diff --git a/compiler/java/com/google/dart/compiler/DefaultErrorFormatter.java b/compiler/java/com/google/dart/compiler/DefaultErrorFormatter.java
index f38dde8..bbf3851 100644
--- a/compiler/java/com/google/dart/compiler/DefaultErrorFormatter.java
+++ b/compiler/java/com/google/dart/compiler/DefaultErrorFormatter.java
@@ -4,6 +4,7 @@
 
 package com.google.dart.compiler;
 
+import com.google.common.base.Objects;
 import com.google.dart.compiler.CompilerConfiguration.ErrorFormat;
 
 import java.io.PrintStream;
@@ -42,7 +43,7 @@
     String includeFrom = "";
     if (sourceFile instanceof DartSource) {
       LibrarySource lib = ((DartSource) sourceFile).getLibrary();
-      if (!sourceFile.getUri().equals(lib.getUri())) {
+      if (lib != null && !Objects.equal(sourceFile.getUri(), lib.getUri())) {
         includeFrom = " (sourced from " + lib.getUri() + ")";
       }
     }
diff --git a/compiler/java/com/google/dart/compiler/ast/ASTNodes.java b/compiler/java/com/google/dart/compiler/ast/ASTNodes.java
index 104b56c..82bc855 100644
--- a/compiler/java/com/google/dart/compiler/ast/ASTNodes.java
+++ b/compiler/java/com/google/dart/compiler/ast/ASTNodes.java
@@ -37,10 +37,10 @@
 public class ASTNodes {
 
   /**
-   * @return <code>true</code> if given {@link DartNode} is part of static method or top-level
-   *         function.
+   * @return <code>true</code> if given {@link DartNode} is part of static method, static field or
+   *         top-level function.
    */
-  public static boolean isStaticContext(DartNode node ) {
+  public static boolean isStaticContext(DartNode node) {
     while (node != null) {
       DartNode parent = node.getParent();
       if (node instanceof DartMethodDefinition) {
@@ -52,7 +52,7 @@
       }
       if (node instanceof DartField) {
         DartField field = (DartField) node;
-        if (field.getModifiers().isStatic() || field.getModifiers().isConstant()) {
+        if (field.getModifiers().isStatic()) {
           return true;
         }
         return parent != null && parent.getParent() instanceof DartUnit;
diff --git a/compiler/java/com/google/dart/compiler/ast/ASTVisitor.java b/compiler/java/com/google/dart/compiler/ast/ASTVisitor.java
index 4254db7..e125b1e 100644
--- a/compiler/java/com/google/dart/compiler/ast/ASTVisitor.java
+++ b/compiler/java/com/google/dart/compiler/ast/ASTVisitor.java
@@ -84,6 +84,14 @@
   public R visitComment(DartComment node) {
     return visitNode(node);
   }
+  
+  public R visitCommentNewName(DartCommentNewName node) {
+    return visitNode(node);
+  }
+  
+  public R visitCommentRefName(DartCommentRefName node) {
+    return visitNode(node);
+  }
 
   public R visitAnnotation(DartAnnotation node) {
     return visitNode(node);
diff --git a/compiler/java/com/google/dart/compiler/ast/DartComment.java b/compiler/java/com/google/dart/compiler/ast/DartComment.java
index c55a075..6f6e7d0 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartComment.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartComment.java
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -7,7 +7,11 @@
 import com.google.dart.compiler.Source;
 import com.google.dart.compiler.common.SourceInfo;
 
+import java.util.List;
+
 public class DartComment extends DartNode {
+  private final NodeList<DartCommentRefName> refNames = NodeList.create(this);
+  private final NodeList<DartCommentNewName> newNames = NodeList.create(this);
 
   @SuppressWarnings("unused")
   private static final long serialVersionUID = 6066713446767517627L;
@@ -25,7 +29,7 @@
 
   /**
    * Return <code>true<code> if this comment is a block comment.
-   *
+   * 
    * @return <code>true<code> if this comment is a block comment
    */
   public boolean isBlock() {
@@ -34,7 +38,7 @@
 
   /**
    * Return <code>true<code> if this comment is a DartDoc comment.
-   *
+   * 
    * @return <code>true<code> if this comment is a DartDoc comment
    */
   public boolean isDartDoc() {
@@ -43,20 +47,47 @@
 
   /**
    * Return <code>true<code> if this comment is an end-of-line comment.
-   *
+   * 
    * @return <code>true<code> if this comment is an end-of-line comment
    */
   public boolean isEndOfLine() {
     return style == Style.END_OF_LINE;
   }
 
+  /**
+   * Adds <code>[id]</code> reference.
+   */
+  public void addRefName(DartCommentRefName name) {
+    refNames.add(name);
+  }
+
+  public NodeList<DartCommentRefName> getRefNames() {
+    return refNames;
+  }
+
+  /**
+   * Adds <code>[new Class]</code> or <b>[new Class.name]</b> reference.
+   */
+  public void addNewName(DartCommentNewName name) {
+    newNames.add(name);
+  }
+
+  /**
+   * @return the <code>[new Class]</code> or <b>[new Class.name]</b> references.
+   */
+  public List<DartCommentNewName> getNewNames() {
+    return newNames;
+  }
+
   @Override
   public void visitChildren(ASTVisitor<?> visitor) {
+    refNames.accept(visitor);
+    newNames.accept(visitor);
   }
 
   @Override
   public <R> R accept(ASTVisitor<R> visitor) {
-    return null;
+    return visitor.visitComment(this);
   }
 
 }
diff --git a/compiler/java/com/google/dart/compiler/ast/DartCommentNewName.java b/compiler/java/com/google/dart/compiler/ast/DartCommentNewName.java
new file mode 100644
index 0000000..1ab676f
--- /dev/null
+++ b/compiler/java/com/google/dart/compiler/ast/DartCommentNewName.java
@@ -0,0 +1,76 @@
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.google.dart.compiler.ast;
+
+import com.google.dart.compiler.resolver.ClassElement;
+import com.google.dart.compiler.resolver.ConstructorElement;
+
+/**
+ * <code>[new Class.name]</code> in {@link DartComment}.
+ */
+public final class DartCommentNewName extends DartNode {
+  private final String className;
+  private final int classOffset;
+  private final String constructorName;
+  private ClassElement classElement;
+  private final int constructorOffset;
+  private ConstructorElement constructorElement;
+
+  public DartCommentNewName(String className, int classOffset, String constructorName,
+      int constructorOffset) {
+    assert className != null;
+    assert constructorName != null;
+    this.className = className;
+    this.classOffset = classOffset;
+    this.constructorName = constructorName;
+    this.constructorOffset = constructorOffset;
+  }
+
+  @Override
+  public String toString() {
+    if (constructorName.isEmpty()) {
+      return className;
+    }
+    return className + "." + constructorName;
+  }
+
+  public void setElements(ClassElement classElement, ConstructorElement constructorElement) {
+    this.classElement = classElement;
+    this.constructorElement = constructorElement;
+  }
+
+  public String getClassName() {
+    return className;
+  }
+
+  public int getClassOffset() {
+    return classOffset;
+  }
+
+  public ClassElement getClassElement() {
+    return classElement;
+  }
+
+  public String getConstructorName() {
+    return constructorName;
+  }
+
+  public int getConstructorOffset() {
+    return constructorOffset;
+  }
+
+  public ConstructorElement getConstructorElement() {
+    return constructorElement;
+  }
+
+  @Override
+  public void visitChildren(ASTVisitor<?> visitor) {
+  }
+
+  @Override
+  public <R> R accept(ASTVisitor<R> visitor) {
+    return visitor.visitCommentNewName(this);
+  }
+}
diff --git a/compiler/java/com/google/dart/compiler/ast/DartCommentRefName.java b/compiler/java/com/google/dart/compiler/ast/DartCommentRefName.java
new file mode 100644
index 0000000..e39c50a
--- /dev/null
+++ b/compiler/java/com/google/dart/compiler/ast/DartCommentRefName.java
@@ -0,0 +1,49 @@
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.google.dart.compiler.ast;
+
+import com.google.dart.compiler.resolver.Element;
+import com.google.dart.compiler.resolver.NodeElement;
+
+/**
+ * <code>[new name]</code> in {@link DartComment}.
+ */
+public final class DartCommentRefName extends DartNode {
+  private final String name;
+  private NodeElement element;
+
+  public DartCommentRefName(String name) {
+    assert name != null;
+    this.name = name;
+  }
+
+  @Override
+  public String toString() {
+    return name;
+  }
+
+  @Override
+  public NodeElement getElement() {
+    return element;
+  }
+
+  @Override
+  public void setElement(Element element) {
+    this.element = (NodeElement) element;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  @Override
+  public void visitChildren(ASTVisitor<?> visitor) {
+  }
+
+  @Override
+  public <R> R accept(ASTVisitor<R> visitor) {
+    return visitor.visitCommentRefName(this);
+  }
+}
diff --git a/compiler/java/com/google/dart/compiler/ast/DartDeclaration.java b/compiler/java/com/google/dart/compiler/ast/DartDeclaration.java
index 0c13470..5080bb1 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartDeclaration.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartDeclaration.java
@@ -47,6 +47,7 @@
 
   @Override
   public void visitChildren(ASTVisitor<?> visitor) {
+    safelyVisitChild(dartDoc, visitor);
     super.visitChildren(visitor);
     safelyVisitChild(name, visitor);
   }
diff --git a/compiler/java/com/google/dart/compiler/ast/DartNode.java b/compiler/java/com/google/dart/compiler/ast/DartNode.java
index 1c20781..5079d1b 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartNode.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartNode.java
@@ -117,10 +117,7 @@
    * @param visitor the visitor that will be used to visit the child
    */
   protected void safelyVisitChild(DartNode child, ASTVisitor<?> visitor) {
-    // Inline the DartIdentifier path - it's by far the most common.
-    if (child instanceof DartIdentifier) {
-      visitor.visitIdentifier((DartIdentifier)child);
-    } else if (child != null) {
+    if (child != null) {
       child.accept(visitor);
     }
   }
diff --git a/compiler/java/com/google/dart/compiler/ast/DartToSourceVisitor.java b/compiler/java/com/google/dart/compiler/ast/DartToSourceVisitor.java
index e913de9..d7c2597 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartToSourceVisitor.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartToSourceVisitor.java
@@ -28,6 +28,11 @@
   }
 
   @Override
+  public Void visitComment(DartComment node) {
+    return null;
+  }
+
+  @Override
   public Void visitNativeBlock(DartNativeBlock x) {
     p("native;");
     return null;
diff --git a/compiler/java/com/google/dart/compiler/ast/DartUnit.java b/compiler/java/com/google/dart/compiler/ast/DartUnit.java
index 063455e..8959f52 100644
--- a/compiler/java/com/google/dart/compiler/ast/DartUnit.java
+++ b/compiler/java/com/google/dart/compiler/ast/DartUnit.java
@@ -56,7 +56,6 @@
   public void visitChildren(ASTVisitor<?> visitor) {
     directives.accept(visitor);
     topLevelNodes.accept(visitor);
-    comments.accept(visitor);
   }
 
   @Override
diff --git a/compiler/java/com/google/dart/compiler/parser/DartParser.java b/compiler/java/com/google/dart/compiler/parser/DartParser.java
index 41d3d9b..055b5b0 100644
--- a/compiler/java/com/google/dart/compiler/parser/DartParser.java
+++ b/compiler/java/com/google/dart/compiler/parser/DartParser.java
@@ -619,6 +619,7 @@
 
   private DartLibraryDirective parseObsoleteLibraryDirective() {
     expect(Token.LIBRARY);
+    reportDeprecatedError(position(), ParserErrorCode.DEPRECATED_LIBRARY_DIRECTIVE);
     expect(Token.LPAREN);
     beginLiteral();
     expect(Token.STRING);
@@ -715,6 +716,7 @@
 
   protected DartImportDirective parseObsoleteImportDirective() {
     expect(Token.IMPORT);
+    reportDeprecatedError(position(), ParserErrorCode.DEPRECATED_IMPORT_DIRECTIVE);
     expect(Token.LPAREN);
     
     beginLiteral();
@@ -761,6 +763,7 @@
 
   private DartSourceDirective parseSourceDirective() {
     expect(Token.SOURCE);
+    reportDeprecatedError(position(), ParserErrorCode.DEPRECATED_SOURCE_DIRECTIVE);
     expect(Token.LPAREN);
     beginLiteral();
     expect(Token.STRING);
@@ -5391,6 +5394,23 @@
     return errorCount < MAX_DEFAULT_ERRORS;
   }
   
+  private void reportDeprecatedError(int position, ErrorCode errorCode) {
+    // TODO(scheglov) remove after http://code.google.com/p/dart/issues/detail?id=6508
+    if (!Elements.isCoreLibrarySource(source) &&
+        !Elements.isLibrarySource(source, "/isolate/isolate.dart")
+      &&  !Elements.isLibrarySource(source, "/json/json.dart")
+      &&  !Elements.isLibrarySource(source, "/math/math.dart")
+      &&  !Elements.isLibrarySource(source, "/html/dartium/nativewrappers.dart")
+      &&  !Elements.isLibrarySource(source, "/io/io.dart")
+      &&  !Elements.isLibrarySource(source, "/crypto/crypto.dart")
+      &&  !Elements.isLibrarySource(source, "/uri/uri.dart")
+      &&  !Elements.isLibrarySource(source, "/utf/utf.dart")
+      &&  !Elements.isLibrarySource(source, "/scalarlist/scalarlist.dart")
+        ) {
+      super.reportError(position, errorCode);
+    }
+  }
+  
   @Override
   protected void reportError(int position, ErrorCode errorCode, Object... arguments) {
     // TODO(devoncarew): we're not correctly identifying dart:html as a core library
diff --git a/compiler/java/com/google/dart/compiler/parser/DartParserCommentsHelper.java b/compiler/java/com/google/dart/compiler/parser/DartParserCommentsHelper.java
index 7c2be7f..e21d2b8 100644
--- a/compiler/java/com/google/dart/compiler/parser/DartParserCommentsHelper.java
+++ b/compiler/java/com/google/dart/compiler/parser/DartParserCommentsHelper.java
@@ -9,6 +9,8 @@
 import com.google.dart.compiler.Source;
 import com.google.dart.compiler.ast.ASTVisitor;
 import com.google.dart.compiler.ast.DartComment;
+import com.google.dart.compiler.ast.DartCommentNewName;
+import com.google.dart.compiler.ast.DartCommentRefName;
 import com.google.dart.compiler.ast.DartDeclaration;
 import com.google.dart.compiler.ast.DartField;
 import com.google.dart.compiler.ast.DartMethodDefinition;
@@ -16,6 +18,7 @@
 import com.google.dart.compiler.ast.DartUnit;
 import com.google.dart.compiler.common.SourceInfo;
 import com.google.dart.compiler.metrics.CompilerMetrics;
+import com.google.dart.compiler.util.apache.StringUtils;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -41,14 +44,16 @@
     }
 
     @Override
-    protected DartScanner createScanner(String sourceCode, Source source, DartCompilerListener listener) {
+    protected DartScanner createScanner(String sourceCode, Source source,
+        DartCompilerListener listener) {
       commentLocs = Lists.newArrayList();
       return new CommentScanner(sourceCode, 0, source, listener);
     }
 
     private class CommentScanner extends DartScanner {
 
-      CommentScanner(String sourceCode, int start, Source sourceReference, DartCompilerListener listener) {
+      CommentScanner(String sourceCode, int start, Source sourceReference,
+          DartCompilerListener listener) {
         super(sourceCode, start, sourceReference, listener);
       }
 
@@ -147,6 +152,7 @@
         if (decl != null) {
           String commentStr = sourceCode.substring(comment.getSourceInfo().getOffset(),
               comment.getSourceInfo().getEnd());
+          tokenizeComment(comment, commentStr);
           // may be @Metadata
           if (commentStr.contains("@deprecated")) {
             decl.setObsoleteMetadata(decl.getObsoleteMetadata().makeDeprecated());
@@ -163,6 +169,63 @@
     }
   }
 
+  private static void tokenizeComment(DartComment comment, String src) {
+    int lastIndex = 0;
+    while (true) {
+      int openIndex = src.indexOf('[', lastIndex);
+      if (openIndex == -1) {
+        break;
+      }
+      int closeIndex = src.indexOf(']', openIndex);
+      if (closeIndex == -1) {
+        break;
+      }
+      lastIndex = closeIndex;
+      String tokenSrc = src.substring(openIndex + 1, closeIndex);
+      if (tokenSrc.startsWith(":") && tokenSrc.endsWith(":")) {
+        // TODO(scheglov) [:code:] and 'code'
+      } else if (tokenSrc.startsWith("new ")) {
+        SourceInfo sourceInfo = comment.getSourceInfo();
+        int offset = sourceInfo.getOffset() + openIndex;
+        int classOffset = offset + "[".length();
+        // remove leading "new "
+        String name = StringUtils.remove(tokenSrc, "new ");
+        classOffset += "new ".length();
+        // remove spaces
+        {
+          String stripName = StringUtils.stripStart(name, null);
+          classOffset += name.length() - stripName.length();
+          name = stripName;
+        }
+        name = name.trim();
+        //
+        String className = StringUtils.substringBefore(name, ".");
+        String constructorName = StringUtils.substringAfter(name, ".");
+        int constructorOffset = classOffset + className.length() + ".".length();
+        DartCommentNewName newNode = new DartCommentNewName(className, classOffset,
+            constructorName, constructorOffset);
+        {
+          Source source = sourceInfo.getSource();
+          int length = tokenSrc.length() + "[]".length();
+          newNode.setSourceInfo(new SourceInfo(source, offset, length));
+        }
+        // add node
+        comment.addNewName(newNode);
+      } else {
+        String name = tokenSrc.trim();
+        DartCommentRefName refNode = new DartCommentRefName(name);
+        {
+          SourceInfo sourceInfo = comment.getSourceInfo();
+          Source source = sourceInfo.getSource();
+          int offset = sourceInfo.getOffset() + openIndex;
+          int length = name.length() + "[]".length();
+          refNode.setSourceInfo(new SourceInfo(source, offset, length));
+        }
+        comment.addRefName(refNode);
+      }
+    }
+  }
+
   private static DartDeclaration<?> adjustDartdocTarget(DartNode currentNode, DartNode nextNode) {
     if (currentNode instanceof DartField && nextNode instanceof DartMethodDefinition) {
       if (currentNode.getSourceInfo().equals(nextNode.getSourceInfo())) {
diff --git a/compiler/java/com/google/dart/compiler/parser/ParserErrorCode.java b/compiler/java/com/google/dart/compiler/parser/ParserErrorCode.java
index 0e3a536..aa904a6 100644
--- a/compiler/java/com/google/dart/compiler/parser/ParserErrorCode.java
+++ b/compiler/java/com/google/dart/compiler/parser/ParserErrorCode.java
@@ -40,6 +40,9 @@
   DEPRECATED_USE_OF_FACTORY_KEYWORD("Deprecated use of the 'factory' keyword: use 'default' instead"),
   DEPRECATED_RAW_STRING("The use of '@' to prefix a raw string has been deprecated; use 'r' instead"),
   DEPRECATED_RESOURCE_DIRECTIVE("The #resource directive has been deprecated and will soon be disallowed"),
+  DEPRECATED_LIBRARY_DIRECTIVE("The '#library(url)' directive has been deprecated, use 'library name' instead"),
+  DEPRECATED_IMPORT_DIRECTIVE("The '#import(url)' directive has been deprecated, use 'import url' instead"),
+  DEPRECATED_SOURCE_DIRECTIVE("The '#source(url)' directive has been deprecated, use 'part url' instead"),
   DIRECTIVE_OUT_OF_ORDER("Directive out of order"),
   DISALLOWED_ABSTRACT_KEYWORD("Abstract keyword not allowed here"),
   // TODO(zundel): error message needs JUnit test (unreachable code?)
diff --git a/compiler/java/com/google/dart/compiler/resolver/ClassElementImplementation.java b/compiler/java/com/google/dart/compiler/resolver/ClassElementImplementation.java
index e8b4b45..64d0528 100644
--- a/compiler/java/com/google/dart/compiler/resolver/ClassElementImplementation.java
+++ b/compiler/java/com/google/dart/compiler/resolver/ClassElementImplementation.java
@@ -119,7 +119,13 @@
 
   @Override
   public void setSupertype(InterfaceType supertype) {
+    if (this.supertype != null) {
+      this.supertype.unregisterSubClass(this);
+    }
     this.supertype = supertype;
+    if (this.supertype != null) {
+      this.supertype.registerSubClass(this);
+    }
   }
 
   void setDefaultClass(InterfaceType element) {
@@ -210,6 +216,7 @@
 
   void addInterface(InterfaceType type) {
     interfaces.add(type);
+    type.registerSubClass(this);
   }
 
   Element findElement(String name) {
diff --git a/compiler/java/com/google/dart/compiler/resolver/CompileTimeConstantAnalyzer.java b/compiler/java/com/google/dart/compiler/resolver/CompileTimeConstantAnalyzer.java
index 4c15ab1..9974915 100644
--- a/compiler/java/com/google/dart/compiler/resolver/CompileTimeConstantAnalyzer.java
+++ b/compiler/java/com/google/dart/compiler/resolver/CompileTimeConstantAnalyzer.java
@@ -68,9 +68,6 @@
 public class CompileTimeConstantAnalyzer {
 
   private class ExpressionVisitor extends ASTVisitor<Void> {
-    private ExpressionVisitor() {
-    }
-
     private boolean checkBoolean(DartNode x, Type type) {
       // Spec 0.11 allows using "null" literal in place of bool.
       if (x instanceof DartNullLiteral) {
@@ -367,6 +364,8 @@
       }
 
       Element element = x.getElement();
+      boolean elementIsStatic = element != null
+          && (element.getModifiers().isStatic() || Elements.isTopLevel(element));
       switch (ElementKind.of(element)) {
         case CLASS:
         case PARAMETER:
@@ -417,7 +416,7 @@
           return null;
 
         case METHOD:
-          if (!element.getModifiers().isStatic() && !Elements.isTopLevel(element)) {
+          if (!elementIsStatic) {
             expectedConstant(x);
           }
           return null;
diff --git a/compiler/java/com/google/dart/compiler/resolver/Elements.java b/compiler/java/com/google/dart/compiler/resolver/Elements.java
index 55f1401..cea87a6 100644
--- a/compiler/java/com/google/dart/compiler/resolver/Elements.java
+++ b/compiler/java/com/google/dart/compiler/resolver/Elements.java
@@ -717,13 +717,17 @@
    * @return <code>true</code> if given {@link Source} represents library with given name.
    */
   public static boolean isLibrarySource(Source source, String name) {
+    LibrarySource library = null;
+    if (source instanceof LibrarySource) {
+      library = (LibrarySource) source;
+    }
     if (source instanceof DartSource) {
       DartSource dartSource = (DartSource) source;
-      LibrarySource library = dartSource.getLibrary();
-      if (library != null) {
-        String libraryName = library.getName();
-        return libraryName.endsWith(name);
-      }
+      library = dartSource.getLibrary();
+    }
+    if (library != null) {
+      String libraryName = library.getName();
+      return libraryName.endsWith(name);
     }
     return false;
   }
@@ -748,13 +752,18 @@
    *         implementation.
    */
   public static boolean isCoreLibrarySource(Source source) {
+    if (source != null && source.getUri() != null
+        && source.getUri().toString().equals("libraries.dart")) {
+      return true;
+    }
     // TODO (danrubel) remove these when dartc libraries are removed
     // Old core library file names
     return Elements.isLibrarySource(source, "/core/corelib.dart")
         || Elements.isLibrarySource(source, "/core/corelib_impl.dart")
         // New core library file names
         || Elements.isLibrarySource(source, "/core/core.dart")
-        || Elements.isLibrarySource(source, "/core/coreimpl.dart");
+        || Elements.isLibrarySource(source, "/core/coreimpl.dart")
+        || Elements.isLibrarySource(source, "/coreimpl/coreimpl.dart");
   }
   
   public static boolean isHtmlLibrarySource(Source source) {
diff --git a/compiler/java/com/google/dart/compiler/resolver/Resolver.java b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
index 9edadea..91a5f7c 100644
--- a/compiler/java/com/google/dart/compiler/resolver/Resolver.java
+++ b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
@@ -20,6 +20,9 @@
 import com.google.dart.compiler.ast.DartCase;
 import com.google.dart.compiler.ast.DartCatchBlock;
 import com.google.dart.compiler.ast.DartClass;
+import com.google.dart.compiler.ast.DartComment;
+import com.google.dart.compiler.ast.DartCommentNewName;
+import com.google.dart.compiler.ast.DartCommentRefName;
 import com.google.dart.compiler.ast.DartContinueStatement;
 import com.google.dart.compiler.ast.DartDirective;
 import com.google.dart.compiler.ast.DartDoWhileStatement;
@@ -81,7 +84,9 @@
 import com.google.dart.compiler.type.InterfaceType;
 import com.google.dart.compiler.type.InterfaceType.Member;
 import com.google.dart.compiler.type.Type;
+import com.google.dart.compiler.type.TypeAnalyzer;
 import com.google.dart.compiler.type.TypeKind;
+import com.google.dart.compiler.type.TypeQuality;
 import com.google.dart.compiler.type.TypeVariable;
 import com.google.dart.compiler.type.Types;
 
@@ -302,6 +307,32 @@
     }
 
     @Override
+    public Element visitCommentRefName(DartCommentRefName node) {
+      Scope scope = getContext().getScope();
+      String name = node.getName();
+      Element element = scope.findElement(scope.getLibrary(), name);
+      return recordElement(node, element);
+    }
+
+    @Override
+    public Element visitCommentNewName(DartCommentNewName node) {
+      String className = node.getClassName();
+      String constructorName = node.getConstructorName();
+      Scope scope = getContext().getScope();
+      Element element = scope.findElement(scope.getLibrary(), className);
+      if (ElementKind.of(element) == ElementKind.CLASS) {
+        ClassElement classElement = (ClassElement) element;
+        for (ConstructorElement constructor : classElement.getConstructors()) {
+          if (constructor.getName().equals(constructorName)) {
+            node.setElements(classElement, constructor);
+            return constructor;
+          }
+        }
+      }
+      return null;
+    }
+
+    @Override
     public Element visitClass(DartClass cls) {
       assert currentMethod == null : "nested class?";
       ClassNodeElement classElement = cls.getElement();
@@ -325,11 +356,16 @@
       enclosingElement = classElement;
       context = topLevelContext.extend(classElement);
 
+      // members
       this.finalsNeedingInitializing.clear();
-      for (NodeElement member : classElement.getMembers()) {
-        member.getNode().accept(this);
+      for (DartNode member : cls.getMembers()) {
+        if (ElementKind.of(member.getElement()) == ElementKind.CONSTRUCTOR) {
+          continue;
+        }
+        member.accept(this);
       }
 
+      // constructors
       boolean testForAllConstantFields = false;
       for (DartNode member : cls.getMembers()) {
         if (member instanceof DartMethodDefinition) {
@@ -401,6 +437,13 @@
         });
       }
 
+      {
+        DartComment comment = cls.getDartDoc();
+        if (comment != null) {
+          comment.accept(this);
+        }
+      }
+
       context = previousContext;
       currentHolder = previousHolder;
       enclosingElement = previousEnclosingElement;
@@ -640,6 +683,13 @@
           onError(parameter, ResolverErrorCode.DUPLICATE_INITIALIZATION, parameter.getName());
         }
       }
+      
+      {
+        DartComment comment = node.getDartDoc();
+        if (comment != null) {
+          comment.accept(this);
+        }
+      }
 
       DartBlock body = functionNode.getBody();
       boolean isInterface = false;
@@ -726,7 +776,8 @@
         Element element = node.getElement();
         Type expressionType = expression.getType();
         if (isFinal && expressionType != null && TypeKind.of(element.getType()) == TypeKind.DYNAMIC) {
-          Type fieldType = Types.makeInferred(expressionType);
+          TypeQuality typeQuality = TypeAnalyzer.getTypeQuality(expression);
+          Type fieldType = Types.makeInferred(expressionType, typeQuality);
           Elements.setType(element, fieldType);
         }
       } else if (isFinal) {
@@ -1176,6 +1227,7 @@
           onError(x, ResolverErrorCode.CANNOT_BE_RESOLVED, name);
           x.markResolutionAlreadyReportedThatTheMethodCouldNotBeFound();
         }
+      } else if (x.getParent() instanceof DartComment) {
       } else {
         element = checkResolvedIdentifier(x, isQualifier, scope, name, element);
       }
@@ -1199,7 +1251,7 @@
         onError(x, ResolverErrorCode.USING_LOCAL_VARIABLE_BEFORE_DECLARATION, x);
       }
 
-      if (!isQualifier) {
+      if (!isQualifier && !(x.getParent() instanceof DartComment)) {
         switch (ElementKind.of(element)) {
           case FUNCTION_TYPE_ALIAS:
             onError(x, ResolverErrorCode.CANNOT_USE_TYPE, name);
@@ -1232,10 +1284,11 @@
           if (!Elements.isStaticContext(element) && !element.getModifiers().isConstant()) {
             if (inInstanceVariableInitializer) {
               onError(x, ResolverErrorCode.CANNOT_USE_INSTANCE_FIELD_IN_INSTANCE_FIELD_INITIALIZER);
-            } else if (ASTNodes.isStaticContext(x)) {
-              onError(x, ResolverErrorCode.ILLEGAL_FIELD_ACCESS_FROM_STATIC, name);
             }
           }
+          if (ASTNodes.isStaticContext(x) && !Elements.isStaticContext(element)) {
+            onError(x, ResolverErrorCode.ILLEGAL_FIELD_ACCESS_FROM_STATIC, name);
+          }
           if (isIllegalPrivateAccess(x, enclosingElement, element, x.getName())) {
             return null;
           }
diff --git a/compiler/java/com/google/dart/compiler/type/AbstractType.java b/compiler/java/com/google/dart/compiler/type/AbstractType.java
index 221a3d6..3a5892a 100644
--- a/compiler/java/com/google/dart/compiler/type/AbstractType.java
+++ b/compiler/java/com/google/dart/compiler/type/AbstractType.java
@@ -9,7 +9,7 @@
  */
 abstract class AbstractType implements Type {
   @Override
-  public boolean isInferred() {
-    return false;
+  public TypeQuality getQuality() {
+    return TypeQuality.EXACT;
   }
 }
diff --git a/compiler/java/com/google/dart/compiler/type/DynamicTypeImplementation.java b/compiler/java/com/google/dart/compiler/type/DynamicTypeImplementation.java
index 57b024e..7467104 100644
--- a/compiler/java/com/google/dart/compiler/type/DynamicTypeImplementation.java
+++ b/compiler/java/com/google/dart/compiler/type/DynamicTypeImplementation.java
@@ -4,6 +4,7 @@
 
 package com.google.dart.compiler.type;
 
+import com.google.dart.compiler.resolver.ClassElement;
 import com.google.dart.compiler.resolver.DynamicElement;
 import com.google.dart.compiler.resolver.Element;
 import com.google.dart.compiler.resolver.Elements;
@@ -133,4 +134,17 @@
   public Map<String, Type> getNamedParameterTypes() {
     return null;
   }
+  
+  @Override
+  public void registerSubClass(ClassElement subClass) {
+  }
+  
+  @Override
+  public void unregisterSubClass(ClassElement subClass) {
+  }
+
+  @Override
+  public Member lookupSubTypeMember(String name) {
+    return null;
+  }
 }
diff --git a/compiler/java/com/google/dart/compiler/type/ExternalTypeAnalyzers.java b/compiler/java/com/google/dart/compiler/type/ExternalTypeAnalyzers.java
index 56cd267..d8a6be2 100644
--- a/compiler/java/com/google/dart/compiler/type/ExternalTypeAnalyzers.java
+++ b/compiler/java/com/google/dart/compiler/type/ExternalTypeAnalyzers.java
@@ -12,7 +12,6 @@
 import com.google.dart.compiler.resolver.Element;
 import com.google.dart.compiler.resolver.ElementKind;
 import com.google.dart.compiler.resolver.Elements;
-import com.google.dart.compiler.resolver.EnclosingElement;
 import com.google.dart.compiler.resolver.LibraryElement;
 import com.google.dart.compiler.util.apache.StringUtils;
 
@@ -118,11 +117,8 @@
     String name = element.getName();
     List<DartExpression> arguments = invocation.getArguments();
     LibraryElement libraryElement = Elements.getDeclaringLibrary(element);
-    // NodeSelector.query(String)
-    EnclosingElement enclosingElement = element.getEnclosingElement();
-    if ("query".equals(name) && isDeclaredInHtmlLibrary(element)
-        && ElementKind.of(enclosingElement) == ElementKind.CLASS
-        && "NodeSelector".equals(enclosingElement.getName())) {
+    // Document.query(String)
+    if ("query".equals(name) && isDeclaredInHtmlLibrary(element)) {
       return analyzeQuery(arguments, libraryElement, defaultType);
     }
     // no guess
diff --git a/compiler/java/com/google/dart/compiler/type/InterfaceType.java b/compiler/java/com/google/dart/compiler/type/InterfaceType.java
index aaf43ca..7a746c1 100644
--- a/compiler/java/com/google/dart/compiler/type/InterfaceType.java
+++ b/compiler/java/com/google/dart/compiler/type/InterfaceType.java
@@ -32,6 +32,10 @@
   InterfaceType asRawType();
 
   Member lookupMember(String name);
+  
+  void registerSubClass(ClassElement subClass);
+  void unregisterSubClass(ClassElement subClass);
+  Member lookupSubTypeMember(String name);
 
   interface Member {
     InterfaceType getHolder();
diff --git a/compiler/java/com/google/dart/compiler/type/InterfaceTypeImplementation.java b/compiler/java/com/google/dart/compiler/type/InterfaceTypeImplementation.java
index a7ab8d6..fac151a 100644
--- a/compiler/java/com/google/dart/compiler/type/InterfaceTypeImplementation.java
+++ b/compiler/java/com/google/dart/compiler/type/InterfaceTypeImplementation.java
@@ -4,6 +4,7 @@
 
 package com.google.dart.compiler.type;
 
+import com.google.common.collect.MapMaker;
 import com.google.dart.compiler.resolver.ClassElement;
 import com.google.dart.compiler.resolver.Element;
 import com.google.dart.compiler.resolver.ElementKind;
@@ -15,6 +16,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
 /**
  * An interface type.
@@ -22,6 +24,7 @@
 class InterfaceTypeImplementation extends AbstractType implements InterfaceType {
   private final ClassElement element;
   private final List<Type> arguments;
+  private final Map<ClassElement, Object> subClasses = new MapMaker().weakKeys().makeMap();
 
   InterfaceTypeImplementation(ClassElement element, List<Type> arguments) {
     this.element = element;
@@ -217,4 +220,34 @@
       return getterType.subst(typeArguments, typeParameters);
     }
   }
+  
+  @Override
+  public void registerSubClass(ClassElement subClass) {
+    subClasses.put(subClass, this);
+  }
+  
+  @Override
+  public void unregisterSubClass(ClassElement subClass) {
+    subClasses.remove(subClass);
+  }
+  
+  @Override
+  public Member lookupSubTypeMember(String name) {
+    for (ClassElement subClass : subClasses.keySet()) {
+      {
+        Element element = subClass.lookupLocalElement(name);
+        if (element != null) {
+          return new MemberImplementation(this, element);
+        }
+      }
+      InterfaceType type = subClass.getType();
+      if (type != null) {
+        Member member = type.lookupSubTypeMember(name);
+        if (member != null) {
+          return member;
+        }
+      }
+    }
+    return null;
+  }
 }
diff --git a/compiler/java/com/google/dart/compiler/type/InterfaceTypeUnion.java b/compiler/java/com/google/dart/compiler/type/InterfaceTypeUnion.java
index 4fcf9a2..87a6c9c 100644
--- a/compiler/java/com/google/dart/compiler/type/InterfaceTypeUnion.java
+++ b/compiler/java/com/google/dart/compiler/type/InterfaceTypeUnion.java
@@ -1,98 +1,17 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 package com.google.dart.compiler.type;
 
-import com.google.common.collect.ImmutableList;
-import com.google.dart.compiler.resolver.ClassElement;
-import com.google.dart.compiler.resolver.ClassElementUnion;
-
 import java.util.List;
 
 /**
  * Artificial {@link InterfaceType} which is union of several {@link InterfaceType}s.
  */
-class InterfaceTypeUnion implements InterfaceType {
-  
-  private final List<InterfaceType> types;
-  private final ClassElement element;
-
-  public InterfaceTypeUnion(List<InterfaceType> types) {
-    this.types = types;
-    this.element = new ClassElementUnion(this, types);
-  }
-  
-  @Override
-  public boolean equals(Object obj) {
-    if (obj instanceof InterfaceTypeUnion) {
-      InterfaceTypeUnion other = (InterfaceTypeUnion) obj;
-      return getElement().equals(other.getElement());
-    }
-    return false;
-  }
-
-  @Override
-  public int hashCode() {
-    int hashCode = 31;
-    hashCode += getElement().hashCode();
-    hashCode += 31 * hashCode + getArguments().hashCode();
-    return hashCode;
-  }
-
-  @Override
-  public String toString() {
-    return types.toString();
-  }
-  
-  @Override
-  public TypeKind getKind() {
-    return TypeKind.INTERFACE;
-  }
-
-  @Override
-  public boolean isInferred() {
-    return false;
-  }
-
-  @Override
-  public InterfaceType subst(List<Type> arguments, List<Type> parameters) {
-    return null;
-  }
-
-  @Override
-  public ClassElement getElement() {
-    return element;
-  }
-
-  @Override
-  public List<Type> getArguments() {
-    return ImmutableList.of();
-  }
-
-  @Override
-  public boolean isRaw() {
-    return true;
-  }
-
-  @Override
-  public boolean hasDynamicTypeArgs() {
-    return false;
-  }
-
-  @Override
-  public InterfaceType asRawType() {
-    return this;
-  }
-
-  @Override
-  public Member lookupMember(String name) {
-    for (InterfaceType type : types) {
-      Member member = type.lookupMember(name);
-      if (member != null) {
-        return member;
-      }
-    }
-    return null;
-  }
+public interface InterfaceTypeUnion extends InterfaceType {
+  /**
+   * @return the {@link InterfaceType} making this union.
+   */
+  List<InterfaceType> getTypes();
 }
diff --git a/compiler/java/com/google/dart/compiler/type/InterfaceTypeUnionImplementation.java b/compiler/java/com/google/dart/compiler/type/InterfaceTypeUnionImplementation.java
new file mode 100644
index 0000000..b17a4d3
--- /dev/null
+++ b/compiler/java/com/google/dart/compiler/type/InterfaceTypeUnionImplementation.java
@@ -0,0 +1,115 @@
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.google.dart.compiler.type;
+
+import com.google.common.collect.ImmutableList;
+import com.google.dart.compiler.resolver.ClassElement;
+import com.google.dart.compiler.resolver.ClassElementUnion;
+
+import java.util.List;
+
+/**
+ * Implementation of {@link InterfaceTypeUnion}.
+ */
+class InterfaceTypeUnionImplementation implements InterfaceTypeUnion {
+
+  private final List<InterfaceType> types;
+  private final ClassElement element;
+
+  public InterfaceTypeUnionImplementation(List<InterfaceType> types) {
+    this.types = types;
+    this.element = new ClassElementUnion(this, types);
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof InterfaceTypeUnionImplementation) {
+      InterfaceTypeUnionImplementation other = (InterfaceTypeUnionImplementation) obj;
+      return getElement().equals(other.getElement());
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    int hashCode = 31;
+    hashCode += getElement().hashCode();
+    hashCode += 31 * hashCode + getArguments().hashCode();
+    return hashCode;
+  }
+
+  @Override
+  public String toString() {
+    return types.toString();
+  }
+
+  @Override
+  public TypeKind getKind() {
+    return TypeKind.INTERFACE;
+  }
+
+  @Override
+  public TypeQuality getQuality() {
+    return TypeQuality.EXACT;
+  }
+
+  @Override
+  public InterfaceType subst(List<Type> arguments, List<Type> parameters) {
+    return null;
+  }
+
+  @Override
+  public ClassElement getElement() {
+    return element;
+  }
+
+  @Override
+  public List<Type> getArguments() {
+    return ImmutableList.of();
+  }
+
+  @Override
+  public boolean isRaw() {
+    return true;
+  }
+
+  @Override
+  public boolean hasDynamicTypeArgs() {
+    return false;
+  }
+
+  @Override
+  public InterfaceType asRawType() {
+    return this;
+  }
+
+  @Override
+  public Member lookupMember(String name) {
+    for (InterfaceType type : types) {
+      Member member = type.lookupMember(name);
+      if (member != null) {
+        return member;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public void registerSubClass(ClassElement subClass) {
+  }
+
+  @Override
+  public void unregisterSubClass(ClassElement subClass) {
+  }
+
+  @Override
+  public Member lookupSubTypeMember(String name) {
+    return null;
+  }
+
+  public List<InterfaceType> getTypes() {
+    return types;
+  }
+}
diff --git a/compiler/java/com/google/dart/compiler/type/Type.java b/compiler/java/com/google/dart/compiler/type/Type.java
index d3b8933..3fa6a0b 100644
--- a/compiler/java/com/google/dart/compiler/type/Type.java
+++ b/compiler/java/com/google/dart/compiler/type/Type.java
@@ -25,8 +25,7 @@
   TypeKind getKind();
   
   /**
-   * @return <code>true</code> if this {@link Type} was not declared in {@link Element}, but
-   * instead was inferred from context.
+   * @return the {@link TypeQuality}, not <code>null</code>.
    */
-  boolean isInferred();
+  TypeQuality getQuality();
 }
diff --git a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
index 454b0b0..aea700e 100644
--- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
+++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
@@ -36,6 +36,7 @@
 import com.google.dart.compiler.ast.DartCase;
 import com.google.dart.compiler.ast.DartCatchBlock;
 import com.google.dart.compiler.ast.DartClass;
+import com.google.dart.compiler.ast.DartComment;
 import com.google.dart.compiler.ast.DartConditional;
 import com.google.dart.compiler.ast.DartContinueStatement;
 import com.google.dart.compiler.ast.DartDeclaration;
@@ -218,7 +219,7 @@
           return true;
         }
         // was assignment, inferred
-        if (type != null && type.isInferred()) {
+        if (type != null && TypeQuality.isInferred(type)) {
           return true;
         }
         // was declared with type, keep it
@@ -442,7 +443,7 @@
             }
           }
           // may be replace type of variable
-          setVariableElementType(lhsNode.getElement(), rhs);
+          setVariableElementType(lhsNode.getElement(), rhs, getTypeQuality(rhsNode));
           checkAssignableElement(lhsNode);
           // if cascade, then use type of "lhs" qualifier
           if (lhsNode instanceof DartPropertyAccess) {
@@ -653,10 +654,17 @@
       if (member == null) {
         member = itype.lookupMember("setter " + methodName);
       }
+      // is "receiver" is inferred, attempt to find member in one of the subtypes
+      if (member == null) {
+        if (TypeQuality.of(receiver) == TypeQuality.INFERRED && receiver instanceof InterfaceType) {
+          member = ((InterfaceType) receiver).lookupSubTypeMember(methodName);
+        }
+      }
+      // report problem
       if (member == null && problemTarget != null) {
         if (reportNoMemberWhenHasInterceptor || !Elements.handlesNoSuchMethod(itype)) {
-          if (typeChecksForInferredTypes || !receiver.isInferred()) {
-            ErrorCode code = receiver.isInferred()
+          if (typeChecksForInferredTypes || !TypeQuality.isInferred(receiver)) {
+            ErrorCode code = TypeQuality.isInferred(receiver)
                 ? TypeErrorCode.INTERFACE_HAS_NO_METHOD_NAMED_INFERRED
                 : TypeErrorCode.INTERFACE_HAS_NO_METHOD_NAMED;
             typeError(problemTarget, code, receiver, methodName);
@@ -671,10 +679,10 @@
      * If left-hand-side is {@link VariableElement} with propagated type, then remember type before
      * current "basic block" and set new type.
      */
-    private void setVariableElementType(Element element, Type rhs) {
+    private void setVariableElementType(Element element, Type type, TypeQuality quality) {
       if (ElementKind.of(element) == ElementKind.VARIABLE) {
         VariableElement variableElement = (VariableElement) element;
-        Type newType = Types.makeInferred(rhs);
+        Type newType = Types.makeInferred(type, quality);
         blockOldTypes.getFirst().setType(variableElement, newType);
       }
     }
@@ -690,7 +698,8 @@
      * @return <code>true</code> if given {@link Element} is has inferred {@link Type}.
      */
     private static boolean hasInferredType(Element element) {
-      return element != null && element.getType() != null && element.getType().isInferred();
+      return element != null && element.getType() != null
+          && element.getType().getQuality() != TypeQuality.EXACT;
     }
 
     /**
@@ -771,7 +780,7 @@
         }
         // apply inferred type
         if (inferredType != null) {
-          if (TypeKind.of(currentType) == TypeKind.DYNAMIC && currentType.isInferred()) {
+          if (TypeKind.of(currentType) == TypeKind.DYNAMIC && TypeQuality.isInferred(currentType)) {
             // if we fell back to Dynamic, keep it
           } else {
             Type unionType = getUnionType(currentType, inferredType);
@@ -784,31 +793,6 @@
         }
       }
 
-      /**
-       * @return the {@link Type} which is both "a" and "b" types. May be "dynamic" if "a" and "b"
-       *         don't form hierarchy.
-       */
-      Type getUnionType(Type curType, Type newType) {
-        if (TypeKind.of(curType) == TypeKind.DYNAMIC) {
-          return newType;
-        }
-        if (TypeKind.of(newType) == TypeKind.DYNAMIC) {
-          return curType;
-        }
-        if (types.isSubtype(curType, newType)) {
-          return curType;
-        }
-        if (types.isSubtype(newType, curType)) {
-          return newType;
-        }
-        // if InterfaceType, use union
-        if (curType instanceof InterfaceType && newType instanceof InterfaceType) {
-          return types.unionTypes(ImmutableList.of((InterfaceType) curType, (InterfaceType) newType));
-        }
-        // keep type as is
-        return curType;
-      }
-
       void restore() {
         for (Entry<VariableElement, Type> entry : typesMap.entrySet()) {
           Elements.setType(entry.getKey(), entry.getValue());
@@ -817,6 +801,31 @@
     }
 
     /**
+     * @return the {@link Type} which is both "a" and "b" types. May be "dynamic" if "a" and "b"
+     *         don't form hierarchy.
+     */
+    private Type getUnionType(Type curType, Type newType) {
+      if (TypeKind.of(curType) == TypeKind.DYNAMIC) {
+        return newType;
+      }
+      if (TypeKind.of(newType) == TypeKind.DYNAMIC) {
+        return curType;
+      }
+      if (types.isSubtype(curType, newType)) {
+        return curType;
+      }
+      if (types.isSubtype(newType, curType)) {
+        return newType;
+      }
+      // if InterfaceType, use union
+      if (curType instanceof InterfaceType && newType instanceof InterfaceType) {
+        return types.unionTypes(ImmutableList.of((InterfaceType) curType, (InterfaceType) newType));
+      }
+      // keep type as is
+      return curType;
+    }
+
+    /**
      * @return <code>true</code> if we can prove that given {@link DartStatement} always leads to
      *         the exit from the enclosing function.
      */
@@ -938,11 +947,22 @@
      * If type of variable-like {@link DartDeclaration} (i.e. variables, parameter, field) is not
      * specified and we know somehow this type, then use it.
      */
-    private static void inferVariableDeclarationType(DartDeclaration<?> node, Type type) {
+    private static void inferVariableDeclarationType(DartDeclaration<?> node, DartExpression value) {
+      Type type = value.getType();
+      TypeQuality quality = getTypeQuality(value);
+      inferVariableDeclarationType(node, type, quality);
+    }
+
+    /**
+     * If type of variable-like {@link DartDeclaration} (i.e. variables, parameter, field) is not
+     * specified and we know somehow this type, then use it.
+     */
+    private static void inferVariableDeclarationType(DartDeclaration<?> node, Type type,
+        TypeQuality typeQuality) {
       if (type != null && TypeKind.of(type) != TypeKind.DYNAMIC) {
         Element element = node.getElement();
         if (element != null && TypeKind.of(element.getType()) == TypeKind.DYNAMIC) {
-          Type inferredType = Types.makeInferred(type);
+          Type inferredType = Types.makeInferred(type, typeQuality);
           Elements.setType(element, inferredType);
           node.getName().setType(inferredType);
         }
@@ -976,7 +996,8 @@
           for (int i = 0; i < n; i++) {
             Type requiredNormalParameterType = requiredNormalParameterTypes.get(i);
             DartParameter parameterNode = parameterNodes.get(i);
-            inferVariableDeclarationType(parameterNode, requiredNormalParameterType);
+            inferVariableDeclarationType(parameterNode, requiredNormalParameterType,
+                TypeQuality.INFERRED);
           }
         }
       }
@@ -990,7 +1011,8 @@
         Type newType = blockTypeContext.newTypes.get(variable);
         Type oldType = blockTypeContext.oldTypes.get(variable);
         Type mergedType = types.intersection(newType, oldType);
-        setVariableElementType(variable, mergedType);
+        TypeQuality mergedTypeQuality = Types.getIntersectionQuality(newType, oldType);
+        setVariableElementType(variable, mergedType, mergedTypeQuality);
       }
     }
 
@@ -999,13 +1021,13 @@
       s.getClass(); // Null check.
       // ignore inferred types, treat them as Dynamic
       if (!typeChecksForInferredTypes) {
-        if (t.isInferred() || s.isInferred()) {
+        if (TypeQuality.isInferred(t) || TypeQuality.isInferred(s)) {
           return true;
         }
       }
       // do check and report error
       if (!types.isAssignable(t, s)) {
-        TypeErrorCode errorCode = t.isInferred() || s.isInferred()
+        TypeErrorCode errorCode = TypeQuality.isInferred(t) || TypeQuality.isInferred(s)
             ? TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE_INFERRED
             : TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE;
         typeError(node, errorCode, s, t);
@@ -1034,7 +1056,7 @@
     private FunctionType getMethodType(Type receiver, Member member, String name,
                                          DartNode diagnosticNode) {
       FunctionType functionType = getMethodType0(receiver, member, name, diagnosticNode);
-      if (receiver.isInferred()) {
+      if (TypeQuality.isInferred(receiver)) {
         functionType = (FunctionType) Types.makeInferred(functionType);
       }
       return functionType;
@@ -1078,8 +1100,8 @@
           }
         }
         default:
-          if (typeChecksForInferredTypes || !receiver.isInferred()) {
-            TypeErrorCode errorCode = receiver.isInferred()
+          if (typeChecksForInferredTypes || !TypeQuality.isInferred(receiver)) {
+            TypeErrorCode errorCode = TypeQuality.isInferred(receiver)
                 ? TypeErrorCode.NOT_A_METHOD_IN_INFERRED : TypeErrorCode.NOT_A_METHOD_IN;
             typeError(diagnosticNode, errorCode, name, receiver);
           }
@@ -1174,33 +1196,7 @@
       {
         Set<String> usedNamedParametersPositional = Sets.newHashSet();
         Set<String> usedNamedParametersNamed = Sets.newHashSet();
-        // Prepare named parameters.
         Map<String, Type> namedParameterTypes = ftype.getNamedParameterTypes();
-        Iterator<Entry<String, Type>> namedParameterTypesIterator =
-            namedParameterTypes.entrySet().iterator();
-//        // Check positional arguments for named parameters.
-//        while (namedParameterTypesIterator.hasNext()
-//            && argumentTypes.hasNext()
-//            && !(argumentNodes.get(argumentIndex) instanceof DartNamedExpression)) {
-//          Entry<String, Type> namedEntry = namedParameterTypesIterator.next();
-//          String parameterName = namedEntry.getKey();
-//          usedNamedParametersPositional.add(parameterName);
-//          Type namedType = namedEntry.getValue();
-//          namedType.getClass(); // quick null check
-//          Type argumentType = argumentTypes.next();
-//          argumentType.getClass(); // quick null check
-//          DartExpression argumentNode = argumentNodes.get(argumentIndex);
-//          if (parameters != null) {
-//            argumentNode.setInvocationParameterId(parameters.get(argumentIndex));
-//          } else {
-//            argumentNode.setInvocationParameterId(argumentIndex);
-//          }
-//          if (checkAssignable(argumentNode, namedType, argumentType)) {
-//            inferFunctionLiteralParametersTypes(argumentNode, namedType);
-//          }
-//          argumentIndex++;
-//        }
-        // Check named arguments for named parameters.
         while (argumentTypes.hasNext()
             && argumentNodes.get(argumentIndex) instanceof DartNamedExpression) {
           DartNamedExpression namedExpression =
@@ -1348,11 +1344,18 @@
       if (node == null) {
         return dynamicType;
       }
+      // prepare new type
       Type result = node.accept(this);
       if (result == null) {
          return dynamicType;
       }
-      node.setType(result);
+      // set new type, or keep existing
+      if (node.getType() == null) {
+        node.setType(result);
+      } else {
+        result = node.getType();
+      }
+      // done
       return result;
     }
 
@@ -1446,10 +1449,57 @@
     public Type visitCascadeExpression(DartCascadeExpression node) {
       DartExpression target = node.getTarget();
       Type type = nonVoidTypeOf(target);
+      node.setType(type);
+      inferCascadeType(node);
       node.visitChildren(this);
       return type;
     }
 
+    /**
+     * Infers {@link Type} of {@link DartCascadeExpression} from context.
+     */
+    private void inferCascadeType(DartCascadeExpression node) {
+      // field declaration
+      if (node.getParent() instanceof DartField) {
+        DartField field = (DartField) node.getParent();
+        Type varType = field.getElement().getType();
+        setCascadeUnionType(node, varType);
+      }
+      // variable declaration
+      if (node.getParent() instanceof DartVariable) {
+        DartVariable var = (DartVariable) node.getParent();
+        Type varType = var.getElement().getType();
+        setCascadeUnionType(node, varType);
+      }
+      // assignment
+      if (node.getParent() instanceof DartBinaryExpression) {
+        DartBinaryExpression binary = (DartBinaryExpression) node.getParent();
+        if (binary.getOperator() == Token.ASSIGN && binary.getArg2() == node
+            && binary.getArg1() != null) {
+          Element leftElement = binary.getArg1().getElement();
+          if (leftElement != null) {
+            Type varType = leftElement.getType();
+            setCascadeUnionType(node, varType);
+          }
+        }
+      }
+    }
+
+    /**
+     * Sets for given {@link DartCascadeExpression} and its target {@link Type} which is union of
+     * existing type and "newType".
+     */
+    private void setCascadeUnionType(DartCascadeExpression node, Type newType) {
+      DartExpression target = node.getTarget();
+      Type type = node.getType();
+      if (isExplicitlySpecifiedType(newType) && types.isAssignable(type, newType)) {
+        Type unionType = getUnionType(type, newType);
+        unionType = Types.makeInferred(unionType);
+        node.setType(unionType);
+        target.setType(unionType);
+      }
+    }
+
     @Override
     public Type visitFunctionObjectInvocation(DartFunctionObjectInvocation node) {
       ClassElement element = functionType.getElement();
@@ -1845,6 +1895,9 @@
           && ((DartDeclaration<?>) node.getParent()).getName() == node) {
         return node.getType();
       }
+      if (node.getParent() instanceof DartComment) {
+        return dynamicType;
+      }
       Element element = node.getElement();
       Type type;
       switch (ElementKind.of(element)) {
@@ -1966,7 +2019,8 @@
           }
           // do merge
           Type mergedType = types.intersection(possibleTypes);
-          setVariableElementType(variable, mergedType);
+          TypeQuality mergedTypeQuality = Types.getIntersectionQuality(possibleTypes);
+          setVariableElementType(variable, mergedType, mergedTypeQuality);
         }
       }
       // done
@@ -2309,16 +2363,24 @@
           member = member2;
         }
       }
+      // is "receiver" is inferred, attempt to find member in one of the subtypes
+      if (member == null) {
+        if (TypeQuality.of(receiver) == TypeQuality.INFERRED && receiver instanceof InterfaceType) {
+          member = ((InterfaceType) receiver).lookupSubTypeMember(name);
+        }
+      }
+      // report "not a member"
       if (member == null) {
         if (reportNoMemberWhenHasInterceptor || !Elements.handlesNoSuchMethod(cls)) {
-          if (typeChecksForInferredTypes || !receiver.isInferred()) {
-            TypeErrorCode errorCode = receiver.isInferred()
+          if (typeChecksForInferredTypes || !TypeQuality.isInferred(receiver)) {
+            TypeErrorCode errorCode = TypeQuality.isInferred(receiver)
                 ? TypeErrorCode.NOT_A_MEMBER_OF_INFERRED : TypeErrorCode.NOT_A_MEMBER_OF;
             typeError(node.getName(), errorCode, name, cls);
           }
         }
         return dynamicType;
       }
+      // set resolved element
       element = member.getElement();
       node.setElement(element);
       Modifiers modifiers = element.getModifiers();
@@ -2799,7 +2861,7 @@
       // if type is declared and right side is closure, infer its parameter types
       if (value != null) {
         Type varType = node.getElement().getType();
-        if (isExclicitlySpecifiedType(varType)) {
+        if (isExplicitlySpecifiedType(varType)) {
           inferFunctionLiteralParametersTypes(value, varType);
         }
       }
@@ -2807,8 +2869,7 @@
       Type result = checkInitializedDeclaration(node, value);
       // if no type declared for variables, try to use type of value
       if (value != null) {
-        Type valueType = value.getType();
-        inferVariableDeclarationType(node, valueType);
+        inferVariableDeclarationType(node, value);
       }
       // done
       return result;
@@ -2907,7 +2968,7 @@
         // if type is declared and right side is closure, infer its parameter types
         if (value != null) {
           Type fieldType = node.getElement().getType();
-          if (isExclicitlySpecifiedType(fieldType)) {
+          if (isExplicitlySpecifiedType(fieldType)) {
             inferFunctionLiteralParametersTypes(value, fieldType);
           }
         }
@@ -2917,8 +2978,7 @@
         // only final fields, because only in this case we can be sure that field is not assigned
         // somewhere, may be even not in this unit
         if (node.getModifiers().isFinal() && value != null) {
-          Type valueType = value.getType();
-          inferVariableDeclarationType(node, valueType);
+          inferVariableDeclarationType(node, value);
         }
         // done
         return result;
@@ -3488,7 +3548,7 @@
         }
         return namedParameters;
       }
-      
+
       private Map<String, DartExpression> getParametersDefaultsNamed(List<VariableElement> parameters) {
         Map<String, DartExpression> defaults = Maps.newHashMap();
         for (VariableElement parameter : parameters) {
@@ -3498,31 +3558,54 @@
         }
         return defaults;
       }
-
-      private int getNumRequiredParameters(List<VariableElement> parameters) {
-        int numRequired = 0;
-        for (VariableElement parameter : parameters) {
-          if (!parameter.isNamed()) {
-            numRequired++;
-          }
-        }
-        return numRequired;
-      }
-
-      private List<VariableElement> getNamedParameters(List<VariableElement> parameters) {
-        List<VariableElement> named = Lists.newArrayList();
-        for (VariableElement v : parameters) {
-          if (v.isNamed()) {
-            named.add(v);
-          }
-        }
-        return named;
-      }
     }
   }
 
-  private static boolean isExclicitlySpecifiedType(Type fieldType) {
-    return fieldType != null && TypeKind.of(fieldType) != TypeKind.DYNAMIC
-        && !fieldType.isInferred();
+  private static boolean isExplicitlySpecifiedType(Type type) {
+    return type != null && TypeKind.of(type) != TypeKind.DYNAMIC
+        && !TypeQuality.isInferred(type);
+  }
+  
+  /**
+   * @return the {@link TypeQuality} of given {@link DartExpression}.
+   */
+  public static TypeQuality getTypeQuality(DartExpression expr) {
+    if (expr != null) {
+      if (expr instanceof DartMethodInvocation) {
+        return TypeQuality.INFERRED;
+      }
+      if (expr instanceof DartUnqualifiedInvocation) {
+        return TypeQuality.INFERRED;
+      }
+      if (expr instanceof DartUnaryExpression) {
+        DartUnaryExpression unary = (DartUnaryExpression) expr;
+        if (hasTypeBoolIntDouble(unary.getArg())) {
+          return TypeQuality.INFERRED_EXACT;
+        }
+        return TypeQuality.INFERRED;
+      }
+      if (expr instanceof DartBinaryExpression) {
+        DartBinaryExpression binary = (DartBinaryExpression) expr;
+        if (hasTypeBoolIntDouble(binary.getArg1()) && hasTypeBoolIntDouble(binary.getArg2())) {
+          return TypeQuality.INFERRED_EXACT;
+        }
+        return TypeQuality.INFERRED;
+      }
+      if (expr instanceof DartNewExpression) {
+        return TypeQuality.INFERRED;
+      }
+    }
+    return TypeQuality.INFERRED_EXACT;
+  }
+
+  private static boolean hasTypeBoolIntDouble(DartExpression expr) {
+    Type type = expr.getType();
+    return isCoreType(type, "bool") || isCoreType(type, "int") || isCoreType(type, "double");
+  }
+  
+  private static boolean isCoreType(Type type, String name) {
+    return type != null
+        && Elements.isCoreLibrarySource(type.getElement().getSourceInfo().getSource())
+        && type.getElement().getName().equals(name);
   }
 }
diff --git a/compiler/java/com/google/dart/compiler/type/TypeQuality.java b/compiler/java/com/google/dart/compiler/type/TypeQuality.java
new file mode 100644
index 0000000..04ff2a6
--- /dev/null
+++ b/compiler/java/com/google/dart/compiler/type/TypeQuality.java
@@ -0,0 +1,36 @@
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.google.dart.compiler.type;
+
+import com.google.dart.compiler.resolver.Element;
+
+/**
+ * Quality of the {@link Type}.
+ */
+public enum TypeQuality {
+  /**
+   * {@link Element} was declared with this {@link Type}.
+   */
+  EXACT,
+  /**
+   * {@link Element} was not declared with this {@link Type}, but we can prove that we can treat it
+   * as if it was declared with this {@link Type}.
+   */
+  INFERRED_EXACT,
+  /**
+   * {@link Element} was not declared this {@link Type}, but we have some reasons to think that it
+   * has such {@link Type}, or one of its subtypes.
+   */
+  INFERRED;
+
+  public static TypeQuality of(Type type) {
+    return type.getQuality();
+  }
+
+  public static boolean isInferred(Type type) {
+    return type.getQuality() != EXACT;
+  }
+
+}
diff --git a/compiler/java/com/google/dart/compiler/type/Types.java b/compiler/java/com/google/dart/compiler/type/Types.java
index 3c1d122..d825e85 100644
--- a/compiler/java/com/google/dart/compiler/type/Types.java
+++ b/compiler/java/com/google/dart/compiler/type/Types.java
@@ -43,7 +43,7 @@
  * Utility class for types.
  */
 public class Types {
-  private static Map<Type, Type> inferredTypes = new MapMaker().weakKeys().weakValues().makeMap();
+  private static Map<Type, Map<TypeQuality, Type>> inferredTypes = new MapMaker().weakKeys().makeMap();
   private final CoreTypeProvider typeProvider;
 
   private Types(CoreTypeProvider typeProvider) { // Prevent subclassing.
@@ -71,6 +71,22 @@
     return intersection(ImmutableList.of(t, s));
   }
     
+  public static TypeQuality getIntersectionQuality(Type t, Type s) {
+    return getIntersectionQuality(ImmutableList.of(t, s));
+  }
+  
+  public static TypeQuality getIntersectionQuality(List<Type> types) {
+    Type singleType = null;
+    for (Type type : types) {
+      if (singleType == null) {
+        singleType = type;
+      } else if (singleType != type) {
+        return TypeQuality.INFERRED;
+      }
+    }
+    return TypeQuality.INFERRED_EXACT;
+  }
+    
   public Type intersection(List<Type> types) {
     // exclude 'dynamic' type
     {
@@ -169,7 +185,7 @@
    * @return the {@link InterfaceType} which is union of given ones.
    */
   public InterfaceType unionTypes(List<InterfaceType> types) {
-    return new InterfaceTypeUnion(types);
+    return new InterfaceTypeUnionImplementation(types);
   }
 
   /**
@@ -322,8 +338,19 @@
   }
 
   private boolean isSubtypeOfInterface(Type t, InterfaceType s) {
-    final Type sup = asInstanceOf(t, s.getElement());
+    // Special handling for union.
+    if (t instanceof InterfaceTypeUnion) {
+      InterfaceTypeUnion tUnion = (InterfaceTypeUnion) t;
+      for (InterfaceType unionPart : tUnion.getTypes()) {
+        if (isSubtype(unionPart, s)) {
+          return true;
+        }
+      }
+      return false;
+    }
 
+    // Try to cast "t" to "s".
+    final Type sup = asInstanceOf(t, s.getElement());
     if (TypeKind.of(sup).equals(TypeKind.INTERFACE)) {
       InterfaceType ti = (InterfaceType) sup;
       assert ti.getElement().equals(s.getElement());
@@ -338,7 +365,7 @@
 
   /**
    * Implement the Dart function subtype rule. Unlike the classic arrow rule (return type is
-   * covariant, and paramter types are contravariant), in Dart they must just be assignable.
+   * covariant, and parameter types are contravariant), in Dart they must just be assignable.
    */
   private boolean isSubtypeOfFunction(FunctionType t, FunctionType s) {
     if (s.getKind() == TypeKind.DYNAMIC || t.getKind() == TypeKind.DYNAMIC) {
@@ -664,41 +691,59 @@
   }
 
   /**
-   * @return the wrapper of the given {@link Type} which returns <code>true</code> from
-   *         {@link Type#isInferred()}.
+   * @return the wrapper of the given {@link Type} with {@link TypeQuality#INFERRED}.
    */
   public static Type makeInferred(Type type) {
+    return makeInferred(type, TypeQuality.INFERRED);
+  }
+  
+  /**
+   * @return the wrapper of the given {@link Type} with {@link TypeQuality#INFERRED_EXACT}.
+   */
+  public static Type makeInferredExact(Type type) {
+    return makeInferred(type, TypeQuality.INFERRED_EXACT);
+  }
+
+  /**
+   * @return the wrapper of the given {@link Type} with given {@link TypeQuality}.
+   */
+  public static Type makeInferred(Type type, TypeQuality quality) {
     if (type == null) {
       return null;
     }
-    if (type.isInferred()) {
+    if (type.getQuality().ordinal() > quality.ordinal()) {
       return type;
     }
     Set<Class<?>> interfaceSet = getAllImplementedInterfaces(type.getClass());
     if (!interfaceSet.isEmpty()) {
       Class<?>[] interfaces = (Class[]) interfaceSet.toArray(new Class[interfaceSet.size()]);
-      return makeInferred(type, interfaces);
+      return makeInferred(type, interfaces, quality);
     }
     return type;
   }
 
-  private static Type makeInferred(final Type type, Class<?>[] interfaces) {
-    Type inferred = inferredTypes.get(type);
+  private static Type makeInferred(final Type type, Class<?>[] interfaces, final TypeQuality quality) {
+    Map<TypeQuality, Type> inferredMap = inferredTypes.get(type);
+    if (inferredMap == null) {
+      inferredMap = new MapMaker().weakValues().makeMap();
+      inferredTypes.put(type, inferredMap);
+    }
+    Type inferred = inferredMap.get(quality);
     if (inferred == null) {
       inferred = (Type) Proxy.newProxyInstance(type.getClass().getClassLoader(),
           interfaces, new InvocationHandler() {
             @Override
             @SuppressWarnings("unchecked")
             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-              if (args == null && method.getName().equals("isInferred")) {
-                return true;
+              if (args == null && method.getName().equals("getQuality")) {
+                return quality;
               }
               if (type instanceof FunctionType) {
                 if (args == null && method.getName().equals("getParameterTypes")) {
                   List<Type> originalTypes = (List<Type>) method.invoke(type, args);
                   return Lists.transform(originalTypes, new Function<Type, Type>() {
                     public Type apply(Type input) {
-                      return makeInferred(input);
+                      return makeInferred(input, quality);
                     }
                   });
                 }
@@ -706,7 +751,7 @@
               return method.invoke(type, args);
             }
           });
-      inferredTypes.put(type, inferred);
+      inferredMap.put(quality, inferred);
     }
     return inferred;
   }
diff --git a/compiler/java/com/google/dart/compiler/util/apache/FilenameUtils.java b/compiler/java/com/google/dart/compiler/util/apache/FilenameUtils.java
new file mode 100644
index 0000000..31288d3
--- /dev/null
+++ b/compiler/java/com/google/dart/compiler/util/apache/FilenameUtils.java
@@ -0,0 +1,1405 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.dart.compiler.util.apache;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Stack;
+
+/**
+ * General filename and filepath manipulation utilities.
+ * <p>
+ * When dealing with filenames you can hit problems when moving from a Windows
+ * based development machine to a Unix based production machine.
+ * This class aims to help avoid those problems.
+ * <p>
+ * <b>NOTE</b>: You may be able to avoid using this class entirely simply by
+ * using JDK {@link java.io.File File} objects and the two argument constructor
+ * {@link java.io.File#File(java.io.File, java.lang.String) File(File,String)}.
+ * <p>
+ * Most methods on this class are designed to work the same on both Unix and Windows.
+ * Those that don't include 'System', 'Unix' or 'Windows' in their name.
+ * <p>
+ * Most methods recognise both separators (forward and back), and both
+ * sets of prefixes. See the javadoc of each method for details.
+ * <p>
+ * This class defines six components within a filename
+ * (example C:\dev\project\file.txt):
+ * <ul>
+ * <li>the prefix - C:\</li>
+ * <li>the path - dev\project\</li>
+ * <li>the full path - C:\dev\project\</li>
+ * <li>the name - file.txt</li>
+ * <li>the base name - file</li>
+ * <li>the extension - txt</li>
+ * </ul>
+ * Note that this class works best if directory filenames end with a separator.
+ * If you omit the last separator, it is impossible to determine if the filename
+ * corresponds to a file or a directory. As a result, we have chosen to say
+ * it corresponds to a file.
+ * <p>
+ * This class only supports Unix and Windows style names.
+ * Prefixes are matched as follows:
+ * <pre>
+ * Windows:
+ * a\b\c.txt           --> ""          --> relative
+ * \a\b\c.txt          --> "\"         --> current drive absolute
+ * C:a\b\c.txt         --> "C:"        --> drive relative
+ * C:\a\b\c.txt        --> "C:\"       --> absolute
+ * \\server\a\b\c.txt  --> "\\server\" --> UNC
+ *
+ * Unix:
+ * a/b/c.txt           --> ""          --> relative
+ * /a/b/c.txt          --> "/"         --> absolute
+ * ~/a/b/c.txt         --> "~/"        --> current user
+ * ~                   --> "~/"        --> current user (slash added)
+ * ~user/a/b/c.txt     --> "~user/"    --> named user
+ * ~user               --> "~user/"    --> named user (slash added)
+ * </pre>
+ * Both prefix styles are matched always, irrespective of the machine that you are
+ * currently running on.
+ * <p>
+ * Origin of code: Excalibur, Alexandria, Tomcat, Commons-Utils.
+ *
+ * @version $Id: FilenameUtils.java 1307462 2012-03-30 15:13:11Z ggregory $
+ * @since 1.1
+ */
+public class FilenameUtils {
+
+    /**
+     * The extension separator character.
+     * @since 1.4
+     */
+    public static final char EXTENSION_SEPARATOR = '.';
+
+    /**
+     * The extension separator String.
+     * @since 1.4
+     */
+    public static final String EXTENSION_SEPARATOR_STR = Character.toString(EXTENSION_SEPARATOR);
+
+    /**
+     * The Unix separator character.
+     */
+    private static final char UNIX_SEPARATOR = '/';
+
+    /**
+     * The Windows separator character.
+     */
+    private static final char WINDOWS_SEPARATOR = '\\';
+
+    /**
+     * The system separator character.
+     */
+    private static final char SYSTEM_SEPARATOR = File.separatorChar;
+
+    /**
+     * The separator character that is the opposite of the system separator.
+     */
+    private static final char OTHER_SEPARATOR;
+    static {
+        if (isSystemWindows()) {
+            OTHER_SEPARATOR = UNIX_SEPARATOR;
+        } else {
+            OTHER_SEPARATOR = WINDOWS_SEPARATOR;
+        }
+    }
+
+    /**
+     * Instances should NOT be constructed in standard programming.
+     */
+    public FilenameUtils() {
+        super();
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Determines if Windows file system is in use.
+     * 
+     * @return true if the system is Windows
+     */
+    static boolean isSystemWindows() {
+        return SYSTEM_SEPARATOR == WINDOWS_SEPARATOR;
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Checks if the character is a separator.
+     * 
+     * @param ch  the character to check
+     * @return true if it is a separator character
+     */
+    private static boolean isSeparator(char ch) {
+        return ch == UNIX_SEPARATOR || ch == WINDOWS_SEPARATOR;
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Normalizes a path, removing double and single dot path steps.
+     * <p>
+     * This method normalizes a path to a standard format.
+     * The input may contain separators in either Unix or Windows format.
+     * The output will contain separators in the format of the system.
+     * <p>
+     * A trailing slash will be retained.
+     * A double slash will be merged to a single slash (but UNC names are handled).
+     * A single dot path segment will be removed.
+     * A double dot will cause that path segment and the one before to be removed.
+     * If the double dot has no parent path segment to work with, {@code null}
+     * is returned.
+     * <p>
+     * The output will be the same on both Unix and Windows except
+     * for the separator character.
+     * <pre>
+     * /foo//               -->   /foo/
+     * /foo/./              -->   /foo/
+     * /foo/../bar          -->   /bar
+     * /foo/../bar/         -->   /bar/
+     * /foo/../bar/../baz   -->   /baz
+     * //foo//./bar         -->   /foo/bar
+     * /../                 -->   null
+     * ../foo               -->   null
+     * foo/bar/..           -->   foo/
+     * foo/../../bar        -->   null
+     * foo/../bar           -->   bar
+     * //server/foo/../bar  -->   //server/bar
+     * //server/../bar      -->   null
+     * C:\foo\..\bar        -->   C:\bar
+     * C:\..\bar            -->   null
+     * ~/foo/../bar/        -->   ~/bar/
+     * ~/../bar             -->   null
+     * </pre>
+     * (Note the file separator returned will be correct for Windows/Unix)
+     *
+     * @param filename  the filename to normalize, null returns null
+     * @return the normalized filename, or null if invalid
+     */
+    public static String normalize(String filename) {
+        return doNormalize(filename, SYSTEM_SEPARATOR, true);
+    }
+    /**
+     * Normalizes a path, removing double and single dot path steps.
+     * <p>
+     * This method normalizes a path to a standard format.
+     * The input may contain separators in either Unix or Windows format.
+     * The output will contain separators in the format specified.
+     * <p>
+     * A trailing slash will be retained.
+     * A double slash will be merged to a single slash (but UNC names are handled).
+     * A single dot path segment will be removed.
+     * A double dot will cause that path segment and the one before to be removed.
+     * If the double dot has no parent path segment to work with, {@code null}
+     * is returned.
+     * <p>
+     * The output will be the same on both Unix and Windows except
+     * for the separator character.
+     * <pre>
+     * /foo//               -->   /foo/
+     * /foo/./              -->   /foo/
+     * /foo/../bar          -->   /bar
+     * /foo/../bar/         -->   /bar/
+     * /foo/../bar/../baz   -->   /baz
+     * //foo//./bar         -->   /foo/bar
+     * /../                 -->   null
+     * ../foo               -->   null
+     * foo/bar/..           -->   foo/
+     * foo/../../bar        -->   null
+     * foo/../bar           -->   bar
+     * //server/foo/../bar  -->   //server/bar
+     * //server/../bar      -->   null
+     * C:\foo\..\bar        -->   C:\bar
+     * C:\..\bar            -->   null
+     * ~/foo/../bar/        -->   ~/bar/
+     * ~/../bar             -->   null
+     * </pre>
+     * The output will be the same on both Unix and Windows including
+     * the separator character.
+     *
+     * @param filename  the filename to normalize, null returns null
+     * @param unixSeparator {@code true} if a unix separator should
+     * be used or {@code false} if a windows separator should be used.
+     * @return the normalized filename, or null if invalid
+     * @since 2.0
+     */
+    public static String normalize(String filename, boolean unixSeparator) {
+        char separator = unixSeparator ? UNIX_SEPARATOR : WINDOWS_SEPARATOR;
+        return doNormalize(filename, separator, true);
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Normalizes a path, removing double and single dot path steps,
+     * and removing any final directory separator.
+     * <p>
+     * This method normalizes a path to a standard format.
+     * The input may contain separators in either Unix or Windows format.
+     * The output will contain separators in the format of the system.
+     * <p>
+     * A trailing slash will be removed.
+     * A double slash will be merged to a single slash (but UNC names are handled).
+     * A single dot path segment will be removed.
+     * A double dot will cause that path segment and the one before to be removed.
+     * If the double dot has no parent path segment to work with, {@code null}
+     * is returned.
+     * <p>
+     * The output will be the same on both Unix and Windows except
+     * for the separator character.
+     * <pre>
+     * /foo//               -->   /foo
+     * /foo/./              -->   /foo
+     * /foo/../bar          -->   /bar
+     * /foo/../bar/         -->   /bar
+     * /foo/../bar/../baz   -->   /baz
+     * //foo//./bar         -->   /foo/bar
+     * /../                 -->   null
+     * ../foo               -->   null
+     * foo/bar/..           -->   foo
+     * foo/../../bar        -->   null
+     * foo/../bar           -->   bar
+     * //server/foo/../bar  -->   //server/bar
+     * //server/../bar      -->   null
+     * C:\foo\..\bar        -->   C:\bar
+     * C:\..\bar            -->   null
+     * ~/foo/../bar/        -->   ~/bar
+     * ~/../bar             -->   null
+     * </pre>
+     * (Note the file separator returned will be correct for Windows/Unix)
+     *
+     * @param filename  the filename to normalize, null returns null
+     * @return the normalized filename, or null if invalid
+     */
+    public static String normalizeNoEndSeparator(String filename) {
+        return doNormalize(filename, SYSTEM_SEPARATOR, false);
+    }
+
+    /**
+     * Normalizes a path, removing double and single dot path steps,
+     * and removing any final directory separator.
+     * <p>
+     * This method normalizes a path to a standard format.
+     * The input may contain separators in either Unix or Windows format.
+     * The output will contain separators in the format specified.
+     * <p>
+     * A trailing slash will be removed.
+     * A double slash will be merged to a single slash (but UNC names are handled).
+     * A single dot path segment will be removed.
+     * A double dot will cause that path segment and the one before to be removed.
+     * If the double dot has no parent path segment to work with, {@code null}
+     * is returned.
+     * <p>
+     * The output will be the same on both Unix and Windows including
+     * the separator character.
+     * <pre>
+     * /foo//               -->   /foo
+     * /foo/./              -->   /foo
+     * /foo/../bar          -->   /bar
+     * /foo/../bar/         -->   /bar
+     * /foo/../bar/../baz   -->   /baz
+     * //foo//./bar         -->   /foo/bar
+     * /../                 -->   null
+     * ../foo               -->   null
+     * foo/bar/..           -->   foo
+     * foo/../../bar        -->   null
+     * foo/../bar           -->   bar
+     * //server/foo/../bar  -->   //server/bar
+     * //server/../bar      -->   null
+     * C:\foo\..\bar        -->   C:\bar
+     * C:\..\bar            -->   null
+     * ~/foo/../bar/        -->   ~/bar
+     * ~/../bar             -->   null
+     * </pre>
+     *
+     * @param filename  the filename to normalize, null returns null
+     * @param unixSeparator {@code true} if a unix separator should
+     * be used or {@code false} if a windows separtor should be used.
+     * @return the normalized filename, or null if invalid
+     * @since 2.0
+     */
+    public static String normalizeNoEndSeparator(String filename, boolean unixSeparator) {
+         char separator = unixSeparator ? UNIX_SEPARATOR : WINDOWS_SEPARATOR;
+        return doNormalize(filename, separator, false);
+    }
+
+    /**
+     * Internal method to perform the normalization.
+     *
+     * @param filename  the filename
+     * @param separator The separator character to use
+     * @param keepSeparator  true to keep the final separator
+     * @return the normalized filename
+     */
+    private static String doNormalize(String filename, char separator, boolean keepSeparator) {
+        if (filename == null) {
+            return null;
+        }
+        int size = filename.length();
+        if (size == 0) {
+            return filename;
+        }
+        int prefix = getPrefixLength(filename);
+        if (prefix < 0) {
+            return null;
+        }
+        
+        char[] array = new char[size + 2];  // +1 for possible extra slash, +2 for arraycopy
+        filename.getChars(0, filename.length(), array, 0);
+        
+        // fix separators throughout
+        char otherSeparator = separator == SYSTEM_SEPARATOR ? OTHER_SEPARATOR : SYSTEM_SEPARATOR;
+        for (int i = 0; i < array.length; i++) {
+            if (array[i] == otherSeparator) {
+                array[i] = separator;
+            }
+        }
+        
+        // add extra separator on the end to simplify code below
+        boolean lastIsDirectory = true;
+        if (array[size - 1] != separator) {
+            array[size++] = separator;
+            lastIsDirectory = false;
+        }
+        
+        // adjoining slashes
+        for (int i = prefix + 1; i < size; i++) {
+            if (array[i] == separator && array[i - 1] == separator) {
+                System.arraycopy(array, i, array, i - 1, size - i);
+                size--;
+                i--;
+            }
+        }
+        
+        // dot slash
+        for (int i = prefix + 1; i < size; i++) {
+            if (array[i] == separator && array[i - 1] == '.' &&
+                    (i == prefix + 1 || array[i - 2] == separator)) {
+                if (i == size - 1) {
+                    lastIsDirectory = true;
+                }
+                System.arraycopy(array, i + 1, array, i - 1, size - i);
+                size -=2;
+                i--;
+            }
+        }
+        
+        // double dot slash
+        outer:
+        for (int i = prefix + 2; i < size; i++) {
+            if (array[i] == separator && array[i - 1] == '.' && array[i - 2] == '.' &&
+                    (i == prefix + 2 || array[i - 3] == separator)) {
+                if (i == prefix + 2) {
+                    return null;
+                }
+                if (i == size - 1) {
+                    lastIsDirectory = true;
+                }
+                int j;
+                for (j = i - 4 ; j >= prefix; j--) {
+                    if (array[j] == separator) {
+                        // remove b/../ from a/b/../c
+                        System.arraycopy(array, i + 1, array, j + 1, size - i);
+                        size -= i - j;
+                        i = j + 1;
+                        continue outer;
+                    }
+                }
+                // remove a/../ from a/../c
+                System.arraycopy(array, i + 1, array, prefix, size - i);
+                size -= i + 1 - prefix;
+                i = prefix + 1;
+            }
+        }
+        
+        if (size <= 0) {  // should never be less than 0
+            return "";
+        }
+        if (size <= prefix) {  // should never be less than prefix
+            return new String(array, 0, size);
+        }
+        if (lastIsDirectory && keepSeparator) {
+            return new String(array, 0, size);  // keep trailing separator
+        }
+        return new String(array, 0, size - 1);  // lose trailing separator
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Concatenates a filename to a base path using normal command line style rules.
+     * <p>
+     * The effect is equivalent to resultant directory after changing
+     * directory to the first argument, followed by changing directory to
+     * the second argument.
+     * <p>
+     * The first argument is the base path, the second is the path to concatenate.
+     * The returned path is always normalized via {@link #normalize(String)},
+     * thus <code>..</code> is handled.
+     * <p>
+     * If <code>pathToAdd</code> is absolute (has an absolute prefix), then
+     * it will be normalized and returned.
+     * Otherwise, the paths will be joined, normalized and returned.
+     * <p>
+     * The output will be the same on both Unix and Windows except
+     * for the separator character.
+     * <pre>
+     * /foo/ + bar          -->   /foo/bar
+     * /foo + bar           -->   /foo/bar
+     * /foo + /bar          -->   /bar
+     * /foo + C:/bar        -->   C:/bar
+     * /foo + C:bar         -->   C:bar (*)
+     * /foo/a/ + ../bar     -->   foo/bar
+     * /foo/ + ../../bar    -->   null
+     * /foo/ + /bar         -->   /bar
+     * /foo/.. + /bar       -->   /bar
+     * /foo + bar/c.txt     -->   /foo/bar/c.txt
+     * /foo/c.txt + bar     -->   /foo/c.txt/bar (!)
+     * </pre>
+     * (*) Note that the Windows relative drive prefix is unreliable when
+     * used with this method.
+     * (!) Note that the first parameter must be a path. If it ends with a name, then
+     * the name will be built into the concatenated path. If this might be a problem,
+     * use {@link #getFullPath(String)} on the base path argument.
+     *
+     * @param basePath  the base path to attach to, always treated as a path
+     * @param fullFilenameToAdd  the filename (or path) to attach to the base
+     * @return the concatenated path, or null if invalid
+     */
+    public static String concat(String basePath, String fullFilenameToAdd) {
+        int prefix = getPrefixLength(fullFilenameToAdd);
+        if (prefix < 0) {
+            return null;
+        }
+        if (prefix > 0) {
+            return normalize(fullFilenameToAdd);
+        }
+        if (basePath == null) {
+            return null;
+        }
+        int len = basePath.length();
+        if (len == 0) {
+            return normalize(fullFilenameToAdd);
+        }
+        char ch = basePath.charAt(len - 1);
+        if (isSeparator(ch)) {
+            return normalize(basePath + fullFilenameToAdd);
+        } else {
+            return normalize(basePath + '/' + fullFilenameToAdd);
+        }
+    }
+
+    /**
+     * Determines whether the {@code parent} directory contains the {@code child} element (a file or directory).
+     * <p>
+     * The files names are expected to be normalized.
+     * </p>
+     * 
+     * Edge cases:
+     * <ul>
+     * <li>A {@code directory} must not be null: if null, throw IllegalArgumentException</li>
+     * <li>A directory does not contain itself: return false</li>
+     * <li>A null child file is not contained in any parent: return false</li>
+     * </ul>
+     * 
+     * @param canonicalParent
+     *            the file to consider as the parent.
+     * @param canonicalChild
+     *            the file to consider as the child.
+     * @return true is the candidate leaf is under by the specified composite. False otherwise.
+     * @throws IOException
+     *             if an IO error occurs while checking the files.
+     * @since 2.2
+     * @see FileUtils#directoryContains(File, File)
+     */
+    public static boolean directoryContains(final String canonicalParent, final String canonicalChild)
+            throws IOException {
+
+        // Fail fast against NullPointerException
+        if (canonicalParent == null) {
+            throw new IllegalArgumentException("Directory must not be null");
+        }
+
+        if (canonicalChild == null) {
+            return false;
+        }
+
+        if (IOCase.SYSTEM.checkEquals(canonicalParent, canonicalChild)) {
+            return false;
+        }
+
+        return IOCase.SYSTEM.checkStartsWith(canonicalChild, canonicalParent);
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Converts all separators to the Unix separator of forward slash.
+     * 
+     * @param path  the path to be changed, null ignored
+     * @return the updated path
+     */
+    public static String separatorsToUnix(String path) {
+        if (path == null || path.indexOf(WINDOWS_SEPARATOR) == -1) {
+            return path;
+        }
+        return path.replace(WINDOWS_SEPARATOR, UNIX_SEPARATOR);
+    }
+
+    /**
+     * Converts all separators to the Windows separator of backslash.
+     * 
+     * @param path  the path to be changed, null ignored
+     * @return the updated path
+     */
+    public static String separatorsToWindows(String path) {
+        if (path == null || path.indexOf(UNIX_SEPARATOR) == -1) {
+            return path;
+        }
+        return path.replace(UNIX_SEPARATOR, WINDOWS_SEPARATOR);
+    }
+
+    /**
+     * Converts all separators to the system separator.
+     * 
+     * @param path  the path to be changed, null ignored
+     * @return the updated path
+     */
+    public static String separatorsToSystem(String path) {
+        if (path == null) {
+            return null;
+        }
+        if (isSystemWindows()) {
+            return separatorsToWindows(path);
+        } else {
+            return separatorsToUnix(path);
+        }
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Returns the length of the filename prefix, such as <code>C:/</code> or <code>~/</code>.
+     * <p>
+     * This method will handle a file in either Unix or Windows format.
+     * <p>
+     * The prefix length includes the first slash in the full filename
+     * if applicable. Thus, it is possible that the length returned is greater
+     * than the length of the input string.
+     * <pre>
+     * Windows:
+     * a\b\c.txt           --> ""          --> relative
+     * \a\b\c.txt          --> "\"         --> current drive absolute
+     * C:a\b\c.txt         --> "C:"        --> drive relative
+     * C:\a\b\c.txt        --> "C:\"       --> absolute
+     * \\server\a\b\c.txt  --> "\\server\" --> UNC
+     *
+     * Unix:
+     * a/b/c.txt           --> ""          --> relative
+     * /a/b/c.txt          --> "/"         --> absolute
+     * ~/a/b/c.txt         --> "~/"        --> current user
+     * ~                   --> "~/"        --> current user (slash added)
+     * ~user/a/b/c.txt     --> "~user/"    --> named user
+     * ~user               --> "~user/"    --> named user (slash added)
+     * </pre>
+     * <p>
+     * The output will be the same irrespective of the machine that the code is running on.
+     * ie. both Unix and Windows prefixes are matched regardless.
+     *
+     * @param filename  the filename to find the prefix in, null returns -1
+     * @return the length of the prefix, -1 if invalid or null
+     */
+    public static int getPrefixLength(String filename) {
+        if (filename == null) {
+            return -1;
+        }
+        int len = filename.length();
+        if (len == 0) {
+            return 0;
+        }
+        char ch0 = filename.charAt(0);
+        if (ch0 == ':') {
+            return -1;
+        }
+        if (len == 1) {
+            if (ch0 == '~') {
+                return 2;  // return a length greater than the input
+            }
+            return isSeparator(ch0) ? 1 : 0;
+        } else {
+            if (ch0 == '~') {
+                int posUnix = filename.indexOf(UNIX_SEPARATOR, 1);
+                int posWin = filename.indexOf(WINDOWS_SEPARATOR, 1);
+                if (posUnix == -1 && posWin == -1) {
+                    return len + 1;  // return a length greater than the input
+                }
+                posUnix = posUnix == -1 ? posWin : posUnix;
+                posWin = posWin == -1 ? posUnix : posWin;
+                return Math.min(posUnix, posWin) + 1;
+            }
+            char ch1 = filename.charAt(1);
+            if (ch1 == ':') {
+                ch0 = Character.toUpperCase(ch0);
+                if (ch0 >= 'A' && ch0 <= 'Z') {
+                    if (len == 2 || isSeparator(filename.charAt(2)) == false) {
+                        return 2;
+                    }
+                    return 3;
+                }
+                return -1;
+                
+            } else if (isSeparator(ch0) && isSeparator(ch1)) {
+                int posUnix = filename.indexOf(UNIX_SEPARATOR, 2);
+                int posWin = filename.indexOf(WINDOWS_SEPARATOR, 2);
+                if (posUnix == -1 && posWin == -1 || posUnix == 2 || posWin == 2) {
+                    return -1;
+                }
+                posUnix = posUnix == -1 ? posWin : posUnix;
+                posWin = posWin == -1 ? posUnix : posWin;
+                return Math.min(posUnix, posWin) + 1;
+            } else {
+                return isSeparator(ch0) ? 1 : 0;
+            }
+        }
+    }
+
+    /**
+     * Returns the index of the last directory separator character.
+     * <p>
+     * This method will handle a file in either Unix or Windows format.
+     * The position of the last forward or backslash is returned.
+     * <p>
+     * The output will be the same irrespective of the machine that the code is running on.
+     * 
+     * @param filename  the filename to find the last path separator in, null returns -1
+     * @return the index of the last separator character, or -1 if there
+     * is no such character
+     */
+    public static int indexOfLastSeparator(String filename) {
+        if (filename == null) {
+            return -1;
+        }
+        int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR);
+        int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR);
+        return Math.max(lastUnixPos, lastWindowsPos);
+    }
+
+    /**
+     * Returns the index of the last extension separator character, which is a dot.
+     * <p>
+     * This method also checks that there is no directory separator after the last dot.
+     * To do this it uses {@link #indexOfLastSeparator(String)} which will
+     * handle a file in either Unix or Windows format.
+     * <p>
+     * The output will be the same irrespective of the machine that the code is running on.
+     * 
+     * @param filename  the filename to find the last path separator in, null returns -1
+     * @return the index of the last separator character, or -1 if there
+     * is no such character
+     */
+    public static int indexOfExtension(String filename) {
+        if (filename == null) {
+            return -1;
+        }
+        int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
+        int lastSeparator = indexOfLastSeparator(filename);
+        return lastSeparator > extensionPos ? -1 : extensionPos;
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Gets the prefix from a full filename, such as <code>C:/</code>
+     * or <code>~/</code>.
+     * <p>
+     * This method will handle a file in either Unix or Windows format.
+     * The prefix includes the first slash in the full filename where applicable.
+     * <pre>
+     * Windows:
+     * a\b\c.txt           --> ""          --> relative
+     * \a\b\c.txt          --> "\"         --> current drive absolute
+     * C:a\b\c.txt         --> "C:"        --> drive relative
+     * C:\a\b\c.txt        --> "C:\"       --> absolute
+     * \\server\a\b\c.txt  --> "\\server\" --> UNC
+     *
+     * Unix:
+     * a/b/c.txt           --> ""          --> relative
+     * /a/b/c.txt          --> "/"         --> absolute
+     * ~/a/b/c.txt         --> "~/"        --> current user
+     * ~                   --> "~/"        --> current user (slash added)
+     * ~user/a/b/c.txt     --> "~user/"    --> named user
+     * ~user               --> "~user/"    --> named user (slash added)
+     * </pre>
+     * <p>
+     * The output will be the same irrespective of the machine that the code is running on.
+     * ie. both Unix and Windows prefixes are matched regardless.
+     *
+     * @param filename  the filename to query, null returns null
+     * @return the prefix of the file, null if invalid
+     */
+    public static String getPrefix(String filename) {
+        if (filename == null) {
+            return null;
+        }
+        int len = getPrefixLength(filename);
+        if (len < 0) {
+            return null;
+        }
+        if (len > filename.length()) {
+            return filename + UNIX_SEPARATOR;  // we know this only happens for unix
+        }
+        return filename.substring(0, len);
+    }
+
+    /**
+     * Gets the path from a full filename, which excludes the prefix.
+     * <p>
+     * This method will handle a file in either Unix or Windows format.
+     * The method is entirely text based, and returns the text before and
+     * including the last forward or backslash.
+     * <pre>
+     * C:\a\b\c.txt --> a\b\
+     * ~/a/b/c.txt  --> a/b/
+     * a.txt        --> ""
+     * a/b/c        --> a/b/
+     * a/b/c/       --> a/b/c/
+     * </pre>
+     * <p>
+     * The output will be the same irrespective of the machine that the code is running on.
+     * <p>
+     * This method drops the prefix from the result.
+     * See {@link #getFullPath(String)} for the method that retains the prefix.
+     *
+     * @param filename  the filename to query, null returns null
+     * @return the path of the file, an empty string if none exists, null if invalid
+     */
+    public static String getPath(String filename) {
+        return doGetPath(filename, 1);
+    }
+
+    /**
+     * Gets the path from a full filename, which excludes the prefix, and
+     * also excluding the final directory separator.
+     * <p>
+     * This method will handle a file in either Unix or Windows format.
+     * The method is entirely text based, and returns the text before the
+     * last forward or backslash.
+     * <pre>
+     * C:\a\b\c.txt --> a\b
+     * ~/a/b/c.txt  --> a/b
+     * a.txt        --> ""
+     * a/b/c        --> a/b
+     * a/b/c/       --> a/b/c
+     * </pre>
+     * <p>
+     * The output will be the same irrespective of the machine that the code is running on.
+     * <p>
+     * This method drops the prefix from the result.
+     * See {@link #getFullPathNoEndSeparator(String)} for the method that retains the prefix.
+     *
+     * @param filename  the filename to query, null returns null
+     * @return the path of the file, an empty string if none exists, null if invalid
+     */
+    public static String getPathNoEndSeparator(String filename) {
+        return doGetPath(filename, 0);
+    }
+
+    /**
+     * Does the work of getting the path.
+     * 
+     * @param filename  the filename
+     * @param separatorAdd  0 to omit the end separator, 1 to return it
+     * @return the path
+     */
+    private static String doGetPath(String filename, int separatorAdd) {
+        if (filename == null) {
+            return null;
+        }
+        int prefix = getPrefixLength(filename);
+        if (prefix < 0) {
+            return null;
+        }
+        int index = indexOfLastSeparator(filename);
+        int endIndex = index+separatorAdd;
+        if (prefix >= filename.length() || index < 0 || prefix >= endIndex) {
+            return "";
+        }
+        return filename.substring(prefix, endIndex);
+    }
+
+    /**
+     * Gets the full path from a full filename, which is the prefix + path.
+     * <p>
+     * This method will handle a file in either Unix or Windows format.
+     * The method is entirely text based, and returns the text before and
+     * including the last forward or backslash.
+     * <pre>
+     * C:\a\b\c.txt --> C:\a\b\
+     * ~/a/b/c.txt  --> ~/a/b/
+     * a.txt        --> ""
+     * a/b/c        --> a/b/
+     * a/b/c/       --> a/b/c/
+     * C:           --> C:
+     * C:\          --> C:\
+     * ~            --> ~/
+     * ~/           --> ~/
+     * ~user        --> ~user/
+     * ~user/       --> ~user/
+     * </pre>
+     * <p>
+     * The output will be the same irrespective of the machine that the code is running on.
+     *
+     * @param filename  the filename to query, null returns null
+     * @return the path of the file, an empty string if none exists, null if invalid
+     */
+    public static String getFullPath(String filename) {
+        return doGetFullPath(filename, true);
+    }
+
+    /**
+     * Gets the full path from a full filename, which is the prefix + path,
+     * and also excluding the final directory separator.
+     * <p>
+     * This method will handle a file in either Unix or Windows format.
+     * The method is entirely text based, and returns the text before the
+     * last forward or backslash.
+     * <pre>
+     * C:\a\b\c.txt --> C:\a\b
+     * ~/a/b/c.txt  --> ~/a/b
+     * a.txt        --> ""
+     * a/b/c        --> a/b
+     * a/b/c/       --> a/b/c
+     * C:           --> C:
+     * C:\          --> C:\
+     * ~            --> ~
+     * ~/           --> ~
+     * ~user        --> ~user
+     * ~user/       --> ~user
+     * </pre>
+     * <p>
+     * The output will be the same irrespective of the machine that the code is running on.
+     *
+     * @param filename  the filename to query, null returns null
+     * @return the path of the file, an empty string if none exists, null if invalid
+     */
+    public static String getFullPathNoEndSeparator(String filename) {
+        return doGetFullPath(filename, false);
+    }
+
+    /**
+     * Does the work of getting the path.
+     * 
+     * @param filename  the filename
+     * @param includeSeparator  true to include the end separator
+     * @return the path
+     */
+    private static String doGetFullPath(String filename, boolean includeSeparator) {
+        if (filename == null) {
+            return null;
+        }
+        int prefix = getPrefixLength(filename);
+        if (prefix < 0) {
+            return null;
+        }
+        if (prefix >= filename.length()) {
+            if (includeSeparator) {
+                return getPrefix(filename);  // add end slash if necessary
+            } else {
+                return filename;
+            }
+        }
+        int index = indexOfLastSeparator(filename);
+        if (index < 0) {
+            return filename.substring(0, prefix);
+        }
+        int end = index + (includeSeparator ?  1 : 0);
+        if (end == 0) {
+            end++;
+        }
+        return filename.substring(0, end);
+    }
+
+    /**
+     * Gets the name minus the path from a full filename.
+     * <p>
+     * This method will handle a file in either Unix or Windows format.
+     * The text after the last forward or backslash is returned.
+     * <pre>
+     * a/b/c.txt --> c.txt
+     * a.txt     --> a.txt
+     * a/b/c     --> c
+     * a/b/c/    --> ""
+     * </pre>
+     * <p>
+     * The output will be the same irrespective of the machine that the code is running on.
+     *
+     * @param filename  the filename to query, null returns null
+     * @return the name of the file without the path, or an empty string if none exists
+     */
+    public static String getName(String filename) {
+        if (filename == null) {
+            return null;
+        }
+        int index = indexOfLastSeparator(filename);
+        return filename.substring(index + 1);
+    }
+
+    /**
+     * Gets the base name, minus the full path and extension, from a full filename.
+     * <p>
+     * This method will handle a file in either Unix or Windows format.
+     * The text after the last forward or backslash and before the last dot is returned.
+     * <pre>
+     * a/b/c.txt --> c
+     * a.txt     --> a
+     * a/b/c     --> c
+     * a/b/c/    --> ""
+     * </pre>
+     * <p>
+     * The output will be the same irrespective of the machine that the code is running on.
+     *
+     * @param filename  the filename to query, null returns null
+     * @return the name of the file without the path, or an empty string if none exists
+     */
+    public static String getBaseName(String filename) {
+        return removeExtension(getName(filename));
+    }
+
+    /**
+     * Gets the extension of a filename.
+     * <p>
+     * This method returns the textual part of the filename after the last dot.
+     * There must be no directory separator after the dot.
+     * <pre>
+     * foo.txt      --> "txt"
+     * a/b/c.jpg    --> "jpg"
+     * a/b.txt/c    --> ""
+     * a/b/c        --> ""
+     * </pre>
+     * <p>
+     * The output will be the same irrespective of the machine that the code is running on.
+     *
+     * @param filename the filename to retrieve the extension of.
+     * @return the extension of the file or an empty string if none exists or {@code null}
+     * if the filename is {@code null}.
+     */
+    public static String getExtension(String filename) {
+        if (filename == null) {
+            return null;
+        }
+        int index = indexOfExtension(filename);
+        if (index == -1) {
+            return "";
+        } else {
+            return filename.substring(index + 1);
+        }
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Removes the extension from a filename.
+     * <p>
+     * This method returns the textual part of the filename before the last dot.
+     * There must be no directory separator after the dot.
+     * <pre>
+     * foo.txt    --> foo
+     * a\b\c.jpg  --> a\b\c
+     * a\b\c      --> a\b\c
+     * a.b\c      --> a.b\c
+     * </pre>
+     * <p>
+     * The output will be the same irrespective of the machine that the code is running on.
+     *
+     * @param filename  the filename to query, null returns null
+     * @return the filename minus the extension
+     */
+    public static String removeExtension(String filename) {
+        if (filename == null) {
+            return null;
+        }
+        int index = indexOfExtension(filename);
+        if (index == -1) {
+            return filename;
+        } else {
+            return filename.substring(0, index);
+        }
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Checks whether two filenames are equal exactly.
+     * <p>
+     * No processing is performed on the filenames other than comparison,
+     * thus this is merely a null-safe case-sensitive equals.
+     *
+     * @param filename1  the first filename to query, may be null
+     * @param filename2  the second filename to query, may be null
+     * @return true if the filenames are equal, null equals null
+     * @see IOCase#SENSITIVE
+     */
+    public static boolean equals(String filename1, String filename2) {
+        return equals(filename1, filename2, false, IOCase.SENSITIVE);
+    }
+
+    /**
+     * Checks whether two filenames are equal using the case rules of the system.
+     * <p>
+     * No processing is performed on the filenames other than comparison.
+     * The check is case-sensitive on Unix and case-insensitive on Windows.
+     *
+     * @param filename1  the first filename to query, may be null
+     * @param filename2  the second filename to query, may be null
+     * @return true if the filenames are equal, null equals null
+     * @see IOCase#SYSTEM
+     */
+    public static boolean equalsOnSystem(String filename1, String filename2) {
+        return equals(filename1, filename2, false, IOCase.SYSTEM);
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Checks whether two filenames are equal after both have been normalized.
+     * <p>
+     * Both filenames are first passed to {@link #normalize(String)}.
+     * The check is then performed in a case-sensitive manner.
+     *
+     * @param filename1  the first filename to query, may be null
+     * @param filename2  the second filename to query, may be null
+     * @return true if the filenames are equal, null equals null
+     * @see IOCase#SENSITIVE
+     */
+    public static boolean equalsNormalized(String filename1, String filename2) {
+        return equals(filename1, filename2, true, IOCase.SENSITIVE);
+    }
+
+    /**
+     * Checks whether two filenames are equal after both have been normalized
+     * and using the case rules of the system.
+     * <p>
+     * Both filenames are first passed to {@link #normalize(String)}.
+     * The check is then performed case-sensitive on Unix and
+     * case-insensitive on Windows.
+     *
+     * @param filename1  the first filename to query, may be null
+     * @param filename2  the second filename to query, may be null
+     * @return true if the filenames are equal, null equals null
+     * @see IOCase#SYSTEM
+     */
+    public static boolean equalsNormalizedOnSystem(String filename1, String filename2) {
+        return equals(filename1, filename2, true, IOCase.SYSTEM);
+    }
+
+    /**
+     * Checks whether two filenames are equal, optionally normalizing and providing
+     * control over the case-sensitivity.
+     *
+     * @param filename1  the first filename to query, may be null
+     * @param filename2  the second filename to query, may be null
+     * @param normalized  whether to normalize the filenames
+     * @param caseSensitivity  what case sensitivity rule to use, null means case-sensitive
+     * @return true if the filenames are equal, null equals null
+     * @since 1.3
+     */
+    public static boolean equals(
+            String filename1, String filename2,
+            boolean normalized, IOCase caseSensitivity) {
+        
+        if (filename1 == null || filename2 == null) {
+            return filename1 == null && filename2 == null;
+        }
+        if (normalized) {
+            filename1 = normalize(filename1);
+            filename2 = normalize(filename2);
+            if (filename1 == null || filename2 == null) {
+                throw new NullPointerException(
+                    "Error normalizing one or both of the file names");
+            }
+        }
+        if (caseSensitivity == null) {
+            caseSensitivity = IOCase.SENSITIVE;
+        }
+        return caseSensitivity.checkEquals(filename1, filename2);
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Checks whether the extension of the filename is that specified.
+     * <p>
+     * This method obtains the extension as the textual part of the filename
+     * after the last dot. There must be no directory separator after the dot.
+     * The extension check is case-sensitive on all platforms.
+     *
+     * @param filename  the filename to query, null returns false
+     * @param extension  the extension to check for, null or empty checks for no extension
+     * @return true if the filename has the specified extension
+     */
+    public static boolean isExtension(String filename, String extension) {
+        if (filename == null) {
+            return false;
+        }
+        if (extension == null || extension.length() == 0) {
+            return indexOfExtension(filename) == -1;
+        }
+        String fileExt = getExtension(filename);
+        return fileExt.equals(extension);
+    }
+
+    /**
+     * Checks whether the extension of the filename is one of those specified.
+     * <p>
+     * This method obtains the extension as the textual part of the filename
+     * after the last dot. There must be no directory separator after the dot.
+     * The extension check is case-sensitive on all platforms.
+     *
+     * @param filename  the filename to query, null returns false
+     * @param extensions  the extensions to check for, null checks for no extension
+     * @return true if the filename is one of the extensions
+     */
+    public static boolean isExtension(String filename, String[] extensions) {
+        if (filename == null) {
+            return false;
+        }
+        if (extensions == null || extensions.length == 0) {
+            return indexOfExtension(filename) == -1;
+        }
+        String fileExt = getExtension(filename);
+        for (String extension : extensions) {
+            if (fileExt.equals(extension)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Checks whether the extension of the filename is one of those specified.
+     * <p>
+     * This method obtains the extension as the textual part of the filename
+     * after the last dot. There must be no directory separator after the dot.
+     * The extension check is case-sensitive on all platforms.
+     *
+     * @param filename  the filename to query, null returns false
+     * @param extensions  the extensions to check for, null checks for no extension
+     * @return true if the filename is one of the extensions
+     */
+    public static boolean isExtension(String filename, Collection<String> extensions) {
+        if (filename == null) {
+            return false;
+        }
+        if (extensions == null || extensions.isEmpty()) {
+            return indexOfExtension(filename) == -1;
+        }
+        String fileExt = getExtension(filename);
+        for (String extension : extensions) {
+            if (fileExt.equals(extension)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Checks a filename to see if it matches the specified wildcard matcher,
+     * always testing case-sensitive.
+     * <p>
+     * The wildcard matcher uses the characters '?' and '*' to represent a
+     * single or multiple (zero or more) wildcard characters.
+     * This is the same as often found on Dos/Unix command lines.
+     * The check is case-sensitive always.
+     * <pre>
+     * wildcardMatch("c.txt", "*.txt")      --> true
+     * wildcardMatch("c.txt", "*.jpg")      --> false
+     * wildcardMatch("a/b/c.txt", "a/b/*")  --> true
+     * wildcardMatch("c.txt", "*.???")      --> true
+     * wildcardMatch("c.txt", "*.????")     --> false
+     * </pre>
+     * N.B. the sequence "*?" does not work properly at present in match strings.
+     * 
+     * @param filename  the filename to match on
+     * @param wildcardMatcher  the wildcard string to match against
+     * @return true if the filename matches the wilcard string
+     * @see IOCase#SENSITIVE
+     */
+    public static boolean wildcardMatch(String filename, String wildcardMatcher) {
+        return wildcardMatch(filename, wildcardMatcher, IOCase.SENSITIVE);
+    }
+
+    /**
+     * Checks a filename to see if it matches the specified wildcard matcher
+     * using the case rules of the system.
+     * <p>
+     * The wildcard matcher uses the characters '?' and '*' to represent a
+     * single or multiple (zero or more) wildcard characters.
+     * This is the same as often found on Dos/Unix command lines.
+     * The check is case-sensitive on Unix and case-insensitive on Windows.
+     * <pre>
+     * wildcardMatch("c.txt", "*.txt")      --> true
+     * wildcardMatch("c.txt", "*.jpg")      --> false
+     * wildcardMatch("a/b/c.txt", "a/b/*")  --> true
+     * wildcardMatch("c.txt", "*.???")      --> true
+     * wildcardMatch("c.txt", "*.????")     --> false
+     * </pre>
+     * N.B. the sequence "*?" does not work properly at present in match strings.
+     * 
+     * @param filename  the filename to match on
+     * @param wildcardMatcher  the wildcard string to match against
+     * @return true if the filename matches the wilcard string
+     * @see IOCase#SYSTEM
+     */
+    public static boolean wildcardMatchOnSystem(String filename, String wildcardMatcher) {
+        return wildcardMatch(filename, wildcardMatcher, IOCase.SYSTEM);
+    }
+
+    /**
+     * Checks a filename to see if it matches the specified wildcard matcher
+     * allowing control over case-sensitivity.
+     * <p>
+     * The wildcard matcher uses the characters '?' and '*' to represent a
+     * single or multiple (zero or more) wildcard characters.
+     * N.B. the sequence "*?" does not work properly at present in match strings.
+     * 
+     * @param filename  the filename to match on
+     * @param wildcardMatcher  the wildcard string to match against
+     * @param caseSensitivity  what case sensitivity rule to use, null means case-sensitive
+     * @return true if the filename matches the wilcard string
+     * @since 1.3
+     */
+    public static boolean wildcardMatch(String filename, String wildcardMatcher, IOCase caseSensitivity) {
+        if (filename == null && wildcardMatcher == null) {
+            return true;
+        }
+        if (filename == null || wildcardMatcher == null) {
+            return false;
+        }
+        if (caseSensitivity == null) {
+            caseSensitivity = IOCase.SENSITIVE;
+        }
+        String[] wcs = splitOnTokens(wildcardMatcher);
+        boolean anyChars = false;
+        int textIdx = 0;
+        int wcsIdx = 0;
+        Stack<int[]> backtrack = new Stack<int[]>();
+        
+        // loop around a backtrack stack, to handle complex * matching
+        do {
+            if (backtrack.size() > 0) {
+                int[] array = backtrack.pop();
+                wcsIdx = array[0];
+                textIdx = array[1];
+                anyChars = true;
+            }
+            
+            // loop whilst tokens and text left to process
+            while (wcsIdx < wcs.length) {
+      
+                if (wcs[wcsIdx].equals("?")) {
+                    // ? so move to next text char
+                    textIdx++;
+                    if (textIdx > filename.length()) {
+                        break;
+                    }
+                    anyChars = false;
+                    
+                } else if (wcs[wcsIdx].equals("*")) {
+                    // set any chars status
+                    anyChars = true;
+                    if (wcsIdx == wcs.length - 1) {
+                        textIdx = filename.length();
+                    }
+                    
+                } else {
+                    // matching text token
+                    if (anyChars) {
+                        // any chars then try to locate text token
+                        textIdx = caseSensitivity.checkIndexOf(filename, textIdx, wcs[wcsIdx]);
+                        if (textIdx == -1) {
+                            // token not found
+                            break;
+                        }
+                        int repeat = caseSensitivity.checkIndexOf(filename, textIdx + 1, wcs[wcsIdx]);
+                        if (repeat >= 0) {
+                            backtrack.push(new int[] {wcsIdx, repeat});
+                        }
+                    } else {
+                        // matching from current position
+                        if (!caseSensitivity.checkRegionMatches(filename, textIdx, wcs[wcsIdx])) {
+                            // couldnt match token
+                            break;
+                        }
+                    }
+      
+                    // matched text token, move text index to end of matched token
+                    textIdx += wcs[wcsIdx].length();
+                    anyChars = false;
+                }
+      
+                wcsIdx++;
+            }
+            
+            // full match
+            if (wcsIdx == wcs.length && textIdx == filename.length()) {
+                return true;
+            }
+            
+        } while (backtrack.size() > 0);
+  
+        return false;
+    }
+
+    /**
+     * Splits a string into a number of tokens.
+     * The text is split by '?' and '*'.
+     * Where multiple '*' occur consecutively they are collapsed into a single '*'.
+     * 
+     * @param text  the text to split
+     * @return the array of tokens, never null
+     */
+    static String[] splitOnTokens(String text) {
+        // used by wildcardMatch
+        // package level so a unit test may run on this
+        
+        if (text.indexOf('?') == -1 && text.indexOf('*') == -1) {
+            return new String[] { text };
+        }
+
+        char[] array = text.toCharArray();
+        ArrayList<String> list = new ArrayList<String>();
+        StringBuilder buffer = new StringBuilder();
+        for (int i = 0; i < array.length; i++) {
+            if (array[i] == '?' || array[i] == '*') {
+                if (buffer.length() != 0) {
+                    list.add(buffer.toString());
+                    buffer.setLength(0);
+                }
+                if (array[i] == '?') {
+                    list.add("?");
+                } else if (list.isEmpty() ||
+                        i > 0 && list.get(list.size() - 1).equals("*") == false) {
+                    list.add("*");
+                }
+            } else {
+                buffer.append(array[i]);
+            }
+        }
+        if (buffer.length() != 0) {
+            list.add(buffer.toString());
+        }
+
+        return list.toArray( new String[ list.size() ] );
+    }
+
+}
diff --git a/compiler/java/com/google/dart/compiler/util/apache/IOCase.java b/compiler/java/com/google/dart/compiler/util/apache/IOCase.java
new file mode 100644
index 0000000..f635bed
--- /dev/null
+++ b/compiler/java/com/google/dart/compiler/util/apache/IOCase.java
@@ -0,0 +1,260 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.dart.compiler.util.apache;
+
+import java.io.Serializable;
+
+/**
+ * Enumeration of IO case sensitivity.
+ * <p>
+ * Different filing systems have different rules for case-sensitivity.
+ * Windows is case-insensitive, Unix is case-sensitive.
+ * <p>
+ * This class captures that difference, providing an enumeration to
+ * control how filename comparisons should be performed. It also provides
+ * methods that use the enumeration to perform comparisons.
+ * <p>
+ * Wherever possible, you should use the <code>check</code> methods in this
+ * class to compare filenames.
+ *
+ * @version $Id: IOCase.java 1307459 2012-03-30 15:11:44Z ggregory $
+ * @since 1.3
+ */
+public final class IOCase implements Serializable {
+
+    /**
+     * The constant for case sensitive regardless of operating system.
+     */
+    public static final IOCase SENSITIVE = new IOCase("Sensitive", true);
+    
+    /**
+     * The constant for case insensitive regardless of operating system.
+     */
+    public static final IOCase INSENSITIVE = new IOCase("Insensitive", false);
+    
+    /**
+     * The constant for case sensitivity determined by the current operating system.
+     * Windows is case-insensitive when comparing filenames, Unix is case-sensitive.
+     * <p>
+     * <strong>Note:</strong> This only caters for Windows and Unix. Other operating
+     * systems (e.g. OSX and OpenVMS) are treated as case sensitive if they use the
+     * Unix file separator and case-insensitive if they use the Windows file separator
+     * (see {@link java.io.File#separatorChar}).
+     * <p>
+     * If you derialize this constant of Windows, and deserialize on Unix, or vice
+     * versa, then the value of the case-sensitivity flag will change.
+     */
+    public static final IOCase SYSTEM = new IOCase("System", !FilenameUtils.isSystemWindows());
+
+    /** Serialization version. */
+    private static final long serialVersionUID = -6343169151696340687L;
+
+    /** The enumeration name. */
+    private final String name;
+    
+    /** The sensitivity flag. */
+    private final transient boolean sensitive;
+
+    //-----------------------------------------------------------------------
+    /**
+     * Factory method to create an IOCase from a name.
+     * 
+     * @param name  the name to find
+     * @return the IOCase object
+     * @throws IllegalArgumentException if the name is invalid
+     */
+    public static IOCase forName(String name) {
+        if (IOCase.SENSITIVE.name.equals(name)){
+            return IOCase.SENSITIVE;
+        }
+        if (IOCase.INSENSITIVE.name.equals(name)){
+            return IOCase.INSENSITIVE;
+        }
+        if (IOCase.SYSTEM.name.equals(name)){
+            return IOCase.SYSTEM;
+        }
+        throw new IllegalArgumentException("Invalid IOCase name: " + name);
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Private constructor.
+     * 
+     * @param name  the name
+     * @param sensitive  the sensitivity
+     */
+    private IOCase(String name, boolean sensitive) {
+        this.name = name;
+        this.sensitive = sensitive;
+    }
+
+    /**
+     * Replaces the enumeration from the stream with a real one.
+     * This ensures that the correct flag is set for SYSTEM.
+     * 
+     * @return the resolved object
+     */
+    private Object readResolve() {
+        return forName(name);
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Gets the name of the constant.
+     * 
+     * @return the name of the constant
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Does the object represent case sensitive comparison.
+     * 
+     * @return true if case sensitive
+     */
+    public boolean isCaseSensitive() {
+        return sensitive;
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Compares two strings using the case-sensitivity rule.
+     * <p>
+     * This method mimics {@link String#compareTo} but takes case-sensitivity
+     * into account.
+     * 
+     * @param str1  the first string to compare, not null
+     * @param str2  the second string to compare, not null
+     * @return true if equal using the case rules
+     * @throws NullPointerException if either string is null
+     */
+    public int checkCompareTo(String str1, String str2) {
+        if (str1 == null || str2 == null) {
+            throw new NullPointerException("The strings must not be null");
+        }
+        return sensitive ? str1.compareTo(str2) : str1.compareToIgnoreCase(str2);
+    }
+
+    /**
+     * Compares two strings using the case-sensitivity rule.
+     * <p>
+     * This method mimics {@link String#equals} but takes case-sensitivity
+     * into account.
+     * 
+     * @param str1  the first string to compare, not null
+     * @param str2  the second string to compare, not null
+     * @return true if equal using the case rules
+     * @throws NullPointerException if either string is null
+     */
+    public boolean checkEquals(String str1, String str2) {
+        if (str1 == null || str2 == null) {
+            throw new NullPointerException("The strings must not be null");
+        }
+        return sensitive ? str1.equals(str2) : str1.equalsIgnoreCase(str2);
+    }
+
+    /**
+     * Checks if one string starts with another using the case-sensitivity rule.
+     * <p>
+     * This method mimics {@link String#startsWith(String)} but takes case-sensitivity
+     * into account.
+     * 
+     * @param str  the string to check, not null
+     * @param start  the start to compare against, not null
+     * @return true if equal using the case rules
+     * @throws NullPointerException if either string is null
+     */
+    public boolean checkStartsWith(String str, String start) {
+        return str.regionMatches(!sensitive, 0, start, 0, start.length());
+    }
+
+    /**
+     * Checks if one string ends with another using the case-sensitivity rule.
+     * <p>
+     * This method mimics {@link String#endsWith} but takes case-sensitivity
+     * into account.
+     * 
+     * @param str  the string to check, not null
+     * @param end  the end to compare against, not null
+     * @return true if equal using the case rules
+     * @throws NullPointerException if either string is null
+     */
+    public boolean checkEndsWith(String str, String end) {
+        int endLen = end.length();
+        return str.regionMatches(!sensitive, str.length() - endLen, end, 0, endLen);
+    }
+
+    /**
+     * Checks if one string contains another starting at a specific index using the
+     * case-sensitivity rule.
+     * <p>
+     * This method mimics parts of {@link String#indexOf(String, int)} 
+     * but takes case-sensitivity into account.
+     * 
+     * @param str  the string to check, not null
+     * @param strStartIndex  the index to start at in str
+     * @param search  the start to search for, not null
+     * @return the first index of the search String,
+     *  -1 if no match or {@code null} string input
+     * @throws NullPointerException if either string is null
+     * @since 2.0
+     */
+    public int checkIndexOf(String str, int strStartIndex, String search) {
+        int endIndex = str.length() - search.length();
+        if (endIndex >= strStartIndex) {
+            for (int i = strStartIndex; i <= endIndex; i++) {
+                if (checkRegionMatches(str, i, search)) {
+                    return i;
+                }
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * Checks if one string contains another at a specific index using the case-sensitivity rule.
+     * <p>
+     * This method mimics parts of {@link String#regionMatches(boolean, int, String, int, int)} 
+     * but takes case-sensitivity into account.
+     * 
+     * @param str  the string to check, not null
+     * @param strStartIndex  the index to start at in str
+     * @param search  the start to search for, not null
+     * @return true if equal using the case rules
+     * @throws NullPointerException if either string is null
+     */
+    public boolean checkRegionMatches(String str, int strStartIndex, String search) {
+        return str.regionMatches(!sensitive, strStartIndex, search, 0, search.length());
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Gets a string describing the sensitivity.
+     * 
+     * @return a string describing the sensitivity
+     */
+    @Override
+    public String toString() {
+        return name;
+    }
+
+}
diff --git a/compiler/javatests/com/google/dart/compiler/CompilerTestCase.java b/compiler/javatests/com/google/dart/compiler/CompilerTestCase.java
index 9a1cae7..a3cbffa 100644
--- a/compiler/javatests/com/google/dart/compiler/CompilerTestCase.java
+++ b/compiler/javatests/com/google/dart/compiler/CompilerTestCase.java
@@ -4,8 +4,6 @@
 
 package com.google.dart.compiler;
 
-import static com.google.dart.compiler.common.ErrorExpectation.assertErrors;
-
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -24,7 +22,9 @@
 import com.google.dart.compiler.parser.DartParserRunner;
 import com.google.dart.compiler.resolver.Element;
 import com.google.dart.compiler.type.Type;
-import com.google.dart.compiler.type.TypeKind;
+import com.google.dart.compiler.type.TypeQuality;
+
+import static com.google.dart.compiler.common.ErrorExpectation.assertErrors;
 
 import junit.framework.TestCase;
 
@@ -456,23 +456,19 @@
     assertEquals(nodeSource, actualSource);
   }
 
-
   /**
    * Asserts that {@link Element} with given name has expected type.
    */
-  protected static void assertInferredElementTypeString(
-      DartUnit unit,
-      String variableName,
-      String expectedType) {
+  protected static void assertInferredElementTypeString(DartUnit unit, String variableName,
+      String expectedType, TypeQuality exact) {
     // find element
     Element element = getNamedElement(unit, variableName);
     assertNotNull(element);
     // check type
     Type actualType = element.getType();
     assertEquals(element.getName(), expectedType, getTypeSource(actualType));
-    // should be inferred
-    if (TypeKind.of(actualType) != TypeKind.DYNAMIC) {
-      assertTrue("Should be marked as inferred", actualType.isInferred());
+    if (exact != null) {
+      assertSame(exact, actualType.getQuality());
     }
   }
 
diff --git a/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java b/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java
index eb13e61..fcd7d63 100644
--- a/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java
+++ b/compiler/javatests/com/google/dart/compiler/end2end/inc/IncrementalCompilation2Test.java
@@ -23,6 +23,7 @@
 import com.google.dart.compiler.common.ErrorExpectation;
 import com.google.dart.compiler.resolver.ResolverErrorCode;
 import com.google.dart.compiler.resolver.TypeErrorCode;
+import com.google.dart.compiler.type.TypeQuality;
 
 import static com.google.dart.compiler.DartCompiler.EXTENSION_DEPS;
 import static com.google.dart.compiler.DartCompiler.EXTENSION_TIMESTAMP;
@@ -1352,19 +1353,19 @@
     // validate types
     DartUnit unit = units.get(APP);
     assertNotNull(unit);
-    assertInferredElementTypeString(unit, "v1", "AnchorElement");
-    assertInferredElementTypeString(unit, "v2", "AnchorElement");
-    assertInferredElementTypeString(unit, "v3", "BodyElement");
-    assertInferredElementTypeString(unit, "v4", "ButtonElement");
-    assertInferredElementTypeString(unit, "v5", "DivElement");
-    assertInferredElementTypeString(unit, "v6", "InputElement");
-    assertInferredElementTypeString(unit, "v7", "SelectElement");
+    assertInferredElementTypeString(unit, "v1", "AnchorElement", TypeQuality.INFERRED);
+    assertInferredElementTypeString(unit, "v2", "AnchorElement", TypeQuality.INFERRED);
+    assertInferredElementTypeString(unit, "v3", "BodyElement", TypeQuality.INFERRED);
+    assertInferredElementTypeString(unit, "v4", "ButtonElement", TypeQuality.INFERRED);
+    assertInferredElementTypeString(unit, "v5", "DivElement", TypeQuality.INFERRED);
+    assertInferredElementTypeString(unit, "v6", "InputElement", TypeQuality.INFERRED);
+    assertInferredElementTypeString(unit, "v7", "SelectElement", TypeQuality.INFERRED);
     // invocation of method
-    assertInferredElementTypeString(unit, "m1", "DivElement");
+    assertInferredElementTypeString(unit, "m1", "DivElement", TypeQuality.INFERRED);
     // bad cases, or unsupported now
-    assertInferredElementTypeString(unit, "b1", "Element");
-    assertInferredElementTypeString(unit, "b2", "Element");
-    assertInferredElementTypeString(unit, "b3", "Element");
+    assertInferredElementTypeString(unit, "b1", "Element", TypeQuality.INFERRED);
+    assertInferredElementTypeString(unit, "b2", "Element", TypeQuality.INFERRED);
+    assertInferredElementTypeString(unit, "b3", "Element", TypeQuality.INFERRED);
   }
 
   /**
@@ -1582,26 +1583,6 @@
     compile();
     assertErrors(errors);
   }
-
-  /**
-   * Internals of Dart use "dart-ext:" import scheme, and these libraries are allowed to use
-   * "native". Obsolete import syntax.
-   */
-  public void test_useNative_withDartExt_obsolete() throws Exception {
-    appSource.setContent(
-        APP,
-        makeCode(
-            "// filler filler filler filler filler filler filler filler filler filler filler",
-            "#library('A');",
-            "#import('dart-ext:test_extension');",
-            "class A {",
-            "  static int ifNull(a, b) native 'TestExtension_IfNull';",
-            "}",
-            ""));
-    // do compile, no errors expected
-    compile();
-    assertErrors(errors);
-  }
   
   /**
    * <p>
diff --git a/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java b/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java
index 28d4dc5..9eeab09 100644
--- a/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java
+++ b/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java
@@ -1147,4 +1147,38 @@
             errEx(ResolverErrorCode.CANNOT_ASSIGN_TO_FINAL, 7, 7, 1),
             errEx(ResolverErrorCode.CANNOT_ASSIGN_TO_FINAL, 8, 7, 1));
   }
+
+  /**
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=5987
+   */
+  public void test_accessConstInstanceField_fromConstStaticField() throws Exception {
+    checkSourceErrors(
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler",
+            "class A {",
+            "  const x = 499;",
+            "  static const bar = x;",
+            "}",
+            ""),
+        errEx(ResolverErrorCode.ILLEGAL_FIELD_ACCESS_FROM_STATIC, 4, 22, 1));
+  }
+  
+  /**
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=6489
+   */
+  public void test_accessConstInstanceField_fromConstStaticMethod() throws Exception {
+    checkSourceErrors(
+        makeCode(
+            "// filler filler filler filler filler filler filler filler filler filler",
+            "class A {",
+            "  const CONST = 26;",
+            "  static int foo() {",
+            "    return CONST;",
+            "  }",
+            "}",
+            ""),
+        errEx(ResolverErrorCode.ILLEGAL_FIELD_ACCESS_FROM_STATIC, 5, 12, 5));
+  }
 }
diff --git a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
index 445482f..8e46da1 100644
--- a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
+++ b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java
@@ -4,7 +4,6 @@
 package com.google.dart.compiler.type;
 
 import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.dart.compiler.CommandLineOptions.CompilerOptions;
 import com.google.dart.compiler.CompilerTestCase;
@@ -15,6 +14,8 @@
 import com.google.dart.compiler.ast.DartArrayAccess;
 import com.google.dart.compiler.ast.DartBinaryExpression;
 import com.google.dart.compiler.ast.DartClass;
+import com.google.dart.compiler.ast.DartCommentNewName;
+import com.google.dart.compiler.ast.DartCommentRefName;
 import com.google.dart.compiler.ast.DartDeclaration;
 import com.google.dart.compiler.ast.DartExprStmt;
 import com.google.dart.compiler.ast.DartExpression;
@@ -45,9 +46,13 @@
 import com.google.dart.compiler.resolver.NodeElement;
 import com.google.dart.compiler.resolver.ResolverErrorCode;
 import com.google.dart.compiler.resolver.TypeErrorCode;
+import com.google.dart.compiler.resolver.VariableElement;
 
 import static com.google.dart.compiler.common.ErrorExpectation.assertErrors;
 import static com.google.dart.compiler.common.ErrorExpectation.errEx;
+import static com.google.dart.compiler.type.TypeQuality.EXACT;
+import static com.google.dart.compiler.type.TypeQuality.INFERRED;
+import static com.google.dart.compiler.type.TypeQuality.INFERRED_EXACT;
 
 import java.net.URI;
 import java.util.List;
@@ -1937,23 +1942,23 @@
    * http://code.google.com/p/dart/issues/detail?id=4460
    */
   public void test_inferredTypes_noMemberWarnings_forInLoop() throws Exception {
-      compilerConfiguration = new DefaultCompilerConfiguration(new CompilerOptions() {
-        @Override
-        public boolean typeChecksForInferredTypes() {
-          return false;
-        }
-      });
-      AnalyzeLibraryResult result = analyzeLibrary(
-          "// filler filler filler filler filler filler filler filler filler filler",
-          "class A {}",
-          "foo() {",
-          "  List<A> values;",
-          "  for (var v in values) {",
-          "    v.bar();",
-          "  }",
-          "}",
-          "");
-      assertErrors(result.getErrors());
+    compilerConfiguration = new DefaultCompilerConfiguration(new CompilerOptions() {
+      @Override
+      public boolean typeChecksForInferredTypes() {
+        return false;
+      }
+    });
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {}",
+        "foo() {",
+        "  List<A> values;",
+        "  for (var v in values) {",
+        "    v.bar();",
+        "  }",
+        "}",
+        "");
+    assertErrors(result.getErrors());
   }
 
   public void test_inferredTypes_whenInvocationArgument_checkAssignable() throws Exception {
@@ -2029,21 +2034,14 @@
         "  var v7 = new Map().length;",
         "}",
         "");
-    // prepare expected results
-    List<String> expectedList = Lists.newArrayList();
-    expectedList.add("bool");
-    expectedList.add("bool");
-    expectedList.add("int");
-    expectedList.add("int");
-    expectedList.add("double");
-    expectedList.add("double");
-    expectedList.add("Map<String, int>");
-    expectedList.add("int");
-    // check each "v" type
-    for (int i = 0; i < expectedList.size(); i++) {
-      String expectedTypeString = expectedList.get(i);
-      assertInferredElementTypeString(testUnit, "v" + i, expectedTypeString);
-    }
+    assertInferredElementTypeString(testUnit, "v0", "bool", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v1", "bool", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v3", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v4", "double", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v5", "double", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v6", "Map<String, int>", INFERRED);
+    assertInferredElementTypeString(testUnit, "v7", "int", INFERRED_EXACT);
   }
 
   /**
@@ -2062,8 +2060,8 @@
         "}",
         "");
     assertErrors(libraryResult.getErrors());
-    assertInferredElementTypeString(testUnit, "v1", "B");
-    assertInferredElementTypeString(testUnit, "v2", "B");
+    assertInferredElementTypeString(testUnit, "v1", "B", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "B", INFERRED_EXACT);
   }
 
   public void test_typesPropagation_multiAssign() throws Exception {
@@ -2076,8 +2074,8 @@
         "  var v2 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "bool");
-    assertInferredElementTypeString(testUnit, "v2", "int");
+    assertInferredElementTypeString(testUnit, "v1", "bool", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "int", INFERRED_EXACT);
   }
 
   public void test_typesPropagation_multiAssign_noInitialValue() throws Exception {
@@ -2089,7 +2087,7 @@
         "  var v1 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "int");
+    assertInferredElementTypeString(testUnit, "v1", "int", INFERRED_EXACT);
   }
 
   public void test_typesPropagation_multiAssign_IfThen() throws Exception {
@@ -2105,9 +2103,9 @@
         "  var v3 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "bool");
-    assertInferredElementTypeString(testUnit, "v2", "int");
-    assertInferredElementTypeString(testUnit, "v3", "Object");
+    assertInferredElementTypeString(testUnit, "v1", "bool", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v3", "Object", INFERRED);
   }
 
   public void test_typesPropagation_multiAssign_IfThenElse() throws Exception {
@@ -2131,10 +2129,10 @@
         "  var d1 = d;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "a1", "int");
-    assertInferredElementTypeString(testUnit, "b1", "Object");
-    assertInferredElementTypeString(testUnit, "c1", "Object");
-    assertInferredElementTypeString(testUnit, "d1", "bool");
+    assertInferredElementTypeString(testUnit, "a1", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "b1", "Object", INFERRED);
+    assertInferredElementTypeString(testUnit, "c1", "Object", INFERRED);
+    assertInferredElementTypeString(testUnit, "d1", "bool", INFERRED_EXACT);
   }
 
   public void test_typesPropagation_multiAssign_IfThenElse_whenAsTypeCondition() throws Exception {
@@ -2150,9 +2148,9 @@
         "  var v3 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "String");
-    assertInferredElementTypeString(testUnit, "v2", "dynamic");
-    assertInferredElementTypeString(testUnit, "v3", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "String", INFERRED);
+    assertInferredElementTypeString(testUnit, "v2", "dynamic", EXACT);
+    assertInferredElementTypeString(testUnit, "v3", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_multiAssign_While() throws Exception {
@@ -2169,10 +2167,10 @@
         "  var v4 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "bool");
-    assertInferredElementTypeString(testUnit, "v2", "bool");
-    assertInferredElementTypeString(testUnit, "v3", "int");
-    assertInferredElementTypeString(testUnit, "v4", "Object");
+    assertInferredElementTypeString(testUnit, "v1", "bool", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "bool", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v3", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v4", "Object", INFERRED);
   }
   
   public void test_typesPropagation_multiAssign_DoWhile() throws Exception {
@@ -2189,10 +2187,10 @@
         "  var v4 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "bool");
-    assertInferredElementTypeString(testUnit, "v2", "bool");
-    assertInferredElementTypeString(testUnit, "v3", "int");
-    assertInferredElementTypeString(testUnit, "v4", "int");
+    assertInferredElementTypeString(testUnit, "v1", "bool", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "bool", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v3", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v4", "int", INFERRED_EXACT);
   }
 
   public void test_typesPropagation_multiAssign_For() throws Exception {
@@ -2209,10 +2207,10 @@
         "  var v4 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "bool");
-    assertInferredElementTypeString(testUnit, "v2", "bool");
-    assertInferredElementTypeString(testUnit, "v3", "int");
-    assertInferredElementTypeString(testUnit, "v4", "Object");
+    assertInferredElementTypeString(testUnit, "v1", "bool", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "bool", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v3", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v4", "Object", INFERRED);
   }
 
   public void test_typesPropagation_multiAssign_ForIn() throws Exception {
@@ -2230,10 +2228,10 @@
         "  var v4 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "bool");
-    assertInferredElementTypeString(testUnit, "v2", "bool");
-    assertInferredElementTypeString(testUnit, "v3", "int");
-    assertInferredElementTypeString(testUnit, "v4", "Object");
+    assertInferredElementTypeString(testUnit, "v1", "bool", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "bool", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v3", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v4", "Object", INFERRED);
   }
 
   /**
@@ -2255,8 +2253,8 @@
         "  var b1 = b;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "a1", "List<Object>");
-    assertInferredElementTypeString(testUnit, "b1", "List<Object>");
+    assertInferredElementTypeString(testUnit, "a1", "List<Object>", INFERRED);
+    assertInferredElementTypeString(testUnit, "b1", "List<Object>", INFERRED);
   }
   
   /**
@@ -2278,8 +2276,8 @@
         "  var b1 = b;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "a1", "List<String>");
-    assertInferredElementTypeString(testUnit, "b1", "List<String>");
+    assertInferredElementTypeString(testUnit, "a1", "List<String>", INFERRED);
+    assertInferredElementTypeString(testUnit, "b1", "List<String>", INFERRED);
   }
   
   /**
@@ -2299,9 +2297,9 @@
         "  var v3 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
-    assertInferredElementTypeString(testUnit, "v2", "String");
-    assertInferredElementTypeString(testUnit, "v3", "String");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "String", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v3", "String", INFERRED);
   }
 
   /**
@@ -2331,8 +2329,8 @@
         "  var v2 = new Unknown.name();",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
-    assertInferredElementTypeString(testUnit, "v2", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_ifAsType() throws Exception {
@@ -2345,8 +2343,8 @@
         "  var v2 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "String");
-    assertInferredElementTypeString(testUnit, "v2", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "String", INFERRED);
+    assertInferredElementTypeString(testUnit, "v2", "dynamic", EXACT);
   }
 
   /**
@@ -2363,8 +2361,8 @@
         "  var v2 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "String");
-    assertInferredElementTypeString(testUnit, "v2", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "String", INFERRED);
+    assertInferredElementTypeString(testUnit, "v2", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_ifIsType() throws Exception {
@@ -2379,9 +2377,9 @@
         "  var v3 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "List<String>");
-    assertInferredElementTypeString(testUnit, "v2", "Map<int, String>");
-    assertInferredElementTypeString(testUnit, "v3", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "List<String>", INFERRED);
+    assertInferredElementTypeString(testUnit, "v2", "Map<int, String>", INFERRED);
+    assertInferredElementTypeString(testUnit, "v3", "dynamic", EXACT);
   }
 
   /**
@@ -2403,24 +2401,39 @@
         "  }",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "a1", "int");
-    assertInferredElementTypeString(testUnit, "a2", "int");
-    assertInferredElementTypeString(testUnit, "b1", "int");
+    assertInferredElementTypeString(testUnit, "a1", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "a2", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "b1", "int", INFERRED);
   }
 
   /**
    * When single variable has conflicting type constraints, we use union of types.
    */
   public void test_typesPropagation_ifIsType_conflictingTypes() throws Exception {
-    analyzeLibrary(
+    compilerConfiguration = new DefaultCompilerConfiguration(new CompilerOptions() {
+      @Override
+      public boolean typeChecksForInferredTypes() {
+        return true;
+      }
+    });
+    AnalyzeLibraryResult result = analyzeLibrary(
         "// filler filler filler filler filler filler filler filler filler filler",
         "f(int v) {",
         "  if (v is String) {",
         "    var v1 = v;",
+        "    // should be OK because 'v' is String",
+        "    v.abs; // from num",
+        "    v.length; // from String",
+        "    processInt(v);",
+        "    processString(v);",
         "  }",
         "}",
+        "processInt(int p) {}",
+        "processString(String p) {}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "[int, String]");
+    // should be no errors, we because "v" is String
+    assertErrors(result.getErrors());
+    assertInferredElementTypeString(testUnit, "v1", "[int, String]", INFERRED);
   }
 
   public void test_typesPropagation_ifIsType_negation() throws Exception {
@@ -2437,9 +2450,9 @@
         "  }",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
-    assertInferredElementTypeString(testUnit, "v2", "dynamic");
-    assertInferredElementTypeString(testUnit, "v3", "String");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "dynamic", EXACT);
+    assertInferredElementTypeString(testUnit, "v3", "String", INFERRED);
   }
 
   public void test_typesPropagation_ifIsType_and() throws Exception {
@@ -2452,8 +2465,8 @@
         "  }",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "a1", "String");
-    assertInferredElementTypeString(testUnit, "b1", "List<String>");
+    assertInferredElementTypeString(testUnit, "a1", "String", INFERRED);
+    assertInferredElementTypeString(testUnit, "b1", "List<String>", INFERRED);
   }
 
   public void test_typesPropagation_ifIsType_or() throws Exception {
@@ -2468,8 +2481,8 @@
         "  }",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
-    assertInferredElementTypeString(testUnit, "v2", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_whileIsType() throws Exception {
@@ -2483,8 +2496,8 @@
         "  var v2 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "String");
-    assertInferredElementTypeString(testUnit, "v2", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "String", INFERRED);
+    assertInferredElementTypeString(testUnit, "v2", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_forIsType() throws Exception {
@@ -2498,9 +2511,9 @@
         "  var v3 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "String");
-    assertInferredElementTypeString(testUnit, "v2", "String");
-    assertInferredElementTypeString(testUnit, "v3", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "String", INFERRED);
+    assertInferredElementTypeString(testUnit, "v2", "String", INFERRED);
+    assertInferredElementTypeString(testUnit, "v3", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_forEach() throws Exception {
@@ -2513,7 +2526,7 @@
         "  }",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "String");
+    assertInferredElementTypeString(testUnit, "v1", "String", INFERRED);
   }
 
   public void test_typesPropagation_ifIsNotType_withElse() throws Exception {
@@ -2529,11 +2542,11 @@
         "}",
         "");
     // we don't know type, but not String
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
     // we know that String
-    assertInferredElementTypeString(testUnit, "v2", "String");
+    assertInferredElementTypeString(testUnit, "v2", "String", INFERRED);
     // again, we don't know after "if"
-    assertInferredElementTypeString(testUnit, "v3", "dynamic");
+    assertInferredElementTypeString(testUnit, "v3", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_ifIsNotType_hasThenReturn() throws Exception {
@@ -2547,8 +2560,8 @@
         "  var v2 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
-    assertInferredElementTypeString(testUnit, "v2", "String");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "String", INFERRED);
   }
 
   public void test_typesPropagation_ifIsNotType_hasThenThrow() throws Exception {
@@ -2561,7 +2574,7 @@
         "  var v1 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "String");
+    assertInferredElementTypeString(testUnit, "v1", "String", INFERRED);
   }
 
   public void test_typesPropagation_ifIsNotType_emptyThen() throws Exception {
@@ -2573,7 +2586,7 @@
         "  var v1 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_ifIsNotType_otherThen() throws Exception {
@@ -2586,7 +2599,7 @@
         "  var v1 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_ifIsNotType_hasThenThrow_withCatch() throws Exception {
@@ -2602,7 +2615,7 @@
         "  var v1 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_ifIsNotType_hasThenContinue() throws Exception {
@@ -2619,8 +2632,8 @@
         "}",
         "");
     assertErrors(libraryResult.getErrors());
-    assertInferredElementTypeString(testUnit, "v1", "Object");
-    assertInferredElementTypeString(testUnit, "v2", "String");
+    assertInferredElementTypeString(testUnit, "v1", "Object", INFERRED);
+    assertInferredElementTypeString(testUnit, "v2", "String", INFERRED);
   }
 
   public void test_typesPropagation_ifIsNotType_hasThenBreak() throws Exception {
@@ -2637,8 +2650,8 @@
         "}",
         "");
     assertErrors(libraryResult.getErrors());
-    assertInferredElementTypeString(testUnit, "v1", "Object");
-    assertInferredElementTypeString(testUnit, "v2", "String");
+    assertInferredElementTypeString(testUnit, "v1", "Object", INFERRED);
+    assertInferredElementTypeString(testUnit, "v2", "String", INFERRED);
   }
 
   public void test_typesPropagation_ifIsNotType_or() throws Exception {
@@ -2652,8 +2665,8 @@
         "  var v2 = p2;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "int");
-    assertInferredElementTypeString(testUnit, "v2", "String");
+    assertInferredElementTypeString(testUnit, "v1", "int", INFERRED);
+    assertInferredElementTypeString(testUnit, "v2", "String", INFERRED);
   }
 
   public void test_typesPropagation_ifIsNotType_and() throws Exception {
@@ -2666,7 +2679,7 @@
         "  var v1 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_ifIsNotType_not() throws Exception {
@@ -2679,7 +2692,7 @@
         "  var v1 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_ifIsNotType_not2() throws Exception {
@@ -2692,7 +2705,7 @@
         "  var v1 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "String");
+    assertInferredElementTypeString(testUnit, "v1", "String", INFERRED);
   }
 
   public void test_typesPropagation_ifNotIsType() throws Exception {
@@ -2705,7 +2718,7 @@
         "  var v1 = v;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "String");
+    assertInferredElementTypeString(testUnit, "v1", "String", INFERRED);
   }
 
   /**
@@ -2728,14 +2741,14 @@
         "}",
         "");
     // we don't know type initially
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
     // after "assert" all next statements know type
-    assertInferredElementTypeString(testUnit, "v2", "String");
-    assertInferredElementTypeString(testUnit, "v3", "String");
+    assertInferredElementTypeString(testUnit, "v2", "String", INFERRED);
+    assertInferredElementTypeString(testUnit, "v3", "String", INFERRED);
     // type is set to unknown only when we exit control Block, not just any Block
-    assertInferredElementTypeString(testUnit, "v4", "String");
+    assertInferredElementTypeString(testUnit, "v4", "String", INFERRED);
     // we exited "if" Block, so "assert" may be was not executed, so we don't know type
-    assertInferredElementTypeString(testUnit, "v5", "dynamic");
+    assertInferredElementTypeString(testUnit, "v5", "dynamic", EXACT);
   }
   
   /**
@@ -2758,14 +2771,14 @@
         "}",
         "");
     // we don't know type initially
-    assertInferredElementTypeString(testUnit, "a1", "dynamic");
-    assertInferredElementTypeString(testUnit, "b1", "dynamic");
+    assertInferredElementTypeString(testUnit, "a1", "dynamic", EXACT);
+    assertInferredElementTypeString(testUnit, "b1", "dynamic", EXACT);
     // after "assert" all next statements know type
-    assertInferredElementTypeString(testUnit, "a2", "String");
-    assertInferredElementTypeString(testUnit, "b2", "String");
+    assertInferredElementTypeString(testUnit, "a2", "String", INFERRED);
+    assertInferredElementTypeString(testUnit, "b2", "String", INFERRED);
     // we exited "if" Block, so "assert" may be was not executed, so we don't know type
-    assertInferredElementTypeString(testUnit, "a3", "dynamic");
-    assertInferredElementTypeString(testUnit, "b3", "dynamic");
+    assertInferredElementTypeString(testUnit, "a3", "dynamic", EXACT);
+    assertInferredElementTypeString(testUnit, "b3", "dynamic", EXACT);
   }
 
   /**
@@ -2794,10 +2807,10 @@
         "  }",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "B");
-    assertInferredElementTypeString(testUnit, "v2", "B");
-    assertInferredElementTypeString(testUnit, "v3", "C");
-    assertInferredElementTypeString(testUnit, "v4", "[B, String]");
+    assertInferredElementTypeString(testUnit, "v1", "B", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "B", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v3", "C", INFERRED);
+    assertInferredElementTypeString(testUnit, "v4", "[B, String]", INFERRED);
   }
 
   public void test_typesPropagation_field_inClass_final() throws Exception {
@@ -2808,8 +2821,8 @@
         "  final v2 = 1 + 2.0;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "int");
-    assertInferredElementTypeString(testUnit, "v2", "double");
+    assertInferredElementTypeString(testUnit, "v1", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "double", INFERRED_EXACT);
   }
 
   public void test_typesPropagation_field_inClass_const() throws Exception {
@@ -2820,8 +2833,8 @@
         "  final v2 = 1 + 2.0;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "int");
-    assertInferredElementTypeString(testUnit, "v2", "double");
+    assertInferredElementTypeString(testUnit, "v1", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "double", INFERRED_EXACT);
   }
   
   /**
@@ -2835,7 +2848,7 @@
         "  var v1 = 123;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_field_topLevel_final() throws Exception {
@@ -2844,8 +2857,8 @@
         "final v1 = 123;",
         "final v2 = 1 + 2.0;",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "int");
-    assertInferredElementTypeString(testUnit, "v2", "double");
+    assertInferredElementTypeString(testUnit, "v1", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "double", INFERRED_EXACT);
   }
 
   public void test_typesPropagation_field_topLevel_const() throws Exception {
@@ -2854,8 +2867,8 @@
         "const v1 = 123;",
         "const v2 = 1 + 2.0;",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "int");
-    assertInferredElementTypeString(testUnit, "v2", "double");
+    assertInferredElementTypeString(testUnit, "v1", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "double", INFERRED_EXACT);
   }
   
   /**
@@ -2867,7 +2880,7 @@
         "// filler filler filler filler filler filler filler filler filler filler",
         "var v1 = 123;",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "dynamic");
+    assertInferredElementTypeString(testUnit, "v1", "dynamic", EXACT);
   }
 
   public void test_typesPropagation_FunctionAliasType() throws Exception {
@@ -2880,7 +2893,7 @@
         "}",
         "",
         "");
-    assertInferredElementTypeString(testUnit, "v", "F");
+    assertInferredElementTypeString(testUnit, "v", "F", INFERRED_EXACT);
   }
 
   /**
@@ -2904,7 +2917,7 @@
         "  });",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v", "Event");
+    assertInferredElementTypeString(testUnit, "v", "Event", INFERRED);
   }
 
   /**
@@ -2924,7 +2937,7 @@
         "  });",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v", "Event");
+    assertInferredElementTypeString(testUnit, "v", "Event", INFERRED);
   }
 
   /**
@@ -2944,7 +2957,7 @@
         "  });",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v", "Event");
+    assertInferredElementTypeString(testUnit, "v", "Event", INFERRED);
   }
 
   /**
@@ -2966,7 +2979,7 @@
         "  });",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v", "Event");
+    assertInferredElementTypeString(testUnit, "v", "Event", INFERRED);
   }
 
   /**
@@ -2988,7 +3001,7 @@
         "  });",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v", "Event");
+    assertInferredElementTypeString(testUnit, "v", "Event", INFERRED);
   }
 
   public void test_typesPropagation_parameterOfClosure_assignVariable() throws Exception {
@@ -3012,8 +3025,8 @@
         "  }",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "Event");
-    assertInferredElementTypeString(testUnit, "v2", "Event");
+    assertInferredElementTypeString(testUnit, "v1", "Event", INFERRED);
+    assertInferredElementTypeString(testUnit, "v2", "Event", INFERRED);
   }
 
   public void test_typesPropagation_parameterOfClosure_assignField() throws Exception {
@@ -3044,9 +3057,9 @@
         "  var v3 = e;",
         "};",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "Event");
-    assertInferredElementTypeString(testUnit, "v2", "Event");
-    assertInferredElementTypeString(testUnit, "v3", "Event");
+    assertInferredElementTypeString(testUnit, "v1", "Event", INFERRED);
+    assertInferredElementTypeString(testUnit, "v2", "Event", INFERRED);
+    assertInferredElementTypeString(testUnit, "v3", "Event", INFERRED);
   }
 
   /**
@@ -3114,23 +3127,23 @@
         "  var v17 = arg as int",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v1", "int");
-    assertInferredElementTypeString(testUnit, "v2", "int");
-    assertInferredElementTypeString(testUnit, "v3", "int");
-    assertInferredElementTypeString(testUnit, "v4", "int");
-    assertInferredElementTypeString(testUnit, "v5", "int");
-    assertInferredElementTypeString(testUnit, "v6", "double");
-    assertInferredElementTypeString(testUnit, "v7", "double");
-    assertInferredElementTypeString(testUnit, "v8", "double");
-    assertInferredElementTypeString(testUnit, "v9", "double");
-    assertInferredElementTypeString(testUnit, "v10", "double");
-    assertInferredElementTypeString(testUnit, "v11", "double");
-    assertInferredElementTypeString(testUnit, "v12", "double");
-    assertInferredElementTypeString(testUnit, "v13", "double");
-    assertInferredElementTypeString(testUnit, "v14", "double");
-    assertInferredElementTypeString(testUnit, "v15", "double");
-    assertInferredElementTypeString(testUnit, "v16", "double");
-    assertInferredElementTypeString(testUnit, "v17", "int");
+    assertInferredElementTypeString(testUnit, "v1", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v3", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v4", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v5", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v6", "double", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v7", "double", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v8", "double", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v9", "double", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v10", "double", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v11", "double", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v12", "double", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v13", "double", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v14", "double", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v15", "double", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v16", "double", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v17", "int", INFERRED);
   }
 
   /**
@@ -3187,8 +3200,8 @@
         "}",
         "");
     assertErrors(libraryResult.getErrors());
-    assertInferredElementTypeString(testUnit, "v1", "int");
-    assertInferredElementTypeString(testUnit, "v2", "bool");
+    assertInferredElementTypeString(testUnit, "v1", "int", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "bool", INFERRED_EXACT);
   }
 
   public void test_getType_getterInNegation_generic() throws Exception {
@@ -3212,8 +3225,8 @@
         "}",
         "");
     assertErrors(libraryResult.getErrors());
-    assertInferredElementTypeString(testUnit, "v1", "bool");
-    assertInferredElementTypeString(testUnit, "v2", "bool");
+    assertInferredElementTypeString(testUnit, "v1", "bool", INFERRED_EXACT);
+    assertInferredElementTypeString(testUnit, "v2", "bool", INFERRED_EXACT);
   }
 
   public void test_getType_getterInSwitch_default() throws Exception {
@@ -4336,7 +4349,94 @@
         "  var v = s..length;",
         "}",
         "");
-    assertInferredElementTypeString(testUnit, "v", "String");
+    assertInferredElementTypeString(testUnit, "v", "String", INFERRED_EXACT);
+  }
+
+  /**
+   * There should be no problem reported, because assignment of "a" cascade to "b" with type "B"
+   * implicitly set type of "a" to "B".
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=6107
+   */
+  public void test_cascade_inferType_varDeclaration() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {}",
+        "class B extends A {",
+        "  bMethod() {}",
+        "}",
+        "main() {",
+        "  A a = new B();",
+        "  B b = a..bMethod();",
+        "}",
+        "");
+    assertErrors(result.getErrors());
+  }
+  
+  /**
+   * There should be no problem reported, because assignment of "a" cascade to "b" with type "B"
+   * implicitly set type of "a" to "B".
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=6107
+   */
+  public void test_cascade_inferType_varAssignment() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {}",
+        "class B extends A {",
+        "  bMethod() {}",
+        "}",
+        "main() {",
+        "  A a = new B();",
+        "  B b = null;",
+        "  b = a..bMethod();",
+        "}",
+        "");
+    assertErrors(result.getErrors());
+  }
+
+  /**
+   * We assign "a" to field "Holder.b" of type "B", so implicitly set type of "a" to "B".
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=6107
+   */
+  public void test_cascade_inferType_fieldDeclaration() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class Holder {",
+        "  B b = getA()..bMethod();",
+        "}",
+        "class A {}",
+        "class B extends A {",
+        "  bMethod() {}",
+        "}",
+        "A getA() => new B();",
+        "");
+    assertErrors(result.getErrors());
+  }
+  
+  /**
+   * We assign "a" to field "Holder.b" of type "B", so implicitly set type of "a" to "B".
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=6107
+   */
+  public void test_cascade_inferType_fieldAssignment() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class Holder {",
+        "  B b;",
+        "}",
+        "class A {}",
+        "class B extends A {",
+        "  bMethod() {}",
+        "}",
+        "main() {",
+        "  A a = new B();",
+        "  Holder holder = new Holder();",
+        "  holder.b = a..bMethod();",
+        "}",
+        "");
+    assertErrors(result.getErrors());
   }
 
   /**
@@ -5319,4 +5419,155 @@
         "");
     assertErrors(result.getErrors());
   }
+
+  /**
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=5157
+   */
+  public void test_trySubTypeMember_forInferredType() throws Exception {
+    compilerConfiguration = new DefaultCompilerConfiguration(new CompilerOptions() {
+      @Override
+      public boolean typeChecksForInferredTypes() {
+        return true;
+      }
+    });
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class Event {}",
+        "class MouseEvent extends Event {",
+        "  int clientX;",
+        "  void stop() {}",
+        "}",
+        "typedef Listener(Event event);",
+        "class Button {",
+        "  addListener(Listener listener) {}",
+        "}",
+        "main() {",
+        "  Button button = new Button();",
+        "  button.addListener((event) {",
+        "    event.clientX;",
+        "    event.stop();",
+        "  });",
+        "}",
+        "");
+    assertErrors(result.getErrors());
+  }
+  
+  /**
+   * <p>
+   * http://code.google.com/p/dart/issues/detail?id=6491
+   */
+  public void test_annotationOnGetter() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "const myAnnotation = 0;",
+        "class A {",
+        "  @myAnnotation bool get isEmpty => true;",
+        "}",
+        "");
+    assertErrors(result.getErrors());
+  }
+
+  public void test_resolveRefInComment_ofClass() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "/** This class [A] has method [foo]. */",
+        "class A {",
+        "  foo() {}",
+        "}",
+        "");
+    assertErrors(result.getErrors());
+    // [A]
+    {
+      DartCommentRefName node = findNode(DartCommentRefName.class, "A]");
+      ClassElement element = (ClassElement) node.getElement();
+      assertEquals("A", element.getName());
+    }
+    // [foo]
+    {
+      DartCommentRefName node = findNode(DartCommentRefName.class, "foo]");
+      MethodElement element = (MethodElement) node.getElement();
+      assertEquals("foo", element.getName());
+    }
+  }
+
+  public void test_resolveRefInComment_ofFunction() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {}",
+        "/** This function has parameter [aaa] of type [A] ans also [bbb]. */",
+        "foo(A aaa, bbb) {}",
+        "");
+    assertErrors(result.getErrors());
+    // [aaa]
+    {
+      DartCommentRefName node = findNode(DartCommentRefName.class, "aaa]");
+      VariableElement element = (VariableElement) node.getElement();
+      assertSame(ElementKind.PARAMETER, ElementKind.of(element));
+      assertEquals("aaa", element.getName());
+    }
+    // [A]
+    {
+      DartCommentRefName node = findNode(DartCommentRefName.class, "A]");
+      ClassElement element = (ClassElement) node.getElement();
+      assertEquals("A", element.getName());
+    }
+    // [bbb]
+    {
+      DartCommentRefName node = findNode(DartCommentRefName.class, "bbb]");
+      VariableElement element = (VariableElement) node.getElement();
+      assertSame(ElementKind.PARAMETER, ElementKind.of(element));
+      assertEquals("bbb", element.getName());
+    }
+  }
+  
+  public void test_resolveRefInComment_ofMethod() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "  var fff;",
+        "  /** Initializes [fff] and then calls [bar]. */",
+        "  foo() {}",
+        "  bar() {}",
+        "}",
+        "");
+    assertErrors(result.getErrors());
+    // [fff]
+    {
+      DartCommentRefName node = findNode(DartCommentRefName.class, "fff]");
+      FieldElement element = (FieldElement) node.getElement();
+      assertEquals("fff", element.getName());
+    }
+    // [bar]
+    {
+      DartCommentRefName node = findNode(DartCommentRefName.class, "bar]");
+      MethodElement element = (MethodElement) node.getElement();
+      assertEquals("bar", element.getName());
+    }
+  }
+  
+  public void test_resolveNewInComment() throws Exception {
+    AnalyzeLibraryResult result = analyzeLibrary(
+        "// filler filler filler filler filler filler filler filler filler filler",
+        "class A {",
+        "  A() {}",
+        "  A.named() {}",
+        "}",
+        "/** Creates [A] using [new A] or [new A.named] constructors. */",
+        "foo() {}",
+        "");
+    assertErrors(result.getErrors());
+    // [new A]
+    {
+      DartCommentNewName node = findNode(DartCommentNewName.class, "new A]");
+      assertEquals("", node.getConstructorElement().getName());
+      assertEquals("A", node.getClassElement().getName());
+    }
+    // [new A.named]
+    {
+      DartCommentNewName node = findNode(DartCommentNewName.class, "new A.named]");
+      assertEquals("named", node.getConstructorElement().getName());
+      assertEquals("A", node.getClassElement().getName());
+    }
+  }
 }
diff --git a/lib/compiler/implementation/lib/mirrors.dart b/lib/compiler/implementation/lib/mirrors.dart
deleted file mode 100644
index 243de22..0000000
--- a/lib/compiler/implementation/lib/mirrors.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#library("dart:mirrors");
-
-#import("dart:isolate");
-
-#source("../../../mirrors/mirrors.dart");
-
-/**
- * Stub class for the mirror system.
- */
-class _Mirrors {
-  static MirrorSystem currentMirrorSystem() {
-    throw new UnsupportedError("MirrorSystem not implemented");
-  }
-
-  static Future<MirrorSystem> mirrorSystemOf(SendPort port) {
-    throw new UnsupportedError("MirrorSystem not implemented");
-  }
-
-  static InstanceMirror reflect(Object reflectee) {
-    throw new UnsupportedError("MirrorSystem not implemented");
-  }
-}
diff --git a/lib/core/map.dart b/lib/core/map.dart
deleted file mode 100644
index 530d4ee..0000000
--- a/lib/core/map.dart
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * A [Map] is an associative container, mapping a key to a value.
- * Null values are supported, but null keys are not.
- */
-interface Map<K, V> default HashMapImplementation<K, V> {
-  /**
-   * Creates a map with the default implementation.
-   */
-  Map();
-
-  /**
-   * Creates a [Map] that contains all key value pairs of [other].
-   */
-  Map.from(Map<K, V> other);
-
-
-  /**
-   * Returns whether this map contains the given [value].
-   */
-  bool containsValue(V value);
-
-  /**
-   * Returns whether this map contains the given [key].
-   */
-  bool containsKey(K key);
-
-  /**
-   * Returns the value for the given [key] or null if [key] is not
-   * in the map. Because null values are supported, one should either
-   * use containsKey to distinguish between an absent key and a null
-   * value, or use the [putIfAbsent] method.
-   */
-  V operator [](K key);
-
-  /**
-   * Associates the [key] with the given [value].
-   */
-  void operator []=(K key, V value);
-
-  /**
-   * If [key] is not associated to a value, calls [ifAbsent] and
-   * updates the map by mapping [key] to the value returned by
-   * [ifAbsent]. Returns the value in the map.
-   */
-  V putIfAbsent(K key, V ifAbsent());
-
-  /**
-   * Removes the association for the given [key]. Returns the value for
-   * [key] in the map or null if [key] is not in the map. Note that values
-   * can be null and a returned null value does not always imply that the
-   * key is absent.
-   */
-  V remove(K key);
-
-  /**
-   * Removes all pairs from the map.
-   */
-  void clear();
-
-  /**
-   * Applies [f] to each {key, value} pair of the map.
-   */
-  void forEach(void f(K key, V value));
-
-  /**
-   * Returns a collection containing all the keys in the map.
-   */
-  Collection<K> get keys;
-
-  /**
-   * Returns a collection containing all the values in the map.
-   */
-  Collection<V> get values;
-
-  /**
-   * The number of {key, value} pairs in the map.
-   */
-  int get length;
-
-  /**
-   * Returns true if there is no {key, value} pair in the map.
-   */
-  bool get isEmpty;
-}
-
-/**
- * Hash map version of the [Map] interface. A [HashMap] does not
- * provide any guarantees on the order of keys and values in [keys]
- * and [values].
- */
-interface HashMap<K, V> extends Map<K, V>
-    default HashMapImplementation<K, V> {
-  /**
-   * Creates a map with the default implementation.
-   */
-  HashMap();
-
-  /**
-   * Creates a [HashMap] that contains all key value pairs of [other].
-   */
-  HashMap.from(Map<K, V> other);
-}
-
-/**
- * Hash map version of the [Map] interface that preserves insertion
- * order.
- */
-interface LinkedHashMap<K, V> extends HashMap<K, V>
-    default LinkedHashMapImplementation<K, V> {
-  /**
-   * Creates a map with the default implementation.
-   */
-  LinkedHashMap();
-
-  /**
-   * Creates a [LinkedHashMap] that contains all key value pairs of [other].
-   */
-  LinkedHashMap.from(Map<K, V> other);
-}
diff --git a/lib/core/set.dart b/lib/core/set.dart
deleted file mode 100644
index 1c2b690..0000000
--- a/lib/core/set.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This class is the public interface of a set. A set is a collection
- * without duplicates.
- */
-abstract class Set<E> extends Collection<E> {
-  factory Set() => new HashSetImplementation<E>();
-
-  /**
-   * Creates a [Set] that contains all elements of [other].
-   */
-  factory Set.from(Iterable<E> other) {
-    return new HashSetImplementation<E>.from(other);
-  }
-
-  /**
-   * Returns true if [value] is in the set.
-   */
-  bool contains(E value);
-
-  /**
-   * Adds [value] into the set. The method has no effect if
-   * [value] was already in the set.
-   */
-  void add(E value);
-
-  /**
-   * Removes [value] from the set. Returns true if [value] was
-   * in the set. Returns false otherwise. The method has no effect
-   * if [value] value was not in the set.
-   */
-  bool remove(E value);
-
-  /**
-   * Adds all the elements of the given collection to the set.
-   */
-  void addAll(Collection<E> collection);
-
-  /**
-   * Removes all the elements of the given collection from the set.
-   */
-  void removeAll(Collection<E> collection);
-
-  /**
-   * Returns true if [collection] contains all the elements of this
-   * collection.
-   */
-  bool isSubsetOf(Collection<E> collection);
-
-  /**
-   * Returns true if this collection contains all the elements of
-   * [collection].
-   */
-  bool containsAll(Collection<E> collection);
-
-  /**
-   * Returns a new set which is the intersection between this set and
-   * the given collection.
-   */
-  Set<E> intersection(Collection<E> other);
-
-  /**
-   * Removes all elements in the set.
-   */
-  void clear();
-
-}
-
-abstract class HashSet<E> extends Set<E> {
-  factory HashSet() => new HashSetImplementation<E>();
-
-  /**
-   * Creates a [Set] that contains all elements of [other].
-   */
-  factory HashSet.from(Iterable<E> other) =>
-      new HashSetImplementation<E>.from(other);
-}
diff --git a/lib/coreimpl/linked_hash_map.dart b/lib/coreimpl/linked_hash_map.dart
deleted file mode 100644
index 3534028..0000000
--- a/lib/coreimpl/linked_hash_map.dart
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This class represents a pair of two objects, used by LinkedHashMap
- * to store a {key, value} in a list.
- */
-class KeyValuePair<K, V> {
-  KeyValuePair(this.key, this.value) {}
-
-  final K key;
-  V value;
-}
-
-/**
- * A LinkedHashMap is a hash map that preserves the insertion order
- * when iterating over the keys or the values. Updating the value of a
- * key does not change the order.
- */
-class LinkedHashMapImplementation<K, V>
-    implements LinkedHashMap<K, V> {
-  DoubleLinkedQueue<KeyValuePair<K, V>> _list;
-  HashMap<K, DoubleLinkedQueueEntry<KeyValuePair<K, V>>> _map;
-
-  LinkedHashMapImplementation() {
-    _map = new HashMap<K, DoubleLinkedQueueEntry<KeyValuePair<K, V>>>();
-    _list = new DoubleLinkedQueue<KeyValuePair<K, V>>();
-  }
-
-  factory LinkedHashMapImplementation.from(Map<K, V> other) {
-    Map<K, V> result = new LinkedHashMapImplementation<K, V>();
-    other.forEach((K key, V value) { result[key] = value; });
-    return result;
-  }
-
-  void operator []=(K key, V value) {
-    if (_map.containsKey(key)) {
-      _map[key].element.value = value;
-    } else {
-      _list.addLast(new KeyValuePair<K, V>(key, value));
-      _map[key] = _list.lastEntry();
-    }
-  }
-
-  V operator [](K key) {
-    DoubleLinkedQueueEntry<KeyValuePair<K, V>> entry = _map[key];
-    if (entry === null) return null;
-    return entry.element.value;
-  }
-
-  V remove(K key) {
-    DoubleLinkedQueueEntry<KeyValuePair<K, V>> entry = _map.remove(key);
-    if (entry === null) return null;
-    entry.remove();
-    return entry.element.value;
-  }
-
-  V putIfAbsent(K key, V ifAbsent()) {
-    V value = this[key];
-    if ((this[key] === null) && !(containsKey(key))) {
-      value = ifAbsent();
-      this[key] = value;
-    }
-    return value;
-  }
-
-  Collection<K> get keys {
-    List<K> list = new List<K>(length);
-    int index = 0;
-    _list.forEach(void _(KeyValuePair<K, V> entry) {
-      list[index++] = entry.key;
-    });
-    assert(index == length);
-    return list;
-  }
-
-
-  Collection<V> get values {
-    List<V> list = new List<V>(length);
-    int index = 0;
-    _list.forEach(void _(KeyValuePair<K, V> entry) {
-      list[index++] = entry.value;
-    });
-    assert(index == length);
-    return list;
-  }
-
-  void forEach(void f(K key, V value)) {
-    _list.forEach(void _(KeyValuePair<K, V> entry) {
-      f(entry.key, entry.value);
-    });
-  }
-
-  bool containsKey(K key) {
-    return _map.containsKey(key);
-  }
-
-  bool containsValue(V value) {
-    return _list.some(bool _(KeyValuePair<K, V> entry) {
-      return (entry.value == value);
-    });
-  }
-
-  int get length {
-    return _map.length;
-  }
-
-  bool get isEmpty {
-    return length == 0;
-  }
-
-  void clear() {
-    _map.clear();
-    _list.clear();
-  }
-
-  String toString() {
-    return Maps.mapToString(this);
-  }
-}
diff --git a/lib/html/dart2js/html_dart2js.dart b/lib/html/dart2js/html_dart2js.dart
deleted file mode 100644
index 663b0c0..0000000
--- a/lib/html/dart2js/html_dart2js.dart
+++ /dev/null
@@ -1,40909 +0,0 @@
-library html;
-
-import 'dart:isolate';
-import 'dart:json';
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// DO NOT EDIT
-// Auto-generated dart:html library.
-
-
-
-
-
-
-
-LocalWindow get window => JS('LocalWindow', 'window');
-_LocalWindowImpl get _window => JS('_LocalWindowImpl', 'window');
-
-Document get document => JS('Document', 'document');
-
-_DocumentImpl get _document => JS('_DocumentImpl', 'document');
-
-Element query(String selector) => _document.query(selector);
-List<Element> queryAll(String selector) => _document.queryAll(selector);
-
-// Workaround for tags like <cite> that lack their own Element subclass --
-// Dart issue 1990.
-class _HTMLElementImpl extends _ElementImpl native "*HTMLElement" {
-}
-
-// Support for Send/ReceivePortSync.
-int _getNewIsolateId() {
-  if (JS('bool', r'!window.$dart$isolate$counter')) {
-    JS('void', r'window.$dart$isolate$counter = 1');
-  }
-  return JS('int', r'window.$dart$isolate$counter++');
-}
-
-// Fast path to invoke JS send port.
-_callPortSync(int id, message) {
-  return JS('var', r'ReceivePortSync.dispatchCall(#, #)', id, message);
-}
-
-// TODO(vsm): Plumb this properly.
-spawnDomFunction(f) => spawnFunction(f);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName AbstractWorker
-abstract class AbstractWorker implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  AbstractWorkerEvents get on;
-
-  /** @domName AbstractWorker.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName AbstractWorker.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName AbstractWorker.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class AbstractWorkerEvents implements Events {
-
-  EventListenerList get error;
-}
-
-class _AbstractWorkerImpl extends _EventTargetImpl implements AbstractWorker native "*AbstractWorker" {
-
-  _AbstractWorkerEventsImpl get on =>
-    new _AbstractWorkerEventsImpl(this);
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _AbstractWorkerEventsImpl extends _EventsImpl implements AbstractWorkerEvents {
-  _AbstractWorkerEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get error => this['error'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName AnalyserNode
-abstract class AnalyserNode implements AudioNode {
-
-  /** @domName AnalyserNode.fftSize */
-  int fftSize;
-
-  /** @domName AnalyserNode.frequencyBinCount */
-  int get frequencyBinCount;
-
-  /** @domName AnalyserNode.maxDecibels */
-  num maxDecibels;
-
-  /** @domName AnalyserNode.minDecibels */
-  num minDecibels;
-
-  /** @domName AnalyserNode.smoothingTimeConstant */
-  num smoothingTimeConstant;
-
-  /** @domName AnalyserNode.getByteFrequencyData */
-  void getByteFrequencyData(Uint8Array array);
-
-  /** @domName AnalyserNode.getByteTimeDomainData */
-  void getByteTimeDomainData(Uint8Array array);
-
-  /** @domName AnalyserNode.getFloatFrequencyData */
-  void getFloatFrequencyData(Float32Array array);
-}
-
-class _AnalyserNodeImpl extends _AudioNodeImpl implements AnalyserNode native "*AnalyserNode" {
-
-  int fftSize;
-
-  final int frequencyBinCount;
-
-  num maxDecibels;
-
-  num minDecibels;
-
-  num smoothingTimeConstant;
-
-  void getByteFrequencyData(_Uint8ArrayImpl array) native;
-
-  void getByteTimeDomainData(_Uint8ArrayImpl array) native;
-
-  void getFloatFrequencyData(_Float32ArrayImpl array) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLAnchorElement
-abstract class AnchorElement implements Element {
-
-  factory AnchorElement({String href}) {
-    if (!?href) {
-      return _Elements.createAnchorElement();
-    }
-    return _Elements.createAnchorElement(href);
-  }
-
-  /** @domName HTMLAnchorElement.charset */
-  String charset;
-
-  /** @domName HTMLAnchorElement.coords */
-  String coords;
-
-  /** @domName HTMLAnchorElement.download */
-  String download;
-
-  /** @domName HTMLAnchorElement.hash */
-  String hash;
-
-  /** @domName HTMLAnchorElement.host */
-  String host;
-
-  /** @domName HTMLAnchorElement.hostname */
-  String hostname;
-
-  /** @domName HTMLAnchorElement.href */
-  String href;
-
-  /** @domName HTMLAnchorElement.hreflang */
-  String hreflang;
-
-  /** @domName HTMLAnchorElement.name */
-  String name;
-
-  /** @domName HTMLAnchorElement.origin */
-  String get origin;
-
-  /** @domName HTMLAnchorElement.pathname */
-  String pathname;
-
-  /** @domName HTMLAnchorElement.ping */
-  String ping;
-
-  /** @domName HTMLAnchorElement.port */
-  String port;
-
-  /** @domName HTMLAnchorElement.protocol */
-  String protocol;
-
-  /** @domName HTMLAnchorElement.rel */
-  String rel;
-
-  /** @domName HTMLAnchorElement.rev */
-  String rev;
-
-  /** @domName HTMLAnchorElement.search */
-  String search;
-
-  /** @domName HTMLAnchorElement.shape */
-  String shape;
-
-  /** @domName HTMLAnchorElement.target */
-  String target;
-
-  /** @domName HTMLAnchorElement.type */
-  String type;
-
-  /** @domName HTMLAnchorElement.toString */
-  String toString();
-}
-
-class _AnchorElementImpl extends _ElementImpl implements AnchorElement native "*HTMLAnchorElement" {
-
-  String charset;
-
-  String coords;
-
-  String download;
-
-  String hash;
-
-  String host;
-
-  String hostname;
-
-  String href;
-
-  String hreflang;
-
-  String name;
-
-  final String origin;
-
-  String pathname;
-
-  String ping;
-
-  String port;
-
-  String protocol;
-
-  String rel;
-
-  String rev;
-
-  String search;
-
-  String shape;
-
-  String target;
-
-  String type;
-
-  String toString() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebKitAnimation
-abstract class Animation {
-
-  static const int DIRECTION_ALTERNATE = 1;
-
-  static const int DIRECTION_NORMAL = 0;
-
-  static const int FILL_BACKWARDS = 1;
-
-  static const int FILL_BOTH = 3;
-
-  static const int FILL_FORWARDS = 2;
-
-  static const int FILL_NONE = 0;
-
-  /** @domName WebKitAnimation.delay */
-  num get delay;
-
-  /** @domName WebKitAnimation.direction */
-  int get direction;
-
-  /** @domName WebKitAnimation.duration */
-  num get duration;
-
-  /** @domName WebKitAnimation.elapsedTime */
-  num elapsedTime;
-
-  /** @domName WebKitAnimation.ended */
-  bool get ended;
-
-  /** @domName WebKitAnimation.fillMode */
-  int get fillMode;
-
-  /** @domName WebKitAnimation.iterationCount */
-  int get iterationCount;
-
-  /** @domName WebKitAnimation.name */
-  String get name;
-
-  /** @domName WebKitAnimation.paused */
-  bool get paused;
-
-  /** @domName WebKitAnimation.pause */
-  void pause();
-
-  /** @domName WebKitAnimation.play */
-  void play();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebKitAnimationEvent
-abstract class AnimationEvent implements Event {
-
-  /** @domName WebKitAnimationEvent.animationName */
-  String get animationName;
-
-  /** @domName WebKitAnimationEvent.elapsedTime */
-  num get elapsedTime;
-}
-
-class _AnimationEventImpl extends _EventImpl implements AnimationEvent native "*WebKitAnimationEvent" {
-
-  final String animationName;
-
-  final num elapsedTime;
-}
-
-class _AnimationImpl implements Animation native "*WebKitAnimation" {
-
-  final num delay;
-
-  final int direction;
-
-  final num duration;
-
-  num elapsedTime;
-
-  final bool ended;
-
-  final int fillMode;
-
-  final int iterationCount;
-
-  final String name;
-
-  final bool paused;
-
-  void pause() native;
-
-  void play() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLAppletElement
-abstract class AppletElement implements Element {
-
-  /** @domName HTMLAppletElement.align */
-  String align;
-
-  /** @domName HTMLAppletElement.alt */
-  String alt;
-
-  /** @domName HTMLAppletElement.archive */
-  String archive;
-
-  /** @domName HTMLAppletElement.code */
-  String code;
-
-  /** @domName HTMLAppletElement.codeBase */
-  String codeBase;
-
-  /** @domName HTMLAppletElement.height */
-  String height;
-
-  /** @domName HTMLAppletElement.hspace */
-  String hspace;
-
-  /** @domName HTMLAppletElement.name */
-  String name;
-
-  /** @domName HTMLAppletElement.object */
-  String object;
-
-  /** @domName HTMLAppletElement.vspace */
-  String vspace;
-
-  /** @domName HTMLAppletElement.width */
-  String width;
-}
-
-class _AppletElementImpl extends _ElementImpl implements AppletElement native "*HTMLAppletElement" {
-
-  String align;
-
-  String alt;
-
-  String archive;
-
-  String code;
-
-  String codeBase;
-
-  String height;
-
-  String hspace;
-
-  String name;
-
-  String object;
-
-  String vspace;
-
-  String width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLAreaElement
-abstract class AreaElement implements Element {
-
-  factory AreaElement() => _Elements.createAreaElement();
-
-  /** @domName HTMLAreaElement.alt */
-  String alt;
-
-  /** @domName HTMLAreaElement.coords */
-  String coords;
-
-  /** @domName HTMLAreaElement.hash */
-  String get hash;
-
-  /** @domName HTMLAreaElement.host */
-  String get host;
-
-  /** @domName HTMLAreaElement.hostname */
-  String get hostname;
-
-  /** @domName HTMLAreaElement.href */
-  String href;
-
-  /** @domName HTMLAreaElement.noHref */
-  bool noHref;
-
-  /** @domName HTMLAreaElement.pathname */
-  String get pathname;
-
-  /** @domName HTMLAreaElement.ping */
-  String ping;
-
-  /** @domName HTMLAreaElement.port */
-  String get port;
-
-  /** @domName HTMLAreaElement.protocol */
-  String get protocol;
-
-  /** @domName HTMLAreaElement.search */
-  String get search;
-
-  /** @domName HTMLAreaElement.shape */
-  String shape;
-
-  /** @domName HTMLAreaElement.target */
-  String target;
-}
-
-class _AreaElementImpl extends _ElementImpl implements AreaElement native "*HTMLAreaElement" {
-
-  String alt;
-
-  String coords;
-
-  final String hash;
-
-  final String host;
-
-  final String hostname;
-
-  String href;
-
-  bool noHref;
-
-  final String pathname;
-
-  String ping;
-
-  final String port;
-
-  final String protocol;
-
-  final String search;
-
-  String shape;
-
-  String target;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ArrayBuffer
-abstract class ArrayBuffer {
-
-  factory ArrayBuffer(int length) => _ArrayBufferFactoryProvider.createArrayBuffer(length);
-
-  /** @domName ArrayBuffer.byteLength */
-  int get byteLength;
-
-  /** @domName ArrayBuffer.slice */
-  ArrayBuffer slice(int begin, [int end]);
-}
-
-class _ArrayBufferImpl implements ArrayBuffer native "*ArrayBuffer" {
-
-  final int byteLength;
-
-  _ArrayBufferImpl slice(int begin, [int end]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ArrayBufferView
-abstract class ArrayBufferView {
-
-  /** @domName ArrayBufferView.buffer */
-  ArrayBuffer get buffer;
-
-  /** @domName ArrayBufferView.byteLength */
-  int get byteLength;
-
-  /** @domName ArrayBufferView.byteOffset */
-  int get byteOffset;
-}
-
-class _ArrayBufferViewImpl implements ArrayBufferView native "*ArrayBufferView" {
-
-  final _ArrayBufferImpl buffer;
-
-  final int byteLength;
-
-  final int byteOffset;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Attr
-abstract class Attr implements Node {
-
-  /** @domName Attr.isId */
-  bool get isId;
-
-  /** @domName Attr.name */
-  String get name;
-
-  /** @domName Attr.ownerElement */
-  Element get ownerElement;
-
-  /** @domName Attr.specified */
-  bool get specified;
-
-  /** @domName Attr.value */
-  String value;
-}
-
-class _AttrImpl extends _NodeImpl implements Attr native "*Attr" {
-
-  final bool isId;
-
-  final String name;
-
-  final _ElementImpl ownerElement;
-
-  final bool specified;
-
-  String value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName AudioBuffer
-abstract class AudioBuffer {
-
-  /** @domName AudioBuffer.duration */
-  num get duration;
-
-  /** @domName AudioBuffer.gain */
-  num gain;
-
-  /** @domName AudioBuffer.length */
-  int get length;
-
-  /** @domName AudioBuffer.numberOfChannels */
-  int get numberOfChannels;
-
-  /** @domName AudioBuffer.sampleRate */
-  num get sampleRate;
-
-  /** @domName AudioBuffer.getChannelData */
-  Float32Array getChannelData(int channelIndex);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void AudioBufferCallback(AudioBuffer audioBuffer);
-
-class _AudioBufferImpl implements AudioBuffer native "*AudioBuffer" {
-
-  final num duration;
-
-  num gain;
-
-  final int length;
-
-  final int numberOfChannels;
-
-  final num sampleRate;
-
-  _Float32ArrayImpl getChannelData(int channelIndex) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName AudioBufferSourceNode
-abstract class AudioBufferSourceNode implements AudioSourceNode {
-
-  static const int FINISHED_STATE = 3;
-
-  static const int PLAYING_STATE = 2;
-
-  static const int SCHEDULED_STATE = 1;
-
-  static const int UNSCHEDULED_STATE = 0;
-
-  /** @domName AudioBufferSourceNode.buffer */
-  AudioBuffer buffer;
-
-  /** @domName AudioBufferSourceNode.gain */
-  AudioGain get gain;
-
-  /** @domName AudioBufferSourceNode.loop */
-  bool loop;
-
-  /** @domName AudioBufferSourceNode.loopEnd */
-  num loopEnd;
-
-  /** @domName AudioBufferSourceNode.loopStart */
-  num loopStart;
-
-  /** @domName AudioBufferSourceNode.playbackRate */
-  AudioParam get playbackRate;
-
-  /** @domName AudioBufferSourceNode.playbackState */
-  int get playbackState;
-
-  /** @domName AudioBufferSourceNode.start */
-  void start(num when, [num grainOffset, num grainDuration]);
-
-  /** @domName AudioBufferSourceNode.stop */
-  void stop(num when);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _AudioBufferSourceNodeImpl extends _AudioSourceNodeImpl implements AudioBufferSourceNode native "*AudioBufferSourceNode" {
-
-  // TODO(efortuna): Remove these methods when Chrome stable also uses start
-  // instead of noteOn.
-  void start(num when, [num grainOffset, num grainDuration]) {
-    if (JS('bool', '!!#.start', this)) {
-      if (?grainDuration) {
-        JS('void', '#.start(#, #, #)', this, when, grainOffset, grainDuration);
-      } else if (?grainOffset) {
-        JS('void', '#.start(#, #)', this, when, grainOffset);
-      } else {
-        JS('void', '#.start(#)', this, when);
-      }
-    } else {
-      if (?grainDuration) {
-        JS('void', '#.noteOn(#, #, #)', this, when, grainOffset, grainDuration);
-      } else if (?grainOffset) {
-        JS('void', '#.noteOn(#, #)', this, when, grainOffset);
-      } else {
-        JS('void', '#.noteOn(#)', this, when);
-      }
-    }
-  }
-
-  void stop(num when) {
-    if (JS('bool', '!!#.stop', this)) {
-      JS('void', '#.stop(#)', this, when);
-    } else {
-      JS('void', '#.noteOff(#)', this, when);
-    }
-  }
-
-  _AudioBufferImpl buffer;
-
-  final _AudioGainImpl gain;
-
-  bool loop;
-
-  num loopEnd;
-
-  num loopStart;
-
-  final _AudioParamImpl playbackRate;
-
-  final int playbackState;
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName AudioContext
-abstract class AudioContext implements EventTarget {
-  factory AudioContext() => _AudioContextFactoryProvider.createAudioContext();
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  AudioContextEvents get on;
-
-  /** @domName AudioContext.activeSourceCount */
-  int get activeSourceCount;
-
-  /** @domName AudioContext.currentTime */
-  num get currentTime;
-
-  /** @domName AudioContext.destination */
-  AudioDestinationNode get destination;
-
-  /** @domName AudioContext.listener */
-  AudioListener get listener;
-
-  /** @domName AudioContext.sampleRate */
-  num get sampleRate;
-
-  /** @domName AudioContext.createAnalyser */
-  AnalyserNode createAnalyser();
-
-  /** @domName AudioContext.createBiquadFilter */
-  BiquadFilterNode createBiquadFilter();
-
-  /** @domName AudioContext.createBuffer */
-  AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [num sampleRate]);
-
-  /** @domName AudioContext.createBufferSource */
-  AudioBufferSourceNode createBufferSource();
-
-  /** @domName AudioContext.createChannelMerger */
-  ChannelMergerNode createChannelMerger([int numberOfInputs]);
-
-  /** @domName AudioContext.createChannelSplitter */
-  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]);
-
-  /** @domName AudioContext.createConvolver */
-  ConvolverNode createConvolver();
-
-  /** @domName AudioContext.createDelay */
-  DelayNode createDelay([num maxDelayTime]);
-
-  /** @domName AudioContext.createDynamicsCompressor */
-  DynamicsCompressorNode createDynamicsCompressor();
-
-  /** @domName AudioContext.createGain */
-  GainNode createGain();
-
-  /** @domName AudioContext.createMediaElementSource */
-  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement);
-
-  /** @domName AudioContext.createMediaStreamSource */
-  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream);
-
-  /** @domName AudioContext.createOscillator */
-  OscillatorNode createOscillator();
-
-  /** @domName AudioContext.createPanner */
-  PannerNode createPanner();
-
-  /** @domName AudioContext.createScriptProcessor */
-  ScriptProcessorNode createScriptProcessor(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]);
-
-  /** @domName AudioContext.createWaveShaper */
-  WaveShaperNode createWaveShaper();
-
-  /** @domName AudioContext.createWaveTable */
-  WaveTable createWaveTable(Float32Array real, Float32Array imag);
-
-  /** @domName AudioContext.decodeAudioData */
-  void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]);
-
-  /** @domName AudioContext.startRendering */
-  void startRendering();
-}
-
-abstract class AudioContextEvents implements Events {
-
-  EventListenerList get complete;
-}
-
-class _AudioContextImpl extends _EventTargetImpl implements AudioContext native "*AudioContext" {
-
-  _AudioContextEventsImpl get on =>
-    new _AudioContextEventsImpl(this);
-
-  final int activeSourceCount;
-
-  final num currentTime;
-
-  final _AudioDestinationNodeImpl destination;
-
-  final _AudioListenerImpl listener;
-
-  final num sampleRate;
-
-  _AnalyserNodeImpl createAnalyser() native;
-
-  _BiquadFilterNodeImpl createBiquadFilter() native;
-
-  _AudioBufferImpl createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [num sampleRate]) native;
-
-  _AudioBufferSourceNodeImpl createBufferSource() native;
-
-  _ChannelMergerNodeImpl createChannelMerger([int numberOfInputs]) native;
-
-  _ChannelSplitterNodeImpl createChannelSplitter([int numberOfOutputs]) native;
-
-  _ConvolverNodeImpl createConvolver() native;
-
-  _DelayNodeImpl createDelay([num maxDelayTime]) native;
-
-  _DynamicsCompressorNodeImpl createDynamicsCompressor() native;
-
-  _GainNodeImpl createGain() native;
-
-  _MediaElementAudioSourceNodeImpl createMediaElementSource(_MediaElementImpl mediaElement) native;
-
-  _MediaStreamAudioSourceNodeImpl createMediaStreamSource(_MediaStreamImpl mediaStream) native;
-
-  _OscillatorNodeImpl createOscillator() native;
-
-  _PannerNodeImpl createPanner() native;
-
-  _ScriptProcessorNodeImpl createScriptProcessor(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) native;
-
-  _WaveShaperNodeImpl createWaveShaper() native;
-
-  _WaveTableImpl createWaveTable(_Float32ArrayImpl real, _Float32ArrayImpl imag) native;
-
-  void decodeAudioData(_ArrayBufferImpl audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native;
-
-  void startRendering() native;
-}
-
-class _AudioContextEventsImpl extends _EventsImpl implements AudioContextEvents {
-  _AudioContextEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get complete => this['complete'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName AudioDestinationNode
-abstract class AudioDestinationNode implements AudioNode {
-
-  /** @domName AudioDestinationNode.numberOfChannels */
-  int get numberOfChannels;
-}
-
-class _AudioDestinationNodeImpl extends _AudioNodeImpl implements AudioDestinationNode native "*AudioDestinationNode" {
-
-  final int numberOfChannels;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLAudioElement
-abstract class AudioElement implements MediaElement {
-
-  factory AudioElement([String src]) {
-    if (!?src) {
-      return _AudioElementFactoryProvider.createAudioElement();
-    }
-    return _AudioElementFactoryProvider.createAudioElement(src);
-  }
-}
-
-class _AudioElementImpl extends _MediaElementImpl implements AudioElement native "*HTMLAudioElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName AudioGain
-abstract class AudioGain implements AudioParam {
-}
-
-class _AudioGainImpl extends _AudioParamImpl implements AudioGain native "*AudioGain" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName AudioListener
-abstract class AudioListener {
-
-  /** @domName AudioListener.dopplerFactor */
-  num dopplerFactor;
-
-  /** @domName AudioListener.speedOfSound */
-  num speedOfSound;
-
-  /** @domName AudioListener.setOrientation */
-  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp);
-
-  /** @domName AudioListener.setPosition */
-  void setPosition(num x, num y, num z);
-
-  /** @domName AudioListener.setVelocity */
-  void setVelocity(num x, num y, num z);
-}
-
-class _AudioListenerImpl implements AudioListener native "*AudioListener" {
-
-  num dopplerFactor;
-
-  num speedOfSound;
-
-  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native;
-
-  void setPosition(num x, num y, num z) native;
-
-  void setVelocity(num x, num y, num z) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName AudioNode
-abstract class AudioNode {
-
-  /** @domName AudioNode.context */
-  AudioContext get context;
-
-  /** @domName AudioNode.numberOfInputs */
-  int get numberOfInputs;
-
-  /** @domName AudioNode.numberOfOutputs */
-  int get numberOfOutputs;
-
-  /** @domName AudioNode.connect */
-  void connect(destination, int output, [int input]);
-
-  /** @domName AudioNode.disconnect */
-  void disconnect(int output);
-}
-
-class _AudioNodeImpl implements AudioNode native "*AudioNode" {
-
-  final _AudioContextImpl context;
-
-  final int numberOfInputs;
-
-  final int numberOfOutputs;
-
-  void connect(destination, int output, [int input]) native;
-
-  void disconnect(int output) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName AudioParam
-abstract class AudioParam {
-
-  /** @domName AudioParam.defaultValue */
-  num get defaultValue;
-
-  /** @domName AudioParam.maxValue */
-  num get maxValue;
-
-  /** @domName AudioParam.minValue */
-  num get minValue;
-
-  /** @domName AudioParam.name */
-  String get name;
-
-  /** @domName AudioParam.units */
-  int get units;
-
-  /** @domName AudioParam.value */
-  num value;
-
-  /** @domName AudioParam.cancelScheduledValues */
-  void cancelScheduledValues(num startTime);
-
-  /** @domName AudioParam.exponentialRampToValueAtTime */
-  void exponentialRampToValueAtTime(num value, num time);
-
-  /** @domName AudioParam.linearRampToValueAtTime */
-  void linearRampToValueAtTime(num value, num time);
-
-  /** @domName AudioParam.setTargetAtTime */
-  void setTargetAtTime(num target, num time, num timeConstant);
-
-  /** @domName AudioParam.setValueAtTime */
-  void setValueAtTime(num value, num time);
-
-  /** @domName AudioParam.setValueCurveAtTime */
-  void setValueCurveAtTime(Float32Array values, num time, num duration);
-}
-
-class _AudioParamImpl implements AudioParam native "*AudioParam" {
-
-  final num defaultValue;
-
-  final num maxValue;
-
-  final num minValue;
-
-  final String name;
-
-  final int units;
-
-  num value;
-
-  void cancelScheduledValues(num startTime) native;
-
-  void exponentialRampToValueAtTime(num value, num time) native;
-
-  void linearRampToValueAtTime(num value, num time) native;
-
-  void setTargetAtTime(num target, num time, num timeConstant) native;
-
-  void setValueAtTime(num value, num time) native;
-
-  void setValueCurveAtTime(_Float32ArrayImpl values, num time, num duration) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName AudioProcessingEvent
-abstract class AudioProcessingEvent implements Event {
-
-  /** @domName AudioProcessingEvent.inputBuffer */
-  AudioBuffer get inputBuffer;
-
-  /** @domName AudioProcessingEvent.outputBuffer */
-  AudioBuffer get outputBuffer;
-}
-
-class _AudioProcessingEventImpl extends _EventImpl implements AudioProcessingEvent native "*AudioProcessingEvent" {
-
-  final _AudioBufferImpl inputBuffer;
-
-  final _AudioBufferImpl outputBuffer;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName AudioSourceNode
-abstract class AudioSourceNode implements AudioNode {
-}
-
-class _AudioSourceNodeImpl extends _AudioNodeImpl implements AudioSourceNode native "*AudioSourceNode" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLBRElement
-abstract class BRElement implements Element {
-
-  factory BRElement() => _Elements.createBRElement();
-
-  /** @domName HTMLBRElement.clear */
-  String clear;
-}
-
-class _BRElementImpl extends _ElementImpl implements BRElement native "*HTMLBRElement" {
-
-  String clear;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName BarInfo
-abstract class BarInfo {
-
-  /** @domName BarInfo.visible */
-  bool get visible;
-}
-
-class _BarInfoImpl implements BarInfo native "*BarInfo" {
-
-  final bool visible;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLBaseElement
-abstract class BaseElement implements Element {
-
-  factory BaseElement() => _Elements.createBaseElement();
-
-  /** @domName HTMLBaseElement.href */
-  String href;
-
-  /** @domName HTMLBaseElement.target */
-  String target;
-}
-
-class _BaseElementImpl extends _ElementImpl implements BaseElement native "*HTMLBaseElement" {
-
-  String href;
-
-  String target;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLBaseFontElement
-abstract class BaseFontElement implements Element {
-
-  /** @domName HTMLBaseFontElement.color */
-  String color;
-
-  /** @domName HTMLBaseFontElement.face */
-  String face;
-
-  /** @domName HTMLBaseFontElement.size */
-  int size;
-}
-
-class _BaseFontElementImpl extends _ElementImpl implements BaseFontElement native "*HTMLBaseFontElement" {
-
-  String color;
-
-  String face;
-
-  int size;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName BatteryManager
-abstract class BatteryManager implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  BatteryManagerEvents get on;
-
-  /** @domName BatteryManager.charging */
-  bool get charging;
-
-  /** @domName BatteryManager.chargingTime */
-  num get chargingTime;
-
-  /** @domName BatteryManager.dischargingTime */
-  num get dischargingTime;
-
-  /** @domName BatteryManager.level */
-  num get level;
-
-  /** @domName BatteryManager.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName BatteryManager.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName BatteryManager.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class BatteryManagerEvents implements Events {
-
-  EventListenerList get chargingChange;
-
-  EventListenerList get chargingTimeChange;
-
-  EventListenerList get dischargingTimeChange;
-
-  EventListenerList get levelChange;
-}
-
-class _BatteryManagerImpl extends _EventTargetImpl implements BatteryManager native "*BatteryManager" {
-
-  _BatteryManagerEventsImpl get on =>
-    new _BatteryManagerEventsImpl(this);
-
-  final bool charging;
-
-  final num chargingTime;
-
-  final num dischargingTime;
-
-  final num level;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _BatteryManagerEventsImpl extends _EventsImpl implements BatteryManagerEvents {
-  _BatteryManagerEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get chargingChange => this['chargingchange'];
-
-  EventListenerList get chargingTimeChange => this['chargingtimechange'];
-
-  EventListenerList get dischargingTimeChange => this['dischargingtimechange'];
-
-  EventListenerList get levelChange => this['levelchange'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName BeforeLoadEvent
-abstract class BeforeLoadEvent implements Event {
-
-  /** @domName BeforeLoadEvent.url */
-  String get url;
-}
-
-class _BeforeLoadEventImpl extends _EventImpl implements BeforeLoadEvent native "*BeforeLoadEvent" {
-
-  final String url;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName BiquadFilterNode
-abstract class BiquadFilterNode implements AudioNode {
-
-  static const int ALLPASS = 7;
-
-  static const int BANDPASS = 2;
-
-  static const int HIGHPASS = 1;
-
-  static const int HIGHSHELF = 4;
-
-  static const int LOWPASS = 0;
-
-  static const int LOWSHELF = 3;
-
-  static const int NOTCH = 6;
-
-  static const int PEAKING = 5;
-
-  /** @domName BiquadFilterNode.Q */
-  AudioParam get Q;
-
-  /** @domName BiquadFilterNode.frequency */
-  AudioParam get frequency;
-
-  /** @domName BiquadFilterNode.gain */
-  AudioParam get gain;
-
-  /** @domName BiquadFilterNode.type */
-  int type;
-
-  /** @domName BiquadFilterNode.getFrequencyResponse */
-  void getFrequencyResponse(Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse);
-}
-
-class _BiquadFilterNodeImpl extends _AudioNodeImpl implements BiquadFilterNode native "*BiquadFilterNode" {
-
-  final _AudioParamImpl Q;
-
-  final _AudioParamImpl frequency;
-
-  final _AudioParamImpl gain;
-
-  int type;
-
-  void getFrequencyResponse(_Float32ArrayImpl frequencyHz, _Float32ArrayImpl magResponse, _Float32ArrayImpl phaseResponse) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Blob
-abstract class Blob {
-
-  factory Blob(List blobParts, [String type, String endings]) {
-    if (!?type) {
-      return _BlobFactoryProvider.createBlob(blobParts);
-    }
-    if (!?endings) {
-      return _BlobFactoryProvider.createBlob(blobParts, type);
-    }
-    return _BlobFactoryProvider.createBlob(blobParts, type, endings);
-  }
-
-  /** @domName Blob.size */
-  int get size;
-
-  /** @domName Blob.type */
-  String get type;
-
-  /** @domName Blob.slice */
-  Blob slice([int start, int end, String contentType]);
-}
-
-class _BlobImpl implements Blob native "*Blob" {
-
-  final int size;
-
-  final String type;
-
-  _BlobImpl slice([int start, int end, String contentType]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLBodyElement
-abstract class BodyElement implements Element {
-
-  factory BodyElement() => _Elements.createBodyElement();
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  BodyElementEvents get on;
-
-  /** @domName HTMLBodyElement.aLink */
-  String aLink;
-
-  /** @domName HTMLBodyElement.background */
-  String background;
-
-  /** @domName HTMLBodyElement.bgColor */
-  String bgColor;
-
-  /** @domName HTMLBodyElement.link */
-  String link;
-
-  /** @domName HTMLBodyElement.vLink */
-  String vLink;
-}
-
-abstract class BodyElementEvents implements ElementEvents {
-
-  EventListenerList get beforeUnload;
-
-  EventListenerList get blur;
-
-  EventListenerList get error;
-
-  EventListenerList get focus;
-
-  EventListenerList get hashChange;
-
-  EventListenerList get load;
-
-  EventListenerList get message;
-
-  EventListenerList get offline;
-
-  EventListenerList get online;
-
-  EventListenerList get popState;
-
-  EventListenerList get resize;
-
-  EventListenerList get storage;
-
-  EventListenerList get unload;
-}
-
-class _BodyElementImpl extends _ElementImpl implements BodyElement native "*HTMLBodyElement" {
-
-  _BodyElementEventsImpl get on =>
-    new _BodyElementEventsImpl(this);
-
-  String aLink;
-
-  String background;
-
-  String bgColor;
-
-  String link;
-
-  String vLink;
-}
-
-class _BodyElementEventsImpl extends _ElementEventsImpl implements BodyElementEvents {
-  _BodyElementEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get beforeUnload => this['beforeunload'];
-
-  EventListenerList get blur => this['blur'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get focus => this['focus'];
-
-  EventListenerList get hashChange => this['hashchange'];
-
-  EventListenerList get load => this['load'];
-
-  EventListenerList get message => this['message'];
-
-  EventListenerList get offline => this['offline'];
-
-  EventListenerList get online => this['online'];
-
-  EventListenerList get popState => this['popstate'];
-
-  EventListenerList get resize => this['resize'];
-
-  EventListenerList get storage => this['storage'];
-
-  EventListenerList get unload => this['unload'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLButtonElement
-abstract class ButtonElement implements Element {
-
-  factory ButtonElement() => _Elements.createButtonElement();
-
-  /** @domName HTMLButtonElement.autofocus */
-  bool autofocus;
-
-  /** @domName HTMLButtonElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLButtonElement.form */
-  FormElement get form;
-
-  /** @domName HTMLButtonElement.formAction */
-  String formAction;
-
-  /** @domName HTMLButtonElement.formEnctype */
-  String formEnctype;
-
-  /** @domName HTMLButtonElement.formMethod */
-  String formMethod;
-
-  /** @domName HTMLButtonElement.formNoValidate */
-  bool formNoValidate;
-
-  /** @domName HTMLButtonElement.formTarget */
-  String formTarget;
-
-  /** @domName HTMLButtonElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLButtonElement.name */
-  String name;
-
-  /** @domName HTMLButtonElement.type */
-  String type;
-
-  /** @domName HTMLButtonElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLButtonElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLButtonElement.value */
-  String value;
-
-  /** @domName HTMLButtonElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLButtonElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLButtonElement.setCustomValidity */
-  void setCustomValidity(String error);
-}
-
-class _ButtonElementImpl extends _ElementImpl implements ButtonElement native "*HTMLButtonElement" {
-
-  bool autofocus;
-
-  bool disabled;
-
-  final _FormElementImpl form;
-
-  String formAction;
-
-  String formEnctype;
-
-  String formMethod;
-
-  bool formNoValidate;
-
-  String formTarget;
-
-  final List<Node> labels;
-
-  String name;
-
-  String type;
-
-  final String validationMessage;
-
-  final _ValidityStateImpl validity;
-
-  String value;
-
-  final bool willValidate;
-
-  bool checkValidity() native;
-
-  void setCustomValidity(String error) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CDATASection
-abstract class CDATASection implements Text {
-}
-
-class _CDATASectionImpl extends _TextImpl implements CDATASection native "*CDATASection" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CSSCharsetRule
-abstract class CSSCharsetRule implements CSSRule {
-
-  /** @domName CSSCharsetRule.encoding */
-  String encoding;
-}
-
-class _CSSCharsetRuleImpl extends _CSSRuleImpl implements CSSCharsetRule native "*CSSCharsetRule" {
-
-  String encoding;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CSSFontFaceRule
-abstract class CSSFontFaceRule implements CSSRule {
-
-  /** @domName CSSFontFaceRule.style */
-  CSSStyleDeclaration get style;
-}
-
-class _CSSFontFaceRuleImpl extends _CSSRuleImpl implements CSSFontFaceRule native "*CSSFontFaceRule" {
-
-  final _CSSStyleDeclarationImpl style;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CSSImportRule
-abstract class CSSImportRule implements CSSRule {
-
-  /** @domName CSSImportRule.href */
-  String get href;
-
-  /** @domName CSSImportRule.media */
-  MediaList get media;
-
-  /** @domName CSSImportRule.styleSheet */
-  CSSStyleSheet get styleSheet;
-}
-
-class _CSSImportRuleImpl extends _CSSRuleImpl implements CSSImportRule native "*CSSImportRule" {
-
-  final String href;
-
-  final _MediaListImpl media;
-
-  final _CSSStyleSheetImpl styleSheet;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebKitCSSKeyframeRule
-abstract class CSSKeyframeRule implements CSSRule {
-
-  /** @domName WebKitCSSKeyframeRule.keyText */
-  String keyText;
-
-  /** @domName WebKitCSSKeyframeRule.style */
-  CSSStyleDeclaration get style;
-}
-
-class _CSSKeyframeRuleImpl extends _CSSRuleImpl implements CSSKeyframeRule native "*WebKitCSSKeyframeRule" {
-
-  String keyText;
-
-  final _CSSStyleDeclarationImpl style;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebKitCSSKeyframesRule
-abstract class CSSKeyframesRule implements CSSRule {
-
-  /** @domName WebKitCSSKeyframesRule.cssRules */
-  List<CSSRule> get cssRules;
-
-  /** @domName WebKitCSSKeyframesRule.name */
-  String name;
-
-  /** @domName WebKitCSSKeyframesRule.deleteRule */
-  void deleteRule(String key);
-
-  /** @domName WebKitCSSKeyframesRule.findRule */
-  CSSKeyframeRule findRule(String key);
-
-  /** @domName WebKitCSSKeyframesRule.insertRule */
-  void insertRule(String rule);
-}
-
-class _CSSKeyframesRuleImpl extends _CSSRuleImpl implements CSSKeyframesRule native "*WebKitCSSKeyframesRule" {
-
-  final _CSSRuleListImpl cssRules;
-
-  String name;
-
-  void deleteRule(String key) native;
-
-  _CSSKeyframeRuleImpl findRule(String key) native;
-
-  void insertRule(String rule) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebKitCSSMatrix
-abstract class CSSMatrix {
-
-  factory CSSMatrix([String cssValue]) {
-    if (!?cssValue) {
-      return _CSSMatrixFactoryProvider.createCSSMatrix();
-    }
-    return _CSSMatrixFactoryProvider.createCSSMatrix(cssValue);
-  }
-
-  /** @domName WebKitCSSMatrix.a */
-  num a;
-
-  /** @domName WebKitCSSMatrix.b */
-  num b;
-
-  /** @domName WebKitCSSMatrix.c */
-  num c;
-
-  /** @domName WebKitCSSMatrix.d */
-  num d;
-
-  /** @domName WebKitCSSMatrix.e */
-  num e;
-
-  /** @domName WebKitCSSMatrix.f */
-  num f;
-
-  /** @domName WebKitCSSMatrix.m11 */
-  num m11;
-
-  /** @domName WebKitCSSMatrix.m12 */
-  num m12;
-
-  /** @domName WebKitCSSMatrix.m13 */
-  num m13;
-
-  /** @domName WebKitCSSMatrix.m14 */
-  num m14;
-
-  /** @domName WebKitCSSMatrix.m21 */
-  num m21;
-
-  /** @domName WebKitCSSMatrix.m22 */
-  num m22;
-
-  /** @domName WebKitCSSMatrix.m23 */
-  num m23;
-
-  /** @domName WebKitCSSMatrix.m24 */
-  num m24;
-
-  /** @domName WebKitCSSMatrix.m31 */
-  num m31;
-
-  /** @domName WebKitCSSMatrix.m32 */
-  num m32;
-
-  /** @domName WebKitCSSMatrix.m33 */
-  num m33;
-
-  /** @domName WebKitCSSMatrix.m34 */
-  num m34;
-
-  /** @domName WebKitCSSMatrix.m41 */
-  num m41;
-
-  /** @domName WebKitCSSMatrix.m42 */
-  num m42;
-
-  /** @domName WebKitCSSMatrix.m43 */
-  num m43;
-
-  /** @domName WebKitCSSMatrix.m44 */
-  num m44;
-
-  /** @domName WebKitCSSMatrix.inverse */
-  CSSMatrix inverse();
-
-  /** @domName WebKitCSSMatrix.multiply */
-  CSSMatrix multiply(CSSMatrix secondMatrix);
-
-  /** @domName WebKitCSSMatrix.rotate */
-  CSSMatrix rotate(num rotX, num rotY, num rotZ);
-
-  /** @domName WebKitCSSMatrix.rotateAxisAngle */
-  CSSMatrix rotateAxisAngle(num x, num y, num z, num angle);
-
-  /** @domName WebKitCSSMatrix.scale */
-  CSSMatrix scale(num scaleX, num scaleY, num scaleZ);
-
-  /** @domName WebKitCSSMatrix.setMatrixValue */
-  void setMatrixValue(String string);
-
-  /** @domName WebKitCSSMatrix.skewX */
-  CSSMatrix skewX(num angle);
-
-  /** @domName WebKitCSSMatrix.skewY */
-  CSSMatrix skewY(num angle);
-
-  /** @domName WebKitCSSMatrix.toString */
-  String toString();
-
-  /** @domName WebKitCSSMatrix.translate */
-  CSSMatrix translate(num x, num y, num z);
-}
-
-class _CSSMatrixImpl implements CSSMatrix native "*WebKitCSSMatrix" {
-
-  num a;
-
-  num b;
-
-  num c;
-
-  num d;
-
-  num e;
-
-  num f;
-
-  num m11;
-
-  num m12;
-
-  num m13;
-
-  num m14;
-
-  num m21;
-
-  num m22;
-
-  num m23;
-
-  num m24;
-
-  num m31;
-
-  num m32;
-
-  num m33;
-
-  num m34;
-
-  num m41;
-
-  num m42;
-
-  num m43;
-
-  num m44;
-
-  _CSSMatrixImpl inverse() native;
-
-  _CSSMatrixImpl multiply(_CSSMatrixImpl secondMatrix) native;
-
-  _CSSMatrixImpl rotate(num rotX, num rotY, num rotZ) native;
-
-  _CSSMatrixImpl rotateAxisAngle(num x, num y, num z, num angle) native;
-
-  _CSSMatrixImpl scale(num scaleX, num scaleY, num scaleZ) native;
-
-  void setMatrixValue(String string) native;
-
-  _CSSMatrixImpl skewX(num angle) native;
-
-  _CSSMatrixImpl skewY(num angle) native;
-
-  String toString() native;
-
-  _CSSMatrixImpl translate(num x, num y, num z) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CSSMediaRule
-abstract class CSSMediaRule implements CSSRule {
-
-  /** @domName CSSMediaRule.cssRules */
-  List<CSSRule> get cssRules;
-
-  /** @domName CSSMediaRule.media */
-  MediaList get media;
-
-  /** @domName CSSMediaRule.deleteRule */
-  void deleteRule(int index);
-
-  /** @domName CSSMediaRule.insertRule */
-  int insertRule(String rule, int index);
-}
-
-class _CSSMediaRuleImpl extends _CSSRuleImpl implements CSSMediaRule native "*CSSMediaRule" {
-
-  final _CSSRuleListImpl cssRules;
-
-  final _MediaListImpl media;
-
-  void deleteRule(int index) native;
-
-  int insertRule(String rule, int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CSSPageRule
-abstract class CSSPageRule implements CSSRule {
-
-  /** @domName CSSPageRule.selectorText */
-  String selectorText;
-
-  /** @domName CSSPageRule.style */
-  CSSStyleDeclaration get style;
-}
-
-class _CSSPageRuleImpl extends _CSSRuleImpl implements CSSPageRule native "*CSSPageRule" {
-
-  String selectorText;
-
-  final _CSSStyleDeclarationImpl style;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CSSPrimitiveValue
-abstract class CSSPrimitiveValue implements CSSValue {
-
-  static const int CSS_ATTR = 22;
-
-  static const int CSS_CM = 6;
-
-  static const int CSS_COUNTER = 23;
-
-  static const int CSS_DEG = 11;
-
-  static const int CSS_DIMENSION = 18;
-
-  static const int CSS_EMS = 3;
-
-  static const int CSS_EXS = 4;
-
-  static const int CSS_GRAD = 13;
-
-  static const int CSS_HZ = 16;
-
-  static const int CSS_IDENT = 21;
-
-  static const int CSS_IN = 8;
-
-  static const int CSS_KHZ = 17;
-
-  static const int CSS_MM = 7;
-
-  static const int CSS_MS = 14;
-
-  static const int CSS_NUMBER = 1;
-
-  static const int CSS_PC = 10;
-
-  static const int CSS_PERCENTAGE = 2;
-
-  static const int CSS_PT = 9;
-
-  static const int CSS_PX = 5;
-
-  static const int CSS_RAD = 12;
-
-  static const int CSS_RECT = 24;
-
-  static const int CSS_RGBCOLOR = 25;
-
-  static const int CSS_S = 15;
-
-  static const int CSS_STRING = 19;
-
-  static const int CSS_UNKNOWN = 0;
-
-  static const int CSS_URI = 20;
-
-  static const int CSS_VH = 27;
-
-  static const int CSS_VMIN = 28;
-
-  static const int CSS_VW = 26;
-
-  /** @domName CSSPrimitiveValue.primitiveType */
-  int get primitiveType;
-
-  /** @domName CSSPrimitiveValue.getCounterValue */
-  Counter getCounterValue();
-
-  /** @domName CSSPrimitiveValue.getFloatValue */
-  num getFloatValue(int unitType);
-
-  /** @domName CSSPrimitiveValue.getRGBColorValue */
-  RGBColor getRGBColorValue();
-
-  /** @domName CSSPrimitiveValue.getRectValue */
-  Rect getRectValue();
-
-  /** @domName CSSPrimitiveValue.getStringValue */
-  String getStringValue();
-
-  /** @domName CSSPrimitiveValue.setFloatValue */
-  void setFloatValue(int unitType, num floatValue);
-
-  /** @domName CSSPrimitiveValue.setStringValue */
-  void setStringValue(int stringType, String stringValue);
-}
-
-class _CSSPrimitiveValueImpl extends _CSSValueImpl implements CSSPrimitiveValue native "*CSSPrimitiveValue" {
-
-  final int primitiveType;
-
-  _CounterImpl getCounterValue() native;
-
-  num getFloatValue(int unitType) native;
-
-  _RGBColorImpl getRGBColorValue() native;
-
-  _RectImpl getRectValue() native;
-
-  String getStringValue() native;
-
-  void setFloatValue(int unitType, num floatValue) native;
-
-  void setStringValue(int stringType, String stringValue) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CSSRule
-abstract class CSSRule {
-
-  static const int CHARSET_RULE = 2;
-
-  static const int FONT_FACE_RULE = 5;
-
-  static const int IMPORT_RULE = 3;
-
-  static const int MEDIA_RULE = 4;
-
-  static const int PAGE_RULE = 6;
-
-  static const int STYLE_RULE = 1;
-
-  static const int UNKNOWN_RULE = 0;
-
-  static const int WEBKIT_KEYFRAMES_RULE = 7;
-
-  static const int WEBKIT_KEYFRAME_RULE = 8;
-
-  /** @domName CSSRule.cssText */
-  String cssText;
-
-  /** @domName CSSRule.parentRule */
-  CSSRule get parentRule;
-
-  /** @domName CSSRule.parentStyleSheet */
-  CSSStyleSheet get parentStyleSheet;
-
-  /** @domName CSSRule.type */
-  int get type;
-}
-
-class _CSSRuleImpl implements CSSRule native "*CSSRule" {
-
-  String cssText;
-
-  final _CSSRuleImpl parentRule;
-
-  final _CSSStyleSheetImpl parentStyleSheet;
-
-  final int type;
-}
-
-class _CSSRuleListImpl implements List<CSSRule>, JavaScriptIndexingBehavior native "*CSSRuleList" {
-
-  final int length;
-
-  _CSSRuleImpl operator[](int index) => JS("_CSSRuleImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _CSSRuleImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<CSSRule> mixins.
-  // CSSRule is the element type.
-
-  // From Iterable<CSSRule>:
-
-  Iterator<CSSRule> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<CSSRule>(this);
-  }
-
-  // From Collection<CSSRule>:
-
-  void add(CSSRule value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(CSSRule value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<CSSRule> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(CSSRule element) => _Collections.contains(this, element);
-
-  void forEach(void f(CSSRule element)) => _Collections.forEach(this, f);
-
-  Collection map(f(CSSRule element)) => _Collections.map(this, [], f);
-
-  Collection<CSSRule> filter(bool f(CSSRule element)) =>
-     _Collections.filter(this, <CSSRule>[], f);
-
-  bool every(bool f(CSSRule element)) => _Collections.every(this, f);
-
-  bool some(bool f(CSSRule element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<CSSRule>:
-
-  void sort([Comparator<CSSRule> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(CSSRule element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(CSSRule element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  CSSRule get last => this[length - 1];
-
-  CSSRule removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<CSSRule> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [CSSRule initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<CSSRule> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <CSSRule>[]);
-
-  // -- end List<CSSRule> mixins.
-
-  _CSSRuleImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName CSSStyleDeclaration
-abstract class CSSStyleDeclaration  {
-  factory CSSStyleDeclaration() => _CSSStyleDeclarationFactoryProvider.createCSSStyleDeclaration();
-  factory CSSStyleDeclaration.css(String css) => _CSSStyleDeclarationFactoryProvider.createCSSStyleDeclaration_css(css);
-
-
-  /** @domName CSSStyleDeclaration.cssText */
-  String cssText;
-
-  /** @domName CSSStyleDeclaration.length */
-  int get length;
-
-  /** @domName CSSStyleDeclaration.parentRule */
-  CSSRule get parentRule;
-
-  /** @domName CSSStyleDeclaration.getPropertyCSSValue */
-  CSSValue getPropertyCSSValue(String propertyName);
-
-  /** @domName CSSStyleDeclaration.getPropertyPriority */
-  String getPropertyPriority(String propertyName);
-
-  /** @domName CSSStyleDeclaration.getPropertyShorthand */
-  String getPropertyShorthand(String propertyName);
-
-  /** @domName CSSStyleDeclaration.isPropertyImplicit */
-  bool isPropertyImplicit(String propertyName);
-
-  /** @domName CSSStyleDeclaration.item */
-  String item(int index);
-
-  /** @domName CSSStyleDeclaration.removeProperty */
-  String removeProperty(String propertyName);
-
-  /** @domName CSSStyleDeclaration.setProperty */
-  void setProperty(String propertyName, String value, [String priority]);
-
-
-  /** Gets the value of "animation" */
-  String get animation;
-
-  /** Sets the value of "animation" */
-  void set animation(var value);
-
-  /** Gets the value of "animation-delay" */
-  String get animationDelay;
-
-  /** Sets the value of "animation-delay" */
-  void set animationDelay(var value);
-
-  /** Gets the value of "animation-direction" */
-  String get animationDirection;
-
-  /** Sets the value of "animation-direction" */
-  void set animationDirection(var value);
-
-  /** Gets the value of "animation-duration" */
-  String get animationDuration;
-
-  /** Sets the value of "animation-duration" */
-  void set animationDuration(var value);
-
-  /** Gets the value of "animation-fill-mode" */
-  String get animationFillMode;
-
-  /** Sets the value of "animation-fill-mode" */
-  void set animationFillMode(var value);
-
-  /** Gets the value of "animation-iteration-count" */
-  String get animationIterationCount;
-
-  /** Sets the value of "animation-iteration-count" */
-  void set animationIterationCount(var value);
-
-  /** Gets the value of "animation-name" */
-  String get animationName;
-
-  /** Sets the value of "animation-name" */
-  void set animationName(var value);
-
-  /** Gets the value of "animation-play-state" */
-  String get animationPlayState;
-
-  /** Sets the value of "animation-play-state" */
-  void set animationPlayState(var value);
-
-  /** Gets the value of "animation-timing-function" */
-  String get animationTimingFunction;
-
-  /** Sets the value of "animation-timing-function" */
-  void set animationTimingFunction(var value);
-
-  /** Gets the value of "appearance" */
-  String get appearance;
-
-  /** Sets the value of "appearance" */
-  void set appearance(var value);
-
-  /** Gets the value of "backface-visibility" */
-  String get backfaceVisibility;
-
-  /** Sets the value of "backface-visibility" */
-  void set backfaceVisibility(var value);
-
-  /** Gets the value of "background" */
-  String get background;
-
-  /** Sets the value of "background" */
-  void set background(var value);
-
-  /** Gets the value of "background-attachment" */
-  String get backgroundAttachment;
-
-  /** Sets the value of "background-attachment" */
-  void set backgroundAttachment(var value);
-
-  /** Gets the value of "background-clip" */
-  String get backgroundClip;
-
-  /** Sets the value of "background-clip" */
-  void set backgroundClip(var value);
-
-  /** Gets the value of "background-color" */
-  String get backgroundColor;
-
-  /** Sets the value of "background-color" */
-  void set backgroundColor(var value);
-
-  /** Gets the value of "background-composite" */
-  String get backgroundComposite;
-
-  /** Sets the value of "background-composite" */
-  void set backgroundComposite(var value);
-
-  /** Gets the value of "background-image" */
-  String get backgroundImage;
-
-  /** Sets the value of "background-image" */
-  void set backgroundImage(var value);
-
-  /** Gets the value of "background-origin" */
-  String get backgroundOrigin;
-
-  /** Sets the value of "background-origin" */
-  void set backgroundOrigin(var value);
-
-  /** Gets the value of "background-position" */
-  String get backgroundPosition;
-
-  /** Sets the value of "background-position" */
-  void set backgroundPosition(var value);
-
-  /** Gets the value of "background-position-x" */
-  String get backgroundPositionX;
-
-  /** Sets the value of "background-position-x" */
-  void set backgroundPositionX(var value);
-
-  /** Gets the value of "background-position-y" */
-  String get backgroundPositionY;
-
-  /** Sets the value of "background-position-y" */
-  void set backgroundPositionY(var value);
-
-  /** Gets the value of "background-repeat" */
-  String get backgroundRepeat;
-
-  /** Sets the value of "background-repeat" */
-  void set backgroundRepeat(var value);
-
-  /** Gets the value of "background-repeat-x" */
-  String get backgroundRepeatX;
-
-  /** Sets the value of "background-repeat-x" */
-  void set backgroundRepeatX(var value);
-
-  /** Gets the value of "background-repeat-y" */
-  String get backgroundRepeatY;
-
-  /** Sets the value of "background-repeat-y" */
-  void set backgroundRepeatY(var value);
-
-  /** Gets the value of "background-size" */
-  String get backgroundSize;
-
-  /** Sets the value of "background-size" */
-  void set backgroundSize(var value);
-
-  /** Gets the value of "border" */
-  String get border;
-
-  /** Sets the value of "border" */
-  void set border(var value);
-
-  /** Gets the value of "border-after" */
-  String get borderAfter;
-
-  /** Sets the value of "border-after" */
-  void set borderAfter(var value);
-
-  /** Gets the value of "border-after-color" */
-  String get borderAfterColor;
-
-  /** Sets the value of "border-after-color" */
-  void set borderAfterColor(var value);
-
-  /** Gets the value of "border-after-style" */
-  String get borderAfterStyle;
-
-  /** Sets the value of "border-after-style" */
-  void set borderAfterStyle(var value);
-
-  /** Gets the value of "border-after-width" */
-  String get borderAfterWidth;
-
-  /** Sets the value of "border-after-width" */
-  void set borderAfterWidth(var value);
-
-  /** Gets the value of "border-before" */
-  String get borderBefore;
-
-  /** Sets the value of "border-before" */
-  void set borderBefore(var value);
-
-  /** Gets the value of "border-before-color" */
-  String get borderBeforeColor;
-
-  /** Sets the value of "border-before-color" */
-  void set borderBeforeColor(var value);
-
-  /** Gets the value of "border-before-style" */
-  String get borderBeforeStyle;
-
-  /** Sets the value of "border-before-style" */
-  void set borderBeforeStyle(var value);
-
-  /** Gets the value of "border-before-width" */
-  String get borderBeforeWidth;
-
-  /** Sets the value of "border-before-width" */
-  void set borderBeforeWidth(var value);
-
-  /** Gets the value of "border-bottom" */
-  String get borderBottom;
-
-  /** Sets the value of "border-bottom" */
-  void set borderBottom(var value);
-
-  /** Gets the value of "border-bottom-color" */
-  String get borderBottomColor;
-
-  /** Sets the value of "border-bottom-color" */
-  void set borderBottomColor(var value);
-
-  /** Gets the value of "border-bottom-left-radius" */
-  String get borderBottomLeftRadius;
-
-  /** Sets the value of "border-bottom-left-radius" */
-  void set borderBottomLeftRadius(var value);
-
-  /** Gets the value of "border-bottom-right-radius" */
-  String get borderBottomRightRadius;
-
-  /** Sets the value of "border-bottom-right-radius" */
-  void set borderBottomRightRadius(var value);
-
-  /** Gets the value of "border-bottom-style" */
-  String get borderBottomStyle;
-
-  /** Sets the value of "border-bottom-style" */
-  void set borderBottomStyle(var value);
-
-  /** Gets the value of "border-bottom-width" */
-  String get borderBottomWidth;
-
-  /** Sets the value of "border-bottom-width" */
-  void set borderBottomWidth(var value);
-
-  /** Gets the value of "border-collapse" */
-  String get borderCollapse;
-
-  /** Sets the value of "border-collapse" */
-  void set borderCollapse(var value);
-
-  /** Gets the value of "border-color" */
-  String get borderColor;
-
-  /** Sets the value of "border-color" */
-  void set borderColor(var value);
-
-  /** Gets the value of "border-end" */
-  String get borderEnd;
-
-  /** Sets the value of "border-end" */
-  void set borderEnd(var value);
-
-  /** Gets the value of "border-end-color" */
-  String get borderEndColor;
-
-  /** Sets the value of "border-end-color" */
-  void set borderEndColor(var value);
-
-  /** Gets the value of "border-end-style" */
-  String get borderEndStyle;
-
-  /** Sets the value of "border-end-style" */
-  void set borderEndStyle(var value);
-
-  /** Gets the value of "border-end-width" */
-  String get borderEndWidth;
-
-  /** Sets the value of "border-end-width" */
-  void set borderEndWidth(var value);
-
-  /** Gets the value of "border-fit" */
-  String get borderFit;
-
-  /** Sets the value of "border-fit" */
-  void set borderFit(var value);
-
-  /** Gets the value of "border-horizontal-spacing" */
-  String get borderHorizontalSpacing;
-
-  /** Sets the value of "border-horizontal-spacing" */
-  void set borderHorizontalSpacing(var value);
-
-  /** Gets the value of "border-image" */
-  String get borderImage;
-
-  /** Sets the value of "border-image" */
-  void set borderImage(var value);
-
-  /** Gets the value of "border-image-outset" */
-  String get borderImageOutset;
-
-  /** Sets the value of "border-image-outset" */
-  void set borderImageOutset(var value);
-
-  /** Gets the value of "border-image-repeat" */
-  String get borderImageRepeat;
-
-  /** Sets the value of "border-image-repeat" */
-  void set borderImageRepeat(var value);
-
-  /** Gets the value of "border-image-slice" */
-  String get borderImageSlice;
-
-  /** Sets the value of "border-image-slice" */
-  void set borderImageSlice(var value);
-
-  /** Gets the value of "border-image-source" */
-  String get borderImageSource;
-
-  /** Sets the value of "border-image-source" */
-  void set borderImageSource(var value);
-
-  /** Gets the value of "border-image-width" */
-  String get borderImageWidth;
-
-  /** Sets the value of "border-image-width" */
-  void set borderImageWidth(var value);
-
-  /** Gets the value of "border-left" */
-  String get borderLeft;
-
-  /** Sets the value of "border-left" */
-  void set borderLeft(var value);
-
-  /** Gets the value of "border-left-color" */
-  String get borderLeftColor;
-
-  /** Sets the value of "border-left-color" */
-  void set borderLeftColor(var value);
-
-  /** Gets the value of "border-left-style" */
-  String get borderLeftStyle;
-
-  /** Sets the value of "border-left-style" */
-  void set borderLeftStyle(var value);
-
-  /** Gets the value of "border-left-width" */
-  String get borderLeftWidth;
-
-  /** Sets the value of "border-left-width" */
-  void set borderLeftWidth(var value);
-
-  /** Gets the value of "border-radius" */
-  String get borderRadius;
-
-  /** Sets the value of "border-radius" */
-  void set borderRadius(var value);
-
-  /** Gets the value of "border-right" */
-  String get borderRight;
-
-  /** Sets the value of "border-right" */
-  void set borderRight(var value);
-
-  /** Gets the value of "border-right-color" */
-  String get borderRightColor;
-
-  /** Sets the value of "border-right-color" */
-  void set borderRightColor(var value);
-
-  /** Gets the value of "border-right-style" */
-  String get borderRightStyle;
-
-  /** Sets the value of "border-right-style" */
-  void set borderRightStyle(var value);
-
-  /** Gets the value of "border-right-width" */
-  String get borderRightWidth;
-
-  /** Sets the value of "border-right-width" */
-  void set borderRightWidth(var value);
-
-  /** Gets the value of "border-spacing" */
-  String get borderSpacing;
-
-  /** Sets the value of "border-spacing" */
-  void set borderSpacing(var value);
-
-  /** Gets the value of "border-start" */
-  String get borderStart;
-
-  /** Sets the value of "border-start" */
-  void set borderStart(var value);
-
-  /** Gets the value of "border-start-color" */
-  String get borderStartColor;
-
-  /** Sets the value of "border-start-color" */
-  void set borderStartColor(var value);
-
-  /** Gets the value of "border-start-style" */
-  String get borderStartStyle;
-
-  /** Sets the value of "border-start-style" */
-  void set borderStartStyle(var value);
-
-  /** Gets the value of "border-start-width" */
-  String get borderStartWidth;
-
-  /** Sets the value of "border-start-width" */
-  void set borderStartWidth(var value);
-
-  /** Gets the value of "border-style" */
-  String get borderStyle;
-
-  /** Sets the value of "border-style" */
-  void set borderStyle(var value);
-
-  /** Gets the value of "border-top" */
-  String get borderTop;
-
-  /** Sets the value of "border-top" */
-  void set borderTop(var value);
-
-  /** Gets the value of "border-top-color" */
-  String get borderTopColor;
-
-  /** Sets the value of "border-top-color" */
-  void set borderTopColor(var value);
-
-  /** Gets the value of "border-top-left-radius" */
-  String get borderTopLeftRadius;
-
-  /** Sets the value of "border-top-left-radius" */
-  void set borderTopLeftRadius(var value);
-
-  /** Gets the value of "border-top-right-radius" */
-  String get borderTopRightRadius;
-
-  /** Sets the value of "border-top-right-radius" */
-  void set borderTopRightRadius(var value);
-
-  /** Gets the value of "border-top-style" */
-  String get borderTopStyle;
-
-  /** Sets the value of "border-top-style" */
-  void set borderTopStyle(var value);
-
-  /** Gets the value of "border-top-width" */
-  String get borderTopWidth;
-
-  /** Sets the value of "border-top-width" */
-  void set borderTopWidth(var value);
-
-  /** Gets the value of "border-vertical-spacing" */
-  String get borderVerticalSpacing;
-
-  /** Sets the value of "border-vertical-spacing" */
-  void set borderVerticalSpacing(var value);
-
-  /** Gets the value of "border-width" */
-  String get borderWidth;
-
-  /** Sets the value of "border-width" */
-  void set borderWidth(var value);
-
-  /** Gets the value of "bottom" */
-  String get bottom;
-
-  /** Sets the value of "bottom" */
-  void set bottom(var value);
-
-  /** Gets the value of "box-align" */
-  String get boxAlign;
-
-  /** Sets the value of "box-align" */
-  void set boxAlign(var value);
-
-  /** Gets the value of "box-direction" */
-  String get boxDirection;
-
-  /** Sets the value of "box-direction" */
-  void set boxDirection(var value);
-
-  /** Gets the value of "box-flex" */
-  String get boxFlex;
-
-  /** Sets the value of "box-flex" */
-  void set boxFlex(var value);
-
-  /** Gets the value of "box-flex-group" */
-  String get boxFlexGroup;
-
-  /** Sets the value of "box-flex-group" */
-  void set boxFlexGroup(var value);
-
-  /** Gets the value of "box-lines" */
-  String get boxLines;
-
-  /** Sets the value of "box-lines" */
-  void set boxLines(var value);
-
-  /** Gets the value of "box-ordinal-group" */
-  String get boxOrdinalGroup;
-
-  /** Sets the value of "box-ordinal-group" */
-  void set boxOrdinalGroup(var value);
-
-  /** Gets the value of "box-orient" */
-  String get boxOrient;
-
-  /** Sets the value of "box-orient" */
-  void set boxOrient(var value);
-
-  /** Gets the value of "box-pack" */
-  String get boxPack;
-
-  /** Sets the value of "box-pack" */
-  void set boxPack(var value);
-
-  /** Gets the value of "box-reflect" */
-  String get boxReflect;
-
-  /** Sets the value of "box-reflect" */
-  void set boxReflect(var value);
-
-  /** Gets the value of "box-shadow" */
-  String get boxShadow;
-
-  /** Sets the value of "box-shadow" */
-  void set boxShadow(var value);
-
-  /** Gets the value of "box-sizing" */
-  String get boxSizing;
-
-  /** Sets the value of "box-sizing" */
-  void set boxSizing(var value);
-
-  /** Gets the value of "caption-side" */
-  String get captionSide;
-
-  /** Sets the value of "caption-side" */
-  void set captionSide(var value);
-
-  /** Gets the value of "clear" */
-  String get clear;
-
-  /** Sets the value of "clear" */
-  void set clear(var value);
-
-  /** Gets the value of "clip" */
-  String get clip;
-
-  /** Sets the value of "clip" */
-  void set clip(var value);
-
-  /** Gets the value of "color" */
-  String get color;
-
-  /** Sets the value of "color" */
-  void set color(var value);
-
-  /** Gets the value of "color-correction" */
-  String get colorCorrection;
-
-  /** Sets the value of "color-correction" */
-  void set colorCorrection(var value);
-
-  /** Gets the value of "column-break-after" */
-  String get columnBreakAfter;
-
-  /** Sets the value of "column-break-after" */
-  void set columnBreakAfter(var value);
-
-  /** Gets the value of "column-break-before" */
-  String get columnBreakBefore;
-
-  /** Sets the value of "column-break-before" */
-  void set columnBreakBefore(var value);
-
-  /** Gets the value of "column-break-inside" */
-  String get columnBreakInside;
-
-  /** Sets the value of "column-break-inside" */
-  void set columnBreakInside(var value);
-
-  /** Gets the value of "column-count" */
-  String get columnCount;
-
-  /** Sets the value of "column-count" */
-  void set columnCount(var value);
-
-  /** Gets the value of "column-gap" */
-  String get columnGap;
-
-  /** Sets the value of "column-gap" */
-  void set columnGap(var value);
-
-  /** Gets the value of "column-rule" */
-  String get columnRule;
-
-  /** Sets the value of "column-rule" */
-  void set columnRule(var value);
-
-  /** Gets the value of "column-rule-color" */
-  String get columnRuleColor;
-
-  /** Sets the value of "column-rule-color" */
-  void set columnRuleColor(var value);
-
-  /** Gets the value of "column-rule-style" */
-  String get columnRuleStyle;
-
-  /** Sets the value of "column-rule-style" */
-  void set columnRuleStyle(var value);
-
-  /** Gets the value of "column-rule-width" */
-  String get columnRuleWidth;
-
-  /** Sets the value of "column-rule-width" */
-  void set columnRuleWidth(var value);
-
-  /** Gets the value of "column-span" */
-  String get columnSpan;
-
-  /** Sets the value of "column-span" */
-  void set columnSpan(var value);
-
-  /** Gets the value of "column-width" */
-  String get columnWidth;
-
-  /** Sets the value of "column-width" */
-  void set columnWidth(var value);
-
-  /** Gets the value of "columns" */
-  String get columns;
-
-  /** Sets the value of "columns" */
-  void set columns(var value);
-
-  /** Gets the value of "content" */
-  String get content;
-
-  /** Sets the value of "content" */
-  void set content(var value);
-
-  /** Gets the value of "counter-increment" */
-  String get counterIncrement;
-
-  /** Sets the value of "counter-increment" */
-  void set counterIncrement(var value);
-
-  /** Gets the value of "counter-reset" */
-  String get counterReset;
-
-  /** Sets the value of "counter-reset" */
-  void set counterReset(var value);
-
-  /** Gets the value of "cursor" */
-  String get cursor;
-
-  /** Sets the value of "cursor" */
-  void set cursor(var value);
-
-  /** Gets the value of "direction" */
-  String get direction;
-
-  /** Sets the value of "direction" */
-  void set direction(var value);
-
-  /** Gets the value of "display" */
-  String get display;
-
-  /** Sets the value of "display" */
-  void set display(var value);
-
-  /** Gets the value of "empty-cells" */
-  String get emptyCells;
-
-  /** Sets the value of "empty-cells" */
-  void set emptyCells(var value);
-
-  /** Gets the value of "filter" */
-  String get filter;
-
-  /** Sets the value of "filter" */
-  void set filter(var value);
-
-  /** Gets the value of "flex-align" */
-  String get flexAlign;
-
-  /** Sets the value of "flex-align" */
-  void set flexAlign(var value);
-
-  /** Gets the value of "flex-flow" */
-  String get flexFlow;
-
-  /** Sets the value of "flex-flow" */
-  void set flexFlow(var value);
-
-  /** Gets the value of "flex-order" */
-  String get flexOrder;
-
-  /** Sets the value of "flex-order" */
-  void set flexOrder(var value);
-
-  /** Gets the value of "flex-pack" */
-  String get flexPack;
-
-  /** Sets the value of "flex-pack" */
-  void set flexPack(var value);
-
-  /** Gets the value of "float" */
-  String get float;
-
-  /** Sets the value of "float" */
-  void set float(var value);
-
-  /** Gets the value of "flow-from" */
-  String get flowFrom;
-
-  /** Sets the value of "flow-from" */
-  void set flowFrom(var value);
-
-  /** Gets the value of "flow-into" */
-  String get flowInto;
-
-  /** Sets the value of "flow-into" */
-  void set flowInto(var value);
-
-  /** Gets the value of "font" */
-  String get font;
-
-  /** Sets the value of "font" */
-  void set font(var value);
-
-  /** Gets the value of "font-family" */
-  String get fontFamily;
-
-  /** Sets the value of "font-family" */
-  void set fontFamily(var value);
-
-  /** Gets the value of "font-feature-settings" */
-  String get fontFeatureSettings;
-
-  /** Sets the value of "font-feature-settings" */
-  void set fontFeatureSettings(var value);
-
-  /** Gets the value of "font-size" */
-  String get fontSize;
-
-  /** Sets the value of "font-size" */
-  void set fontSize(var value);
-
-  /** Gets the value of "font-size-delta" */
-  String get fontSizeDelta;
-
-  /** Sets the value of "font-size-delta" */
-  void set fontSizeDelta(var value);
-
-  /** Gets the value of "font-smoothing" */
-  String get fontSmoothing;
-
-  /** Sets the value of "font-smoothing" */
-  void set fontSmoothing(var value);
-
-  /** Gets the value of "font-stretch" */
-  String get fontStretch;
-
-  /** Sets the value of "font-stretch" */
-  void set fontStretch(var value);
-
-  /** Gets the value of "font-style" */
-  String get fontStyle;
-
-  /** Sets the value of "font-style" */
-  void set fontStyle(var value);
-
-  /** Gets the value of "font-variant" */
-  String get fontVariant;
-
-  /** Sets the value of "font-variant" */
-  void set fontVariant(var value);
-
-  /** Gets the value of "font-weight" */
-  String get fontWeight;
-
-  /** Sets the value of "font-weight" */
-  void set fontWeight(var value);
-
-  /** @domName CSSStyleDeclaration.getPropertyValue. */
-  String getPropertyValue(String propertyName);
-
-  /** Gets the value of "height" */
-  String get height;
-
-  /** Sets the value of "height" */
-  void set height(var value);
-
-  /** Gets the value of "highlight" */
-  String get highlight;
-
-  /** Sets the value of "highlight" */
-  void set highlight(var value);
-
-  /** Gets the value of "hyphenate-character" */
-  String get hyphenateCharacter;
-
-  /** Sets the value of "hyphenate-character" */
-  void set hyphenateCharacter(var value);
-
-  /** Gets the value of "hyphenate-limit-after" */
-  String get hyphenateLimitAfter;
-
-  /** Sets the value of "hyphenate-limit-after" */
-  void set hyphenateLimitAfter(var value);
-
-  /** Gets the value of "hyphenate-limit-before" */
-  String get hyphenateLimitBefore;
-
-  /** Sets the value of "hyphenate-limit-before" */
-  void set hyphenateLimitBefore(var value);
-
-  /** Gets the value of "hyphenate-limit-lines" */
-  String get hyphenateLimitLines;
-
-  /** Sets the value of "hyphenate-limit-lines" */
-  void set hyphenateLimitLines(var value);
-
-  /** Gets the value of "hyphens" */
-  String get hyphens;
-
-  /** Sets the value of "hyphens" */
-  void set hyphens(var value);
-
-  /** Gets the value of "image-rendering" */
-  String get imageRendering;
-
-  /** Sets the value of "image-rendering" */
-  void set imageRendering(var value);
-
-  /** Gets the value of "left" */
-  String get left;
-
-  /** Sets the value of "left" */
-  void set left(var value);
-
-  /** Gets the value of "letter-spacing" */
-  String get letterSpacing;
-
-  /** Sets the value of "letter-spacing" */
-  void set letterSpacing(var value);
-
-  /** Gets the value of "line-box-contain" */
-  String get lineBoxContain;
-
-  /** Sets the value of "line-box-contain" */
-  void set lineBoxContain(var value);
-
-  /** Gets the value of "line-break" */
-  String get lineBreak;
-
-  /** Sets the value of "line-break" */
-  void set lineBreak(var value);
-
-  /** Gets the value of "line-clamp" */
-  String get lineClamp;
-
-  /** Sets the value of "line-clamp" */
-  void set lineClamp(var value);
-
-  /** Gets the value of "line-height" */
-  String get lineHeight;
-
-  /** Sets the value of "line-height" */
-  void set lineHeight(var value);
-
-  /** Gets the value of "list-style" */
-  String get listStyle;
-
-  /** Sets the value of "list-style" */
-  void set listStyle(var value);
-
-  /** Gets the value of "list-style-image" */
-  String get listStyleImage;
-
-  /** Sets the value of "list-style-image" */
-  void set listStyleImage(var value);
-
-  /** Gets the value of "list-style-position" */
-  String get listStylePosition;
-
-  /** Sets the value of "list-style-position" */
-  void set listStylePosition(var value);
-
-  /** Gets the value of "list-style-type" */
-  String get listStyleType;
-
-  /** Sets the value of "list-style-type" */
-  void set listStyleType(var value);
-
-  /** Gets the value of "locale" */
-  String get locale;
-
-  /** Sets the value of "locale" */
-  void set locale(var value);
-
-  /** Gets the value of "logical-height" */
-  String get logicalHeight;
-
-  /** Sets the value of "logical-height" */
-  void set logicalHeight(var value);
-
-  /** Gets the value of "logical-width" */
-  String get logicalWidth;
-
-  /** Sets the value of "logical-width" */
-  void set logicalWidth(var value);
-
-  /** Gets the value of "margin" */
-  String get margin;
-
-  /** Sets the value of "margin" */
-  void set margin(var value);
-
-  /** Gets the value of "margin-after" */
-  String get marginAfter;
-
-  /** Sets the value of "margin-after" */
-  void set marginAfter(var value);
-
-  /** Gets the value of "margin-after-collapse" */
-  String get marginAfterCollapse;
-
-  /** Sets the value of "margin-after-collapse" */
-  void set marginAfterCollapse(var value);
-
-  /** Gets the value of "margin-before" */
-  String get marginBefore;
-
-  /** Sets the value of "margin-before" */
-  void set marginBefore(var value);
-
-  /** Gets the value of "margin-before-collapse" */
-  String get marginBeforeCollapse;
-
-  /** Sets the value of "margin-before-collapse" */
-  void set marginBeforeCollapse(var value);
-
-  /** Gets the value of "margin-bottom" */
-  String get marginBottom;
-
-  /** Sets the value of "margin-bottom" */
-  void set marginBottom(var value);
-
-  /** Gets the value of "margin-bottom-collapse" */
-  String get marginBottomCollapse;
-
-  /** Sets the value of "margin-bottom-collapse" */
-  void set marginBottomCollapse(var value);
-
-  /** Gets the value of "margin-collapse" */
-  String get marginCollapse;
-
-  /** Sets the value of "margin-collapse" */
-  void set marginCollapse(var value);
-
-  /** Gets the value of "margin-end" */
-  String get marginEnd;
-
-  /** Sets the value of "margin-end" */
-  void set marginEnd(var value);
-
-  /** Gets the value of "margin-left" */
-  String get marginLeft;
-
-  /** Sets the value of "margin-left" */
-  void set marginLeft(var value);
-
-  /** Gets the value of "margin-right" */
-  String get marginRight;
-
-  /** Sets the value of "margin-right" */
-  void set marginRight(var value);
-
-  /** Gets the value of "margin-start" */
-  String get marginStart;
-
-  /** Sets the value of "margin-start" */
-  void set marginStart(var value);
-
-  /** Gets the value of "margin-top" */
-  String get marginTop;
-
-  /** Sets the value of "margin-top" */
-  void set marginTop(var value);
-
-  /** Gets the value of "margin-top-collapse" */
-  String get marginTopCollapse;
-
-  /** Sets the value of "margin-top-collapse" */
-  void set marginTopCollapse(var value);
-
-  /** Gets the value of "marquee" */
-  String get marquee;
-
-  /** Sets the value of "marquee" */
-  void set marquee(var value);
-
-  /** Gets the value of "marquee-direction" */
-  String get marqueeDirection;
-
-  /** Sets the value of "marquee-direction" */
-  void set marqueeDirection(var value);
-
-  /** Gets the value of "marquee-increment" */
-  String get marqueeIncrement;
-
-  /** Sets the value of "marquee-increment" */
-  void set marqueeIncrement(var value);
-
-  /** Gets the value of "marquee-repetition" */
-  String get marqueeRepetition;
-
-  /** Sets the value of "marquee-repetition" */
-  void set marqueeRepetition(var value);
-
-  /** Gets the value of "marquee-speed" */
-  String get marqueeSpeed;
-
-  /** Sets the value of "marquee-speed" */
-  void set marqueeSpeed(var value);
-
-  /** Gets the value of "marquee-style" */
-  String get marqueeStyle;
-
-  /** Sets the value of "marquee-style" */
-  void set marqueeStyle(var value);
-
-  /** Gets the value of "mask" */
-  String get mask;
-
-  /** Sets the value of "mask" */
-  void set mask(var value);
-
-  /** Gets the value of "mask-attachment" */
-  String get maskAttachment;
-
-  /** Sets the value of "mask-attachment" */
-  void set maskAttachment(var value);
-
-  /** Gets the value of "mask-box-image" */
-  String get maskBoxImage;
-
-  /** Sets the value of "mask-box-image" */
-  void set maskBoxImage(var value);
-
-  /** Gets the value of "mask-box-image-outset" */
-  String get maskBoxImageOutset;
-
-  /** Sets the value of "mask-box-image-outset" */
-  void set maskBoxImageOutset(var value);
-
-  /** Gets the value of "mask-box-image-repeat" */
-  String get maskBoxImageRepeat;
-
-  /** Sets the value of "mask-box-image-repeat" */
-  void set maskBoxImageRepeat(var value);
-
-  /** Gets the value of "mask-box-image-slice" */
-  String get maskBoxImageSlice;
-
-  /** Sets the value of "mask-box-image-slice" */
-  void set maskBoxImageSlice(var value);
-
-  /** Gets the value of "mask-box-image-source" */
-  String get maskBoxImageSource;
-
-  /** Sets the value of "mask-box-image-source" */
-  void set maskBoxImageSource(var value);
-
-  /** Gets the value of "mask-box-image-width" */
-  String get maskBoxImageWidth;
-
-  /** Sets the value of "mask-box-image-width" */
-  void set maskBoxImageWidth(var value);
-
-  /** Gets the value of "mask-clip" */
-  String get maskClip;
-
-  /** Sets the value of "mask-clip" */
-  void set maskClip(var value);
-
-  /** Gets the value of "mask-composite" */
-  String get maskComposite;
-
-  /** Sets the value of "mask-composite" */
-  void set maskComposite(var value);
-
-  /** Gets the value of "mask-image" */
-  String get maskImage;
-
-  /** Sets the value of "mask-image" */
-  void set maskImage(var value);
-
-  /** Gets the value of "mask-origin" */
-  String get maskOrigin;
-
-  /** Sets the value of "mask-origin" */
-  void set maskOrigin(var value);
-
-  /** Gets the value of "mask-position" */
-  String get maskPosition;
-
-  /** Sets the value of "mask-position" */
-  void set maskPosition(var value);
-
-  /** Gets the value of "mask-position-x" */
-  String get maskPositionX;
-
-  /** Sets the value of "mask-position-x" */
-  void set maskPositionX(var value);
-
-  /** Gets the value of "mask-position-y" */
-  String get maskPositionY;
-
-  /** Sets the value of "mask-position-y" */
-  void set maskPositionY(var value);
-
-  /** Gets the value of "mask-repeat" */
-  String get maskRepeat;
-
-  /** Sets the value of "mask-repeat" */
-  void set maskRepeat(var value);
-
-  /** Gets the value of "mask-repeat-x" */
-  String get maskRepeatX;
-
-  /** Sets the value of "mask-repeat-x" */
-  void set maskRepeatX(var value);
-
-  /** Gets the value of "mask-repeat-y" */
-  String get maskRepeatY;
-
-  /** Sets the value of "mask-repeat-y" */
-  void set maskRepeatY(var value);
-
-  /** Gets the value of "mask-size" */
-  String get maskSize;
-
-  /** Sets the value of "mask-size" */
-  void set maskSize(var value);
-
-  /** Gets the value of "match-nearest-mail-blockquote-color" */
-  String get matchNearestMailBlockquoteColor;
-
-  /** Sets the value of "match-nearest-mail-blockquote-color" */
-  void set matchNearestMailBlockquoteColor(var value);
-
-  /** Gets the value of "max-height" */
-  String get maxHeight;
-
-  /** Sets the value of "max-height" */
-  void set maxHeight(var value);
-
-  /** Gets the value of "max-logical-height" */
-  String get maxLogicalHeight;
-
-  /** Sets the value of "max-logical-height" */
-  void set maxLogicalHeight(var value);
-
-  /** Gets the value of "max-logical-width" */
-  String get maxLogicalWidth;
-
-  /** Sets the value of "max-logical-width" */
-  void set maxLogicalWidth(var value);
-
-  /** Gets the value of "max-width" */
-  String get maxWidth;
-
-  /** Sets the value of "max-width" */
-  void set maxWidth(var value);
-
-  /** Gets the value of "min-height" */
-  String get minHeight;
-
-  /** Sets the value of "min-height" */
-  void set minHeight(var value);
-
-  /** Gets the value of "min-logical-height" */
-  String get minLogicalHeight;
-
-  /** Sets the value of "min-logical-height" */
-  void set minLogicalHeight(var value);
-
-  /** Gets the value of "min-logical-width" */
-  String get minLogicalWidth;
-
-  /** Sets the value of "min-logical-width" */
-  void set minLogicalWidth(var value);
-
-  /** Gets the value of "min-width" */
-  String get minWidth;
-
-  /** Sets the value of "min-width" */
-  void set minWidth(var value);
-
-  /** Gets the value of "nbsp-mode" */
-  String get nbspMode;
-
-  /** Sets the value of "nbsp-mode" */
-  void set nbspMode(var value);
-
-  /** Gets the value of "opacity" */
-  String get opacity;
-
-  /** Sets the value of "opacity" */
-  void set opacity(var value);
-
-  /** Gets the value of "orphans" */
-  String get orphans;
-
-  /** Sets the value of "orphans" */
-  void set orphans(var value);
-
-  /** Gets the value of "outline" */
-  String get outline;
-
-  /** Sets the value of "outline" */
-  void set outline(var value);
-
-  /** Gets the value of "outline-color" */
-  String get outlineColor;
-
-  /** Sets the value of "outline-color" */
-  void set outlineColor(var value);
-
-  /** Gets the value of "outline-offset" */
-  String get outlineOffset;
-
-  /** Sets the value of "outline-offset" */
-  void set outlineOffset(var value);
-
-  /** Gets the value of "outline-style" */
-  String get outlineStyle;
-
-  /** Sets the value of "outline-style" */
-  void set outlineStyle(var value);
-
-  /** Gets the value of "outline-width" */
-  String get outlineWidth;
-
-  /** Sets the value of "outline-width" */
-  void set outlineWidth(var value);
-
-  /** Gets the value of "overflow" */
-  String get overflow;
-
-  /** Sets the value of "overflow" */
-  void set overflow(var value);
-
-  /** Gets the value of "overflow-x" */
-  String get overflowX;
-
-  /** Sets the value of "overflow-x" */
-  void set overflowX(var value);
-
-  /** Gets the value of "overflow-y" */
-  String get overflowY;
-
-  /** Sets the value of "overflow-y" */
-  void set overflowY(var value);
-
-  /** Gets the value of "padding" */
-  String get padding;
-
-  /** Sets the value of "padding" */
-  void set padding(var value);
-
-  /** Gets the value of "padding-after" */
-  String get paddingAfter;
-
-  /** Sets the value of "padding-after" */
-  void set paddingAfter(var value);
-
-  /** Gets the value of "padding-before" */
-  String get paddingBefore;
-
-  /** Sets the value of "padding-before" */
-  void set paddingBefore(var value);
-
-  /** Gets the value of "padding-bottom" */
-  String get paddingBottom;
-
-  /** Sets the value of "padding-bottom" */
-  void set paddingBottom(var value);
-
-  /** Gets the value of "padding-end" */
-  String get paddingEnd;
-
-  /** Sets the value of "padding-end" */
-  void set paddingEnd(var value);
-
-  /** Gets the value of "padding-left" */
-  String get paddingLeft;
-
-  /** Sets the value of "padding-left" */
-  void set paddingLeft(var value);
-
-  /** Gets the value of "padding-right" */
-  String get paddingRight;
-
-  /** Sets the value of "padding-right" */
-  void set paddingRight(var value);
-
-  /** Gets the value of "padding-start" */
-  String get paddingStart;
-
-  /** Sets the value of "padding-start" */
-  void set paddingStart(var value);
-
-  /** Gets the value of "padding-top" */
-  String get paddingTop;
-
-  /** Sets the value of "padding-top" */
-  void set paddingTop(var value);
-
-  /** Gets the value of "page" */
-  String get page;
-
-  /** Sets the value of "page" */
-  void set page(var value);
-
-  /** Gets the value of "page-break-after" */
-  String get pageBreakAfter;
-
-  /** Sets the value of "page-break-after" */
-  void set pageBreakAfter(var value);
-
-  /** Gets the value of "page-break-before" */
-  String get pageBreakBefore;
-
-  /** Sets the value of "page-break-before" */
-  void set pageBreakBefore(var value);
-
-  /** Gets the value of "page-break-inside" */
-  String get pageBreakInside;
-
-  /** Sets the value of "page-break-inside" */
-  void set pageBreakInside(var value);
-
-  /** Gets the value of "perspective" */
-  String get perspective;
-
-  /** Sets the value of "perspective" */
-  void set perspective(var value);
-
-  /** Gets the value of "perspective-origin" */
-  String get perspectiveOrigin;
-
-  /** Sets the value of "perspective-origin" */
-  void set perspectiveOrigin(var value);
-
-  /** Gets the value of "perspective-origin-x" */
-  String get perspectiveOriginX;
-
-  /** Sets the value of "perspective-origin-x" */
-  void set perspectiveOriginX(var value);
-
-  /** Gets the value of "perspective-origin-y" */
-  String get perspectiveOriginY;
-
-  /** Sets the value of "perspective-origin-y" */
-  void set perspectiveOriginY(var value);
-
-  /** Gets the value of "pointer-events" */
-  String get pointerEvents;
-
-  /** Sets the value of "pointer-events" */
-  void set pointerEvents(var value);
-
-  /** Gets the value of "position" */
-  String get position;
-
-  /** Sets the value of "position" */
-  void set position(var value);
-
-  /** Gets the value of "quotes" */
-  String get quotes;
-
-  /** Sets the value of "quotes" */
-  void set quotes(var value);
-
-  /** Gets the value of "region-break-after" */
-  String get regionBreakAfter;
-
-  /** Sets the value of "region-break-after" */
-  void set regionBreakAfter(var value);
-
-  /** Gets the value of "region-break-before" */
-  String get regionBreakBefore;
-
-  /** Sets the value of "region-break-before" */
-  void set regionBreakBefore(var value);
-
-  /** Gets the value of "region-break-inside" */
-  String get regionBreakInside;
-
-  /** Sets the value of "region-break-inside" */
-  void set regionBreakInside(var value);
-
-  /** Gets the value of "region-overflow" */
-  String get regionOverflow;
-
-  /** Sets the value of "region-overflow" */
-  void set regionOverflow(var value);
-
-  /** Gets the value of "resize" */
-  String get resize;
-
-  /** Sets the value of "resize" */
-  void set resize(var value);
-
-  /** Gets the value of "right" */
-  String get right;
-
-  /** Sets the value of "right" */
-  void set right(var value);
-
-  /** Gets the value of "rtl-ordering" */
-  String get rtlOrdering;
-
-  /** Sets the value of "rtl-ordering" */
-  void set rtlOrdering(var value);
-
-  /** Gets the value of "size" */
-  String get size;
-
-  /** Sets the value of "size" */
-  void set size(var value);
-
-  /** Gets the value of "speak" */
-  String get speak;
-
-  /** Sets the value of "speak" */
-  void set speak(var value);
-
-  /** Gets the value of "src" */
-  String get src;
-
-  /** Sets the value of "src" */
-  void set src(var value);
-
-  /** Gets the value of "table-layout" */
-  String get tableLayout;
-
-  /** Sets the value of "table-layout" */
-  void set tableLayout(var value);
-
-  /** Gets the value of "tap-highlight-color" */
-  String get tapHighlightColor;
-
-  /** Sets the value of "tap-highlight-color" */
-  void set tapHighlightColor(var value);
-
-  /** Gets the value of "text-align" */
-  String get textAlign;
-
-  /** Sets the value of "text-align" */
-  void set textAlign(var value);
-
-  /** Gets the value of "text-combine" */
-  String get textCombine;
-
-  /** Sets the value of "text-combine" */
-  void set textCombine(var value);
-
-  /** Gets the value of "text-decoration" */
-  String get textDecoration;
-
-  /** Sets the value of "text-decoration" */
-  void set textDecoration(var value);
-
-  /** Gets the value of "text-decorations-in-effect" */
-  String get textDecorationsInEffect;
-
-  /** Sets the value of "text-decorations-in-effect" */
-  void set textDecorationsInEffect(var value);
-
-  /** Gets the value of "text-emphasis" */
-  String get textEmphasis;
-
-  /** Sets the value of "text-emphasis" */
-  void set textEmphasis(var value);
-
-  /** Gets the value of "text-emphasis-color" */
-  String get textEmphasisColor;
-
-  /** Sets the value of "text-emphasis-color" */
-  void set textEmphasisColor(var value);
-
-  /** Gets the value of "text-emphasis-position" */
-  String get textEmphasisPosition;
-
-  /** Sets the value of "text-emphasis-position" */
-  void set textEmphasisPosition(var value);
-
-  /** Gets the value of "text-emphasis-style" */
-  String get textEmphasisStyle;
-
-  /** Sets the value of "text-emphasis-style" */
-  void set textEmphasisStyle(var value);
-
-  /** Gets the value of "text-fill-color" */
-  String get textFillColor;
-
-  /** Sets the value of "text-fill-color" */
-  void set textFillColor(var value);
-
-  /** Gets the value of "text-indent" */
-  String get textIndent;
-
-  /** Sets the value of "text-indent" */
-  void set textIndent(var value);
-
-  /** Gets the value of "text-line-through" */
-  String get textLineThrough;
-
-  /** Sets the value of "text-line-through" */
-  void set textLineThrough(var value);
-
-  /** Gets the value of "text-line-through-color" */
-  String get textLineThroughColor;
-
-  /** Sets the value of "text-line-through-color" */
-  void set textLineThroughColor(var value);
-
-  /** Gets the value of "text-line-through-mode" */
-  String get textLineThroughMode;
-
-  /** Sets the value of "text-line-through-mode" */
-  void set textLineThroughMode(var value);
-
-  /** Gets the value of "text-line-through-style" */
-  String get textLineThroughStyle;
-
-  /** Sets the value of "text-line-through-style" */
-  void set textLineThroughStyle(var value);
-
-  /** Gets the value of "text-line-through-width" */
-  String get textLineThroughWidth;
-
-  /** Sets the value of "text-line-through-width" */
-  void set textLineThroughWidth(var value);
-
-  /** Gets the value of "text-orientation" */
-  String get textOrientation;
-
-  /** Sets the value of "text-orientation" */
-  void set textOrientation(var value);
-
-  /** Gets the value of "text-overflow" */
-  String get textOverflow;
-
-  /** Sets the value of "text-overflow" */
-  void set textOverflow(var value);
-
-  /** Gets the value of "text-overline" */
-  String get textOverline;
-
-  /** Sets the value of "text-overline" */
-  void set textOverline(var value);
-
-  /** Gets the value of "text-overline-color" */
-  String get textOverlineColor;
-
-  /** Sets the value of "text-overline-color" */
-  void set textOverlineColor(var value);
-
-  /** Gets the value of "text-overline-mode" */
-  String get textOverlineMode;
-
-  /** Sets the value of "text-overline-mode" */
-  void set textOverlineMode(var value);
-
-  /** Gets the value of "text-overline-style" */
-  String get textOverlineStyle;
-
-  /** Sets the value of "text-overline-style" */
-  void set textOverlineStyle(var value);
-
-  /** Gets the value of "text-overline-width" */
-  String get textOverlineWidth;
-
-  /** Sets the value of "text-overline-width" */
-  void set textOverlineWidth(var value);
-
-  /** Gets the value of "text-rendering" */
-  String get textRendering;
-
-  /** Sets the value of "text-rendering" */
-  void set textRendering(var value);
-
-  /** Gets the value of "text-security" */
-  String get textSecurity;
-
-  /** Sets the value of "text-security" */
-  void set textSecurity(var value);
-
-  /** Gets the value of "text-shadow" */
-  String get textShadow;
-
-  /** Sets the value of "text-shadow" */
-  void set textShadow(var value);
-
-  /** Gets the value of "text-size-adjust" */
-  String get textSizeAdjust;
-
-  /** Sets the value of "text-size-adjust" */
-  void set textSizeAdjust(var value);
-
-  /** Gets the value of "text-stroke" */
-  String get textStroke;
-
-  /** Sets the value of "text-stroke" */
-  void set textStroke(var value);
-
-  /** Gets the value of "text-stroke-color" */
-  String get textStrokeColor;
-
-  /** Sets the value of "text-stroke-color" */
-  void set textStrokeColor(var value);
-
-  /** Gets the value of "text-stroke-width" */
-  String get textStrokeWidth;
-
-  /** Sets the value of "text-stroke-width" */
-  void set textStrokeWidth(var value);
-
-  /** Gets the value of "text-transform" */
-  String get textTransform;
-
-  /** Sets the value of "text-transform" */
-  void set textTransform(var value);
-
-  /** Gets the value of "text-underline" */
-  String get textUnderline;
-
-  /** Sets the value of "text-underline" */
-  void set textUnderline(var value);
-
-  /** Gets the value of "text-underline-color" */
-  String get textUnderlineColor;
-
-  /** Sets the value of "text-underline-color" */
-  void set textUnderlineColor(var value);
-
-  /** Gets the value of "text-underline-mode" */
-  String get textUnderlineMode;
-
-  /** Sets the value of "text-underline-mode" */
-  void set textUnderlineMode(var value);
-
-  /** Gets the value of "text-underline-style" */
-  String get textUnderlineStyle;
-
-  /** Sets the value of "text-underline-style" */
-  void set textUnderlineStyle(var value);
-
-  /** Gets the value of "text-underline-width" */
-  String get textUnderlineWidth;
-
-  /** Sets the value of "text-underline-width" */
-  void set textUnderlineWidth(var value);
-
-  /** Gets the value of "top" */
-  String get top;
-
-  /** Sets the value of "top" */
-  void set top(var value);
-
-  /** Gets the value of "transform" */
-  String get transform;
-
-  /** Sets the value of "transform" */
-  void set transform(var value);
-
-  /** Gets the value of "transform-origin" */
-  String get transformOrigin;
-
-  /** Sets the value of "transform-origin" */
-  void set transformOrigin(var value);
-
-  /** Gets the value of "transform-origin-x" */
-  String get transformOriginX;
-
-  /** Sets the value of "transform-origin-x" */
-  void set transformOriginX(var value);
-
-  /** Gets the value of "transform-origin-y" */
-  String get transformOriginY;
-
-  /** Sets the value of "transform-origin-y" */
-  void set transformOriginY(var value);
-
-  /** Gets the value of "transform-origin-z" */
-  String get transformOriginZ;
-
-  /** Sets the value of "transform-origin-z" */
-  void set transformOriginZ(var value);
-
-  /** Gets the value of "transform-style" */
-  String get transformStyle;
-
-  /** Sets the value of "transform-style" */
-  void set transformStyle(var value);
-
-  /** Gets the value of "transition" */
-  String get transition;
-
-  /** Sets the value of "transition" */
-  void set transition(var value);
-
-  /** Gets the value of "transition-delay" */
-  String get transitionDelay;
-
-  /** Sets the value of "transition-delay" */
-  void set transitionDelay(var value);
-
-  /** Gets the value of "transition-duration" */
-  String get transitionDuration;
-
-  /** Sets the value of "transition-duration" */
-  void set transitionDuration(var value);
-
-  /** Gets the value of "transition-property" */
-  String get transitionProperty;
-
-  /** Sets the value of "transition-property" */
-  void set transitionProperty(var value);
-
-  /** Gets the value of "transition-timing-function" */
-  String get transitionTimingFunction;
-
-  /** Sets the value of "transition-timing-function" */
-  void set transitionTimingFunction(var value);
-
-  /** Gets the value of "unicode-bidi" */
-  String get unicodeBidi;
-
-  /** Sets the value of "unicode-bidi" */
-  void set unicodeBidi(var value);
-
-  /** Gets the value of "unicode-range" */
-  String get unicodeRange;
-
-  /** Sets the value of "unicode-range" */
-  void set unicodeRange(var value);
-
-  /** Gets the value of "user-drag" */
-  String get userDrag;
-
-  /** Sets the value of "user-drag" */
-  void set userDrag(var value);
-
-  /** Gets the value of "user-modify" */
-  String get userModify;
-
-  /** Sets the value of "user-modify" */
-  void set userModify(var value);
-
-  /** Gets the value of "user-select" */
-  String get userSelect;
-
-  /** Sets the value of "user-select" */
-  void set userSelect(var value);
-
-  /** Gets the value of "vertical-align" */
-  String get verticalAlign;
-
-  /** Sets the value of "vertical-align" */
-  void set verticalAlign(var value);
-
-  /** Gets the value of "visibility" */
-  String get visibility;
-
-  /** Sets the value of "visibility" */
-  void set visibility(var value);
-
-  /** Gets the value of "white-space" */
-  String get whiteSpace;
-
-  /** Sets the value of "white-space" */
-  void set whiteSpace(var value);
-
-  /** Gets the value of "widows" */
-  String get widows;
-
-  /** Sets the value of "widows" */
-  void set widows(var value);
-
-  /** Gets the value of "width" */
-  String get width;
-
-  /** Sets the value of "width" */
-  void set width(var value);
-
-  /** Gets the value of "word-break" */
-  String get wordBreak;
-
-  /** Sets the value of "word-break" */
-  void set wordBreak(var value);
-
-  /** Gets the value of "word-spacing" */
-  String get wordSpacing;
-
-  /** Sets the value of "word-spacing" */
-  void set wordSpacing(var value);
-
-  /** Gets the value of "word-wrap" */
-  String get wordWrap;
-
-  /** Sets the value of "word-wrap" */
-  void set wordWrap(var value);
-
-  /** Gets the value of "wrap-shape" */
-  String get wrapShape;
-
-  /** Sets the value of "wrap-shape" */
-  void set wrapShape(var value);
-
-  /** Gets the value of "writing-mode" */
-  String get writingMode;
-
-  /** Sets the value of "writing-mode" */
-  void set writingMode(var value);
-
-  /** Gets the value of "z-index" */
-  String get zIndex;
-
-  /** Sets the value of "z-index" */
-  void set zIndex(var value);
-
-  /** Gets the value of "zoom" */
-  String get zoom;
-
-  /** Sets the value of "zoom" */
-  void set zoom(var value);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-String _cachedBrowserPrefix;
-
-String get _browserPrefix {
-  if (_cachedBrowserPrefix == null) {
-    if (_Device.isFirefox) {
-      _cachedBrowserPrefix = '-moz-';
-    } else if (_Device.isIE) {
-      _cachedBrowserPrefix = '-ms-';
-    } else if (_Device.isOpera) {
-      _cachedBrowserPrefix = '-o-';
-    } else {
-      _cachedBrowserPrefix = '-webkit-';
-    }
-  }
-  return _cachedBrowserPrefix;
-}
-
-class _CSSStyleDeclarationImpl implements CSSStyleDeclaration native "*CSSStyleDeclaration" {
-
-
-  String cssText;
-
-  final int length;
-
-  final _CSSRuleImpl parentRule;
-
-  _CSSValueImpl getPropertyCSSValue(String propertyName) native;
-
-  String getPropertyPriority(String propertyName) native;
-
-  String getPropertyShorthand(String propertyName) native;
-
-  String _getPropertyValue(String propertyName) native "getPropertyValue";
-
-  bool isPropertyImplicit(String propertyName) native;
-
-  String item(int index) native;
-
-  String removeProperty(String propertyName) native;
-
-
-  String getPropertyValue(String propertyName) {
-    var propValue = _getPropertyValue(propertyName);
-    return propValue != null ? propValue : '';
-  }
-
-  void setProperty(String propertyName, String value, [String priority]) {
-    JS('void', '#.setProperty(#, #, #)', this, propertyName, value, priority);
-    // Bug #2772, IE9 requires a poke to actually apply the value.
-    if (JS('bool', '!!#.setAttribute', this)) {
-      JS('void', '#.setAttribute(#, #)', this, propertyName, value);
-    }
-  }
-
-  // TODO(jacobr): generate this list of properties using the existing script.
-    /** Gets the value of "animation" */
-  String get animation =>
-    getPropertyValue('${_browserPrefix}animation');
-
-  /** Sets the value of "animation" */
-  void set animation(var value) {
-    setProperty('${_browserPrefix}animation', value, '');
-  }
-
-  /** Gets the value of "animation-delay" */
-  String get animationDelay =>
-    getPropertyValue('${_browserPrefix}animation-delay');
-
-  /** Sets the value of "animation-delay" */
-  void set animationDelay(var value) {
-    setProperty('${_browserPrefix}animation-delay', value, '');
-  }
-
-  /** Gets the value of "animation-direction" */
-  String get animationDirection =>
-    getPropertyValue('${_browserPrefix}animation-direction');
-
-  /** Sets the value of "animation-direction" */
-  void set animationDirection(var value) {
-    setProperty('${_browserPrefix}animation-direction', value, '');
-  }
-
-  /** Gets the value of "animation-duration" */
-  String get animationDuration =>
-    getPropertyValue('${_browserPrefix}animation-duration');
-
-  /** Sets the value of "animation-duration" */
-  void set animationDuration(var value) {
-    setProperty('${_browserPrefix}animation-duration', value, '');
-  }
-
-  /** Gets the value of "animation-fill-mode" */
-  String get animationFillMode =>
-    getPropertyValue('${_browserPrefix}animation-fill-mode');
-
-  /** Sets the value of "animation-fill-mode" */
-  void set animationFillMode(var value) {
-    setProperty('${_browserPrefix}animation-fill-mode', value, '');
-  }
-
-  /** Gets the value of "animation-iteration-count" */
-  String get animationIterationCount =>
-    getPropertyValue('${_browserPrefix}animation-iteration-count');
-
-  /** Sets the value of "animation-iteration-count" */
-  void set animationIterationCount(var value) {
-    setProperty('${_browserPrefix}animation-iteration-count', value, '');
-  }
-
-  /** Gets the value of "animation-name" */
-  String get animationName =>
-    getPropertyValue('${_browserPrefix}animation-name');
-
-  /** Sets the value of "animation-name" */
-  void set animationName(var value) {
-    setProperty('${_browserPrefix}animation-name', value, '');
-  }
-
-  /** Gets the value of "animation-play-state" */
-  String get animationPlayState =>
-    getPropertyValue('${_browserPrefix}animation-play-state');
-
-  /** Sets the value of "animation-play-state" */
-  void set animationPlayState(var value) {
-    setProperty('${_browserPrefix}animation-play-state', value, '');
-  }
-
-  /** Gets the value of "animation-timing-function" */
-  String get animationTimingFunction =>
-    getPropertyValue('${_browserPrefix}animation-timing-function');
-
-  /** Sets the value of "animation-timing-function" */
-  void set animationTimingFunction(var value) {
-    setProperty('${_browserPrefix}animation-timing-function', value, '');
-  }
-
-  /** Gets the value of "appearance" */
-  String get appearance =>
-    getPropertyValue('${_browserPrefix}appearance');
-
-  /** Sets the value of "appearance" */
-  void set appearance(var value) {
-    setProperty('${_browserPrefix}appearance', value, '');
-  }
-
-  /** Gets the value of "backface-visibility" */
-  String get backfaceVisibility =>
-    getPropertyValue('${_browserPrefix}backface-visibility');
-
-  /** Sets the value of "backface-visibility" */
-  void set backfaceVisibility(var value) {
-    setProperty('${_browserPrefix}backface-visibility', value, '');
-  }
-
-  /** Gets the value of "background" */
-  String get background =>
-    getPropertyValue('background');
-
-  /** Sets the value of "background" */
-  void set background(var value) {
-    setProperty('background', value, '');
-  }
-
-  /** Gets the value of "background-attachment" */
-  String get backgroundAttachment =>
-    getPropertyValue('background-attachment');
-
-  /** Sets the value of "background-attachment" */
-  void set backgroundAttachment(var value) {
-    setProperty('background-attachment', value, '');
-  }
-
-  /** Gets the value of "background-clip" */
-  String get backgroundClip =>
-    getPropertyValue('background-clip');
-
-  /** Sets the value of "background-clip" */
-  void set backgroundClip(var value) {
-    setProperty('background-clip', value, '');
-  }
-
-  /** Gets the value of "background-color" */
-  String get backgroundColor =>
-    getPropertyValue('background-color');
-
-  /** Sets the value of "background-color" */
-  void set backgroundColor(var value) {
-    setProperty('background-color', value, '');
-  }
-
-  /** Gets the value of "background-composite" */
-  String get backgroundComposite =>
-    getPropertyValue('${_browserPrefix}background-composite');
-
-  /** Sets the value of "background-composite" */
-  void set backgroundComposite(var value) {
-    setProperty('${_browserPrefix}background-composite', value, '');
-  }
-
-  /** Gets the value of "background-image" */
-  String get backgroundImage =>
-    getPropertyValue('background-image');
-
-  /** Sets the value of "background-image" */
-  void set backgroundImage(var value) {
-    setProperty('background-image', value, '');
-  }
-
-  /** Gets the value of "background-origin" */
-  String get backgroundOrigin =>
-    getPropertyValue('background-origin');
-
-  /** Sets the value of "background-origin" */
-  void set backgroundOrigin(var value) {
-    setProperty('background-origin', value, '');
-  }
-
-  /** Gets the value of "background-position" */
-  String get backgroundPosition =>
-    getPropertyValue('background-position');
-
-  /** Sets the value of "background-position" */
-  void set backgroundPosition(var value) {
-    setProperty('background-position', value, '');
-  }
-
-  /** Gets the value of "background-position-x" */
-  String get backgroundPositionX =>
-    getPropertyValue('background-position-x');
-
-  /** Sets the value of "background-position-x" */
-  void set backgroundPositionX(var value) {
-    setProperty('background-position-x', value, '');
-  }
-
-  /** Gets the value of "background-position-y" */
-  String get backgroundPositionY =>
-    getPropertyValue('background-position-y');
-
-  /** Sets the value of "background-position-y" */
-  void set backgroundPositionY(var value) {
-    setProperty('background-position-y', value, '');
-  }
-
-  /** Gets the value of "background-repeat" */
-  String get backgroundRepeat =>
-    getPropertyValue('background-repeat');
-
-  /** Sets the value of "background-repeat" */
-  void set backgroundRepeat(var value) {
-    setProperty('background-repeat', value, '');
-  }
-
-  /** Gets the value of "background-repeat-x" */
-  String get backgroundRepeatX =>
-    getPropertyValue('background-repeat-x');
-
-  /** Sets the value of "background-repeat-x" */
-  void set backgroundRepeatX(var value) {
-    setProperty('background-repeat-x', value, '');
-  }
-
-  /** Gets the value of "background-repeat-y" */
-  String get backgroundRepeatY =>
-    getPropertyValue('background-repeat-y');
-
-  /** Sets the value of "background-repeat-y" */
-  void set backgroundRepeatY(var value) {
-    setProperty('background-repeat-y', value, '');
-  }
-
-  /** Gets the value of "background-size" */
-  String get backgroundSize =>
-    getPropertyValue('background-size');
-
-  /** Sets the value of "background-size" */
-  void set backgroundSize(var value) {
-    setProperty('background-size', value, '');
-  }
-
-  /** Gets the value of "border" */
-  String get border =>
-    getPropertyValue('border');
-
-  /** Sets the value of "border" */
-  void set border(var value) {
-    setProperty('border', value, '');
-  }
-
-  /** Gets the value of "border-after" */
-  String get borderAfter =>
-    getPropertyValue('${_browserPrefix}border-after');
-
-  /** Sets the value of "border-after" */
-  void set borderAfter(var value) {
-    setProperty('${_browserPrefix}border-after', value, '');
-  }
-
-  /** Gets the value of "border-after-color" */
-  String get borderAfterColor =>
-    getPropertyValue('${_browserPrefix}border-after-color');
-
-  /** Sets the value of "border-after-color" */
-  void set borderAfterColor(var value) {
-    setProperty('${_browserPrefix}border-after-color', value, '');
-  }
-
-  /** Gets the value of "border-after-style" */
-  String get borderAfterStyle =>
-    getPropertyValue('${_browserPrefix}border-after-style');
-
-  /** Sets the value of "border-after-style" */
-  void set borderAfterStyle(var value) {
-    setProperty('${_browserPrefix}border-after-style', value, '');
-  }
-
-  /** Gets the value of "border-after-width" */
-  String get borderAfterWidth =>
-    getPropertyValue('${_browserPrefix}border-after-width');
-
-  /** Sets the value of "border-after-width" */
-  void set borderAfterWidth(var value) {
-    setProperty('${_browserPrefix}border-after-width', value, '');
-  }
-
-  /** Gets the value of "border-before" */
-  String get borderBefore =>
-    getPropertyValue('${_browserPrefix}border-before');
-
-  /** Sets the value of "border-before" */
-  void set borderBefore(var value) {
-    setProperty('${_browserPrefix}border-before', value, '');
-  }
-
-  /** Gets the value of "border-before-color" */
-  String get borderBeforeColor =>
-    getPropertyValue('${_browserPrefix}border-before-color');
-
-  /** Sets the value of "border-before-color" */
-  void set borderBeforeColor(var value) {
-    setProperty('${_browserPrefix}border-before-color', value, '');
-  }
-
-  /** Gets the value of "border-before-style" */
-  String get borderBeforeStyle =>
-    getPropertyValue('${_browserPrefix}border-before-style');
-
-  /** Sets the value of "border-before-style" */
-  void set borderBeforeStyle(var value) {
-    setProperty('${_browserPrefix}border-before-style', value, '');
-  }
-
-  /** Gets the value of "border-before-width" */
-  String get borderBeforeWidth =>
-    getPropertyValue('${_browserPrefix}border-before-width');
-
-  /** Sets the value of "border-before-width" */
-  void set borderBeforeWidth(var value) {
-    setProperty('${_browserPrefix}border-before-width', value, '');
-  }
-
-  /** Gets the value of "border-bottom" */
-  String get borderBottom =>
-    getPropertyValue('border-bottom');
-
-  /** Sets the value of "border-bottom" */
-  void set borderBottom(var value) {
-    setProperty('border-bottom', value, '');
-  }
-
-  /** Gets the value of "border-bottom-color" */
-  String get borderBottomColor =>
-    getPropertyValue('border-bottom-color');
-
-  /** Sets the value of "border-bottom-color" */
-  void set borderBottomColor(var value) {
-    setProperty('border-bottom-color', value, '');
-  }
-
-  /** Gets the value of "border-bottom-left-radius" */
-  String get borderBottomLeftRadius =>
-    getPropertyValue('border-bottom-left-radius');
-
-  /** Sets the value of "border-bottom-left-radius" */
-  void set borderBottomLeftRadius(var value) {
-    setProperty('border-bottom-left-radius', value, '');
-  }
-
-  /** Gets the value of "border-bottom-right-radius" */
-  String get borderBottomRightRadius =>
-    getPropertyValue('border-bottom-right-radius');
-
-  /** Sets the value of "border-bottom-right-radius" */
-  void set borderBottomRightRadius(var value) {
-    setProperty('border-bottom-right-radius', value, '');
-  }
-
-  /** Gets the value of "border-bottom-style" */
-  String get borderBottomStyle =>
-    getPropertyValue('border-bottom-style');
-
-  /** Sets the value of "border-bottom-style" */
-  void set borderBottomStyle(var value) {
-    setProperty('border-bottom-style', value, '');
-  }
-
-  /** Gets the value of "border-bottom-width" */
-  String get borderBottomWidth =>
-    getPropertyValue('border-bottom-width');
-
-  /** Sets the value of "border-bottom-width" */
-  void set borderBottomWidth(var value) {
-    setProperty('border-bottom-width', value, '');
-  }
-
-  /** Gets the value of "border-collapse" */
-  String get borderCollapse =>
-    getPropertyValue('border-collapse');
-
-  /** Sets the value of "border-collapse" */
-  void set borderCollapse(var value) {
-    setProperty('border-collapse', value, '');
-  }
-
-  /** Gets the value of "border-color" */
-  String get borderColor =>
-    getPropertyValue('border-color');
-
-  /** Sets the value of "border-color" */
-  void set borderColor(var value) {
-    setProperty('border-color', value, '');
-  }
-
-  /** Gets the value of "border-end" */
-  String get borderEnd =>
-    getPropertyValue('${_browserPrefix}border-end');
-
-  /** Sets the value of "border-end" */
-  void set borderEnd(var value) {
-    setProperty('${_browserPrefix}border-end', value, '');
-  }
-
-  /** Gets the value of "border-end-color" */
-  String get borderEndColor =>
-    getPropertyValue('${_browserPrefix}border-end-color');
-
-  /** Sets the value of "border-end-color" */
-  void set borderEndColor(var value) {
-    setProperty('${_browserPrefix}border-end-color', value, '');
-  }
-
-  /** Gets the value of "border-end-style" */
-  String get borderEndStyle =>
-    getPropertyValue('${_browserPrefix}border-end-style');
-
-  /** Sets the value of "border-end-style" */
-  void set borderEndStyle(var value) {
-    setProperty('${_browserPrefix}border-end-style', value, '');
-  }
-
-  /** Gets the value of "border-end-width" */
-  String get borderEndWidth =>
-    getPropertyValue('${_browserPrefix}border-end-width');
-
-  /** Sets the value of "border-end-width" */
-  void set borderEndWidth(var value) {
-    setProperty('${_browserPrefix}border-end-width', value, '');
-  }
-
-  /** Gets the value of "border-fit" */
-  String get borderFit =>
-    getPropertyValue('${_browserPrefix}border-fit');
-
-  /** Sets the value of "border-fit" */
-  void set borderFit(var value) {
-    setProperty('${_browserPrefix}border-fit', value, '');
-  }
-
-  /** Gets the value of "border-horizontal-spacing" */
-  String get borderHorizontalSpacing =>
-    getPropertyValue('${_browserPrefix}border-horizontal-spacing');
-
-  /** Sets the value of "border-horizontal-spacing" */
-  void set borderHorizontalSpacing(var value) {
-    setProperty('${_browserPrefix}border-horizontal-spacing', value, '');
-  }
-
-  /** Gets the value of "border-image" */
-  String get borderImage =>
-    getPropertyValue('border-image');
-
-  /** Sets the value of "border-image" */
-  void set borderImage(var value) {
-    setProperty('border-image', value, '');
-  }
-
-  /** Gets the value of "border-image-outset" */
-  String get borderImageOutset =>
-    getPropertyValue('border-image-outset');
-
-  /** Sets the value of "border-image-outset" */
-  void set borderImageOutset(var value) {
-    setProperty('border-image-outset', value, '');
-  }
-
-  /** Gets the value of "border-image-repeat" */
-  String get borderImageRepeat =>
-    getPropertyValue('border-image-repeat');
-
-  /** Sets the value of "border-image-repeat" */
-  void set borderImageRepeat(var value) {
-    setProperty('border-image-repeat', value, '');
-  }
-
-  /** Gets the value of "border-image-slice" */
-  String get borderImageSlice =>
-    getPropertyValue('border-image-slice');
-
-  /** Sets the value of "border-image-slice" */
-  void set borderImageSlice(var value) {
-    setProperty('border-image-slice', value, '');
-  }
-
-  /** Gets the value of "border-image-source" */
-  String get borderImageSource =>
-    getPropertyValue('border-image-source');
-
-  /** Sets the value of "border-image-source" */
-  void set borderImageSource(var value) {
-    setProperty('border-image-source', value, '');
-  }
-
-  /** Gets the value of "border-image-width" */
-  String get borderImageWidth =>
-    getPropertyValue('border-image-width');
-
-  /** Sets the value of "border-image-width" */
-  void set borderImageWidth(var value) {
-    setProperty('border-image-width', value, '');
-  }
-
-  /** Gets the value of "border-left" */
-  String get borderLeft =>
-    getPropertyValue('border-left');
-
-  /** Sets the value of "border-left" */
-  void set borderLeft(var value) {
-    setProperty('border-left', value, '');
-  }
-
-  /** Gets the value of "border-left-color" */
-  String get borderLeftColor =>
-    getPropertyValue('border-left-color');
-
-  /** Sets the value of "border-left-color" */
-  void set borderLeftColor(var value) {
-    setProperty('border-left-color', value, '');
-  }
-
-  /** Gets the value of "border-left-style" */
-  String get borderLeftStyle =>
-    getPropertyValue('border-left-style');
-
-  /** Sets the value of "border-left-style" */
-  void set borderLeftStyle(var value) {
-    setProperty('border-left-style', value, '');
-  }
-
-  /** Gets the value of "border-left-width" */
-  String get borderLeftWidth =>
-    getPropertyValue('border-left-width');
-
-  /** Sets the value of "border-left-width" */
-  void set borderLeftWidth(var value) {
-    setProperty('border-left-width', value, '');
-  }
-
-  /** Gets the value of "border-radius" */
-  String get borderRadius =>
-    getPropertyValue('border-radius');
-
-  /** Sets the value of "border-radius" */
-  void set borderRadius(var value) {
-    setProperty('border-radius', value, '');
-  }
-
-  /** Gets the value of "border-right" */
-  String get borderRight =>
-    getPropertyValue('border-right');
-
-  /** Sets the value of "border-right" */
-  void set borderRight(var value) {
-    setProperty('border-right', value, '');
-  }
-
-  /** Gets the value of "border-right-color" */
-  String get borderRightColor =>
-    getPropertyValue('border-right-color');
-
-  /** Sets the value of "border-right-color" */
-  void set borderRightColor(var value) {
-    setProperty('border-right-color', value, '');
-  }
-
-  /** Gets the value of "border-right-style" */
-  String get borderRightStyle =>
-    getPropertyValue('border-right-style');
-
-  /** Sets the value of "border-right-style" */
-  void set borderRightStyle(var value) {
-    setProperty('border-right-style', value, '');
-  }
-
-  /** Gets the value of "border-right-width" */
-  String get borderRightWidth =>
-    getPropertyValue('border-right-width');
-
-  /** Sets the value of "border-right-width" */
-  void set borderRightWidth(var value) {
-    setProperty('border-right-width', value, '');
-  }
-
-  /** Gets the value of "border-spacing" */
-  String get borderSpacing =>
-    getPropertyValue('border-spacing');
-
-  /** Sets the value of "border-spacing" */
-  void set borderSpacing(var value) {
-    setProperty('border-spacing', value, '');
-  }
-
-  /** Gets the value of "border-start" */
-  String get borderStart =>
-    getPropertyValue('${_browserPrefix}border-start');
-
-  /** Sets the value of "border-start" */
-  void set borderStart(var value) {
-    setProperty('${_browserPrefix}border-start', value, '');
-  }
-
-  /** Gets the value of "border-start-color" */
-  String get borderStartColor =>
-    getPropertyValue('${_browserPrefix}border-start-color');
-
-  /** Sets the value of "border-start-color" */
-  void set borderStartColor(var value) {
-    setProperty('${_browserPrefix}border-start-color', value, '');
-  }
-
-  /** Gets the value of "border-start-style" */
-  String get borderStartStyle =>
-    getPropertyValue('${_browserPrefix}border-start-style');
-
-  /** Sets the value of "border-start-style" */
-  void set borderStartStyle(var value) {
-    setProperty('${_browserPrefix}border-start-style', value, '');
-  }
-
-  /** Gets the value of "border-start-width" */
-  String get borderStartWidth =>
-    getPropertyValue('${_browserPrefix}border-start-width');
-
-  /** Sets the value of "border-start-width" */
-  void set borderStartWidth(var value) {
-    setProperty('${_browserPrefix}border-start-width', value, '');
-  }
-
-  /** Gets the value of "border-style" */
-  String get borderStyle =>
-    getPropertyValue('border-style');
-
-  /** Sets the value of "border-style" */
-  void set borderStyle(var value) {
-    setProperty('border-style', value, '');
-  }
-
-  /** Gets the value of "border-top" */
-  String get borderTop =>
-    getPropertyValue('border-top');
-
-  /** Sets the value of "border-top" */
-  void set borderTop(var value) {
-    setProperty('border-top', value, '');
-  }
-
-  /** Gets the value of "border-top-color" */
-  String get borderTopColor =>
-    getPropertyValue('border-top-color');
-
-  /** Sets the value of "border-top-color" */
-  void set borderTopColor(var value) {
-    setProperty('border-top-color', value, '');
-  }
-
-  /** Gets the value of "border-top-left-radius" */
-  String get borderTopLeftRadius =>
-    getPropertyValue('border-top-left-radius');
-
-  /** Sets the value of "border-top-left-radius" */
-  void set borderTopLeftRadius(var value) {
-    setProperty('border-top-left-radius', value, '');
-  }
-
-  /** Gets the value of "border-top-right-radius" */
-  String get borderTopRightRadius =>
-    getPropertyValue('border-top-right-radius');
-
-  /** Sets the value of "border-top-right-radius" */
-  void set borderTopRightRadius(var value) {
-    setProperty('border-top-right-radius', value, '');
-  }
-
-  /** Gets the value of "border-top-style" */
-  String get borderTopStyle =>
-    getPropertyValue('border-top-style');
-
-  /** Sets the value of "border-top-style" */
-  void set borderTopStyle(var value) {
-    setProperty('border-top-style', value, '');
-  }
-
-  /** Gets the value of "border-top-width" */
-  String get borderTopWidth =>
-    getPropertyValue('border-top-width');
-
-  /** Sets the value of "border-top-width" */
-  void set borderTopWidth(var value) {
-    setProperty('border-top-width', value, '');
-  }
-
-  /** Gets the value of "border-vertical-spacing" */
-  String get borderVerticalSpacing =>
-    getPropertyValue('${_browserPrefix}border-vertical-spacing');
-
-  /** Sets the value of "border-vertical-spacing" */
-  void set borderVerticalSpacing(var value) {
-    setProperty('${_browserPrefix}border-vertical-spacing', value, '');
-  }
-
-  /** Gets the value of "border-width" */
-  String get borderWidth =>
-    getPropertyValue('border-width');
-
-  /** Sets the value of "border-width" */
-  void set borderWidth(var value) {
-    setProperty('border-width', value, '');
-  }
-
-  /** Gets the value of "bottom" */
-  String get bottom =>
-    getPropertyValue('bottom');
-
-  /** Sets the value of "bottom" */
-  void set bottom(var value) {
-    setProperty('bottom', value, '');
-  }
-
-  /** Gets the value of "box-align" */
-  String get boxAlign =>
-    getPropertyValue('${_browserPrefix}box-align');
-
-  /** Sets the value of "box-align" */
-  void set boxAlign(var value) {
-    setProperty('${_browserPrefix}box-align', value, '');
-  }
-
-  /** Gets the value of "box-direction" */
-  String get boxDirection =>
-    getPropertyValue('${_browserPrefix}box-direction');
-
-  /** Sets the value of "box-direction" */
-  void set boxDirection(var value) {
-    setProperty('${_browserPrefix}box-direction', value, '');
-  }
-
-  /** Gets the value of "box-flex" */
-  String get boxFlex =>
-    getPropertyValue('${_browserPrefix}box-flex');
-
-  /** Sets the value of "box-flex" */
-  void set boxFlex(var value) {
-    setProperty('${_browserPrefix}box-flex', value, '');
-  }
-
-  /** Gets the value of "box-flex-group" */
-  String get boxFlexGroup =>
-    getPropertyValue('${_browserPrefix}box-flex-group');
-
-  /** Sets the value of "box-flex-group" */
-  void set boxFlexGroup(var value) {
-    setProperty('${_browserPrefix}box-flex-group', value, '');
-  }
-
-  /** Gets the value of "box-lines" */
-  String get boxLines =>
-    getPropertyValue('${_browserPrefix}box-lines');
-
-  /** Sets the value of "box-lines" */
-  void set boxLines(var value) {
-    setProperty('${_browserPrefix}box-lines', value, '');
-  }
-
-  /** Gets the value of "box-ordinal-group" */
-  String get boxOrdinalGroup =>
-    getPropertyValue('${_browserPrefix}box-ordinal-group');
-
-  /** Sets the value of "box-ordinal-group" */
-  void set boxOrdinalGroup(var value) {
-    setProperty('${_browserPrefix}box-ordinal-group', value, '');
-  }
-
-  /** Gets the value of "box-orient" */
-  String get boxOrient =>
-    getPropertyValue('${_browserPrefix}box-orient');
-
-  /** Sets the value of "box-orient" */
-  void set boxOrient(var value) {
-    setProperty('${_browserPrefix}box-orient', value, '');
-  }
-
-  /** Gets the value of "box-pack" */
-  String get boxPack =>
-    getPropertyValue('${_browserPrefix}box-pack');
-
-  /** Sets the value of "box-pack" */
-  void set boxPack(var value) {
-    setProperty('${_browserPrefix}box-pack', value, '');
-  }
-
-  /** Gets the value of "box-reflect" */
-  String get boxReflect =>
-    getPropertyValue('${_browserPrefix}box-reflect');
-
-  /** Sets the value of "box-reflect" */
-  void set boxReflect(var value) {
-    setProperty('${_browserPrefix}box-reflect', value, '');
-  }
-
-  /** Gets the value of "box-shadow" */
-  String get boxShadow =>
-    getPropertyValue('box-shadow');
-
-  /** Sets the value of "box-shadow" */
-  void set boxShadow(var value) {
-    setProperty('box-shadow', value, '');
-  }
-
-  /** Gets the value of "box-sizing" */
-  String get boxSizing =>
-    getPropertyValue('box-sizing');
-
-  /** Sets the value of "box-sizing" */
-  void set boxSizing(var value) {
-    setProperty('box-sizing', value, '');
-  }
-
-  /** Gets the value of "caption-side" */
-  String get captionSide =>
-    getPropertyValue('caption-side');
-
-  /** Sets the value of "caption-side" */
-  void set captionSide(var value) {
-    setProperty('caption-side', value, '');
-  }
-
-  /** Gets the value of "clear" */
-  String get clear =>
-    getPropertyValue('clear');
-
-  /** Sets the value of "clear" */
-  void set clear(var value) {
-    setProperty('clear', value, '');
-  }
-
-  /** Gets the value of "clip" */
-  String get clip =>
-    getPropertyValue('clip');
-
-  /** Sets the value of "clip" */
-  void set clip(var value) {
-    setProperty('clip', value, '');
-  }
-
-  /** Gets the value of "color" */
-  String get color =>
-    getPropertyValue('color');
-
-  /** Sets the value of "color" */
-  void set color(var value) {
-    setProperty('color', value, '');
-  }
-
-  /** Gets the value of "color-correction" */
-  String get colorCorrection =>
-    getPropertyValue('${_browserPrefix}color-correction');
-
-  /** Sets the value of "color-correction" */
-  void set colorCorrection(var value) {
-    setProperty('${_browserPrefix}color-correction', value, '');
-  }
-
-  /** Gets the value of "column-break-after" */
-  String get columnBreakAfter =>
-    getPropertyValue('${_browserPrefix}column-break-after');
-
-  /** Sets the value of "column-break-after" */
-  void set columnBreakAfter(var value) {
-    setProperty('${_browserPrefix}column-break-after', value, '');
-  }
-
-  /** Gets the value of "column-break-before" */
-  String get columnBreakBefore =>
-    getPropertyValue('${_browserPrefix}column-break-before');
-
-  /** Sets the value of "column-break-before" */
-  void set columnBreakBefore(var value) {
-    setProperty('${_browserPrefix}column-break-before', value, '');
-  }
-
-  /** Gets the value of "column-break-inside" */
-  String get columnBreakInside =>
-    getPropertyValue('${_browserPrefix}column-break-inside');
-
-  /** Sets the value of "column-break-inside" */
-  void set columnBreakInside(var value) {
-    setProperty('${_browserPrefix}column-break-inside', value, '');
-  }
-
-  /** Gets the value of "column-count" */
-  String get columnCount =>
-    getPropertyValue('${_browserPrefix}column-count');
-
-  /** Sets the value of "column-count" */
-  void set columnCount(var value) {
-    setProperty('${_browserPrefix}column-count', value, '');
-  }
-
-  /** Gets the value of "column-gap" */
-  String get columnGap =>
-    getPropertyValue('${_browserPrefix}column-gap');
-
-  /** Sets the value of "column-gap" */
-  void set columnGap(var value) {
-    setProperty('${_browserPrefix}column-gap', value, '');
-  }
-
-  /** Gets the value of "column-rule" */
-  String get columnRule =>
-    getPropertyValue('${_browserPrefix}column-rule');
-
-  /** Sets the value of "column-rule" */
-  void set columnRule(var value) {
-    setProperty('${_browserPrefix}column-rule', value, '');
-  }
-
-  /** Gets the value of "column-rule-color" */
-  String get columnRuleColor =>
-    getPropertyValue('${_browserPrefix}column-rule-color');
-
-  /** Sets the value of "column-rule-color" */
-  void set columnRuleColor(var value) {
-    setProperty('${_browserPrefix}column-rule-color', value, '');
-  }
-
-  /** Gets the value of "column-rule-style" */
-  String get columnRuleStyle =>
-    getPropertyValue('${_browserPrefix}column-rule-style');
-
-  /** Sets the value of "column-rule-style" */
-  void set columnRuleStyle(var value) {
-    setProperty('${_browserPrefix}column-rule-style', value, '');
-  }
-
-  /** Gets the value of "column-rule-width" */
-  String get columnRuleWidth =>
-    getPropertyValue('${_browserPrefix}column-rule-width');
-
-  /** Sets the value of "column-rule-width" */
-  void set columnRuleWidth(var value) {
-    setProperty('${_browserPrefix}column-rule-width', value, '');
-  }
-
-  /** Gets the value of "column-span" */
-  String get columnSpan =>
-    getPropertyValue('${_browserPrefix}column-span');
-
-  /** Sets the value of "column-span" */
-  void set columnSpan(var value) {
-    setProperty('${_browserPrefix}column-span', value, '');
-  }
-
-  /** Gets the value of "column-width" */
-  String get columnWidth =>
-    getPropertyValue('${_browserPrefix}column-width');
-
-  /** Sets the value of "column-width" */
-  void set columnWidth(var value) {
-    setProperty('${_browserPrefix}column-width', value, '');
-  }
-
-  /** Gets the value of "columns" */
-  String get columns =>
-    getPropertyValue('${_browserPrefix}columns');
-
-  /** Sets the value of "columns" */
-  void set columns(var value) {
-    setProperty('${_browserPrefix}columns', value, '');
-  }
-
-  /** Gets the value of "content" */
-  String get content =>
-    getPropertyValue('content');
-
-  /** Sets the value of "content" */
-  void set content(var value) {
-    setProperty('content', value, '');
-  }
-
-  /** Gets the value of "counter-increment" */
-  String get counterIncrement =>
-    getPropertyValue('counter-increment');
-
-  /** Sets the value of "counter-increment" */
-  void set counterIncrement(var value) {
-    setProperty('counter-increment', value, '');
-  }
-
-  /** Gets the value of "counter-reset" */
-  String get counterReset =>
-    getPropertyValue('counter-reset');
-
-  /** Sets the value of "counter-reset" */
-  void set counterReset(var value) {
-    setProperty('counter-reset', value, '');
-  }
-
-  /** Gets the value of "cursor" */
-  String get cursor =>
-    getPropertyValue('cursor');
-
-  /** Sets the value of "cursor" */
-  void set cursor(var value) {
-    setProperty('cursor', value, '');
-  }
-
-  /** Gets the value of "direction" */
-  String get direction =>
-    getPropertyValue('direction');
-
-  /** Sets the value of "direction" */
-  void set direction(var value) {
-    setProperty('direction', value, '');
-  }
-
-  /** Gets the value of "display" */
-  String get display =>
-    getPropertyValue('display');
-
-  /** Sets the value of "display" */
-  void set display(var value) {
-    setProperty('display', value, '');
-  }
-
-  /** Gets the value of "empty-cells" */
-  String get emptyCells =>
-    getPropertyValue('empty-cells');
-
-  /** Sets the value of "empty-cells" */
-  void set emptyCells(var value) {
-    setProperty('empty-cells', value, '');
-  }
-
-  /** Gets the value of "filter" */
-  String get filter =>
-    getPropertyValue('${_browserPrefix}filter');
-
-  /** Sets the value of "filter" */
-  void set filter(var value) {
-    setProperty('${_browserPrefix}filter', value, '');
-  }
-
-  /** Gets the value of "flex-align" */
-  String get flexAlign =>
-    getPropertyValue('${_browserPrefix}flex-align');
-
-  /** Sets the value of "flex-align" */
-  void set flexAlign(var value) {
-    setProperty('${_browserPrefix}flex-align', value, '');
-  }
-
-  /** Gets the value of "flex-flow" */
-  String get flexFlow =>
-    getPropertyValue('${_browserPrefix}flex-flow');
-
-  /** Sets the value of "flex-flow" */
-  void set flexFlow(var value) {
-    setProperty('${_browserPrefix}flex-flow', value, '');
-  }
-
-  /** Gets the value of "flex-order" */
-  String get flexOrder =>
-    getPropertyValue('${_browserPrefix}flex-order');
-
-  /** Sets the value of "flex-order" */
-  void set flexOrder(var value) {
-    setProperty('${_browserPrefix}flex-order', value, '');
-  }
-
-  /** Gets the value of "flex-pack" */
-  String get flexPack =>
-    getPropertyValue('${_browserPrefix}flex-pack');
-
-  /** Sets the value of "flex-pack" */
-  void set flexPack(var value) {
-    setProperty('${_browserPrefix}flex-pack', value, '');
-  }
-
-  /** Gets the value of "float" */
-  String get float =>
-    getPropertyValue('float');
-
-  /** Sets the value of "float" */
-  void set float(var value) {
-    setProperty('float', value, '');
-  }
-
-  /** Gets the value of "flow-from" */
-  String get flowFrom =>
-    getPropertyValue('${_browserPrefix}flow-from');
-
-  /** Sets the value of "flow-from" */
-  void set flowFrom(var value) {
-    setProperty('${_browserPrefix}flow-from', value, '');
-  }
-
-  /** Gets the value of "flow-into" */
-  String get flowInto =>
-    getPropertyValue('${_browserPrefix}flow-into');
-
-  /** Sets the value of "flow-into" */
-  void set flowInto(var value) {
-    setProperty('${_browserPrefix}flow-into', value, '');
-  }
-
-  /** Gets the value of "font" */
-  String get font =>
-    getPropertyValue('font');
-
-  /** Sets the value of "font" */
-  void set font(var value) {
-    setProperty('font', value, '');
-  }
-
-  /** Gets the value of "font-family" */
-  String get fontFamily =>
-    getPropertyValue('font-family');
-
-  /** Sets the value of "font-family" */
-  void set fontFamily(var value) {
-    setProperty('font-family', value, '');
-  }
-
-  /** Gets the value of "font-feature-settings" */
-  String get fontFeatureSettings =>
-    getPropertyValue('${_browserPrefix}font-feature-settings');
-
-  /** Sets the value of "font-feature-settings" */
-  void set fontFeatureSettings(var value) {
-    setProperty('${_browserPrefix}font-feature-settings', value, '');
-  }
-
-  /** Gets the value of "font-size" */
-  String get fontSize =>
-    getPropertyValue('font-size');
-
-  /** Sets the value of "font-size" */
-  void set fontSize(var value) {
-    setProperty('font-size', value, '');
-  }
-
-  /** Gets the value of "font-size-delta" */
-  String get fontSizeDelta =>
-    getPropertyValue('${_browserPrefix}font-size-delta');
-
-  /** Sets the value of "font-size-delta" */
-  void set fontSizeDelta(var value) {
-    setProperty('${_browserPrefix}font-size-delta', value, '');
-  }
-
-  /** Gets the value of "font-smoothing" */
-  String get fontSmoothing =>
-    getPropertyValue('${_browserPrefix}font-smoothing');
-
-  /** Sets the value of "font-smoothing" */
-  void set fontSmoothing(var value) {
-    setProperty('${_browserPrefix}font-smoothing', value, '');
-  }
-
-  /** Gets the value of "font-stretch" */
-  String get fontStretch =>
-    getPropertyValue('font-stretch');
-
-  /** Sets the value of "font-stretch" */
-  void set fontStretch(var value) {
-    setProperty('font-stretch', value, '');
-  }
-
-  /** Gets the value of "font-style" */
-  String get fontStyle =>
-    getPropertyValue('font-style');
-
-  /** Sets the value of "font-style" */
-  void set fontStyle(var value) {
-    setProperty('font-style', value, '');
-  }
-
-  /** Gets the value of "font-variant" */
-  String get fontVariant =>
-    getPropertyValue('font-variant');
-
-  /** Sets the value of "font-variant" */
-  void set fontVariant(var value) {
-    setProperty('font-variant', value, '');
-  }
-
-  /** Gets the value of "font-weight" */
-  String get fontWeight =>
-    getPropertyValue('font-weight');
-
-  /** Sets the value of "font-weight" */
-  void set fontWeight(var value) {
-    setProperty('font-weight', value, '');
-  }
-
-  /** Gets the value of "height" */
-  String get height =>
-    getPropertyValue('height');
-
-  /** Sets the value of "height" */
-  void set height(var value) {
-    setProperty('height', value, '');
-  }
-
-  /** Gets the value of "highlight" */
-  String get highlight =>
-    getPropertyValue('${_browserPrefix}highlight');
-
-  /** Sets the value of "highlight" */
-  void set highlight(var value) {
-    setProperty('${_browserPrefix}highlight', value, '');
-  }
-
-  /** Gets the value of "hyphenate-character" */
-  String get hyphenateCharacter =>
-    getPropertyValue('${_browserPrefix}hyphenate-character');
-
-  /** Sets the value of "hyphenate-character" */
-  void set hyphenateCharacter(var value) {
-    setProperty('${_browserPrefix}hyphenate-character', value, '');
-  }
-
-  /** Gets the value of "hyphenate-limit-after" */
-  String get hyphenateLimitAfter =>
-    getPropertyValue('${_browserPrefix}hyphenate-limit-after');
-
-  /** Sets the value of "hyphenate-limit-after" */
-  void set hyphenateLimitAfter(var value) {
-    setProperty('${_browserPrefix}hyphenate-limit-after', value, '');
-  }
-
-  /** Gets the value of "hyphenate-limit-before" */
-  String get hyphenateLimitBefore =>
-    getPropertyValue('${_browserPrefix}hyphenate-limit-before');
-
-  /** Sets the value of "hyphenate-limit-before" */
-  void set hyphenateLimitBefore(var value) {
-    setProperty('${_browserPrefix}hyphenate-limit-before', value, '');
-  }
-
-  /** Gets the value of "hyphenate-limit-lines" */
-  String get hyphenateLimitLines =>
-    getPropertyValue('${_browserPrefix}hyphenate-limit-lines');
-
-  /** Sets the value of "hyphenate-limit-lines" */
-  void set hyphenateLimitLines(var value) {
-    setProperty('${_browserPrefix}hyphenate-limit-lines', value, '');
-  }
-
-  /** Gets the value of "hyphens" */
-  String get hyphens =>
-    getPropertyValue('${_browserPrefix}hyphens');
-
-  /** Sets the value of "hyphens" */
-  void set hyphens(var value) {
-    setProperty('${_browserPrefix}hyphens', value, '');
-  }
-
-  /** Gets the value of "image-rendering" */
-  String get imageRendering =>
-    getPropertyValue('image-rendering');
-
-  /** Sets the value of "image-rendering" */
-  void set imageRendering(var value) {
-    setProperty('image-rendering', value, '');
-  }
-
-  /** Gets the value of "left" */
-  String get left =>
-    getPropertyValue('left');
-
-  /** Sets the value of "left" */
-  void set left(var value) {
-    setProperty('left', value, '');
-  }
-
-  /** Gets the value of "letter-spacing" */
-  String get letterSpacing =>
-    getPropertyValue('letter-spacing');
-
-  /** Sets the value of "letter-spacing" */
-  void set letterSpacing(var value) {
-    setProperty('letter-spacing', value, '');
-  }
-
-  /** Gets the value of "line-box-contain" */
-  String get lineBoxContain =>
-    getPropertyValue('${_browserPrefix}line-box-contain');
-
-  /** Sets the value of "line-box-contain" */
-  void set lineBoxContain(var value) {
-    setProperty('${_browserPrefix}line-box-contain', value, '');
-  }
-
-  /** Gets the value of "line-break" */
-  String get lineBreak =>
-    getPropertyValue('${_browserPrefix}line-break');
-
-  /** Sets the value of "line-break" */
-  void set lineBreak(var value) {
-    setProperty('${_browserPrefix}line-break', value, '');
-  }
-
-  /** Gets the value of "line-clamp" */
-  String get lineClamp =>
-    getPropertyValue('${_browserPrefix}line-clamp');
-
-  /** Sets the value of "line-clamp" */
-  void set lineClamp(var value) {
-    setProperty('${_browserPrefix}line-clamp', value, '');
-  }
-
-  /** Gets the value of "line-height" */
-  String get lineHeight =>
-    getPropertyValue('line-height');
-
-  /** Sets the value of "line-height" */
-  void set lineHeight(var value) {
-    setProperty('line-height', value, '');
-  }
-
-  /** Gets the value of "list-style" */
-  String get listStyle =>
-    getPropertyValue('list-style');
-
-  /** Sets the value of "list-style" */
-  void set listStyle(var value) {
-    setProperty('list-style', value, '');
-  }
-
-  /** Gets the value of "list-style-image" */
-  String get listStyleImage =>
-    getPropertyValue('list-style-image');
-
-  /** Sets the value of "list-style-image" */
-  void set listStyleImage(var value) {
-    setProperty('list-style-image', value, '');
-  }
-
-  /** Gets the value of "list-style-position" */
-  String get listStylePosition =>
-    getPropertyValue('list-style-position');
-
-  /** Sets the value of "list-style-position" */
-  void set listStylePosition(var value) {
-    setProperty('list-style-position', value, '');
-  }
-
-  /** Gets the value of "list-style-type" */
-  String get listStyleType =>
-    getPropertyValue('list-style-type');
-
-  /** Sets the value of "list-style-type" */
-  void set listStyleType(var value) {
-    setProperty('list-style-type', value, '');
-  }
-
-  /** Gets the value of "locale" */
-  String get locale =>
-    getPropertyValue('${_browserPrefix}locale');
-
-  /** Sets the value of "locale" */
-  void set locale(var value) {
-    setProperty('${_browserPrefix}locale', value, '');
-  }
-
-  /** Gets the value of "logical-height" */
-  String get logicalHeight =>
-    getPropertyValue('${_browserPrefix}logical-height');
-
-  /** Sets the value of "logical-height" */
-  void set logicalHeight(var value) {
-    setProperty('${_browserPrefix}logical-height', value, '');
-  }
-
-  /** Gets the value of "logical-width" */
-  String get logicalWidth =>
-    getPropertyValue('${_browserPrefix}logical-width');
-
-  /** Sets the value of "logical-width" */
-  void set logicalWidth(var value) {
-    setProperty('${_browserPrefix}logical-width', value, '');
-  }
-
-  /** Gets the value of "margin" */
-  String get margin =>
-    getPropertyValue('margin');
-
-  /** Sets the value of "margin" */
-  void set margin(var value) {
-    setProperty('margin', value, '');
-  }
-
-  /** Gets the value of "margin-after" */
-  String get marginAfter =>
-    getPropertyValue('${_browserPrefix}margin-after');
-
-  /** Sets the value of "margin-after" */
-  void set marginAfter(var value) {
-    setProperty('${_browserPrefix}margin-after', value, '');
-  }
-
-  /** Gets the value of "margin-after-collapse" */
-  String get marginAfterCollapse =>
-    getPropertyValue('${_browserPrefix}margin-after-collapse');
-
-  /** Sets the value of "margin-after-collapse" */
-  void set marginAfterCollapse(var value) {
-    setProperty('${_browserPrefix}margin-after-collapse', value, '');
-  }
-
-  /** Gets the value of "margin-before" */
-  String get marginBefore =>
-    getPropertyValue('${_browserPrefix}margin-before');
-
-  /** Sets the value of "margin-before" */
-  void set marginBefore(var value) {
-    setProperty('${_browserPrefix}margin-before', value, '');
-  }
-
-  /** Gets the value of "margin-before-collapse" */
-  String get marginBeforeCollapse =>
-    getPropertyValue('${_browserPrefix}margin-before-collapse');
-
-  /** Sets the value of "margin-before-collapse" */
-  void set marginBeforeCollapse(var value) {
-    setProperty('${_browserPrefix}margin-before-collapse', value, '');
-  }
-
-  /** Gets the value of "margin-bottom" */
-  String get marginBottom =>
-    getPropertyValue('margin-bottom');
-
-  /** Sets the value of "margin-bottom" */
-  void set marginBottom(var value) {
-    setProperty('margin-bottom', value, '');
-  }
-
-  /** Gets the value of "margin-bottom-collapse" */
-  String get marginBottomCollapse =>
-    getPropertyValue('${_browserPrefix}margin-bottom-collapse');
-
-  /** Sets the value of "margin-bottom-collapse" */
-  void set marginBottomCollapse(var value) {
-    setProperty('${_browserPrefix}margin-bottom-collapse', value, '');
-  }
-
-  /** Gets the value of "margin-collapse" */
-  String get marginCollapse =>
-    getPropertyValue('${_browserPrefix}margin-collapse');
-
-  /** Sets the value of "margin-collapse" */
-  void set marginCollapse(var value) {
-    setProperty('${_browserPrefix}margin-collapse', value, '');
-  }
-
-  /** Gets the value of "margin-end" */
-  String get marginEnd =>
-    getPropertyValue('${_browserPrefix}margin-end');
-
-  /** Sets the value of "margin-end" */
-  void set marginEnd(var value) {
-    setProperty('${_browserPrefix}margin-end', value, '');
-  }
-
-  /** Gets the value of "margin-left" */
-  String get marginLeft =>
-    getPropertyValue('margin-left');
-
-  /** Sets the value of "margin-left" */
-  void set marginLeft(var value) {
-    setProperty('margin-left', value, '');
-  }
-
-  /** Gets the value of "margin-right" */
-  String get marginRight =>
-    getPropertyValue('margin-right');
-
-  /** Sets the value of "margin-right" */
-  void set marginRight(var value) {
-    setProperty('margin-right', value, '');
-  }
-
-  /** Gets the value of "margin-start" */
-  String get marginStart =>
-    getPropertyValue('${_browserPrefix}margin-start');
-
-  /** Sets the value of "margin-start" */
-  void set marginStart(var value) {
-    setProperty('${_browserPrefix}margin-start', value, '');
-  }
-
-  /** Gets the value of "margin-top" */
-  String get marginTop =>
-    getPropertyValue('margin-top');
-
-  /** Sets the value of "margin-top" */
-  void set marginTop(var value) {
-    setProperty('margin-top', value, '');
-  }
-
-  /** Gets the value of "margin-top-collapse" */
-  String get marginTopCollapse =>
-    getPropertyValue('${_browserPrefix}margin-top-collapse');
-
-  /** Sets the value of "margin-top-collapse" */
-  void set marginTopCollapse(var value) {
-    setProperty('${_browserPrefix}margin-top-collapse', value, '');
-  }
-
-  /** Gets the value of "marquee" */
-  String get marquee =>
-    getPropertyValue('${_browserPrefix}marquee');
-
-  /** Sets the value of "marquee" */
-  void set marquee(var value) {
-    setProperty('${_browserPrefix}marquee', value, '');
-  }
-
-  /** Gets the value of "marquee-direction" */
-  String get marqueeDirection =>
-    getPropertyValue('${_browserPrefix}marquee-direction');
-
-  /** Sets the value of "marquee-direction" */
-  void set marqueeDirection(var value) {
-    setProperty('${_browserPrefix}marquee-direction', value, '');
-  }
-
-  /** Gets the value of "marquee-increment" */
-  String get marqueeIncrement =>
-    getPropertyValue('${_browserPrefix}marquee-increment');
-
-  /** Sets the value of "marquee-increment" */
-  void set marqueeIncrement(var value) {
-    setProperty('${_browserPrefix}marquee-increment', value, '');
-  }
-
-  /** Gets the value of "marquee-repetition" */
-  String get marqueeRepetition =>
-    getPropertyValue('${_browserPrefix}marquee-repetition');
-
-  /** Sets the value of "marquee-repetition" */
-  void set marqueeRepetition(var value) {
-    setProperty('${_browserPrefix}marquee-repetition', value, '');
-  }
-
-  /** Gets the value of "marquee-speed" */
-  String get marqueeSpeed =>
-    getPropertyValue('${_browserPrefix}marquee-speed');
-
-  /** Sets the value of "marquee-speed" */
-  void set marqueeSpeed(var value) {
-    setProperty('${_browserPrefix}marquee-speed', value, '');
-  }
-
-  /** Gets the value of "marquee-style" */
-  String get marqueeStyle =>
-    getPropertyValue('${_browserPrefix}marquee-style');
-
-  /** Sets the value of "marquee-style" */
-  void set marqueeStyle(var value) {
-    setProperty('${_browserPrefix}marquee-style', value, '');
-  }
-
-  /** Gets the value of "mask" */
-  String get mask =>
-    getPropertyValue('${_browserPrefix}mask');
-
-  /** Sets the value of "mask" */
-  void set mask(var value) {
-    setProperty('${_browserPrefix}mask', value, '');
-  }
-
-  /** Gets the value of "mask-attachment" */
-  String get maskAttachment =>
-    getPropertyValue('${_browserPrefix}mask-attachment');
-
-  /** Sets the value of "mask-attachment" */
-  void set maskAttachment(var value) {
-    setProperty('${_browserPrefix}mask-attachment', value, '');
-  }
-
-  /** Gets the value of "mask-box-image" */
-  String get maskBoxImage =>
-    getPropertyValue('${_browserPrefix}mask-box-image');
-
-  /** Sets the value of "mask-box-image" */
-  void set maskBoxImage(var value) {
-    setProperty('${_browserPrefix}mask-box-image', value, '');
-  }
-
-  /** Gets the value of "mask-box-image-outset" */
-  String get maskBoxImageOutset =>
-    getPropertyValue('${_browserPrefix}mask-box-image-outset');
-
-  /** Sets the value of "mask-box-image-outset" */
-  void set maskBoxImageOutset(var value) {
-    setProperty('${_browserPrefix}mask-box-image-outset', value, '');
-  }
-
-  /** Gets the value of "mask-box-image-repeat" */
-  String get maskBoxImageRepeat =>
-    getPropertyValue('${_browserPrefix}mask-box-image-repeat');
-
-  /** Sets the value of "mask-box-image-repeat" */
-  void set maskBoxImageRepeat(var value) {
-    setProperty('${_browserPrefix}mask-box-image-repeat', value, '');
-  }
-
-  /** Gets the value of "mask-box-image-slice" */
-  String get maskBoxImageSlice =>
-    getPropertyValue('${_browserPrefix}mask-box-image-slice');
-
-  /** Sets the value of "mask-box-image-slice" */
-  void set maskBoxImageSlice(var value) {
-    setProperty('${_browserPrefix}mask-box-image-slice', value, '');
-  }
-
-  /** Gets the value of "mask-box-image-source" */
-  String get maskBoxImageSource =>
-    getPropertyValue('${_browserPrefix}mask-box-image-source');
-
-  /** Sets the value of "mask-box-image-source" */
-  void set maskBoxImageSource(var value) {
-    setProperty('${_browserPrefix}mask-box-image-source', value, '');
-  }
-
-  /** Gets the value of "mask-box-image-width" */
-  String get maskBoxImageWidth =>
-    getPropertyValue('${_browserPrefix}mask-box-image-width');
-
-  /** Sets the value of "mask-box-image-width" */
-  void set maskBoxImageWidth(var value) {
-    setProperty('${_browserPrefix}mask-box-image-width', value, '');
-  }
-
-  /** Gets the value of "mask-clip" */
-  String get maskClip =>
-    getPropertyValue('${_browserPrefix}mask-clip');
-
-  /** Sets the value of "mask-clip" */
-  void set maskClip(var value) {
-    setProperty('${_browserPrefix}mask-clip', value, '');
-  }
-
-  /** Gets the value of "mask-composite" */
-  String get maskComposite =>
-    getPropertyValue('${_browserPrefix}mask-composite');
-
-  /** Sets the value of "mask-composite" */
-  void set maskComposite(var value) {
-    setProperty('${_browserPrefix}mask-composite', value, '');
-  }
-
-  /** Gets the value of "mask-image" */
-  String get maskImage =>
-    getPropertyValue('${_browserPrefix}mask-image');
-
-  /** Sets the value of "mask-image" */
-  void set maskImage(var value) {
-    setProperty('${_browserPrefix}mask-image', value, '');
-  }
-
-  /** Gets the value of "mask-origin" */
-  String get maskOrigin =>
-    getPropertyValue('${_browserPrefix}mask-origin');
-
-  /** Sets the value of "mask-origin" */
-  void set maskOrigin(var value) {
-    setProperty('${_browserPrefix}mask-origin', value, '');
-  }
-
-  /** Gets the value of "mask-position" */
-  String get maskPosition =>
-    getPropertyValue('${_browserPrefix}mask-position');
-
-  /** Sets the value of "mask-position" */
-  void set maskPosition(var value) {
-    setProperty('${_browserPrefix}mask-position', value, '');
-  }
-
-  /** Gets the value of "mask-position-x" */
-  String get maskPositionX =>
-    getPropertyValue('${_browserPrefix}mask-position-x');
-
-  /** Sets the value of "mask-position-x" */
-  void set maskPositionX(var value) {
-    setProperty('${_browserPrefix}mask-position-x', value, '');
-  }
-
-  /** Gets the value of "mask-position-y" */
-  String get maskPositionY =>
-    getPropertyValue('${_browserPrefix}mask-position-y');
-
-  /** Sets the value of "mask-position-y" */
-  void set maskPositionY(var value) {
-    setProperty('${_browserPrefix}mask-position-y', value, '');
-  }
-
-  /** Gets the value of "mask-repeat" */
-  String get maskRepeat =>
-    getPropertyValue('${_browserPrefix}mask-repeat');
-
-  /** Sets the value of "mask-repeat" */
-  void set maskRepeat(var value) {
-    setProperty('${_browserPrefix}mask-repeat', value, '');
-  }
-
-  /** Gets the value of "mask-repeat-x" */
-  String get maskRepeatX =>
-    getPropertyValue('${_browserPrefix}mask-repeat-x');
-
-  /** Sets the value of "mask-repeat-x" */
-  void set maskRepeatX(var value) {
-    setProperty('${_browserPrefix}mask-repeat-x', value, '');
-  }
-
-  /** Gets the value of "mask-repeat-y" */
-  String get maskRepeatY =>
-    getPropertyValue('${_browserPrefix}mask-repeat-y');
-
-  /** Sets the value of "mask-repeat-y" */
-  void set maskRepeatY(var value) {
-    setProperty('${_browserPrefix}mask-repeat-y', value, '');
-  }
-
-  /** Gets the value of "mask-size" */
-  String get maskSize =>
-    getPropertyValue('${_browserPrefix}mask-size');
-
-  /** Sets the value of "mask-size" */
-  void set maskSize(var value) {
-    setProperty('${_browserPrefix}mask-size', value, '');
-  }
-
-  /** Gets the value of "match-nearest-mail-blockquote-color" */
-  String get matchNearestMailBlockquoteColor =>
-    getPropertyValue('${_browserPrefix}match-nearest-mail-blockquote-color');
-
-  /** Sets the value of "match-nearest-mail-blockquote-color" */
-  void set matchNearestMailBlockquoteColor(var value) {
-    setProperty('${_browserPrefix}match-nearest-mail-blockquote-color', value, '');
-  }
-
-  /** Gets the value of "max-height" */
-  String get maxHeight =>
-    getPropertyValue('max-height');
-
-  /** Sets the value of "max-height" */
-  void set maxHeight(var value) {
-    setProperty('max-height', value, '');
-  }
-
-  /** Gets the value of "max-logical-height" */
-  String get maxLogicalHeight =>
-    getPropertyValue('${_browserPrefix}max-logical-height');
-
-  /** Sets the value of "max-logical-height" */
-  void set maxLogicalHeight(var value) {
-    setProperty('${_browserPrefix}max-logical-height', value, '');
-  }
-
-  /** Gets the value of "max-logical-width" */
-  String get maxLogicalWidth =>
-    getPropertyValue('${_browserPrefix}max-logical-width');
-
-  /** Sets the value of "max-logical-width" */
-  void set maxLogicalWidth(var value) {
-    setProperty('${_browserPrefix}max-logical-width', value, '');
-  }
-
-  /** Gets the value of "max-width" */
-  String get maxWidth =>
-    getPropertyValue('max-width');
-
-  /** Sets the value of "max-width" */
-  void set maxWidth(var value) {
-    setProperty('max-width', value, '');
-  }
-
-  /** Gets the value of "min-height" */
-  String get minHeight =>
-    getPropertyValue('min-height');
-
-  /** Sets the value of "min-height" */
-  void set minHeight(var value) {
-    setProperty('min-height', value, '');
-  }
-
-  /** Gets the value of "min-logical-height" */
-  String get minLogicalHeight =>
-    getPropertyValue('${_browserPrefix}min-logical-height');
-
-  /** Sets the value of "min-logical-height" */
-  void set minLogicalHeight(var value) {
-    setProperty('${_browserPrefix}min-logical-height', value, '');
-  }
-
-  /** Gets the value of "min-logical-width" */
-  String get minLogicalWidth =>
-    getPropertyValue('${_browserPrefix}min-logical-width');
-
-  /** Sets the value of "min-logical-width" */
-  void set minLogicalWidth(var value) {
-    setProperty('${_browserPrefix}min-logical-width', value, '');
-  }
-
-  /** Gets the value of "min-width" */
-  String get minWidth =>
-    getPropertyValue('min-width');
-
-  /** Sets the value of "min-width" */
-  void set minWidth(var value) {
-    setProperty('min-width', value, '');
-  }
-
-  /** Gets the value of "nbsp-mode" */
-  String get nbspMode =>
-    getPropertyValue('${_browserPrefix}nbsp-mode');
-
-  /** Sets the value of "nbsp-mode" */
-  void set nbspMode(var value) {
-    setProperty('${_browserPrefix}nbsp-mode', value, '');
-  }
-
-  /** Gets the value of "opacity" */
-  String get opacity =>
-    getPropertyValue('opacity');
-
-  /** Sets the value of "opacity" */
-  void set opacity(var value) {
-    setProperty('opacity', value, '');
-  }
-
-  /** Gets the value of "orphans" */
-  String get orphans =>
-    getPropertyValue('orphans');
-
-  /** Sets the value of "orphans" */
-  void set orphans(var value) {
-    setProperty('orphans', value, '');
-  }
-
-  /** Gets the value of "outline" */
-  String get outline =>
-    getPropertyValue('outline');
-
-  /** Sets the value of "outline" */
-  void set outline(var value) {
-    setProperty('outline', value, '');
-  }
-
-  /** Gets the value of "outline-color" */
-  String get outlineColor =>
-    getPropertyValue('outline-color');
-
-  /** Sets the value of "outline-color" */
-  void set outlineColor(var value) {
-    setProperty('outline-color', value, '');
-  }
-
-  /** Gets the value of "outline-offset" */
-  String get outlineOffset =>
-    getPropertyValue('outline-offset');
-
-  /** Sets the value of "outline-offset" */
-  void set outlineOffset(var value) {
-    setProperty('outline-offset', value, '');
-  }
-
-  /** Gets the value of "outline-style" */
-  String get outlineStyle =>
-    getPropertyValue('outline-style');
-
-  /** Sets the value of "outline-style" */
-  void set outlineStyle(var value) {
-    setProperty('outline-style', value, '');
-  }
-
-  /** Gets the value of "outline-width" */
-  String get outlineWidth =>
-    getPropertyValue('outline-width');
-
-  /** Sets the value of "outline-width" */
-  void set outlineWidth(var value) {
-    setProperty('outline-width', value, '');
-  }
-
-  /** Gets the value of "overflow" */
-  String get overflow =>
-    getPropertyValue('overflow');
-
-  /** Sets the value of "overflow" */
-  void set overflow(var value) {
-    setProperty('overflow', value, '');
-  }
-
-  /** Gets the value of "overflow-x" */
-  String get overflowX =>
-    getPropertyValue('overflow-x');
-
-  /** Sets the value of "overflow-x" */
-  void set overflowX(var value) {
-    setProperty('overflow-x', value, '');
-  }
-
-  /** Gets the value of "overflow-y" */
-  String get overflowY =>
-    getPropertyValue('overflow-y');
-
-  /** Sets the value of "overflow-y" */
-  void set overflowY(var value) {
-    setProperty('overflow-y', value, '');
-  }
-
-  /** Gets the value of "padding" */
-  String get padding =>
-    getPropertyValue('padding');
-
-  /** Sets the value of "padding" */
-  void set padding(var value) {
-    setProperty('padding', value, '');
-  }
-
-  /** Gets the value of "padding-after" */
-  String get paddingAfter =>
-    getPropertyValue('${_browserPrefix}padding-after');
-
-  /** Sets the value of "padding-after" */
-  void set paddingAfter(var value) {
-    setProperty('${_browserPrefix}padding-after', value, '');
-  }
-
-  /** Gets the value of "padding-before" */
-  String get paddingBefore =>
-    getPropertyValue('${_browserPrefix}padding-before');
-
-  /** Sets the value of "padding-before" */
-  void set paddingBefore(var value) {
-    setProperty('${_browserPrefix}padding-before', value, '');
-  }
-
-  /** Gets the value of "padding-bottom" */
-  String get paddingBottom =>
-    getPropertyValue('padding-bottom');
-
-  /** Sets the value of "padding-bottom" */
-  void set paddingBottom(var value) {
-    setProperty('padding-bottom', value, '');
-  }
-
-  /** Gets the value of "padding-end" */
-  String get paddingEnd =>
-    getPropertyValue('${_browserPrefix}padding-end');
-
-  /** Sets the value of "padding-end" */
-  void set paddingEnd(var value) {
-    setProperty('${_browserPrefix}padding-end', value, '');
-  }
-
-  /** Gets the value of "padding-left" */
-  String get paddingLeft =>
-    getPropertyValue('padding-left');
-
-  /** Sets the value of "padding-left" */
-  void set paddingLeft(var value) {
-    setProperty('padding-left', value, '');
-  }
-
-  /** Gets the value of "padding-right" */
-  String get paddingRight =>
-    getPropertyValue('padding-right');
-
-  /** Sets the value of "padding-right" */
-  void set paddingRight(var value) {
-    setProperty('padding-right', value, '');
-  }
-
-  /** Gets the value of "padding-start" */
-  String get paddingStart =>
-    getPropertyValue('${_browserPrefix}padding-start');
-
-  /** Sets the value of "padding-start" */
-  void set paddingStart(var value) {
-    setProperty('${_browserPrefix}padding-start', value, '');
-  }
-
-  /** Gets the value of "padding-top" */
-  String get paddingTop =>
-    getPropertyValue('padding-top');
-
-  /** Sets the value of "padding-top" */
-  void set paddingTop(var value) {
-    setProperty('padding-top', value, '');
-  }
-
-  /** Gets the value of "page" */
-  String get page =>
-    getPropertyValue('page');
-
-  /** Sets the value of "page" */
-  void set page(var value) {
-    setProperty('page', value, '');
-  }
-
-  /** Gets the value of "page-break-after" */
-  String get pageBreakAfter =>
-    getPropertyValue('page-break-after');
-
-  /** Sets the value of "page-break-after" */
-  void set pageBreakAfter(var value) {
-    setProperty('page-break-after', value, '');
-  }
-
-  /** Gets the value of "page-break-before" */
-  String get pageBreakBefore =>
-    getPropertyValue('page-break-before');
-
-  /** Sets the value of "page-break-before" */
-  void set pageBreakBefore(var value) {
-    setProperty('page-break-before', value, '');
-  }
-
-  /** Gets the value of "page-break-inside" */
-  String get pageBreakInside =>
-    getPropertyValue('page-break-inside');
-
-  /** Sets the value of "page-break-inside" */
-  void set pageBreakInside(var value) {
-    setProperty('page-break-inside', value, '');
-  }
-
-  /** Gets the value of "perspective" */
-  String get perspective =>
-    getPropertyValue('${_browserPrefix}perspective');
-
-  /** Sets the value of "perspective" */
-  void set perspective(var value) {
-    setProperty('${_browserPrefix}perspective', value, '');
-  }
-
-  /** Gets the value of "perspective-origin" */
-  String get perspectiveOrigin =>
-    getPropertyValue('${_browserPrefix}perspective-origin');
-
-  /** Sets the value of "perspective-origin" */
-  void set perspectiveOrigin(var value) {
-    setProperty('${_browserPrefix}perspective-origin', value, '');
-  }
-
-  /** Gets the value of "perspective-origin-x" */
-  String get perspectiveOriginX =>
-    getPropertyValue('${_browserPrefix}perspective-origin-x');
-
-  /** Sets the value of "perspective-origin-x" */
-  void set perspectiveOriginX(var value) {
-    setProperty('${_browserPrefix}perspective-origin-x', value, '');
-  }
-
-  /** Gets the value of "perspective-origin-y" */
-  String get perspectiveOriginY =>
-    getPropertyValue('${_browserPrefix}perspective-origin-y');
-
-  /** Sets the value of "perspective-origin-y" */
-  void set perspectiveOriginY(var value) {
-    setProperty('${_browserPrefix}perspective-origin-y', value, '');
-  }
-
-  /** Gets the value of "pointer-events" */
-  String get pointerEvents =>
-    getPropertyValue('pointer-events');
-
-  /** Sets the value of "pointer-events" */
-  void set pointerEvents(var value) {
-    setProperty('pointer-events', value, '');
-  }
-
-  /** Gets the value of "position" */
-  String get position =>
-    getPropertyValue('position');
-
-  /** Sets the value of "position" */
-  void set position(var value) {
-    setProperty('position', value, '');
-  }
-
-  /** Gets the value of "quotes" */
-  String get quotes =>
-    getPropertyValue('quotes');
-
-  /** Sets the value of "quotes" */
-  void set quotes(var value) {
-    setProperty('quotes', value, '');
-  }
-
-  /** Gets the value of "region-break-after" */
-  String get regionBreakAfter =>
-    getPropertyValue('${_browserPrefix}region-break-after');
-
-  /** Sets the value of "region-break-after" */
-  void set regionBreakAfter(var value) {
-    setProperty('${_browserPrefix}region-break-after', value, '');
-  }
-
-  /** Gets the value of "region-break-before" */
-  String get regionBreakBefore =>
-    getPropertyValue('${_browserPrefix}region-break-before');
-
-  /** Sets the value of "region-break-before" */
-  void set regionBreakBefore(var value) {
-    setProperty('${_browserPrefix}region-break-before', value, '');
-  }
-
-  /** Gets the value of "region-break-inside" */
-  String get regionBreakInside =>
-    getPropertyValue('${_browserPrefix}region-break-inside');
-
-  /** Sets the value of "region-break-inside" */
-  void set regionBreakInside(var value) {
-    setProperty('${_browserPrefix}region-break-inside', value, '');
-  }
-
-  /** Gets the value of "region-overflow" */
-  String get regionOverflow =>
-    getPropertyValue('${_browserPrefix}region-overflow');
-
-  /** Sets the value of "region-overflow" */
-  void set regionOverflow(var value) {
-    setProperty('${_browserPrefix}region-overflow', value, '');
-  }
-
-  /** Gets the value of "resize" */
-  String get resize =>
-    getPropertyValue('resize');
-
-  /** Sets the value of "resize" */
-  void set resize(var value) {
-    setProperty('resize', value, '');
-  }
-
-  /** Gets the value of "right" */
-  String get right =>
-    getPropertyValue('right');
-
-  /** Sets the value of "right" */
-  void set right(var value) {
-    setProperty('right', value, '');
-  }
-
-  /** Gets the value of "rtl-ordering" */
-  String get rtlOrdering =>
-    getPropertyValue('${_browserPrefix}rtl-ordering');
-
-  /** Sets the value of "rtl-ordering" */
-  void set rtlOrdering(var value) {
-    setProperty('${_browserPrefix}rtl-ordering', value, '');
-  }
-
-  /** Gets the value of "size" */
-  String get size =>
-    getPropertyValue('size');
-
-  /** Sets the value of "size" */
-  void set size(var value) {
-    setProperty('size', value, '');
-  }
-
-  /** Gets the value of "speak" */
-  String get speak =>
-    getPropertyValue('speak');
-
-  /** Sets the value of "speak" */
-  void set speak(var value) {
-    setProperty('speak', value, '');
-  }
-
-  /** Gets the value of "src" */
-  String get src =>
-    getPropertyValue('src');
-
-  /** Sets the value of "src" */
-  void set src(var value) {
-    setProperty('src', value, '');
-  }
-
-  /** Gets the value of "table-layout" */
-  String get tableLayout =>
-    getPropertyValue('table-layout');
-
-  /** Sets the value of "table-layout" */
-  void set tableLayout(var value) {
-    setProperty('table-layout', value, '');
-  }
-
-  /** Gets the value of "tap-highlight-color" */
-  String get tapHighlightColor =>
-    getPropertyValue('${_browserPrefix}tap-highlight-color');
-
-  /** Sets the value of "tap-highlight-color" */
-  void set tapHighlightColor(var value) {
-    setProperty('${_browserPrefix}tap-highlight-color', value, '');
-  }
-
-  /** Gets the value of "text-align" */
-  String get textAlign =>
-    getPropertyValue('text-align');
-
-  /** Sets the value of "text-align" */
-  void set textAlign(var value) {
-    setProperty('text-align', value, '');
-  }
-
-  /** Gets the value of "text-combine" */
-  String get textCombine =>
-    getPropertyValue('${_browserPrefix}text-combine');
-
-  /** Sets the value of "text-combine" */
-  void set textCombine(var value) {
-    setProperty('${_browserPrefix}text-combine', value, '');
-  }
-
-  /** Gets the value of "text-decoration" */
-  String get textDecoration =>
-    getPropertyValue('text-decoration');
-
-  /** Sets the value of "text-decoration" */
-  void set textDecoration(var value) {
-    setProperty('text-decoration', value, '');
-  }
-
-  /** Gets the value of "text-decorations-in-effect" */
-  String get textDecorationsInEffect =>
-    getPropertyValue('${_browserPrefix}text-decorations-in-effect');
-
-  /** Sets the value of "text-decorations-in-effect" */
-  void set textDecorationsInEffect(var value) {
-    setProperty('${_browserPrefix}text-decorations-in-effect', value, '');
-  }
-
-  /** Gets the value of "text-emphasis" */
-  String get textEmphasis =>
-    getPropertyValue('${_browserPrefix}text-emphasis');
-
-  /** Sets the value of "text-emphasis" */
-  void set textEmphasis(var value) {
-    setProperty('${_browserPrefix}text-emphasis', value, '');
-  }
-
-  /** Gets the value of "text-emphasis-color" */
-  String get textEmphasisColor =>
-    getPropertyValue('${_browserPrefix}text-emphasis-color');
-
-  /** Sets the value of "text-emphasis-color" */
-  void set textEmphasisColor(var value) {
-    setProperty('${_browserPrefix}text-emphasis-color', value, '');
-  }
-
-  /** Gets the value of "text-emphasis-position" */
-  String get textEmphasisPosition =>
-    getPropertyValue('${_browserPrefix}text-emphasis-position');
-
-  /** Sets the value of "text-emphasis-position" */
-  void set textEmphasisPosition(var value) {
-    setProperty('${_browserPrefix}text-emphasis-position', value, '');
-  }
-
-  /** Gets the value of "text-emphasis-style" */
-  String get textEmphasisStyle =>
-    getPropertyValue('${_browserPrefix}text-emphasis-style');
-
-  /** Sets the value of "text-emphasis-style" */
-  void set textEmphasisStyle(var value) {
-    setProperty('${_browserPrefix}text-emphasis-style', value, '');
-  }
-
-  /** Gets the value of "text-fill-color" */
-  String get textFillColor =>
-    getPropertyValue('${_browserPrefix}text-fill-color');
-
-  /** Sets the value of "text-fill-color" */
-  void set textFillColor(var value) {
-    setProperty('${_browserPrefix}text-fill-color', value, '');
-  }
-
-  /** Gets the value of "text-indent" */
-  String get textIndent =>
-    getPropertyValue('text-indent');
-
-  /** Sets the value of "text-indent" */
-  void set textIndent(var value) {
-    setProperty('text-indent', value, '');
-  }
-
-  /** Gets the value of "text-line-through" */
-  String get textLineThrough =>
-    getPropertyValue('text-line-through');
-
-  /** Sets the value of "text-line-through" */
-  void set textLineThrough(var value) {
-    setProperty('text-line-through', value, '');
-  }
-
-  /** Gets the value of "text-line-through-color" */
-  String get textLineThroughColor =>
-    getPropertyValue('text-line-through-color');
-
-  /** Sets the value of "text-line-through-color" */
-  void set textLineThroughColor(var value) {
-    setProperty('text-line-through-color', value, '');
-  }
-
-  /** Gets the value of "text-line-through-mode" */
-  String get textLineThroughMode =>
-    getPropertyValue('text-line-through-mode');
-
-  /** Sets the value of "text-line-through-mode" */
-  void set textLineThroughMode(var value) {
-    setProperty('text-line-through-mode', value, '');
-  }
-
-  /** Gets the value of "text-line-through-style" */
-  String get textLineThroughStyle =>
-    getPropertyValue('text-line-through-style');
-
-  /** Sets the value of "text-line-through-style" */
-  void set textLineThroughStyle(var value) {
-    setProperty('text-line-through-style', value, '');
-  }
-
-  /** Gets the value of "text-line-through-width" */
-  String get textLineThroughWidth =>
-    getPropertyValue('text-line-through-width');
-
-  /** Sets the value of "text-line-through-width" */
-  void set textLineThroughWidth(var value) {
-    setProperty('text-line-through-width', value, '');
-  }
-
-  /** Gets the value of "text-orientation" */
-  String get textOrientation =>
-    getPropertyValue('${_browserPrefix}text-orientation');
-
-  /** Sets the value of "text-orientation" */
-  void set textOrientation(var value) {
-    setProperty('${_browserPrefix}text-orientation', value, '');
-  }
-
-  /** Gets the value of "text-overflow" */
-  String get textOverflow =>
-    getPropertyValue('text-overflow');
-
-  /** Sets the value of "text-overflow" */
-  void set textOverflow(var value) {
-    setProperty('text-overflow', value, '');
-  }
-
-  /** Gets the value of "text-overline" */
-  String get textOverline =>
-    getPropertyValue('text-overline');
-
-  /** Sets the value of "text-overline" */
-  void set textOverline(var value) {
-    setProperty('text-overline', value, '');
-  }
-
-  /** Gets the value of "text-overline-color" */
-  String get textOverlineColor =>
-    getPropertyValue('text-overline-color');
-
-  /** Sets the value of "text-overline-color" */
-  void set textOverlineColor(var value) {
-    setProperty('text-overline-color', value, '');
-  }
-
-  /** Gets the value of "text-overline-mode" */
-  String get textOverlineMode =>
-    getPropertyValue('text-overline-mode');
-
-  /** Sets the value of "text-overline-mode" */
-  void set textOverlineMode(var value) {
-    setProperty('text-overline-mode', value, '');
-  }
-
-  /** Gets the value of "text-overline-style" */
-  String get textOverlineStyle =>
-    getPropertyValue('text-overline-style');
-
-  /** Sets the value of "text-overline-style" */
-  void set textOverlineStyle(var value) {
-    setProperty('text-overline-style', value, '');
-  }
-
-  /** Gets the value of "text-overline-width" */
-  String get textOverlineWidth =>
-    getPropertyValue('text-overline-width');
-
-  /** Sets the value of "text-overline-width" */
-  void set textOverlineWidth(var value) {
-    setProperty('text-overline-width', value, '');
-  }
-
-  /** Gets the value of "text-rendering" */
-  String get textRendering =>
-    getPropertyValue('text-rendering');
-
-  /** Sets the value of "text-rendering" */
-  void set textRendering(var value) {
-    setProperty('text-rendering', value, '');
-  }
-
-  /** Gets the value of "text-security" */
-  String get textSecurity =>
-    getPropertyValue('${_browserPrefix}text-security');
-
-  /** Sets the value of "text-security" */
-  void set textSecurity(var value) {
-    setProperty('${_browserPrefix}text-security', value, '');
-  }
-
-  /** Gets the value of "text-shadow" */
-  String get textShadow =>
-    getPropertyValue('text-shadow');
-
-  /** Sets the value of "text-shadow" */
-  void set textShadow(var value) {
-    setProperty('text-shadow', value, '');
-  }
-
-  /** Gets the value of "text-size-adjust" */
-  String get textSizeAdjust =>
-    getPropertyValue('${_browserPrefix}text-size-adjust');
-
-  /** Sets the value of "text-size-adjust" */
-  void set textSizeAdjust(var value) {
-    setProperty('${_browserPrefix}text-size-adjust', value, '');
-  }
-
-  /** Gets the value of "text-stroke" */
-  String get textStroke =>
-    getPropertyValue('${_browserPrefix}text-stroke');
-
-  /** Sets the value of "text-stroke" */
-  void set textStroke(var value) {
-    setProperty('${_browserPrefix}text-stroke', value, '');
-  }
-
-  /** Gets the value of "text-stroke-color" */
-  String get textStrokeColor =>
-    getPropertyValue('${_browserPrefix}text-stroke-color');
-
-  /** Sets the value of "text-stroke-color" */
-  void set textStrokeColor(var value) {
-    setProperty('${_browserPrefix}text-stroke-color', value, '');
-  }
-
-  /** Gets the value of "text-stroke-width" */
-  String get textStrokeWidth =>
-    getPropertyValue('${_browserPrefix}text-stroke-width');
-
-  /** Sets the value of "text-stroke-width" */
-  void set textStrokeWidth(var value) {
-    setProperty('${_browserPrefix}text-stroke-width', value, '');
-  }
-
-  /** Gets the value of "text-transform" */
-  String get textTransform =>
-    getPropertyValue('text-transform');
-
-  /** Sets the value of "text-transform" */
-  void set textTransform(var value) {
-    setProperty('text-transform', value, '');
-  }
-
-  /** Gets the value of "text-underline" */
-  String get textUnderline =>
-    getPropertyValue('text-underline');
-
-  /** Sets the value of "text-underline" */
-  void set textUnderline(var value) {
-    setProperty('text-underline', value, '');
-  }
-
-  /** Gets the value of "text-underline-color" */
-  String get textUnderlineColor =>
-    getPropertyValue('text-underline-color');
-
-  /** Sets the value of "text-underline-color" */
-  void set textUnderlineColor(var value) {
-    setProperty('text-underline-color', value, '');
-  }
-
-  /** Gets the value of "text-underline-mode" */
-  String get textUnderlineMode =>
-    getPropertyValue('text-underline-mode');
-
-  /** Sets the value of "text-underline-mode" */
-  void set textUnderlineMode(var value) {
-    setProperty('text-underline-mode', value, '');
-  }
-
-  /** Gets the value of "text-underline-style" */
-  String get textUnderlineStyle =>
-    getPropertyValue('text-underline-style');
-
-  /** Sets the value of "text-underline-style" */
-  void set textUnderlineStyle(var value) {
-    setProperty('text-underline-style', value, '');
-  }
-
-  /** Gets the value of "text-underline-width" */
-  String get textUnderlineWidth =>
-    getPropertyValue('text-underline-width');
-
-  /** Sets the value of "text-underline-width" */
-  void set textUnderlineWidth(var value) {
-    setProperty('text-underline-width', value, '');
-  }
-
-  /** Gets the value of "top" */
-  String get top =>
-    getPropertyValue('top');
-
-  /** Sets the value of "top" */
-  void set top(var value) {
-    setProperty('top', value, '');
-  }
-
-  /** Gets the value of "transform" */
-  String get transform =>
-    getPropertyValue('${_browserPrefix}transform');
-
-  /** Sets the value of "transform" */
-  void set transform(var value) {
-    setProperty('${_browserPrefix}transform', value, '');
-  }
-
-  /** Gets the value of "transform-origin" */
-  String get transformOrigin =>
-    getPropertyValue('${_browserPrefix}transform-origin');
-
-  /** Sets the value of "transform-origin" */
-  void set transformOrigin(var value) {
-    setProperty('${_browserPrefix}transform-origin', value, '');
-  }
-
-  /** Gets the value of "transform-origin-x" */
-  String get transformOriginX =>
-    getPropertyValue('${_browserPrefix}transform-origin-x');
-
-  /** Sets the value of "transform-origin-x" */
-  void set transformOriginX(var value) {
-    setProperty('${_browserPrefix}transform-origin-x', value, '');
-  }
-
-  /** Gets the value of "transform-origin-y" */
-  String get transformOriginY =>
-    getPropertyValue('${_browserPrefix}transform-origin-y');
-
-  /** Sets the value of "transform-origin-y" */
-  void set transformOriginY(var value) {
-    setProperty('${_browserPrefix}transform-origin-y', value, '');
-  }
-
-  /** Gets the value of "transform-origin-z" */
-  String get transformOriginZ =>
-    getPropertyValue('${_browserPrefix}transform-origin-z');
-
-  /** Sets the value of "transform-origin-z" */
-  void set transformOriginZ(var value) {
-    setProperty('${_browserPrefix}transform-origin-z', value, '');
-  }
-
-  /** Gets the value of "transform-style" */
-  String get transformStyle =>
-    getPropertyValue('${_browserPrefix}transform-style');
-
-  /** Sets the value of "transform-style" */
-  void set transformStyle(var value) {
-    setProperty('${_browserPrefix}transform-style', value, '');
-  }
-
-  /** Gets the value of "transition" */
-  String get transition =>
-    getPropertyValue('${_browserPrefix}transition');
-
-  /** Sets the value of "transition" */
-  void set transition(var value) {
-    setProperty('${_browserPrefix}transition', value, '');
-  }
-
-  /** Gets the value of "transition-delay" */
-  String get transitionDelay =>
-    getPropertyValue('${_browserPrefix}transition-delay');
-
-  /** Sets the value of "transition-delay" */
-  void set transitionDelay(var value) {
-    setProperty('${_browserPrefix}transition-delay', value, '');
-  }
-
-  /** Gets the value of "transition-duration" */
-  String get transitionDuration =>
-    getPropertyValue('${_browserPrefix}transition-duration');
-
-  /** Sets the value of "transition-duration" */
-  void set transitionDuration(var value) {
-    setProperty('${_browserPrefix}transition-duration', value, '');
-  }
-
-  /** Gets the value of "transition-property" */
-  String get transitionProperty =>
-    getPropertyValue('${_browserPrefix}transition-property');
-
-  /** Sets the value of "transition-property" */
-  void set transitionProperty(var value) {
-    setProperty('${_browserPrefix}transition-property', value, '');
-  }
-
-  /** Gets the value of "transition-timing-function" */
-  String get transitionTimingFunction =>
-    getPropertyValue('${_browserPrefix}transition-timing-function');
-
-  /** Sets the value of "transition-timing-function" */
-  void set transitionTimingFunction(var value) {
-    setProperty('${_browserPrefix}transition-timing-function', value, '');
-  }
-
-  /** Gets the value of "unicode-bidi" */
-  String get unicodeBidi =>
-    getPropertyValue('unicode-bidi');
-
-  /** Sets the value of "unicode-bidi" */
-  void set unicodeBidi(var value) {
-    setProperty('unicode-bidi', value, '');
-  }
-
-  /** Gets the value of "unicode-range" */
-  String get unicodeRange =>
-    getPropertyValue('unicode-range');
-
-  /** Sets the value of "unicode-range" */
-  void set unicodeRange(var value) {
-    setProperty('unicode-range', value, '');
-  }
-
-  /** Gets the value of "user-drag" */
-  String get userDrag =>
-    getPropertyValue('${_browserPrefix}user-drag');
-
-  /** Sets the value of "user-drag" */
-  void set userDrag(var value) {
-    setProperty('${_browserPrefix}user-drag', value, '');
-  }
-
-  /** Gets the value of "user-modify" */
-  String get userModify =>
-    getPropertyValue('${_browserPrefix}user-modify');
-
-  /** Sets the value of "user-modify" */
-  void set userModify(var value) {
-    setProperty('${_browserPrefix}user-modify', value, '');
-  }
-
-  /** Gets the value of "user-select" */
-  String get userSelect =>
-    getPropertyValue('${_browserPrefix}user-select');
-
-  /** Sets the value of "user-select" */
-  void set userSelect(var value) {
-    setProperty('${_browserPrefix}user-select', value, '');
-  }
-
-  /** Gets the value of "vertical-align" */
-  String get verticalAlign =>
-    getPropertyValue('vertical-align');
-
-  /** Sets the value of "vertical-align" */
-  void set verticalAlign(var value) {
-    setProperty('vertical-align', value, '');
-  }
-
-  /** Gets the value of "visibility" */
-  String get visibility =>
-    getPropertyValue('visibility');
-
-  /** Sets the value of "visibility" */
-  void set visibility(var value) {
-    setProperty('visibility', value, '');
-  }
-
-  /** Gets the value of "white-space" */
-  String get whiteSpace =>
-    getPropertyValue('white-space');
-
-  /** Sets the value of "white-space" */
-  void set whiteSpace(var value) {
-    setProperty('white-space', value, '');
-  }
-
-  /** Gets the value of "widows" */
-  String get widows =>
-    getPropertyValue('widows');
-
-  /** Sets the value of "widows" */
-  void set widows(var value) {
-    setProperty('widows', value, '');
-  }
-
-  /** Gets the value of "width" */
-  String get width =>
-    getPropertyValue('width');
-
-  /** Sets the value of "width" */
-  void set width(var value) {
-    setProperty('width', value, '');
-  }
-
-  /** Gets the value of "word-break" */
-  String get wordBreak =>
-    getPropertyValue('word-break');
-
-  /** Sets the value of "word-break" */
-  void set wordBreak(var value) {
-    setProperty('word-break', value, '');
-  }
-
-  /** Gets the value of "word-spacing" */
-  String get wordSpacing =>
-    getPropertyValue('word-spacing');
-
-  /** Sets the value of "word-spacing" */
-  void set wordSpacing(var value) {
-    setProperty('word-spacing', value, '');
-  }
-
-  /** Gets the value of "word-wrap" */
-  String get wordWrap =>
-    getPropertyValue('word-wrap');
-
-  /** Sets the value of "word-wrap" */
-  void set wordWrap(var value) {
-    setProperty('word-wrap', value, '');
-  }
-
-  /** Gets the value of "wrap-shape" */
-  String get wrapShape =>
-    getPropertyValue('${_browserPrefix}wrap-shape');
-
-  /** Sets the value of "wrap-shape" */
-  void set wrapShape(var value) {
-    setProperty('${_browserPrefix}wrap-shape', value, '');
-  }
-
-  /** Gets the value of "writing-mode" */
-  String get writingMode =>
-    getPropertyValue('${_browserPrefix}writing-mode');
-
-  /** Sets the value of "writing-mode" */
-  void set writingMode(var value) {
-    setProperty('${_browserPrefix}writing-mode', value, '');
-  }
-
-  /** Gets the value of "z-index" */
-  String get zIndex =>
-    getPropertyValue('z-index');
-
-  /** Sets the value of "z-index" */
-  void set zIndex(var value) {
-    setProperty('z-index', value, '');
-  }
-
-  /** Gets the value of "zoom" */
-  String get zoom =>
-    getPropertyValue('zoom');
-
-  /** Sets the value of "zoom" */
-  void set zoom(var value) {
-    setProperty('zoom', value, '');
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CSSStyleRule
-abstract class CSSStyleRule implements CSSRule {
-
-  /** @domName CSSStyleRule.selectorText */
-  String selectorText;
-
-  /** @domName CSSStyleRule.style */
-  CSSStyleDeclaration get style;
-}
-
-class _CSSStyleRuleImpl extends _CSSRuleImpl implements CSSStyleRule native "*CSSStyleRule" {
-
-  String selectorText;
-
-  final _CSSStyleDeclarationImpl style;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CSSStyleSheet
-abstract class CSSStyleSheet implements StyleSheet {
-
-  /** @domName CSSStyleSheet.cssRules */
-  List<CSSRule> get cssRules;
-
-  /** @domName CSSStyleSheet.ownerRule */
-  CSSRule get ownerRule;
-
-  /** @domName CSSStyleSheet.rules */
-  List<CSSRule> get rules;
-
-  /** @domName CSSStyleSheet.addRule */
-  int addRule(String selector, String style, [int index]);
-
-  /** @domName CSSStyleSheet.deleteRule */
-  void deleteRule(int index);
-
-  /** @domName CSSStyleSheet.insertRule */
-  int insertRule(String rule, int index);
-
-  /** @domName CSSStyleSheet.removeRule */
-  void removeRule(int index);
-}
-
-class _CSSStyleSheetImpl extends _StyleSheetImpl implements CSSStyleSheet native "*CSSStyleSheet" {
-
-  final _CSSRuleListImpl cssRules;
-
-  final _CSSRuleImpl ownerRule;
-
-  final _CSSRuleListImpl rules;
-
-  int addRule(String selector, String style, [int index]) native;
-
-  void deleteRule(int index) native;
-
-  int insertRule(String rule, int index) native;
-
-  void removeRule(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebKitCSSTransformValue
-abstract class CSSTransformValue implements List<CSSValue> {
-
-  static const int CSS_MATRIX = 11;
-
-  static const int CSS_MATRIX3D = 21;
-
-  static const int CSS_PERSPECTIVE = 20;
-
-  static const int CSS_ROTATE = 4;
-
-  static const int CSS_ROTATE3D = 17;
-
-  static const int CSS_ROTATEX = 14;
-
-  static const int CSS_ROTATEY = 15;
-
-  static const int CSS_ROTATEZ = 16;
-
-  static const int CSS_SCALE = 5;
-
-  static const int CSS_SCALE3D = 19;
-
-  static const int CSS_SCALEX = 6;
-
-  static const int CSS_SCALEY = 7;
-
-  static const int CSS_SCALEZ = 18;
-
-  static const int CSS_SKEW = 8;
-
-  static const int CSS_SKEWX = 9;
-
-  static const int CSS_SKEWY = 10;
-
-  static const int CSS_TRANSLATE = 1;
-
-  static const int CSS_TRANSLATE3D = 13;
-
-  static const int CSS_TRANSLATEX = 2;
-
-  static const int CSS_TRANSLATEY = 3;
-
-  static const int CSS_TRANSLATEZ = 12;
-
-  /** @domName WebKitCSSTransformValue.operationType */
-  int get operationType;
-}
-
-class _CSSTransformValueImpl extends _CSSValueListImpl implements CSSTransformValue native "*WebKitCSSTransformValue" {
-
-  final int operationType;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CSSUnknownRule
-abstract class CSSUnknownRule implements CSSRule {
-}
-
-class _CSSUnknownRuleImpl extends _CSSRuleImpl implements CSSUnknownRule native "*CSSUnknownRule" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CSSValue
-abstract class CSSValue {
-
-  static const int CSS_CUSTOM = 3;
-
-  static const int CSS_INHERIT = 0;
-
-  static const int CSS_PRIMITIVE_VALUE = 1;
-
-  static const int CSS_VALUE_LIST = 2;
-
-  /** @domName CSSValue.cssText */
-  String cssText;
-
-  /** @domName CSSValue.cssValueType */
-  int get cssValueType;
-}
-
-class _CSSValueImpl implements CSSValue native "*CSSValue" {
-
-  String cssText;
-
-  final int cssValueType;
-}
-
-class _CSSValueListImpl extends _CSSValueImpl implements List<CSSValue>, JavaScriptIndexingBehavior native "*CSSValueList" {
-
-  final int length;
-
-  _CSSValueImpl operator[](int index) => JS("_CSSValueImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _CSSValueImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<CSSValue> mixins.
-  // CSSValue is the element type.
-
-  // From Iterable<CSSValue>:
-
-  Iterator<CSSValue> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<CSSValue>(this);
-  }
-
-  // From Collection<CSSValue>:
-
-  void add(CSSValue value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(CSSValue value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<CSSValue> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(CSSValue element) => _Collections.contains(this, element);
-
-  void forEach(void f(CSSValue element)) => _Collections.forEach(this, f);
-
-  Collection map(f(CSSValue element)) => _Collections.map(this, [], f);
-
-  Collection<CSSValue> filter(bool f(CSSValue element)) =>
-     _Collections.filter(this, <CSSValue>[], f);
-
-  bool every(bool f(CSSValue element)) => _Collections.every(this, f);
-
-  bool some(bool f(CSSValue element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<CSSValue>:
-
-  void sort([Comparator<CSSValue> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(CSSValue element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(CSSValue element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  CSSValue get last => this[length - 1];
-
-  CSSValue removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<CSSValue> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [CSSValue initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<CSSValue> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <CSSValue>[]);
-
-  // -- end List<CSSValue> mixins.
-
-  _CSSValueImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName HTMLCanvasElement
-abstract class CanvasElement implements Element {
-
-  factory CanvasElement({int width, int height}) {
-    if (!?width) {
-      return _Elements.createCanvasElement();
-    }
-    if (!?height) {
-      return _Elements.createCanvasElement(width);
-    }
-    return _Elements.createCanvasElement(width, height);
-  }
-
-  /** @domName HTMLCanvasElement.height */
-  int height;
-
-  /** @domName HTMLCanvasElement.width */
-  int width;
-
-  /** @domName HTMLCanvasElement.getContext */
-  Object getContext(String contextId);
-
-  /** @domName HTMLCanvasElement.toDataURL */
-  String toDataURL(String type, [num quality]);
-
-  final CanvasRenderingContext2D context2d;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _CanvasElementImpl extends _ElementImpl implements CanvasElement native "*HTMLCanvasElement" {
-
-  int height;
-
-  int width;
-
-  Object getContext(String contextId) native;
-
-  String toDataURL(String type, [num quality]) native;
-
-
-  _CanvasRenderingContext2DImpl get context2d => getContext('2d');
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CanvasGradient
-abstract class CanvasGradient {
-
-  /** @domName CanvasGradient.addColorStop */
-  void addColorStop(num offset, String color);
-}
-
-class _CanvasGradientImpl implements CanvasGradient native "*CanvasGradient" {
-
-  void addColorStop(num offset, String color) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CanvasPattern
-abstract class CanvasPattern {
-}
-
-class _CanvasPatternImpl implements CanvasPattern native "*CanvasPattern" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CanvasRenderingContext
-abstract class CanvasRenderingContext {
-
-  /** @domName CanvasRenderingContext.canvas */
-  CanvasElement get canvas;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName CanvasRenderingContext2D
-abstract class CanvasRenderingContext2D implements CanvasRenderingContext {
-
-  /** @domName CanvasRenderingContext2D.fillStyle */
-  dynamic fillStyle;
-
-  /** @domName CanvasRenderingContext2D.font */
-  String font;
-
-  /** @domName CanvasRenderingContext2D.globalAlpha */
-  num globalAlpha;
-
-  /** @domName CanvasRenderingContext2D.globalCompositeOperation */
-  String globalCompositeOperation;
-
-  /** @domName CanvasRenderingContext2D.lineCap */
-  String lineCap;
-
-  /** @domName CanvasRenderingContext2D.lineDashOffset */
-  num lineDashOffset;
-
-  /** @domName CanvasRenderingContext2D.lineJoin */
-  String lineJoin;
-
-  /** @domName CanvasRenderingContext2D.lineWidth */
-  num lineWidth;
-
-  /** @domName CanvasRenderingContext2D.miterLimit */
-  num miterLimit;
-
-  /** @domName CanvasRenderingContext2D.shadowBlur */
-  num shadowBlur;
-
-  /** @domName CanvasRenderingContext2D.shadowColor */
-  String shadowColor;
-
-  /** @domName CanvasRenderingContext2D.shadowOffsetX */
-  num shadowOffsetX;
-
-  /** @domName CanvasRenderingContext2D.shadowOffsetY */
-  num shadowOffsetY;
-
-  /** @domName CanvasRenderingContext2D.strokeStyle */
-  dynamic strokeStyle;
-
-  /** @domName CanvasRenderingContext2D.textAlign */
-  String textAlign;
-
-  /** @domName CanvasRenderingContext2D.textBaseline */
-  String textBaseline;
-
-  /** @domName CanvasRenderingContext2D.webkitBackingStorePixelRatio */
-  num get webkitBackingStorePixelRatio;
-
-  /** @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled */
-  bool webkitImageSmoothingEnabled;
-
-  /** @domName CanvasRenderingContext2D.webkitLineDash */
-  List webkitLineDash;
-
-  /** @domName CanvasRenderingContext2D.webkitLineDashOffset */
-  num webkitLineDashOffset;
-
-  /** @domName CanvasRenderingContext2D.arc */
-  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise);
-
-  /** @domName CanvasRenderingContext2D.arcTo */
-  void arcTo(num x1, num y1, num x2, num y2, num radius);
-
-  /** @domName CanvasRenderingContext2D.beginPath */
-  void beginPath();
-
-  /** @domName CanvasRenderingContext2D.bezierCurveTo */
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y);
-
-  /** @domName CanvasRenderingContext2D.clearRect */
-  void clearRect(num x, num y, num width, num height);
-
-  /** @domName CanvasRenderingContext2D.clearShadow */
-  void clearShadow();
-
-  /** @domName CanvasRenderingContext2D.clip */
-  void clip();
-
-  /** @domName CanvasRenderingContext2D.closePath */
-  void closePath();
-
-  /** @domName CanvasRenderingContext2D.createImageData */
-  ImageData createImageData(imagedata_OR_sw, [num sh]);
-
-  /** @domName CanvasRenderingContext2D.createLinearGradient */
-  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1);
-
-  /** @domName CanvasRenderingContext2D.createPattern */
-  CanvasPattern createPattern(canvas_OR_image, String repetitionType);
-
-  /** @domName CanvasRenderingContext2D.createRadialGradient */
-  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1);
-
-  /** @domName CanvasRenderingContext2D.drawImage */
-  void drawImage(canvas_OR_image_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]);
-
-  /** @domName CanvasRenderingContext2D.drawImageFromRect */
-  void drawImageFromRect(ImageElement image, [num sx, num sy, num sw, num sh, num dx, num dy, num dw, num dh, String compositeOperation]);
-
-  /** @domName CanvasRenderingContext2D.fill */
-  void fill();
-
-  /** @domName CanvasRenderingContext2D.fillRect */
-  void fillRect(num x, num y, num width, num height);
-
-  /** @domName CanvasRenderingContext2D.fillText */
-  void fillText(String text, num x, num y, [num maxWidth]);
-
-  /** @domName CanvasRenderingContext2D.getImageData */
-  ImageData getImageData(num sx, num sy, num sw, num sh);
-
-  /** @domName CanvasRenderingContext2D.getLineDash */
-  List<num> getLineDash();
-
-  /** @domName CanvasRenderingContext2D.isPointInPath */
-  bool isPointInPath(num x, num y);
-
-  /** @domName CanvasRenderingContext2D.lineTo */
-  void lineTo(num x, num y);
-
-  /** @domName CanvasRenderingContext2D.measureText */
-  TextMetrics measureText(String text);
-
-  /** @domName CanvasRenderingContext2D.moveTo */
-  void moveTo(num x, num y);
-
-  /** @domName CanvasRenderingContext2D.putImageData */
-  void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]);
-
-  /** @domName CanvasRenderingContext2D.quadraticCurveTo */
-  void quadraticCurveTo(num cpx, num cpy, num x, num y);
-
-  /** @domName CanvasRenderingContext2D.rect */
-  void rect(num x, num y, num width, num height);
-
-  /** @domName CanvasRenderingContext2D.restore */
-  void restore();
-
-  /** @domName CanvasRenderingContext2D.rotate */
-  void rotate(num angle);
-
-  /** @domName CanvasRenderingContext2D.save */
-  void save();
-
-  /** @domName CanvasRenderingContext2D.scale */
-  void scale(num sx, num sy);
-
-  /** @domName CanvasRenderingContext2D.setAlpha */
-  void setAlpha(num alpha);
-
-  /** @domName CanvasRenderingContext2D.setCompositeOperation */
-  void setCompositeOperation(String compositeOperation);
-
-  /** @domName CanvasRenderingContext2D.setLineCap */
-  void setLineCap(String cap);
-
-  /** @domName CanvasRenderingContext2D.setLineDash */
-  void setLineDash(List<num> dash);
-
-  /** @domName CanvasRenderingContext2D.setLineJoin */
-  void setLineJoin(String join);
-
-  /** @domName CanvasRenderingContext2D.setLineWidth */
-  void setLineWidth(num width);
-
-  /** @domName CanvasRenderingContext2D.setMiterLimit */
-  void setMiterLimit(num limit);
-
-  /** @domName CanvasRenderingContext2D.setShadow */
-  void setShadow(num width, num height, num blur, [c_OR_color_OR_grayLevel_OR_r, num alpha_OR_g_OR_m, num b_OR_y, num a_OR_k, num a]);
-
-  /** @domName CanvasRenderingContext2D.setTransform */
-  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy);
-
-  /** @domName CanvasRenderingContext2D.stroke */
-  void stroke();
-
-  /** @domName CanvasRenderingContext2D.strokeRect */
-  void strokeRect(num x, num y, num width, num height, [num lineWidth]);
-
-  /** @domName CanvasRenderingContext2D.strokeText */
-  void strokeText(String text, num x, num y, [num maxWidth]);
-
-  /** @domName CanvasRenderingContext2D.transform */
-  void transform(num m11, num m12, num m21, num m22, num dx, num dy);
-
-  /** @domName CanvasRenderingContext2D.translate */
-  void translate(num tx, num ty);
-
-  /** @domName CanvasRenderingContext2D.webkitGetImageDataHD */
-  ImageData webkitGetImageDataHD(num sx, num sy, num sw, num sh);
-
-  /** @domName CanvasRenderingContext2D.webkitPutImageDataHD */
-  void webkitPutImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]);
-
-
-  /**
-   * Sets the color used inside shapes.
-   * [r], [g], [b] are 0-255, [a] is 0-1.
-   */
-  void setFillColorRgb(int r, int g, int b, [num a]);
-
-  /**
-   * Sets the color used inside shapes.
-   * [h] is in degrees, 0-360.
-   * [s], [l] are in percent, 0-100.
-   * [a] is 0-1.
-   */
-  void setFillColorHsl(int h, num s, num l, [num a]);
-
-  /**
-   * Sets the color used for stroking shapes.
-   * [r], [g], [b] are 0-255, [a] is 0-1.
-   */
-  void setStrokeColorRgb(int r, int g, int b, [num a]);
-
-  /**
-   * Sets the color used for stroking shapes.
-   * [h] is in degrees, 0-360.
-   * [s], [l] are in percent, 0-100.
-   * [a] is 0-1.
-   */
-  void setStrokeColorHsl(int h, num s, num l, [num a]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _CanvasRenderingContext2DImpl extends _CanvasRenderingContextImpl implements CanvasRenderingContext2D native "*CanvasRenderingContext2D" {
-
-  dynamic fillStyle;
-
-  String font;
-
-  num globalAlpha;
-
-  String globalCompositeOperation;
-
-  String lineCap;
-
-  num lineDashOffset;
-
-  String lineJoin;
-
-  num lineWidth;
-
-  num miterLimit;
-
-  num shadowBlur;
-
-  String shadowColor;
-
-  num shadowOffsetX;
-
-  num shadowOffsetY;
-
-  dynamic strokeStyle;
-
-  String textAlign;
-
-  String textBaseline;
-
-  final num webkitBackingStorePixelRatio;
-
-  bool webkitImageSmoothingEnabled;
-
-  List webkitLineDash;
-
-  num webkitLineDashOffset;
-
-  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native;
-
-  void arcTo(num x1, num y1, num x2, num y2, num radius) native;
-
-  void beginPath() native;
-
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native;
-
-  void clearRect(num x, num y, num width, num height) native;
-
-  void clearShadow() native;
-
-  void clip() native;
-
-  void closePath() native;
-
-  ImageData createImageData(imagedata_OR_sw, [sh]) {
-    if ((imagedata_OR_sw is ImageData || imagedata_OR_sw == null) &&
-        !?sh) {
-      var imagedata_1 = _convertDartToNative_ImageData(imagedata_OR_sw);
-      return _convertNativeToDart_ImageData(_createImageData_1(imagedata_1));
-    }
-    if ((imagedata_OR_sw is num || imagedata_OR_sw == null) &&
-        (sh is num || sh == null)) {
-      return _convertNativeToDart_ImageData(_createImageData_2(imagedata_OR_sw, sh));
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  _createImageData_1(imagedata) native "createImageData";
-  _createImageData_2(num sw, num sh) native "createImageData";
-
-  _CanvasGradientImpl createLinearGradient(num x0, num y0, num x1, num y1) native;
-
-  _CanvasPatternImpl createPattern(canvas_OR_image, String repetitionType) native;
-
-  _CanvasGradientImpl createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native;
-
-  void drawImage(canvas_OR_image_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) native;
-
-  void drawImageFromRect(_ImageElementImpl image, [num sx, num sy, num sw, num sh, num dx, num dy, num dw, num dh, String compositeOperation]) native;
-
-  void fill() native;
-
-  void fillRect(num x, num y, num width, num height) native;
-
-  void fillText(String text, num x, num y, [num maxWidth]) native;
-
-  ImageData getImageData(num sx, num sy, num sw, num sh) {
-    return _convertNativeToDart_ImageData(_getImageData_1(sx, sy, sw, sh));
-  }
-  _getImageData_1(sx, sy, sw, sh) native "getImageData";
-
-  List<num> getLineDash() native;
-
-  bool isPointInPath(num x, num y) native;
-
-  void lineTo(num x, num y) native;
-
-  _TextMetricsImpl measureText(String text) native;
-
-  void moveTo(num x, num y) native;
-
-  void putImageData(ImageData imagedata, num dx, num dy, [dirtyX, dirtyY, dirtyWidth, dirtyHeight]) {
-    if (!?dirtyX &&
-        !?dirtyY &&
-        !?dirtyWidth &&
-        !?dirtyHeight) {
-      var imagedata_1 = _convertDartToNative_ImageData(imagedata);
-      _putImageData_1(imagedata_1, dx, dy);
-      return;
-    }
-    if ((dirtyX is num || dirtyX == null) &&
-        (dirtyY is num || dirtyY == null) &&
-        (dirtyWidth is num || dirtyWidth == null) &&
-        (dirtyHeight is num || dirtyHeight == null)) {
-      var imagedata_2 = _convertDartToNative_ImageData(imagedata);
-      _putImageData_2(imagedata_2, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
-      return;
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  void _putImageData_1(imagedata, dx, dy) native "putImageData";
-  void _putImageData_2(imagedata, dx, dy, num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight) native "putImageData";
-
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
-
-  void rect(num x, num y, num width, num height) native;
-
-  void restore() native;
-
-  void rotate(num angle) native;
-
-  void save() native;
-
-  void scale(num sx, num sy) native;
-
-  void setAlpha(num alpha) native;
-
-  void setCompositeOperation(String compositeOperation) native;
-
-  void setLineCap(String cap) native;
-
-  void setLineDash(List<num> dash) native;
-
-  void setLineJoin(String join) native;
-
-  void setLineWidth(num width) native;
-
-  void setMiterLimit(num limit) native;
-
-  void setShadow(num width, num height, num blur, [c_OR_color_OR_grayLevel_OR_r, num alpha_OR_g_OR_m, num b_OR_y, num a_OR_k, num a]) native;
-
-  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) native;
-
-  void stroke() native;
-
-  void strokeRect(num x, num y, num width, num height, [num lineWidth]) native;
-
-  void strokeText(String text, num x, num y, [num maxWidth]) native;
-
-  void transform(num m11, num m12, num m21, num m22, num dx, num dy) native;
-
-  void translate(num tx, num ty) native;
-
-  ImageData webkitGetImageDataHD(num sx, num sy, num sw, num sh) {
-    return _convertNativeToDart_ImageData(_webkitGetImageDataHD_1(sx, sy, sw, sh));
-  }
-  _webkitGetImageDataHD_1(sx, sy, sw, sh) native "webkitGetImageDataHD";
-
-  void webkitPutImageDataHD(ImageData imagedata, num dx, num dy, [dirtyX, dirtyY, dirtyWidth, dirtyHeight]) {
-    if (!?dirtyX &&
-        !?dirtyY &&
-        !?dirtyWidth &&
-        !?dirtyHeight) {
-      var imagedata_1 = _convertDartToNative_ImageData(imagedata);
-      _webkitPutImageDataHD_1(imagedata_1, dx, dy);
-      return;
-    }
-    if ((dirtyX is num || dirtyX == null) &&
-        (dirtyY is num || dirtyY == null) &&
-        (dirtyWidth is num || dirtyWidth == null) &&
-        (dirtyHeight is num || dirtyHeight == null)) {
-      var imagedata_2 = _convertDartToNative_ImageData(imagedata);
-      _webkitPutImageDataHD_2(imagedata_2, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
-      return;
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  void _webkitPutImageDataHD_1(imagedata, dx, dy) native "webkitPutImageDataHD";
-  void _webkitPutImageDataHD_2(imagedata, dx, dy, num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight) native "webkitPutImageDataHD";
-
-
-  void setFillColorRgb(int r, int g, int b, [num a = 1]) {
-    this.fillStyle = 'rgba($r, $g, $b, $a)';
-  }
-
-  void setFillColorHsl(int h, num s, num l, [num a = 1]) {
-    this.fillStyle = 'hsla($h, $s%, $l%, $a)';
-  }
-
-  void setStrokeColorRgb(int r, int g, int b, [num a = 1]) {
-    this.strokeStyle = 'rgba($r, $g, $b, $a)';
-  }
-
-  void setStrokeColorHsl(int h, num s, num l, [num a = 1]) {
-    this.strokeStyle = 'hsla($h, $s%, $l%, $a)';
-  }
-}
-
-class _CanvasRenderingContextImpl implements CanvasRenderingContext native "*CanvasRenderingContext" {
-
-  final _CanvasElementImpl canvas;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ChannelMergerNode
-abstract class ChannelMergerNode implements AudioNode {
-}
-
-class _ChannelMergerNodeImpl extends _AudioNodeImpl implements ChannelMergerNode native "*ChannelMergerNode" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ChannelSplitterNode
-abstract class ChannelSplitterNode implements AudioNode {
-}
-
-class _ChannelSplitterNodeImpl extends _AudioNodeImpl implements ChannelSplitterNode native "*ChannelSplitterNode" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CharacterData
-abstract class CharacterData implements Node {
-
-  /** @domName CharacterData.data */
-  String data;
-
-  /** @domName CharacterData.length */
-  int get length;
-
-  /** @domName CharacterData.appendData */
-  void appendData(String data);
-
-  /** @domName CharacterData.deleteData */
-  void deleteData(int offset, int length);
-
-  /** @domName CharacterData.insertData */
-  void insertData(int offset, String data);
-
-  /** @domName CharacterData.remove */
-  void remove();
-
-  /** @domName CharacterData.replaceData */
-  void replaceData(int offset, int length, String data);
-
-  /** @domName CharacterData.substringData */
-  String substringData(int offset, int length);
-}
-
-class _CharacterDataImpl extends _NodeImpl implements CharacterData native "*CharacterData" {
-
-  String data;
-
-  final int length;
-
-  void appendData(String data) native;
-
-  void deleteData(int offset, int length) native;
-
-  void insertData(int offset, String data) native;
-
-  void remove() native;
-
-  void replaceData(int offset, int length, String data) native;
-
-  String substringData(int offset, int length) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ClientRect
-abstract class ClientRect {
-
-  /** @domName ClientRect.bottom */
-  num get bottom;
-
-  /** @domName ClientRect.height */
-  num get height;
-
-  /** @domName ClientRect.left */
-  num get left;
-
-  /** @domName ClientRect.right */
-  num get right;
-
-  /** @domName ClientRect.top */
-  num get top;
-
-  /** @domName ClientRect.width */
-  num get width;
-}
-
-class _ClientRectImpl implements ClientRect native "*ClientRect" {
-
-  final num bottom;
-
-  final num height;
-
-  final num left;
-
-  final num right;
-
-  final num top;
-
-  final num width;
-}
-
-class _ClientRectListImpl implements List<ClientRect>, JavaScriptIndexingBehavior native "*ClientRectList" {
-
-  final int length;
-
-  _ClientRectImpl operator[](int index) => JS("_ClientRectImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _ClientRectImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<ClientRect> mixins.
-  // ClientRect is the element type.
-
-  // From Iterable<ClientRect>:
-
-  Iterator<ClientRect> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<ClientRect>(this);
-  }
-
-  // From Collection<ClientRect>:
-
-  void add(ClientRect value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(ClientRect value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<ClientRect> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(ClientRect element) => _Collections.contains(this, element);
-
-  void forEach(void f(ClientRect element)) => _Collections.forEach(this, f);
-
-  Collection map(f(ClientRect element)) => _Collections.map(this, [], f);
-
-  Collection<ClientRect> filter(bool f(ClientRect element)) =>
-     _Collections.filter(this, <ClientRect>[], f);
-
-  bool every(bool f(ClientRect element)) => _Collections.every(this, f);
-
-  bool some(bool f(ClientRect element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<ClientRect>:
-
-  void sort([Comparator<ClientRect> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(ClientRect element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(ClientRect element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  ClientRect get last => this[length - 1];
-
-  ClientRect removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<ClientRect> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [ClientRect initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<ClientRect> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <ClientRect>[]);
-
-  // -- end List<ClientRect> mixins.
-
-  _ClientRectImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Clipboard
-abstract class Clipboard {
-
-  /** @domName Clipboard.dropEffect */
-  String dropEffect;
-
-  /** @domName Clipboard.effectAllowed */
-  String effectAllowed;
-
-  /** @domName Clipboard.files */
-  List<File> get files;
-
-  /** @domName Clipboard.items */
-  DataTransferItemList get items;
-
-  /** @domName Clipboard.types */
-  List get types;
-
-  /** @domName Clipboard.clearData */
-  void clearData([String type]);
-
-  /** @domName Clipboard.getData */
-  String getData(String type);
-
-  /** @domName Clipboard.setData */
-  bool setData(String type, String data);
-
-  /** @domName Clipboard.setDragImage */
-  void setDragImage(ImageElement image, int x, int y);
-}
-
-class _ClipboardImpl implements Clipboard native "*Clipboard" {
-
-  String dropEffect;
-
-  String effectAllowed;
-
-  final _FileListImpl files;
-
-  final _DataTransferItemListImpl items;
-
-  final List types;
-
-  void clearData([String type]) native;
-
-  String getData(String type) native;
-
-  bool setData(String type, String data) native;
-
-  void setDragImage(_ImageElementImpl image, int x, int y) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CloseEvent
-abstract class CloseEvent implements Event {
-
-  /** @domName CloseEvent.code */
-  int get code;
-
-  /** @domName CloseEvent.reason */
-  String get reason;
-
-  /** @domName CloseEvent.wasClean */
-  bool get wasClean;
-}
-
-class _CloseEventImpl extends _EventImpl implements CloseEvent native "*CloseEvent" {
-
-  final int code;
-
-  final String reason;
-
-  final bool wasClean;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Comment
-abstract class Comment implements CharacterData {
-}
-
-class _CommentImpl extends _CharacterDataImpl implements Comment native "*Comment" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName CompositionEvent
-abstract class CompositionEvent implements UIEvent {
-
-  /** @domName CompositionEvent.data */
-  String get data;
-
-  /** @domName CompositionEvent.initCompositionEvent */
-  void initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg);
-}
-
-class _CompositionEventImpl extends _UIEventImpl implements CompositionEvent native "*CompositionEvent" {
-
-  final String data;
-
-  void initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, _LocalWindowImpl viewArg, String dataArg) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Console
-abstract class Console {
-
-  /** @domName Console.memory */
-  MemoryInfo get memory;
-
-  /** @domName Console.profiles */
-  List<ScriptProfile> get profiles;
-
-  /** @domName Console.assertCondition */
-  void assertCondition(bool condition, Object arg);
-
-  /** @domName Console.count */
-  void count(Object arg);
-
-  /** @domName Console.debug */
-  void debug(Object arg);
-
-  /** @domName Console.dir */
-  void dir(Object arg);
-
-  /** @domName Console.dirxml */
-  void dirxml(Object arg);
-
-  /** @domName Console.error */
-  void error(Object arg);
-
-  /** @domName Console.group */
-  void group(Object arg);
-
-  /** @domName Console.groupCollapsed */
-  void groupCollapsed(Object arg);
-
-  /** @domName Console.groupEnd */
-  void groupEnd();
-
-  /** @domName Console.info */
-  void info(Object arg);
-
-  /** @domName Console.log */
-  void log(Object arg);
-
-  /** @domName Console.markTimeline */
-  void markTimeline(Object arg);
-
-  /** @domName Console.profile */
-  void profile(String title);
-
-  /** @domName Console.profileEnd */
-  void profileEnd(String title);
-
-  /** @domName Console.time */
-  void time(String title);
-
-  /** @domName Console.timeEnd */
-  void timeEnd(String title, Object arg);
-
-  /** @domName Console.timeStamp */
-  void timeStamp(Object arg);
-
-  /** @domName Console.trace */
-  void trace(Object arg);
-
-  /** @domName Console.warn */
-  void warn(Object arg);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _ConsoleImpl
-    // Console is sometimes a singleton bag-of-properties without a prototype.
-    implements Console
-    native "=(typeof console == 'undefined' ? {} : console)" {
-
-  final _MemoryInfoImpl memory;
-
-  final List<ScriptProfile> profiles;
-
-  void assertCondition(bool condition, Object arg) native;
-
-  void count(Object arg) native;
-
-  void debug(Object arg) native;
-
-  void dir(Object arg) native;
-
-  void dirxml(Object arg) native;
-
-  void error(Object arg) native;
-
-  void group(Object arg) native;
-
-  void groupCollapsed(Object arg) native;
-
-  void groupEnd() native;
-
-  void info(Object arg) native;
-
-  void log(Object arg) native;
-
-  void markTimeline(Object arg) native;
-
-  void profile(String title) native;
-
-  void profileEnd(String title) native;
-
-  void time(String title) native;
-
-  void timeEnd(String title, Object arg) native;
-
-  void timeStamp(Object arg) native;
-
-  void trace(Object arg) native;
-
-  void warn(Object arg) native;
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLContentElement
-abstract class ContentElement implements Element {
-
-  factory ContentElement() => _Elements.createContentElement();
-
-  /** @domName HTMLContentElement.resetStyleInheritance */
-  bool resetStyleInheritance;
-
-  /** @domName HTMLContentElement.select */
-  String select;
-
-  /** @domName HTMLContentElement.getDistributedNodes */
-  List<Node> getDistributedNodes();
-}
-
-class _ContentElementImpl extends _ElementImpl implements ContentElement native "*HTMLContentElement" {
-
-  bool resetStyleInheritance;
-
-  String select;
-
-  List<Node> getDistributedNodes() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ConvolverNode
-abstract class ConvolverNode implements AudioNode {
-
-  /** @domName ConvolverNode.buffer */
-  AudioBuffer buffer;
-
-  /** @domName ConvolverNode.normalize */
-  bool normalize;
-}
-
-class _ConvolverNodeImpl extends _AudioNodeImpl implements ConvolverNode native "*ConvolverNode" {
-
-  _AudioBufferImpl buffer;
-
-  bool normalize;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Coordinates
-abstract class Coordinates {
-
-  /** @domName Coordinates.accuracy */
-  num get accuracy;
-
-  /** @domName Coordinates.altitude */
-  num get altitude;
-
-  /** @domName Coordinates.altitudeAccuracy */
-  num get altitudeAccuracy;
-
-  /** @domName Coordinates.heading */
-  num get heading;
-
-  /** @domName Coordinates.latitude */
-  num get latitude;
-
-  /** @domName Coordinates.longitude */
-  num get longitude;
-
-  /** @domName Coordinates.speed */
-  num get speed;
-}
-
-class _CoordinatesImpl implements Coordinates native "*Coordinates" {
-
-  final num accuracy;
-
-  final num altitude;
-
-  final num altitudeAccuracy;
-
-  final num heading;
-
-  final num latitude;
-
-  final num longitude;
-
-  final num speed;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Counter
-abstract class Counter {
-
-  /** @domName Counter.identifier */
-  String get identifier;
-
-  /** @domName Counter.listStyle */
-  String get listStyle;
-
-  /** @domName Counter.separator */
-  String get separator;
-}
-
-class _CounterImpl implements Counter native "*Counter" {
-
-  final String identifier;
-
-  final String listStyle;
-
-  final String separator;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Crypto
-abstract class Crypto {
-
-  /** @domName Crypto.getRandomValues */
-  void getRandomValues(ArrayBufferView array);
-}
-
-class _CryptoImpl implements Crypto native "*Crypto" {
-
-  void getRandomValues(_ArrayBufferViewImpl array) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName CustomEvent
-abstract class CustomEvent implements Event {
-
-  factory CustomEvent(String type, [bool canBubble = true, bool cancelable = true,
-      Object detail = null]) => _CustomEventFactoryProvider.createCustomEvent(type, canBubble,
-      cancelable, detail);
-
-
-  /** @domName CustomEvent.detail */
-  Object get detail;
-
-  /** @domName CustomEvent.initCustomEvent */
-  void $dom_initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg);
-}
-
-class _CustomEventImpl extends _EventImpl implements CustomEvent native "*CustomEvent" {
-
-  final Object detail;
-
-  void $dom_initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) native "initCustomEvent";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLDListElement
-abstract class DListElement implements Element {
-
-  factory DListElement() => _Elements.createDListElement();
-
-  /** @domName HTMLDListElement.compact */
-  bool compact;
-}
-
-class _DListElementImpl extends _ElementImpl implements DListElement native "*HTMLDListElement" {
-
-  bool compact;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DOMApplicationCache
-abstract class DOMApplicationCache implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  DOMApplicationCacheEvents get on;
-
-  static const int CHECKING = 2;
-
-  static const int DOWNLOADING = 3;
-
-  static const int IDLE = 1;
-
-  static const int OBSOLETE = 5;
-
-  static const int UNCACHED = 0;
-
-  static const int UPDATEREADY = 4;
-
-  /** @domName DOMApplicationCache.status */
-  int get status;
-
-  /** @domName DOMApplicationCache.abort */
-  void abort();
-
-  /** @domName DOMApplicationCache.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName DOMApplicationCache.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName DOMApplicationCache.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName DOMApplicationCache.swapCache */
-  void swapCache();
-
-  /** @domName DOMApplicationCache.update */
-  void update();
-}
-
-abstract class DOMApplicationCacheEvents implements Events {
-
-  EventListenerList get cached;
-
-  EventListenerList get checking;
-
-  EventListenerList get downloading;
-
-  EventListenerList get error;
-
-  EventListenerList get noUpdate;
-
-  EventListenerList get obsolete;
-
-  EventListenerList get progress;
-
-  EventListenerList get updateReady;
-}
-
-class _DOMApplicationCacheImpl extends _EventTargetImpl implements DOMApplicationCache native "*DOMApplicationCache" {
-
-  _DOMApplicationCacheEventsImpl get on =>
-    new _DOMApplicationCacheEventsImpl(this);
-
-  final int status;
-
-  void abort() native;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  void swapCache() native;
-
-  void update() native;
-}
-
-class _DOMApplicationCacheEventsImpl extends _EventsImpl implements DOMApplicationCacheEvents {
-  _DOMApplicationCacheEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get cached => this['cached'];
-
-  EventListenerList get checking => this['checking'];
-
-  EventListenerList get downloading => this['downloading'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get noUpdate => this['noupdate'];
-
-  EventListenerList get obsolete => this['obsolete'];
-
-  EventListenerList get progress => this['progress'];
-
-  EventListenerList get updateReady => this['updateready'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DOMError
-abstract class DOMError {
-
-  /** @domName DOMError.name */
-  String get name;
-}
-
-class _DOMErrorImpl implements DOMError native "*DOMError" {
-
-  final String name;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DOMException
-abstract class DOMException {
-
-  static const int ABORT_ERR = 20;
-
-  static const int DATA_CLONE_ERR = 25;
-
-  static const int DOMSTRING_SIZE_ERR = 2;
-
-  static const int HIERARCHY_REQUEST_ERR = 3;
-
-  static const int INDEX_SIZE_ERR = 1;
-
-  static const int INUSE_ATTRIBUTE_ERR = 10;
-
-  static const int INVALID_ACCESS_ERR = 15;
-
-  static const int INVALID_CHARACTER_ERR = 5;
-
-  static const int INVALID_MODIFICATION_ERR = 13;
-
-  static const int INVALID_NODE_TYPE_ERR = 24;
-
-  static const int INVALID_STATE_ERR = 11;
-
-  static const int NAMESPACE_ERR = 14;
-
-  static const int NETWORK_ERR = 19;
-
-  static const int NOT_FOUND_ERR = 8;
-
-  static const int NOT_SUPPORTED_ERR = 9;
-
-  static const int NO_DATA_ALLOWED_ERR = 6;
-
-  static const int NO_MODIFICATION_ALLOWED_ERR = 7;
-
-  static const int QUOTA_EXCEEDED_ERR = 22;
-
-  static const int SECURITY_ERR = 18;
-
-  static const int SYNTAX_ERR = 12;
-
-  static const int TIMEOUT_ERR = 23;
-
-  static const int TYPE_MISMATCH_ERR = 17;
-
-  static const int URL_MISMATCH_ERR = 21;
-
-  static const int VALIDATION_ERR = 16;
-
-  static const int WRONG_DOCUMENT_ERR = 4;
-
-  /** @domName DOMException.code */
-  int get code;
-
-  /** @domName DOMException.message */
-  String get message;
-
-  /** @domName DOMException.name */
-  String get name;
-
-  /** @domName DOMException.toString */
-  String toString();
-}
-
-class _DOMExceptionImpl implements DOMException native "*DOMException" {
-
-  final int code;
-
-  final String message;
-
-  final String name;
-
-  String toString() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DOMFileSystem
-abstract class DOMFileSystem {
-
-  /** @domName DOMFileSystem.name */
-  String get name;
-
-  /** @domName DOMFileSystem.root */
-  DirectoryEntry get root;
-}
-
-class _DOMFileSystemImpl implements DOMFileSystem native "*DOMFileSystem" {
-
-  final String name;
-
-  final _DirectoryEntryImpl root;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DOMFileSystemSync
-abstract class DOMFileSystemSync {
-
-  /** @domName DOMFileSystemSync.name */
-  String get name;
-
-  /** @domName DOMFileSystemSync.root */
-  DirectoryEntrySync get root;
-}
-
-class _DOMFileSystemSyncImpl implements DOMFileSystemSync native "*DOMFileSystemSync" {
-
-  final String name;
-
-  final _DirectoryEntrySyncImpl root;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DOMImplementation
-abstract class DOMImplementation {
-
-  /** @domName DOMImplementation.createCSSStyleSheet */
-  CSSStyleSheet createCSSStyleSheet(String title, String media);
-
-  /** @domName DOMImplementation.createDocument */
-  Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype);
-
-  /** @domName DOMImplementation.createDocumentType */
-  DocumentType createDocumentType(String qualifiedName, String publicId, String systemId);
-
-  /** @domName DOMImplementation.createHTMLDocument */
-  Document createHTMLDocument(String title);
-
-  /** @domName DOMImplementation.hasFeature */
-  bool hasFeature(String feature, String version);
-}
-
-class _DOMImplementationImpl implements DOMImplementation native "*DOMImplementation" {
-
-  _CSSStyleSheetImpl createCSSStyleSheet(String title, String media) native;
-
-  _DocumentImpl createDocument(String namespaceURI, String qualifiedName, _DocumentTypeImpl doctype) native;
-
-  _DocumentTypeImpl createDocumentType(String qualifiedName, String publicId, String systemId) native;
-
-  _DocumentImpl createHTMLDocument(String title) native;
-
-  bool hasFeature(String feature, String version) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MimeType
-abstract class DOMMimeType {
-
-  /** @domName MimeType.description */
-  String get description;
-
-  /** @domName MimeType.enabledPlugin */
-  DOMPlugin get enabledPlugin;
-
-  /** @domName MimeType.suffixes */
-  String get suffixes;
-
-  /** @domName MimeType.type */
-  String get type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MimeTypeArray
-abstract class DOMMimeTypeArray implements List<DOMMimeType> {
-
-  /** @domName MimeTypeArray.length */
-  int get length;
-
-  /** @domName MimeTypeArray.item */
-  DOMMimeType item(int index);
-
-  /** @domName MimeTypeArray.namedItem */
-  DOMMimeType namedItem(String name);
-}
-
-class _DOMMimeTypeArrayImpl implements DOMMimeTypeArray, JavaScriptIndexingBehavior native "*MimeTypeArray" {
-
-  final int length;
-
-  _DOMMimeTypeImpl operator[](int index) => JS("_DOMMimeTypeImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _DOMMimeTypeImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<DOMMimeType> mixins.
-  // DOMMimeType is the element type.
-
-  // From Iterable<DOMMimeType>:
-
-  Iterator<DOMMimeType> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<DOMMimeType>(this);
-  }
-
-  // From Collection<DOMMimeType>:
-
-  void add(DOMMimeType value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(DOMMimeType value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<DOMMimeType> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(DOMMimeType element) => _Collections.contains(this, element);
-
-  void forEach(void f(DOMMimeType element)) => _Collections.forEach(this, f);
-
-  Collection map(f(DOMMimeType element)) => _Collections.map(this, [], f);
-
-  Collection<DOMMimeType> filter(bool f(DOMMimeType element)) =>
-     _Collections.filter(this, <DOMMimeType>[], f);
-
-  bool every(bool f(DOMMimeType element)) => _Collections.every(this, f);
-
-  bool some(bool f(DOMMimeType element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<DOMMimeType>:
-
-  void sort([Comparator<DOMMimeType> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(DOMMimeType element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(DOMMimeType element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  DOMMimeType get last => this[length - 1];
-
-  DOMMimeType removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<DOMMimeType> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [DOMMimeType initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<DOMMimeType> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <DOMMimeType>[]);
-
-  // -- end List<DOMMimeType> mixins.
-
-  _DOMMimeTypeImpl item(int index) native;
-
-  _DOMMimeTypeImpl namedItem(String name) native;
-}
-
-class _DOMMimeTypeImpl implements DOMMimeType native "*MimeType" {
-
-  final String description;
-
-  final _DOMPluginImpl enabledPlugin;
-
-  final String suffixes;
-
-  final String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DOMParser
-abstract class DOMParser {
-
-  factory DOMParser() => _DOMParserFactoryProvider.createDOMParser();
-
-  /** @domName DOMParser.parseFromString */
-  Document parseFromString(String str, String contentType);
-}
-
-class _DOMParserImpl implements DOMParser native "*DOMParser" {
-
-  _DocumentImpl parseFromString(String str, String contentType) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Plugin
-abstract class DOMPlugin {
-
-  /** @domName Plugin.description */
-  String get description;
-
-  /** @domName Plugin.filename */
-  String get filename;
-
-  /** @domName Plugin.length */
-  int get length;
-
-  /** @domName Plugin.name */
-  String get name;
-
-  /** @domName Plugin.item */
-  DOMMimeType item(int index);
-
-  /** @domName Plugin.namedItem */
-  DOMMimeType namedItem(String name);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName PluginArray
-abstract class DOMPluginArray implements List<DOMPlugin> {
-
-  /** @domName PluginArray.length */
-  int get length;
-
-  /** @domName PluginArray.item */
-  DOMPlugin item(int index);
-
-  /** @domName PluginArray.namedItem */
-  DOMPlugin namedItem(String name);
-
-  /** @domName PluginArray.refresh */
-  void refresh(bool reload);
-}
-
-class _DOMPluginArrayImpl implements DOMPluginArray, JavaScriptIndexingBehavior native "*PluginArray" {
-
-  final int length;
-
-  _DOMPluginImpl operator[](int index) => JS("_DOMPluginImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _DOMPluginImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<DOMPlugin> mixins.
-  // DOMPlugin is the element type.
-
-  // From Iterable<DOMPlugin>:
-
-  Iterator<DOMPlugin> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<DOMPlugin>(this);
-  }
-
-  // From Collection<DOMPlugin>:
-
-  void add(DOMPlugin value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(DOMPlugin value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<DOMPlugin> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(DOMPlugin element) => _Collections.contains(this, element);
-
-  void forEach(void f(DOMPlugin element)) => _Collections.forEach(this, f);
-
-  Collection map(f(DOMPlugin element)) => _Collections.map(this, [], f);
-
-  Collection<DOMPlugin> filter(bool f(DOMPlugin element)) =>
-     _Collections.filter(this, <DOMPlugin>[], f);
-
-  bool every(bool f(DOMPlugin element)) => _Collections.every(this, f);
-
-  bool some(bool f(DOMPlugin element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<DOMPlugin>:
-
-  void sort([Comparator<DOMPlugin> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(DOMPlugin element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(DOMPlugin element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  DOMPlugin get last => this[length - 1];
-
-  DOMPlugin removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<DOMPlugin> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [DOMPlugin initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<DOMPlugin> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <DOMPlugin>[]);
-
-  // -- end List<DOMPlugin> mixins.
-
-  _DOMPluginImpl item(int index) native;
-
-  _DOMPluginImpl namedItem(String name) native;
-
-  void refresh(bool reload) native;
-}
-
-class _DOMPluginImpl implements DOMPlugin native "*Plugin" {
-
-  final String description;
-
-  final String filename;
-
-  final int length;
-
-  final String name;
-
-  _DOMMimeTypeImpl item(int index) native;
-
-  _DOMMimeTypeImpl namedItem(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Selection
-abstract class DOMSelection {
-
-  /** @domName Selection.anchorNode */
-  Node get anchorNode;
-
-  /** @domName Selection.anchorOffset */
-  int get anchorOffset;
-
-  /** @domName Selection.baseNode */
-  Node get baseNode;
-
-  /** @domName Selection.baseOffset */
-  int get baseOffset;
-
-  /** @domName Selection.extentNode */
-  Node get extentNode;
-
-  /** @domName Selection.extentOffset */
-  int get extentOffset;
-
-  /** @domName Selection.focusNode */
-  Node get focusNode;
-
-  /** @domName Selection.focusOffset */
-  int get focusOffset;
-
-  /** @domName Selection.isCollapsed */
-  bool get isCollapsed;
-
-  /** @domName Selection.rangeCount */
-  int get rangeCount;
-
-  /** @domName Selection.type */
-  String get type;
-
-  /** @domName Selection.addRange */
-  void addRange(Range range);
-
-  /** @domName Selection.collapse */
-  void collapse(Node node, int index);
-
-  /** @domName Selection.collapseToEnd */
-  void collapseToEnd();
-
-  /** @domName Selection.collapseToStart */
-  void collapseToStart();
-
-  /** @domName Selection.containsNode */
-  bool containsNode(Node node, bool allowPartial);
-
-  /** @domName Selection.deleteFromDocument */
-  void deleteFromDocument();
-
-  /** @domName Selection.empty */
-  void empty();
-
-  /** @domName Selection.extend */
-  void extend(Node node, int offset);
-
-  /** @domName Selection.getRangeAt */
-  Range getRangeAt(int index);
-
-  /** @domName Selection.modify */
-  void modify(String alter, String direction, String granularity);
-
-  /** @domName Selection.removeAllRanges */
-  void removeAllRanges();
-
-  /** @domName Selection.selectAllChildren */
-  void selectAllChildren(Node node);
-
-  /** @domName Selection.setBaseAndExtent */
-  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset);
-
-  /** @domName Selection.setPosition */
-  void setPosition(Node node, int offset);
-
-  /** @domName Selection.toString */
-  String toString();
-}
-
-class _DOMSelectionImpl implements DOMSelection native "*Selection" {
-
-  final _NodeImpl anchorNode;
-
-  final int anchorOffset;
-
-  final _NodeImpl baseNode;
-
-  final int baseOffset;
-
-  final _NodeImpl extentNode;
-
-  final int extentOffset;
-
-  final _NodeImpl focusNode;
-
-  final int focusOffset;
-
-  final bool isCollapsed;
-
-  final int rangeCount;
-
-  final String type;
-
-  void addRange(_RangeImpl range) native;
-
-  void collapse(_NodeImpl node, int index) native;
-
-  void collapseToEnd() native;
-
-  void collapseToStart() native;
-
-  bool containsNode(_NodeImpl node, bool allowPartial) native;
-
-  void deleteFromDocument() native;
-
-  void empty() native;
-
-  void extend(_NodeImpl node, int offset) native;
-
-  _RangeImpl getRangeAt(int index) native;
-
-  void modify(String alter, String direction, String granularity) native;
-
-  void removeAllRanges() native;
-
-  void selectAllChildren(_NodeImpl node) native;
-
-  void setBaseAndExtent(_NodeImpl baseNode, int baseOffset, _NodeImpl extentNode, int extentOffset) native;
-
-  void setPosition(_NodeImpl node, int offset) native;
-
-  String toString() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DOMSettableTokenList
-abstract class DOMSettableTokenList implements DOMTokenList {
-
-  /** @domName DOMSettableTokenList.value */
-  String value;
-}
-
-class _DOMSettableTokenListImpl extends _DOMTokenListImpl implements DOMSettableTokenList native "*DOMSettableTokenList" {
-
-  String value;
-}
-
-class _DOMStringListImpl implements List<String>, JavaScriptIndexingBehavior native "*DOMStringList" {
-
-  final int length;
-
-  String operator[](int index) => JS("String", "#[#]", this, index);
-
-  void operator[]=(int index, String value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<String> mixins.
-  // String is the element type.
-
-  // From Iterable<String>:
-
-  Iterator<String> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<String>(this);
-  }
-
-  // From Collection<String>:
-
-  void add(String value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(String value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<String> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  // contains() defined by IDL.
-
-  void forEach(void f(String element)) => _Collections.forEach(this, f);
-
-  Collection map(f(String element)) => _Collections.map(this, [], f);
-
-  Collection<String> filter(bool f(String element)) =>
-     _Collections.filter(this, <String>[], f);
-
-  bool every(bool f(String element)) => _Collections.every(this, f);
-
-  bool some(bool f(String element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<String>:
-
-  void sort([Comparator<String> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(String element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(String element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  String get last => this[length - 1];
-
-  String removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [String initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<String> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <String>[]);
-
-  // -- end List<String> mixins.
-
-  bool contains(String string) native;
-
-  String item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DOMStringMap
-abstract class DOMStringMap {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DOMTokenList
-abstract class DOMTokenList {
-
-  /** @domName DOMTokenList.length */
-  int get length;
-
-  /** @domName DOMTokenList.contains */
-  bool contains(String token);
-
-  /** @domName DOMTokenList.item */
-  String item(int index);
-
-  /** @domName DOMTokenList.toString */
-  String toString();
-
-  /** @domName DOMTokenList.toggle */
-  bool toggle(String token, [bool force]);
-}
-
-class _DOMTokenListImpl implements DOMTokenList native "*DOMTokenList" {
-
-  final int length;
-
-  bool contains(String token) native;
-
-  String item(int index) native;
-
-  String toString() native;
-
-  bool toggle(String token, [bool force]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName URL
-abstract class DOMURL {
-
-  factory DOMURL() => _DOMURLFactoryProvider.createDOMURL();
-
-  /** @domName URL.createObjectURL */
-  static final createObjectURL = _DOMURLImpl.createObjectURL;
-
-  /** @domName URL.revokeObjectURL */
-  static final revokeObjectURL = _DOMURLImpl.revokeObjectURL;
-}
-
-class _DOMURLImpl implements DOMURL native "*URL" {
-
-  static String createObjectURL(blob_OR_source_OR_stream) native;
-
-  static void revokeObjectURL(String url) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLDataListElement
-abstract class DataListElement implements Element {
-
-  factory DataListElement() => _Elements.createDataListElement();
-
-  /** @domName HTMLDataListElement.options */
-  HTMLCollection get options;
-}
-
-class _DataListElementImpl extends _ElementImpl implements DataListElement native "*HTMLDataListElement" {
-
-  final _HTMLCollectionImpl options;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DataTransferItem
-abstract class DataTransferItem {
-
-  /** @domName DataTransferItem.kind */
-  String get kind;
-
-  /** @domName DataTransferItem.type */
-  String get type;
-
-  /** @domName DataTransferItem.getAsFile */
-  Blob getAsFile();
-
-  /** @domName DataTransferItem.getAsString */
-  void getAsString([StringCallback callback]);
-
-  /** @domName DataTransferItem.webkitGetAsEntry */
-  Entry webkitGetAsEntry();
-}
-
-class _DataTransferItemImpl implements DataTransferItem native "*DataTransferItem" {
-
-  final String kind;
-
-  final String type;
-
-  _BlobImpl getAsFile() native;
-
-  void getAsString([StringCallback callback]) native;
-
-  _EntryImpl webkitGetAsEntry() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DataTransferItemList
-abstract class DataTransferItemList {
-
-  /** @domName DataTransferItemList.length */
-  int get length;
-
-  /** @domName DataTransferItemList.add */
-  void add(data_OR_file, [String type]);
-
-  /** @domName DataTransferItemList.clear */
-  void clear();
-
-  /** @domName DataTransferItemList.item */
-  DataTransferItem item(int index);
-}
-
-class _DataTransferItemListImpl implements DataTransferItemList native "*DataTransferItemList" {
-
-  final int length;
-
-  void add(data_OR_file, [String type]) native;
-
-  void clear() native;
-
-  _DataTransferItemImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DataView
-abstract class DataView implements ArrayBufferView {
-
-  factory DataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) {
-    if (!?byteOffset) {
-      return _DataViewFactoryProvider.createDataView(buffer);
-    }
-    if (!?byteLength) {
-      return _DataViewFactoryProvider.createDataView(buffer, byteOffset);
-    }
-    return _DataViewFactoryProvider.createDataView(buffer, byteOffset, byteLength);
-  }
-
-  /** @domName DataView.getFloat32 */
-  num getFloat32(int byteOffset, {bool littleEndian});
-
-  /** @domName DataView.getFloat64 */
-  num getFloat64(int byteOffset, {bool littleEndian});
-
-  /** @domName DataView.getInt16 */
-  int getInt16(int byteOffset, {bool littleEndian});
-
-  /** @domName DataView.getInt32 */
-  int getInt32(int byteOffset, {bool littleEndian});
-
-  /** @domName DataView.getInt8 */
-  int getInt8(int byteOffset);
-
-  /** @domName DataView.getUint16 */
-  int getUint16(int byteOffset, {bool littleEndian});
-
-  /** @domName DataView.getUint32 */
-  int getUint32(int byteOffset, {bool littleEndian});
-
-  /** @domName DataView.getUint8 */
-  int getUint8(int byteOffset);
-
-  /** @domName DataView.setFloat32 */
-  void setFloat32(int byteOffset, num value, {bool littleEndian});
-
-  /** @domName DataView.setFloat64 */
-  void setFloat64(int byteOffset, num value, {bool littleEndian});
-
-  /** @domName DataView.setInt16 */
-  void setInt16(int byteOffset, int value, {bool littleEndian});
-
-  /** @domName DataView.setInt32 */
-  void setInt32(int byteOffset, int value, {bool littleEndian});
-
-  /** @domName DataView.setInt8 */
-  void setInt8(int byteOffset, int value);
-
-  /** @domName DataView.setUint16 */
-  void setUint16(int byteOffset, int value, {bool littleEndian});
-
-  /** @domName DataView.setUint32 */
-  void setUint32(int byteOffset, int value, {bool littleEndian});
-
-  /** @domName DataView.setUint8 */
-  void setUint8(int byteOffset, int value);
-}
-
-class _DataViewImpl extends _ArrayBufferViewImpl implements DataView native "*DataView" {
-
-  num getFloat32(int byteOffset, {bool littleEndian}) native;
-
-  num getFloat64(int byteOffset, {bool littleEndian}) native;
-
-  int getInt16(int byteOffset, {bool littleEndian}) native;
-
-  int getInt32(int byteOffset, {bool littleEndian}) native;
-
-  int getInt8(int byteOffset) native;
-
-  int getUint16(int byteOffset, {bool littleEndian}) native;
-
-  int getUint32(int byteOffset, {bool littleEndian}) native;
-
-  int getUint8(int byteOffset) native;
-
-  void setFloat32(int byteOffset, num value, {bool littleEndian}) native;
-
-  void setFloat64(int byteOffset, num value, {bool littleEndian}) native;
-
-  void setInt16(int byteOffset, int value, {bool littleEndian}) native;
-
-  void setInt32(int byteOffset, int value, {bool littleEndian}) native;
-
-  void setInt8(int byteOffset, int value) native;
-
-  void setUint16(int byteOffset, int value, {bool littleEndian}) native;
-
-  void setUint32(int byteOffset, int value, {bool littleEndian}) native;
-
-  void setUint8(int byteOffset, int value) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Database
-abstract class Database {
-
-  /** @domName Database.version */
-  String get version;
-
-  /** @domName Database.changeVersion */
-  void changeVersion(String oldVersion, String newVersion, [SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]);
-
-  /** @domName Database.readTransaction */
-  void readTransaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]);
-
-  /** @domName Database.transaction */
-  void transaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void DatabaseCallback(database);
-
-class _DatabaseImpl implements Database native "*Database" {
-
-  final String version;
-
-  void changeVersion(String oldVersion, String newVersion, [SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
-
-  void readTransaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
-
-  void transaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DatabaseSync
-abstract class DatabaseSync {
-
-  /** @domName DatabaseSync.lastErrorMessage */
-  String get lastErrorMessage;
-
-  /** @domName DatabaseSync.version */
-  String get version;
-
-  /** @domName DatabaseSync.changeVersion */
-  void changeVersion(String oldVersion, String newVersion, [SQLTransactionSyncCallback callback]);
-
-  /** @domName DatabaseSync.readTransaction */
-  void readTransaction(SQLTransactionSyncCallback callback);
-
-  /** @domName DatabaseSync.transaction */
-  void transaction(SQLTransactionSyncCallback callback);
-}
-
-class _DatabaseSyncImpl implements DatabaseSync native "*DatabaseSync" {
-
-  final String lastErrorMessage;
-
-  final String version;
-
-  void changeVersion(String oldVersion, String newVersion, [SQLTransactionSyncCallback callback]) native;
-
-  void readTransaction(SQLTransactionSyncCallback callback) native;
-
-  void transaction(SQLTransactionSyncCallback callback) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DedicatedWorkerContext
-abstract class DedicatedWorkerContext implements WorkerContext {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  DedicatedWorkerContextEvents get on;
-
-  /** @domName DedicatedWorkerContext.postMessage */
-  void postMessage(Object message, [List messagePorts]);
-}
-
-abstract class DedicatedWorkerContextEvents implements WorkerContextEvents {
-
-  EventListenerList get message;
-}
-
-class _DedicatedWorkerContextImpl extends _WorkerContextImpl implements DedicatedWorkerContext native "*DedicatedWorkerContext" {
-
-  _DedicatedWorkerContextEventsImpl get on =>
-    new _DedicatedWorkerContextEventsImpl(this);
-
-  void postMessage(/*any*/ message, [messagePorts]) {
-    if (?messagePorts) {
-      var message_1 = _convertDartToNative_SerializedScriptValue(message);
-      _postMessage_1(message_1, messagePorts);
-      return;
-    }
-    var message_2 = _convertDartToNative_SerializedScriptValue(message);
-    _postMessage_2(message_2);
-    return;
-  }
-  void _postMessage_1(message, List messagePorts) native "postMessage";
-  void _postMessage_2(message) native "postMessage";
-}
-
-class _DedicatedWorkerContextEventsImpl extends _WorkerContextEventsImpl implements DedicatedWorkerContextEvents {
-  _DedicatedWorkerContextEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get message => this['message'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DelayNode
-abstract class DelayNode implements AudioNode {
-
-  /** @domName DelayNode.delayTime */
-  AudioParam get delayTime;
-}
-
-class _DelayNodeImpl extends _AudioNodeImpl implements DelayNode native "*DelayNode" {
-
-  final _AudioParamImpl delayTime;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLDetailsElement
-abstract class DetailsElement implements Element {
-
-  factory DetailsElement() => _Elements.createDetailsElement();
-
-  /** @domName HTMLDetailsElement.open */
-  bool open;
-}
-
-class _DetailsElementImpl extends _ElementImpl implements DetailsElement native "*HTMLDetailsElement" {
-
-  bool open;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DeviceMotionEvent
-abstract class DeviceMotionEvent implements Event {
-
-  /** @domName DeviceMotionEvent.interval */
-  num get interval;
-}
-
-class _DeviceMotionEventImpl extends _EventImpl implements DeviceMotionEvent native "*DeviceMotionEvent" {
-
-  final num interval;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DeviceOrientationEvent
-abstract class DeviceOrientationEvent implements Event {
-
-  /** @domName DeviceOrientationEvent.absolute */
-  bool get absolute;
-
-  /** @domName DeviceOrientationEvent.alpha */
-  num get alpha;
-
-  /** @domName DeviceOrientationEvent.beta */
-  num get beta;
-
-  /** @domName DeviceOrientationEvent.gamma */
-  num get gamma;
-
-  /** @domName DeviceOrientationEvent.initDeviceOrientationEvent */
-  void initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute);
-}
-
-class _DeviceOrientationEventImpl extends _EventImpl implements DeviceOrientationEvent native "*DeviceOrientationEvent" {
-
-  final bool absolute;
-
-  final num alpha;
-
-  final num beta;
-
-  final num gamma;
-
-  void initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLDirectoryElement
-abstract class DirectoryElement implements Element {
-
-  /** @domName HTMLDirectoryElement.compact */
-  bool compact;
-}
-
-class _DirectoryElementImpl extends _ElementImpl implements DirectoryElement native "*HTMLDirectoryElement" {
-
-  bool compact;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DirectoryEntry
-abstract class DirectoryEntry implements Entry {
-
-  /** @domName DirectoryEntry.createReader */
-  DirectoryReader createReader();
-
-  /** @domName DirectoryEntry.getDirectory */
-  void getDirectory(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback});
-
-  /** @domName DirectoryEntry.getFile */
-  void getFile(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback});
-
-  /** @domName DirectoryEntry.removeRecursively */
-  void removeRecursively(VoidCallback successCallback, [ErrorCallback errorCallback]);
-}
-
-class _DirectoryEntryImpl extends _EntryImpl implements DirectoryEntry native "*DirectoryEntry" {
-
-  _DirectoryReaderImpl createReader() native;
-
-  void getDirectory(String path, {options, successCallback, errorCallback}) {
-    if (?errorCallback) {
-      var options_1 = _convertDartToNative_Dictionary(options);
-      _getDirectory_1(path, options_1, successCallback, errorCallback);
-      return;
-    }
-    if (?successCallback) {
-      var options_2 = _convertDartToNative_Dictionary(options);
-      _getDirectory_2(path, options_2, successCallback);
-      return;
-    }
-    if (?options) {
-      var options_3 = _convertDartToNative_Dictionary(options);
-      _getDirectory_3(path, options_3);
-      return;
-    }
-    _getDirectory_4(path);
-    return;
-  }
-  void _getDirectory_1(path, options, EntryCallback successCallback, ErrorCallback errorCallback) native "getDirectory";
-  void _getDirectory_2(path, options, EntryCallback successCallback) native "getDirectory";
-  void _getDirectory_3(path, options) native "getDirectory";
-  void _getDirectory_4(path) native "getDirectory";
-
-  void getFile(String path, {options, successCallback, errorCallback}) {
-    if (?errorCallback) {
-      var options_1 = _convertDartToNative_Dictionary(options);
-      _getFile_1(path, options_1, successCallback, errorCallback);
-      return;
-    }
-    if (?successCallback) {
-      var options_2 = _convertDartToNative_Dictionary(options);
-      _getFile_2(path, options_2, successCallback);
-      return;
-    }
-    if (?options) {
-      var options_3 = _convertDartToNative_Dictionary(options);
-      _getFile_3(path, options_3);
-      return;
-    }
-    _getFile_4(path);
-    return;
-  }
-  void _getFile_1(path, options, EntryCallback successCallback, ErrorCallback errorCallback) native "getFile";
-  void _getFile_2(path, options, EntryCallback successCallback) native "getFile";
-  void _getFile_3(path, options) native "getFile";
-  void _getFile_4(path) native "getFile";
-
-  void removeRecursively(VoidCallback successCallback, [ErrorCallback errorCallback]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DirectoryEntrySync
-abstract class DirectoryEntrySync implements EntrySync {
-
-  /** @domName DirectoryEntrySync.createReader */
-  DirectoryReaderSync createReader();
-
-  /** @domName DirectoryEntrySync.getDirectory */
-  DirectoryEntrySync getDirectory(String path, Map flags);
-
-  /** @domName DirectoryEntrySync.getFile */
-  FileEntrySync getFile(String path, Map flags);
-
-  /** @domName DirectoryEntrySync.removeRecursively */
-  void removeRecursively();
-}
-
-class _DirectoryEntrySyncImpl extends _EntrySyncImpl implements DirectoryEntrySync native "*DirectoryEntrySync" {
-
-  _DirectoryReaderSyncImpl createReader() native;
-
-  _DirectoryEntrySyncImpl getDirectory(String path, Map flags) {
-    var flags_1 = _convertDartToNative_Dictionary(flags);
-    return _getDirectory_1(path, flags_1);
-  }
-  _DirectoryEntrySyncImpl _getDirectory_1(path, flags) native "getDirectory";
-
-  _FileEntrySyncImpl getFile(String path, Map flags) {
-    var flags_1 = _convertDartToNative_Dictionary(flags);
-    return _getFile_1(path, flags_1);
-  }
-  _FileEntrySyncImpl _getFile_1(path, flags) native "getFile";
-
-  void removeRecursively() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DirectoryReader
-abstract class DirectoryReader {
-
-  /** @domName DirectoryReader.readEntries */
-  void readEntries(EntriesCallback successCallback, [ErrorCallback errorCallback]);
-}
-
-class _DirectoryReaderImpl implements DirectoryReader native "*DirectoryReader" {
-
-  void readEntries(EntriesCallback successCallback, [ErrorCallback errorCallback]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DirectoryReaderSync
-abstract class DirectoryReaderSync {
-
-  /** @domName DirectoryReaderSync.readEntries */
-  List<EntrySync> readEntries();
-}
-
-class _DirectoryReaderSyncImpl implements DirectoryReaderSync native "*DirectoryReaderSync" {
-
-  _EntryArraySyncImpl readEntries() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLDivElement
-abstract class DivElement implements Element {
-
-  factory DivElement() => _Elements.createDivElement();
-
-  /** @domName HTMLDivElement.align */
-  String align;
-}
-
-class _DivElementImpl extends _ElementImpl implements DivElement native "*HTMLDivElement" {
-
-  String align;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName Document
-abstract class Document extends HtmlElement {
-
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  DocumentEvents get on;
-
-  /** @domName HTMLDocument.activeElement */
-  Element get activeElement;
-
-  /** @domName Document.body */
-  Element body;
-
-  /** @domName Document.charset */
-  String charset;
-
-  /** @domName Document.cookie */
-  String cookie;
-
-  /** @domName Document.defaultView */
-  Window get window;
-
-  /** @domName Document.documentElement */
-  Element get documentElement;
-
-  /** @domName Document.domain */
-  String get domain;
-
-  /** @domName Document.head */
-  HeadElement get head;
-
-  /** @domName Document.implementation */
-  DOMImplementation get implementation;
-
-  /** @domName Document.lastModified */
-  String get lastModified;
-
-  /** @domName Document.preferredStylesheetSet */
-  String get preferredStylesheetSet;
-
-  /** @domName Document.readyState */
-  String get readyState;
-
-  /** @domName Document.referrer */
-  String get referrer;
-
-  /** @domName Document.selectedStylesheetSet */
-  String selectedStylesheetSet;
-
-  /** @domName Document.styleSheets */
-  List<StyleSheet> get styleSheets;
-
-  /** @domName Document.title */
-  String title;
-
-  /** @domName Document.webkitCurrentFullScreenElement */
-  Element get webkitCurrentFullScreenElement;
-
-  /** @domName Document.webkitFullScreenKeyboardInputAllowed */
-  bool get webkitFullScreenKeyboardInputAllowed;
-
-  /** @domName Document.webkitFullscreenElement */
-  Element get webkitFullscreenElement;
-
-  /** @domName Document.webkitFullscreenEnabled */
-  bool get webkitFullscreenEnabled;
-
-  /** @domName Document.webkitHidden */
-  bool get webkitHidden;
-
-  /** @domName Document.webkitIsFullScreen */
-  bool get webkitIsFullScreen;
-
-  /** @domName Document.webkitPointerLockElement */
-  Element get webkitPointerLockElement;
-
-  /** @domName Document.webkitVisibilityState */
-  String get webkitVisibilityState;
-
-  /** @domName Document.caretRangeFromPoint */
-  Range caretRangeFromPoint(int x, int y);
-
-  /** @domName Document.createCDATASection */
-  CDATASection createCDATASection(String data);
-
-  /** @domName Document.createDocumentFragment */
-  DocumentFragment createDocumentFragment();
-
-  /** @domName Document.createElement */
-  Element $dom_createElement(String tagName);
-
-  /** @domName Document.createElementNS */
-  Element $dom_createElementNS(String namespaceURI, String qualifiedName);
-
-  /** @domName Document.createEvent */
-  Event $dom_createEvent(String eventType);
-
-  /** @domName Document.createRange */
-  Range createRange();
-
-  /** @domName Document.createTextNode */
-  Text $dom_createTextNode(String data);
-
-  /** @domName Document.createTouch */
-  Touch createTouch(LocalWindow window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce);
-
-  /** @domName Document.createTouchList */
-  TouchList $dom_createTouchList();
-
-  /** @domName Document.elementFromPoint */
-  Element elementFromPoint(int x, int y);
-
-  /** @domName Document.execCommand */
-  bool execCommand(String command, bool userInterface, String value);
-
-  /** @domName Document.getCSSCanvasContext */
-  CanvasRenderingContext getCSSCanvasContext(String contextId, String name, int width, int height);
-
-  /** @domName Document.getElementById */
-  Element $dom_getElementById(String elementId);
-
-  /** @domName Document.getElementsByClassName */
-  List<Node> $dom_getElementsByClassName(String tagname);
-
-  /** @domName Document.getElementsByName */
-  List<Node> $dom_getElementsByName(String elementName);
-
-  /** @domName Document.getElementsByTagName */
-  List<Node> $dom_getElementsByTagName(String tagname);
-
-  /** @domName Document.queryCommandEnabled */
-  bool queryCommandEnabled(String command);
-
-  /** @domName Document.queryCommandIndeterm */
-  bool queryCommandIndeterm(String command);
-
-  /** @domName Document.queryCommandState */
-  bool queryCommandState(String command);
-
-  /** @domName Document.queryCommandSupported */
-  bool queryCommandSupported(String command);
-
-  /** @domName Document.queryCommandValue */
-  String queryCommandValue(String command);
-
-  /** @domName Document.querySelector */
-  Element $dom_querySelector(String selectors);
-
-  /** @domName Document.querySelectorAll */
-  List<Node> $dom_querySelectorAll(String selectors);
-
-  /** @domName Document.webkitCancelFullScreen */
-  void webkitCancelFullScreen();
-
-  /** @domName Document.webkitExitFullscreen */
-  void webkitExitFullscreen();
-
-  /** @domName Document.webkitExitPointerLock */
-  void webkitExitPointerLock();
-
-}
-
-abstract class DocumentEvents implements ElementEvents {
-
-  EventListenerList get abort;
-
-  EventListenerList get beforeCopy;
-
-  EventListenerList get beforeCut;
-
-  EventListenerList get beforePaste;
-
-  EventListenerList get blur;
-
-  EventListenerList get change;
-
-  EventListenerList get click;
-
-  EventListenerList get contextMenu;
-
-  EventListenerList get copy;
-
-  EventListenerList get cut;
-
-  EventListenerList get doubleClick;
-
-  EventListenerList get drag;
-
-  EventListenerList get dragEnd;
-
-  EventListenerList get dragEnter;
-
-  EventListenerList get dragLeave;
-
-  EventListenerList get dragOver;
-
-  EventListenerList get dragStart;
-
-  EventListenerList get drop;
-
-  EventListenerList get error;
-
-  EventListenerList get focus;
-
-  EventListenerList get input;
-
-  EventListenerList get invalid;
-
-  EventListenerList get keyDown;
-
-  EventListenerList get keyPress;
-
-  EventListenerList get keyUp;
-
-  EventListenerList get load;
-
-  EventListenerList get mouseDown;
-
-  EventListenerList get mouseMove;
-
-  EventListenerList get mouseOut;
-
-  EventListenerList get mouseOver;
-
-  EventListenerList get mouseUp;
-
-  EventListenerList get mouseWheel;
-
-  EventListenerList get paste;
-
-  EventListenerList get readyStateChange;
-
-  EventListenerList get reset;
-
-  EventListenerList get scroll;
-
-  EventListenerList get search;
-
-  EventListenerList get select;
-
-  EventListenerList get selectionChange;
-
-  EventListenerList get selectStart;
-
-  EventListenerList get submit;
-
-  EventListenerList get touchCancel;
-
-  EventListenerList get touchEnd;
-
-  EventListenerList get touchMove;
-
-  EventListenerList get touchStart;
-
-  EventListenerList get fullscreenChange;
-
-  EventListenerList get fullscreenError;
-
-  EventListenerList get pointerLockChange;
-
-  EventListenerList get pointerLockError;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName DocumentFragment
-abstract class DocumentFragment extends Element {
-
-  factory DocumentFragment() => _DocumentFragmentFactoryProvider.createDocumentFragment();
-
-  factory DocumentFragment.html(String html) =>
-      _DocumentFragmentFactoryProvider.createDocumentFragment_html(html);
-
-  // TODO(nweiz): enable this when XML is ported
-  // /** WARNING: Currently this doesn't work on Dartium (issue 649). */
-  // DocumentFragment.xml(String xml);
-
-  factory DocumentFragment.svg(String svg) =>
-      new _DocumentFragmentFactoryProvider.DocumentFragment.svg(svg);
-
-  DocumentFragment clone(bool deep);
-
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  ElementEvents get on;
-
-  /** @domName DocumentFragment.querySelector */
-  Element $dom_querySelector(String selectors);
-
-  /** @domName DocumentFragment.querySelectorAll */
-  List<Node> $dom_querySelectorAll(String selectors);
-
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _FilteredElementList implements List {
-  final Node _node;
-  final List<Node> _childNodes;
-
-  _FilteredElementList(Node node): _childNodes = node.nodes, _node = node;
-
-  // We can't memoize this, since it's possible that children will be messed
-  // with externally to this class.
-  //
-  // TODO(nweiz): Do we really need to copy the list to make the types work out?
-  List<Element> get _filtered =>
-    new List.from(_childNodes.filter((n) => n is Element));
-
-  void forEach(void f(Element element)) {
-    _filtered.forEach(f);
-  }
-
-  void operator []=(int index, Element value) {
-    this[index].replaceWith(value);
-  }
-
-  void set length(int newLength) {
-    final len = this.length;
-    if (newLength >= len) {
-      return;
-    } else if (newLength < 0) {
-      throw new ArgumentError("Invalid list length");
-    }
-
-    removeRange(newLength - 1, len - newLength);
-  }
-
-  void add(Element value) {
-    _childNodes.add(value);
-  }
-
-  void addAll(Collection<Element> collection) {
-    collection.forEach(add);
-  }
-
-  void addLast(Element value) {
-    add(value);
-  }
-
-  bool contains(Element element) {
-    return element is Element && _childNodes.contains(element);
-  }
-
-  void sort([Comparator<Element> compare = Comparable.compare]) {
-    throw new UnsupportedError('TODO(jacobr): should we impl?');
-  }
-
-  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
-    throw const NotImplementedException();
-  }
-
-  void removeRange(int start, int rangeLength) {
-    _filtered.getRange(start, rangeLength).forEach((el) => el.remove());
-  }
-
-  void insertRange(int start, int rangeLength, [initialValue = null]) {
-    throw const NotImplementedException();
-  }
-
-  void clear() {
-    // Currently, ElementList#clear clears even non-element nodes, so we follow
-    // that behavior.
-    _childNodes.clear();
-  }
-
-  Element removeLast() {
-    final result = this.last;
-    if (result != null) {
-      result.remove();
-    }
-    return result;
-  }
-
-  Collection map(f(Element element)) => _filtered.map(f);
-  Collection<Element> filter(bool f(Element element)) => _filtered.filter(f);
-  bool every(bool f(Element element)) => _filtered.every(f);
-  bool some(bool f(Element element)) => _filtered.some(f);
-  bool get isEmpty => _filtered.isEmpty;
-  int get length => _filtered.length;
-  Element operator [](int index) => _filtered[index];
-  Iterator<Element> iterator() => _filtered.iterator();
-  List<Element> getRange(int start, int rangeLength) =>
-    _filtered.getRange(start, rangeLength);
-  int indexOf(Element element, [int start = 0]) =>
-    _filtered.indexOf(element, start);
-
-  int lastIndexOf(Element element, [int start = null]) {
-    if (start == null) start = length - 1;
-    return _filtered.lastIndexOf(element, start);
-  }
-
-  Element get last => _filtered.last;
-}
-
-Future<CSSStyleDeclaration> _emptyStyleFuture() {
-  return _createMeasurementFuture(() => new Element.tag('div').style,
-                                  new Completer<CSSStyleDeclaration>());
-}
-
-class EmptyElementRect implements ElementRect {
-  final ClientRect client = const _SimpleClientRect(0, 0, 0, 0);
-  final ClientRect offset = const _SimpleClientRect(0, 0, 0, 0);
-  final ClientRect scroll = const _SimpleClientRect(0, 0, 0, 0);
-  final ClientRect bounding = const _SimpleClientRect(0, 0, 0, 0);
-  final List<ClientRect> clientRects = const <ClientRect>[];
-
-  const EmptyElementRect();
-}
-
-class _FrozenCSSClassSet extends _CssClassSet {
-  _FrozenCSSClassSet() : super(null);
-
-  void _write(Set s) {
-    throw new UnsupportedError(
-        'frozen class set cannot be modified');
-  }
-  Set<String> _read() => new Set<String>();
-
-  bool get frozen => true;
-}
-
-class _DocumentFragmentImpl extends _NodeImpl implements DocumentFragment native "*DocumentFragment" {
-  List<Element> _elements;
-
-  List<Element> get elements {
-    if (_elements == null) {
-      _elements = new _FilteredElementList(this);
-    }
-    return _elements;
-  }
-
-  // TODO: The type of value should be Collection<Element>. See http://b/5392897
-  void set elements(value) {
-    // Copy list first since we don't want liveness during iteration.
-    List copy = new List.from(value);
-    final elements = this.elements;
-    elements.clear();
-    elements.addAll(copy);
-  }
-
-  _ElementImpl query(String selectors) => $dom_querySelector(selectors);
-
-  List<Element> queryAll(String selectors) =>
-    new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
-
-  String get innerHTML {
-    final e = new Element.tag("div");
-    e.nodes.add(this.clone(true));
-    return e.innerHTML;
-  }
-
-  String get outerHTML => innerHTML;
-
-  // TODO(nweiz): Do we want to support some variant of innerHTML for XML and/or
-  // SVG strings?
-  void set innerHTML(String value) {
-    this.nodes.clear();
-
-    final e = new Element.tag("div");
-    e.innerHTML = value;
-
-    // Copy list first since we don't want liveness during iteration.
-    List nodes = new List.from(e.nodes);
-    this.nodes.addAll(nodes);
-  }
-
-  Node _insertAdjacentNode(String where, Node node) {
-    switch (where.toLowerCase()) {
-      case "beforebegin": return null;
-      case "afterend": return null;
-      case "afterbegin":
-        var first = this.nodes.length > 0 ? this.nodes[0] : null;
-        this.insertBefore(node, first);
-        return node;
-      case "beforeend":
-        this.nodes.add(node);
-        return node;
-      default:
-        throw new ArgumentError("Invalid position ${where}");
-    }
-  }
-
-  Element insertAdjacentElement(String where, Element element)
-    => this._insertAdjacentNode(where, element);
-
-  void insertAdjacentText(String where, String text) {
-    this._insertAdjacentNode(where, new Text(text));
-  }
-
-  void insertAdjacentHTML(String where, String text) {
-    this._insertAdjacentNode(where, new DocumentFragment.html(text));
-  }
-
-  void addText(String text) {
-    this.insertAdjacentText('beforeend', text);
-  }
-
-  void addHTML(String text) {
-    this.insertAdjacentHTML('beforeend', text);
-  }
-
-  Future<ElementRect> get rect {
-    return _createMeasurementFuture(() => const EmptyElementRect(),
-                                    new Completer<ElementRect>());
-  }
-
-  // If we can come up with a semi-reasonable default value for an Element
-  // getter, we'll use it. In general, these return the same values as an
-  // element that has no parent.
-  String get contentEditable => "false";
-  bool get isContentEditable => false;
-  bool get draggable => false;
-  bool get hidden => false;
-  bool get spellcheck => false;
-  bool get translate => false;
-  int get tabIndex => -1;
-  String get id => "";
-  String get title => "";
-  String get tagName => "";
-  String get webkitdropzone => "";
-  String get webkitRegionOverflow => "";
-  Element get $m_firstElementChild {
-    if (elements.length > 0) {
-      return elements[0];
-    }
-    return null;
-  }
-  Element get $m_lastElementChild() => elements.last;
-  Element get nextElementSibling => null;
-  Element get previousElementSibling => null;
-  Element get offsetParent => null;
-  Element get parent => null;
-  Map<String, String> get attributes => const {};
-  CSSClassSet get classes => new _FrozenCSSClassSet();
-  Map<String, String> get dataAttributes => const {};
-  CSSStyleDeclaration get style => new Element.tag('div').style;
-  Future<CSSStyleDeclaration> get computedStyle =>
-      _emptyStyleFuture();
-  Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement) =>
-      _emptyStyleFuture();
-  bool matchesSelector(String selectors) => false;
-
-  // Imperative Element methods are made into no-ops, as they are on parentless
-  // elements.
-  void blur() {}
-  void focus() {}
-  void click() {}
-  void scrollByLines(int lines) {}
-  void scrollByPages(int pages) {}
-  void scrollIntoView([bool centerIfNeeded]) {}
-  void webkitRequestFullScreen(int flags) {}
-  void webkitRequestFullscreen() {}
-
-  // Setters throw errors rather than being no-ops because we aren't going to
-  // retain the values that were set, and erroring out seems clearer.
-  void set attributes(Map<String, String> value) {
-    throw new UnsupportedError(
-      "Attributes can't be set for document fragments.");
-  }
-
-  void set classes(Collection<String> value) {
-    throw new UnsupportedError(
-      "Classes can't be set for document fragments.");
-  }
-
-  void set dataAttributes(Map<String, String> value) {
-    throw new UnsupportedError(
-      "Data attributes can't be set for document fragments.");
-  }
-
-  void set contentEditable(String value) {
-    throw new UnsupportedError(
-      "Content editable can't be set for document fragments.");
-  }
-
-  String get dir {
-    throw new UnsupportedError(
-      "Document fragments don't support text direction.");
-  }
-
-  void set dir(String value) {
-    throw new UnsupportedError(
-      "Document fragments don't support text direction.");
-  }
-
-  void set draggable(bool value) {
-    throw new UnsupportedError(
-      "Draggable can't be set for document fragments.");
-  }
-
-  void set hidden(bool value) {
-    throw new UnsupportedError(
-      "Hidden can't be set for document fragments.");
-  }
-
-  void set id(String value) {
-    throw new UnsupportedError(
-      "ID can't be set for document fragments.");
-  }
-
-  String get lang {
-    throw new UnsupportedError(
-      "Document fragments don't support language.");
-  }
-
-  void set lang(String value) {
-    throw new UnsupportedError(
-      "Document fragments don't support language.");
-  }
-
-  void set scrollLeft(int value) {
-    throw new UnsupportedError(
-      "Document fragments don't support scrolling.");
-  }
-
-  void set scrollTop(int value) {
-    throw new UnsupportedError(
-      "Document fragments don't support scrolling.");
-  }
-
-  void set spellcheck(bool value) {
-     throw new UnsupportedError(
-      "Spellcheck can't be set for document fragments.");
-  }
-
-  void set translate(bool value) {
-     throw new UnsupportedError(
-      "Spellcheck can't be set for document fragments.");
-  }
-
-  void set tabIndex(int value) {
-    throw new UnsupportedError(
-      "Tab index can't be set for document fragments.");
-  }
-
-  void set title(String value) {
-    throw new UnsupportedError(
-      "Title can't be set for document fragments.");
-  }
-
-  void set webkitdropzone(String value) {
-    throw new UnsupportedError(
-      "WebKit drop zone can't be set for document fragments.");
-  }
-
-  void set webkitRegionOverflow(String value) {
-    throw new UnsupportedError(
-      "WebKit region overflow can't be set for document fragments.");
-  }
-
-
-  _ElementEventsImpl get on =>
-    new _ElementEventsImpl(this);
-
-  _ElementImpl $dom_querySelector(String selectors) native "querySelector";
-
-  List<Node> $dom_querySelectorAll(String selectors) native "querySelectorAll";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _DocumentImpl extends _NodeImpl implements Document
-    native "*HTMLDocument"
-{
-
-
-  _DocumentEventsImpl get on =>
-    new _DocumentEventsImpl(this);
-
-  final _ElementImpl activeElement;
-
-  _ElementImpl body;
-
-  String charset;
-
-  String cookie;
-
-  Window get window => _convertNativeToDart_Window(this._window);
-  Window get _window => JS("Window", "#.defaultView", this);
-
-  final _ElementImpl documentElement;
-
-  final String domain;
-
-  final _HeadElementImpl head;
-
-  final _DOMImplementationImpl implementation;
-
-  final String lastModified;
-
-  final String preferredStylesheetSet;
-
-  final String readyState;
-
-  final String referrer;
-
-  String selectedStylesheetSet;
-
-  final _StyleSheetListImpl styleSheets;
-
-  String title;
-
-  final _ElementImpl webkitCurrentFullScreenElement;
-
-  final bool webkitFullScreenKeyboardInputAllowed;
-
-  final _ElementImpl webkitFullscreenElement;
-
-  final bool webkitFullscreenEnabled;
-
-  final bool webkitHidden;
-
-  final bool webkitIsFullScreen;
-
-  final _ElementImpl webkitPointerLockElement;
-
-  final String webkitVisibilityState;
-
-  _RangeImpl caretRangeFromPoint(int x, int y) native;
-
-  _CDATASectionImpl createCDATASection(String data) native;
-
-  _DocumentFragmentImpl createDocumentFragment() native;
-
-  _ElementImpl $dom_createElement(String tagName) native "createElement";
-
-  _ElementImpl $dom_createElementNS(String namespaceURI, String qualifiedName) native "createElementNS";
-
-  _EventImpl $dom_createEvent(String eventType) native "createEvent";
-
-  _RangeImpl createRange() native;
-
-  _TextImpl $dom_createTextNode(String data) native "createTextNode";
-
-  _TouchImpl createTouch(_LocalWindowImpl window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) {
-    EventTarget target_1 = _convertDartToNative_EventTarget(target);
-    return _createTouch_1(window, target_1, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
-  }
-  _TouchImpl _createTouch_1(_LocalWindowImpl window, EventTarget target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "createTouch";
-
-  _TouchListImpl $dom_createTouchList() native "createTouchList";
-
-  _ElementImpl elementFromPoint(int x, int y) native;
-
-  bool execCommand(String command, bool userInterface, String value) native;
-
-  _CanvasRenderingContextImpl getCSSCanvasContext(String contextId, String name, int width, int height) native;
-
-  _ElementImpl $dom_getElementById(String elementId) native "getElementById";
-
-  List<Node> $dom_getElementsByClassName(String tagname) native "getElementsByClassName";
-
-  List<Node> $dom_getElementsByName(String elementName) native "getElementsByName";
-
-  List<Node> $dom_getElementsByTagName(String tagname) native "getElementsByTagName";
-
-  bool queryCommandEnabled(String command) native;
-
-  bool queryCommandIndeterm(String command) native;
-
-  bool queryCommandState(String command) native;
-
-  bool queryCommandSupported(String command) native;
-
-  String queryCommandValue(String command) native;
-
-  _ElementImpl $dom_querySelector(String selectors) native "querySelector";
-
-  List<Node> $dom_querySelectorAll(String selectors) native "querySelectorAll";
-
-  void webkitCancelFullScreen() native;
-
-  void webkitExitFullscreen() native;
-
-  void webkitExitPointerLock() native;
-
-  // TODO(jacobr): implement all Element methods not on Document.
-
-  _ElementImpl query(String selectors) {
-    // It is fine for our RegExp to detect element id query selectors to have
-    // false negatives but not false positives.
-    if (const RegExp("^#[_a-zA-Z]\\w*\$").hasMatch(selectors)) {
-      return $dom_getElementById(selectors.substring(1));
-    }
-    return $dom_querySelector(selectors);
-  }
-
-  List<Element> queryAll(String selectors) {
-    if (const RegExp("""^\\[name=["'][^'"]+['"]\\]\$""").hasMatch(selectors)) {
-      final mutableMatches = $dom_getElementsByName(
-          selectors.substring(7,selectors.length - 2));
-      int len = mutableMatches.length;
-      final copyOfMatches = new List<Element>(len);
-      for (int i = 0; i < len; ++i) {
-        copyOfMatches[i] = mutableMatches[i];
-      }
-      return new _FrozenElementList._wrap(copyOfMatches);
-    } else if (const RegExp("^[*a-zA-Z0-9]+\$").hasMatch(selectors)) {
-      final mutableMatches = $dom_getElementsByTagName(selectors);
-      int len = mutableMatches.length;
-      final copyOfMatches = new List<Element>(len);
-      for (int i = 0; i < len; ++i) {
-        copyOfMatches[i] = mutableMatches[i];
-      }
-      return new _FrozenElementList._wrap(copyOfMatches);
-    } else {
-      return new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
-    }
-  }
-}
-
-class _DocumentEventsImpl extends _ElementEventsImpl implements DocumentEvents {
-  _DocumentEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get beforeCopy => this['beforecopy'];
-
-  EventListenerList get beforeCut => this['beforecut'];
-
-  EventListenerList get beforePaste => this['beforepaste'];
-
-  EventListenerList get blur => this['blur'];
-
-  EventListenerList get change => this['change'];
-
-  EventListenerList get click => this['click'];
-
-  EventListenerList get contextMenu => this['contextmenu'];
-
-  EventListenerList get copy => this['copy'];
-
-  EventListenerList get cut => this['cut'];
-
-  EventListenerList get doubleClick => this['dblclick'];
-
-  EventListenerList get drag => this['drag'];
-
-  EventListenerList get dragEnd => this['dragend'];
-
-  EventListenerList get dragEnter => this['dragenter'];
-
-  EventListenerList get dragLeave => this['dragleave'];
-
-  EventListenerList get dragOver => this['dragover'];
-
-  EventListenerList get dragStart => this['dragstart'];
-
-  EventListenerList get drop => this['drop'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get focus => this['focus'];
-
-  EventListenerList get input => this['input'];
-
-  EventListenerList get invalid => this['invalid'];
-
-  EventListenerList get keyDown => this['keydown'];
-
-  EventListenerList get keyPress => this['keypress'];
-
-  EventListenerList get keyUp => this['keyup'];
-
-  EventListenerList get load => this['load'];
-
-  EventListenerList get mouseDown => this['mousedown'];
-
-  EventListenerList get mouseMove => this['mousemove'];
-
-  EventListenerList get mouseOut => this['mouseout'];
-
-  EventListenerList get mouseOver => this['mouseover'];
-
-  EventListenerList get mouseUp => this['mouseup'];
-
-  EventListenerList get mouseWheel => this['mousewheel'];
-
-  EventListenerList get paste => this['paste'];
-
-  EventListenerList get readyStateChange => this['readystatechange'];
-
-  EventListenerList get reset => this['reset'];
-
-  EventListenerList get scroll => this['scroll'];
-
-  EventListenerList get search => this['search'];
-
-  EventListenerList get select => this['select'];
-
-  EventListenerList get selectionChange => this['selectionchange'];
-
-  EventListenerList get selectStart => this['selectstart'];
-
-  EventListenerList get submit => this['submit'];
-
-  EventListenerList get touchCancel => this['touchcancel'];
-
-  EventListenerList get touchEnd => this['touchend'];
-
-  EventListenerList get touchMove => this['touchmove'];
-
-  EventListenerList get touchStart => this['touchstart'];
-
-  EventListenerList get fullscreenChange => this['webkitfullscreenchange'];
-
-  EventListenerList get fullscreenError => this['webkitfullscreenerror'];
-
-  EventListenerList get pointerLockChange => this['webkitpointerlockchange'];
-
-  EventListenerList get pointerLockError => this['webkitpointerlockerror'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DocumentType
-abstract class DocumentType implements Node {
-
-  /** @domName DocumentType.entities */
-  NamedNodeMap get entities;
-
-  /** @domName DocumentType.internalSubset */
-  String get internalSubset;
-
-  /** @domName DocumentType.name */
-  String get name;
-
-  /** @domName DocumentType.notations */
-  NamedNodeMap get notations;
-
-  /** @domName DocumentType.publicId */
-  String get publicId;
-
-  /** @domName DocumentType.systemId */
-  String get systemId;
-
-  /** @domName DocumentType.remove */
-  void remove();
-}
-
-class _DocumentTypeImpl extends _NodeImpl implements DocumentType native "*DocumentType" {
-
-  final _NamedNodeMapImpl entities;
-
-  final String internalSubset;
-
-  final String name;
-
-  final _NamedNodeMapImpl notations;
-
-  final String publicId;
-
-  final String systemId;
-
-  void remove() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName DynamicsCompressorNode
-abstract class DynamicsCompressorNode implements AudioNode {
-
-  /** @domName DynamicsCompressorNode.attack */
-  AudioParam get attack;
-
-  /** @domName DynamicsCompressorNode.knee */
-  AudioParam get knee;
-
-  /** @domName DynamicsCompressorNode.ratio */
-  AudioParam get ratio;
-
-  /** @domName DynamicsCompressorNode.reduction */
-  AudioParam get reduction;
-
-  /** @domName DynamicsCompressorNode.release */
-  AudioParam get release;
-
-  /** @domName DynamicsCompressorNode.threshold */
-  AudioParam get threshold;
-}
-
-class _DynamicsCompressorNodeImpl extends _AudioNodeImpl implements DynamicsCompressorNode native "*DynamicsCompressorNode" {
-
-  final _AudioParamImpl attack;
-
-  final _AudioParamImpl knee;
-
-  final _AudioParamImpl ratio;
-
-  final _AudioParamImpl reduction;
-
-  final _AudioParamImpl release;
-
-  final _AudioParamImpl threshold;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName EXTTextureFilterAnisotropic
-abstract class EXTTextureFilterAnisotropic {
-
-  static const int MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;
-
-  static const int TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE;
-}
-
-class _EXTTextureFilterAnisotropicImpl implements EXTTextureFilterAnisotropic native "*EXTTextureFilterAnisotropic" {
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/**
- * All your attribute manipulation needs in one place.
- * Extends the regular Map interface by automatically coercing non-string
- * values to strings.
- */
-abstract class AttributeMap implements Map<String, String> {
-  void operator []=(String key, value);
-}
-
-/**
- * All your element measurement needs in one place
- */
-abstract class ElementRect {
-  // Relative to offsetParent
-  ClientRect get client;
-  ClientRect get offset;
-  ClientRect get scroll;
-  // In global coords
-  ClientRect get bounding;
-  // In global coords
-  List<ClientRect> get clientRects;
-}
-
-abstract class NodeSelector {
-  Element query(String selectors);
-  List<Element> queryAll(String selectors);
-}
-
-abstract class CSSClassSet implements Set<String> {
-  /**
-   * Adds the class [token] to the element if it is not on it, removes it if it
-   * is.
-   */
-  bool toggle(String token);
-
-  /**
-   * Returns [:true:] classes cannot be added or removed from this
-   * [:CSSClassSet:].
-   */
-  bool get frozen;
-}
-
-/// @domName Element
-abstract class Element implements Node, NodeSelector {
-  factory Element.html(String html) =>
-      _ElementFactoryProvider.createElement_html(html);
-  factory Element.tag(String tag) =>
-      _ElementFactoryProvider.createElement_tag(tag);
-
-  AttributeMap get attributes;
-  void set attributes(Map<String, String> value);
-
-  /**
-   * @domName childElementCount, firstElementChild, lastElementChild,
-   *   children, Node.nodes.add
-   */
-  List<Element> get elements;
-
-  void set elements(Collection<Element> value);
-
-  /** @domName className, classList */
-  CSSClassSet get classes;
-
-  void set classes(Collection<String> value);
-
-  AttributeMap get dataAttributes;
-  void set dataAttributes(Map<String, String> value);
-
-  /**
-   * Adds the specified text as a text node after the last child of this.
-   */
-  void addText(String text);
-
-  /**
-   * Parses the specified text as HTML and adds the resulting node after the
-   * last child of this.
-   */
-  void addHTML(String html);
-
-  /**
-   * @domName getClientRects, getBoundingClientRect, clientHeight, clientWidth,
-   * clientTop, clientLeft, offsetHeight, offsetWidth, offsetTop, offsetLeft,
-   * scrollHeight, scrollWidth, scrollTop, scrollLeft
-   */
-  Future<ElementRect> get rect;
-
-  /** @domName Window.getComputedStyle */
-  Future<CSSStyleDeclaration> get computedStyle;
-
-  /** @domName Window.getComputedStyle */
-  Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement);
-
-  Element clone(bool deep);
-
-  Element get parent;
-
-  /**
-   * Experimental support for [web components][wc]. This field stores a
-   * reference to the component implementation. It was inspired by Mozilla's
-   * [x-tags][] project. Please note: in the future it may be possible to
-   * `extend Element` from your class, in which case this field will be
-   * deprecated and will simply return this [Element] object.
-   *
-   * [wc]: http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html
-   * [x-tags]: http://x-tags.org/
-   */
-  var xtag;
-
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  ElementEvents get on;
-
-  /** @domName HTMLElement.children */
-  HTMLCollection get $dom_children;
-
-  /** @domName HTMLElement.contentEditable */
-  String contentEditable;
-
-  /** @domName HTMLElement.dir */
-  String dir;
-
-  /** @domName HTMLElement.draggable */
-  bool draggable;
-
-  /** @domName HTMLElement.hidden */
-  bool hidden;
-
-  /** @domName HTMLElement.id */
-  String id;
-
-  /** @domName HTMLElement.innerHTML */
-  String innerHTML;
-
-  /** @domName HTMLElement.isContentEditable */
-  bool get isContentEditable;
-
-  /** @domName HTMLElement.lang */
-  String lang;
-
-  /** @domName HTMLElement.outerHTML */
-  String get outerHTML;
-
-  /** @domName HTMLElement.spellcheck */
-  bool spellcheck;
-
-  /** @domName HTMLElement.tabIndex */
-  int tabIndex;
-
-  /** @domName HTMLElement.title */
-  String title;
-
-  /** @domName HTMLElement.translate */
-  bool translate;
-
-  /** @domName HTMLElement.webkitdropzone */
-  String webkitdropzone;
-
-  /** @domName HTMLElement.click */
-  void click();
-
-  /** @domName HTMLElement.insertAdjacentElement */
-  Element insertAdjacentElement(String where, Element element);
-
-  /** @domName HTMLElement.insertAdjacentHTML */
-  void insertAdjacentHTML(String where, String html);
-
-  /** @domName HTMLElement.insertAdjacentText */
-  void insertAdjacentText(String where, String text);
-
-  static const int ALLOW_KEYBOARD_INPUT = 1;
-
-  /** @domName Element.childElementCount */
-  int get $dom_childElementCount;
-
-  /** @domName Element.className */
-  String $dom_className;
-
-  /** @domName Element.clientHeight */
-  int get clientHeight;
-
-  /** @domName Element.clientLeft */
-  int get clientLeft;
-
-  /** @domName Element.clientTop */
-  int get clientTop;
-
-  /** @domName Element.clientWidth */
-  int get clientWidth;
-
-  /** @domName Element.dataset */
-  Map<String, String> get dataset;
-
-  /** @domName Element.firstElementChild */
-  Element get $dom_firstElementChild;
-
-  /** @domName Element.lastElementChild */
-  Element get $dom_lastElementChild;
-
-  /** @domName Element.nextElementSibling */
-  Element get nextElementSibling;
-
-  /** @domName Element.offsetHeight */
-  int get offsetHeight;
-
-  /** @domName Element.offsetLeft */
-  int get offsetLeft;
-
-  /** @domName Element.offsetParent */
-  Element get offsetParent;
-
-  /** @domName Element.offsetTop */
-  int get offsetTop;
-
-  /** @domName Element.offsetWidth */
-  int get offsetWidth;
-
-  /** @domName Element.previousElementSibling */
-  Element get previousElementSibling;
-
-  /** @domName Element.scrollHeight */
-  int get scrollHeight;
-
-  /** @domName Element.scrollLeft */
-  int scrollLeft;
-
-  /** @domName Element.scrollTop */
-  int scrollTop;
-
-  /** @domName Element.scrollWidth */
-  int get scrollWidth;
-
-  /** @domName Element.style */
-  CSSStyleDeclaration get style;
-
-  /** @domName Element.tagName */
-  String get tagName;
-
-  /** @domName Element.blur */
-  void blur();
-
-  /** @domName Element.focus */
-  void focus();
-
-  /** @domName Element.getAttribute */
-  String $dom_getAttribute(String name);
-
-  /** @domName Element.getBoundingClientRect */
-  ClientRect getBoundingClientRect();
-
-  /** @domName Element.getClientRects */
-  List<ClientRect> getClientRects();
-
-  /** @domName Element.getElementsByClassName */
-  List<Node> $dom_getElementsByClassName(String name);
-
-  /** @domName Element.getElementsByTagName */
-  List<Node> $dom_getElementsByTagName(String name);
-
-  /** @domName Element.hasAttribute */
-  bool $dom_hasAttribute(String name);
-
-  /** @domName Element.querySelector */
-  Element $dom_querySelector(String selectors);
-
-  /** @domName Element.querySelectorAll */
-  List<Node> $dom_querySelectorAll(String selectors);
-
-  /** @domName Element.remove */
-  void remove();
-
-  /** @domName Element.removeAttribute */
-  void $dom_removeAttribute(String name);
-
-  /** @domName Element.scrollByLines */
-  void scrollByLines(int lines);
-
-  /** @domName Element.scrollByPages */
-  void scrollByPages(int pages);
-
-  /** @domName Element.scrollIntoViewIfNeeded */
-  void scrollIntoView([bool centerIfNeeded]);
-
-  /** @domName Element.setAttribute */
-  void $dom_setAttribute(String name, String value);
-
-  /** @domName Element.webkitMatchesSelector */
-  bool matchesSelector(String selectors);
-
-  /** @domName Element.webkitRequestFullScreen */
-  void webkitRequestFullScreen(int flags);
-
-  /** @domName Element.webkitRequestFullscreen */
-  void webkitRequestFullscreen();
-
-  /** @domName Element.webkitRequestPointerLock */
-  void webkitRequestPointerLock();
-
-}
-
-abstract class ElementEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get beforeCopy;
-
-  EventListenerList get beforeCut;
-
-  EventListenerList get beforePaste;
-
-  EventListenerList get blur;
-
-  EventListenerList get change;
-
-  EventListenerList get click;
-
-  EventListenerList get contextMenu;
-
-  EventListenerList get copy;
-
-  EventListenerList get cut;
-
-  EventListenerList get doubleClick;
-
-  EventListenerList get drag;
-
-  EventListenerList get dragEnd;
-
-  EventListenerList get dragEnter;
-
-  EventListenerList get dragLeave;
-
-  EventListenerList get dragOver;
-
-  EventListenerList get dragStart;
-
-  EventListenerList get drop;
-
-  EventListenerList get error;
-
-  EventListenerList get focus;
-
-  EventListenerList get input;
-
-  EventListenerList get invalid;
-
-  EventListenerList get keyDown;
-
-  EventListenerList get keyPress;
-
-  EventListenerList get keyUp;
-
-  EventListenerList get load;
-
-  EventListenerList get mouseDown;
-
-  EventListenerList get mouseMove;
-
-  EventListenerList get mouseOut;
-
-  EventListenerList get mouseOver;
-
-  EventListenerList get mouseUp;
-
-  EventListenerList get mouseWheel;
-
-  EventListenerList get paste;
-
-  EventListenerList get reset;
-
-  EventListenerList get scroll;
-
-  EventListenerList get search;
-
-  EventListenerList get select;
-
-  EventListenerList get selectStart;
-
-  EventListenerList get submit;
-
-  EventListenerList get touchCancel;
-
-  EventListenerList get touchEnd;
-
-  EventListenerList get touchEnter;
-
-  EventListenerList get touchLeave;
-
-  EventListenerList get touchMove;
-
-  EventListenerList get touchStart;
-
-  EventListenerList get transitionEnd;
-
-  EventListenerList get fullscreenChange;
-
-  EventListenerList get fullscreenError;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// TODO(jacobr): use _Lists.dart to remove some of the duplicated
-// functionality.
-class _ChildrenElementList implements List {
-  // Raw Element.
-  final _ElementImpl _element;
-  final _HTMLCollectionImpl _childElements;
-
-  _ChildrenElementList._wrap(_ElementImpl element)
-    : _childElements = element.$dom_children,
-      _element = element;
-
-  List<Element> _toList() {
-    final output = new List(_childElements.length);
-    for (int i = 0, len = _childElements.length; i < len; i++) {
-      output[i] = _childElements[i];
-    }
-    return output;
-  }
-
-  bool contains(Element element) => _childElements.contains(element);
-
-  void forEach(void f(Element element)) {
-    for (_ElementImpl element in _childElements) {
-      f(element);
-    }
-  }
-
-  List<Element> filter(bool f(Element element)) {
-    final output = [];
-    forEach((Element element) {
-      if (f(element)) {
-        output.add(element);
-      }
-    });
-    return new _FrozenElementList._wrap(output);
-  }
-
-  bool every(bool f(Element element)) {
-    for (Element element in this) {
-      if (!f(element)) {
-        return false;
-      }
-    };
-    return true;
-  }
-
-  bool some(bool f(Element element)) {
-    for (Element element in this) {
-      if (f(element)) {
-        return true;
-      }
-    };
-    return false;
-  }
-
-  Collection map(f(Element element)) {
-    final out = [];
-    for (Element el in this) {
-      out.add(f(el));
-    }
-    return out;
-  }
-
-  bool get isEmpty {
-    return _element.$dom_firstElementChild == null;
-  }
-
-  int get length {
-    return _childElements.length;
-  }
-
-  _ElementImpl operator [](int index) {
-    return _childElements[index];
-  }
-
-  void operator []=(int index, _ElementImpl value) {
-    _element.$dom_replaceChild(value, _childElements[index]);
-  }
-
-   void set length(int newLength) {
-     // TODO(jacobr): remove children when length is reduced.
-     throw new UnsupportedError('');
-   }
-
-  Element add(_ElementImpl value) {
-    _element.$dom_appendChild(value);
-    return value;
-  }
-
-  Element addLast(_ElementImpl value) => add(value);
-
-  Iterator<Element> iterator() => _toList().iterator();
-
-  void addAll(Collection<Element> collection) {
-    for (_ElementImpl element in collection) {
-      _element.$dom_appendChild(element);
-    }
-  }
-
-  void sort([Comparator<Element> compare = Comparable.compare]) {
-    throw new UnsupportedError('TODO(jacobr): should we impl?');
-  }
-
-  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
-    throw const NotImplementedException();
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw const NotImplementedException();
-  }
-
-  void insertRange(int start, int rangeLength, [initialValue = null]) {
-    throw const NotImplementedException();
-  }
-
-  List getRange(int start, int rangeLength) =>
-    new _FrozenElementList._wrap(_Lists.getRange(this, start, rangeLength,
-        []));
-
-  int indexOf(Element element, [int start = 0]) {
-    return _Lists.indexOf(this, element, start, this.length);
-  }
-
-  int lastIndexOf(Element element, [int start = null]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  void clear() {
-    // It is unclear if we want to keep non element nodes?
-    _element.text = '';
-  }
-
-  Element removeLast() {
-    final result = this.last;
-    if (result != null) {
-      _element.$dom_removeChild(result);
-    }
-    return result;
-  }
-
-  Element get last {
-    return _element.$dom_lastElementChild;
-  }
-}
-
-// TODO(jacobr): this is an inefficient implementation but it is hard to see
-// a better option given that we cannot quite force NodeList to be an
-// ElementList as there are valid cases where a NodeList JavaScript object
-// contains Node objects that are not Elements.
-class _FrozenElementList implements List {
-  final List<Node> _nodeList;
-
-  _FrozenElementList._wrap(this._nodeList);
-
-  Element get first {
-    return _nodeList[0];
-  }
-
-  bool contains(Element element) {
-    for (Element el in this) {
-      if (el == element) return true;
-    }
-    return false;
-  }
-
-  void forEach(void f(Element element)) {
-    for (Element el in this) {
-      f(el);
-    }
-  }
-
-  Collection map(f(Element element)) {
-    final out = [];
-    for (Element el in this) {
-      out.add(f(el));
-    }
-    return out;
-  }
-
-  List<Element> filter(bool f(Element element)) {
-    final out = [];
-    for (Element el in this) {
-      if (f(el)) out.add(el);
-    }
-    return out;
-  }
-
-  bool every(bool f(Element element)) {
-    for(Element element in this) {
-      if (!f(element)) {
-        return false;
-      }
-    };
-    return true;
-  }
-
-  bool some(bool f(Element element)) {
-    for(Element element in this) {
-      if (f(element)) {
-        return true;
-      }
-    };
-    return false;
-  }
-
-  bool get isEmpty => _nodeList.isEmpty;
-
-  int get length => _nodeList.length;
-
-  Element operator [](int index) => _nodeList[index];
-
-  void operator []=(int index, Element value) {
-    throw new UnsupportedError('');
-  }
-
-  void set length(int newLength) {
-    _nodeList.length = newLength;
-  }
-
-  void add(Element value) {
-    throw new UnsupportedError('');
-  }
-
-  void addLast(Element value) {
-    throw new UnsupportedError('');
-  }
-
-  Iterator<Element> iterator() => new _FrozenElementListIterator(this);
-
-  void addAll(Collection<Element> collection) {
-    throw new UnsupportedError('');
-  }
-
-  void sort([Comparator<Element> compare = Comparable.compare]) {
-    throw new UnsupportedError('');
-  }
-
-  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
-    throw new UnsupportedError('');
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError('');
-  }
-
-  void insertRange(int start, int rangeLength, [initialValue = null]) {
-    throw new UnsupportedError('');
-  }
-
-  List<Element> getRange(int start, int rangeLength) =>
-    new _FrozenElementList._wrap(_nodeList.getRange(start, rangeLength));
-
-  int indexOf(Element element, [int start = 0]) =>
-    _nodeList.indexOf(element, start);
-
-  int lastIndexOf(Element element, [int start = null]) =>
-    _nodeList.lastIndexOf(element, start);
-
-  void clear() {
-    throw new UnsupportedError('');
-  }
-
-  Element removeLast() {
-    throw new UnsupportedError('');
-  }
-
-  Element get last => _nodeList.last;
-}
-
-class _FrozenElementListIterator implements Iterator<Element> {
-  final _FrozenElementList _list;
-  int _index = 0;
-
-  _FrozenElementListIterator(this._list);
-
-  /**
-   * Gets the next element in the iteration. Throws a
-   * [StateError("No more elements")] if no element is left.
-   */
-  Element next() {
-    if (!hasNext) {
-      throw new StateError("No more elements");
-    }
-
-    return _list[_index++];
-  }
-
-  /**
-   * Returns whether the [Iterator] has elements left.
-   */
-  bool get hasNext => _index < _list.length;
-}
-
-class _ElementAttributeMap implements AttributeMap {
-
-  final _ElementImpl _element;
-
-  _ElementAttributeMap(this._element);
-
-  bool containsValue(String value) {
-    final attributes = _element.$dom_attributes;
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      if(value == attributes[i].value) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  bool containsKey(String key) {
-    return _element.$dom_hasAttribute(key);
-  }
-
-  String operator [](String key) {
-    return _element.$dom_getAttribute(key);
-  }
-
-  void operator []=(String key, value) {
-    _element.$dom_setAttribute(key, '$value');
-  }
-
-  String putIfAbsent(String key, String ifAbsent()) {
-    if (!containsKey(key)) {
-      this[key] = ifAbsent();
-    }
-    return this[key];
-  }
-
-  String remove(String key) {
-    String value = _element.$dom_getAttribute(key);
-    _element.$dom_removeAttribute(key);
-    return value;
-  }
-
-  void clear() {
-    final attributes = _element.$dom_attributes;
-    for (int i = attributes.length - 1; i >= 0; i--) {
-      remove(attributes[i].name);
-    }
-  }
-
-  void forEach(void f(String key, String value)) {
-    final attributes = _element.$dom_attributes;
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      final item = attributes[i];
-      f(item.name, item.value);
-    }
-  }
-
-  Collection<String> get keys {
-    // TODO(jacobr): generate a lazy collection instead.
-    final attributes = _element.$dom_attributes;
-    final keys = new List<String>(attributes.length);
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      keys[i] = attributes[i].name;
-    }
-    return keys;
-  }
-
-  Collection<String> get values {
-    // TODO(jacobr): generate a lazy collection instead.
-    final attributes = _element.$dom_attributes;
-    final values = new List<String>(attributes.length);
-    for (int i = 0, len = attributes.length; i < len; i++) {
-      values[i] = attributes[i].value;
-    }
-    return values;
-  }
-
-  /**
-   * The number of {key, value} pairs in the map.
-   */
-  int get length {
-    return _element.$dom_attributes.length;
-  }
-
-  /**
-   * Returns true if there is no {key, value} pair in the map.
-   */
-  bool get isEmpty {
-    return length == 0;
-  }
-}
-
-/**
- * Provides a Map abstraction on top of data-* attributes, similar to the
- * dataSet in the old DOM.
- */
-class _DataAttributeMap implements AttributeMap {
-
-  final Map<String, String> $dom_attributes;
-
-  _DataAttributeMap(this.$dom_attributes);
-
-  // interface Map
-
-  // TODO: Use lazy iterator when it is available on Map.
-  bool containsValue(String value) => values.some((v) => v == value);
-
-  bool containsKey(String key) => $dom_attributes.containsKey(_attr(key));
-
-  String operator [](String key) => $dom_attributes[_attr(key)];
-
-  void operator []=(String key, value) {
-    $dom_attributes[_attr(key)] = '$value';
-  }
-
-  String putIfAbsent(String key, String ifAbsent()) =>
-    $dom_attributes.putIfAbsent(_attr(key), ifAbsent);
-
-  String remove(String key) => $dom_attributes.remove(_attr(key));
-
-  void clear() {
-    // Needs to operate on a snapshot since we are mutating the collection.
-    for (String key in keys) {
-      remove(key);
-    }
-  }
-
-  void forEach(void f(String key, String value)) {
-    $dom_attributes.forEach((String key, String value) {
-      if (_matches(key)) {
-        f(_strip(key), value);
-      }
-    });
-  }
-
-  Collection<String> get keys {
-    final keys = new List<String>();
-    $dom_attributes.forEach((String key, String value) {
-      if (_matches(key)) {
-        keys.add(_strip(key));
-      }
-    });
-    return keys;
-  }
-
-  Collection<String> get values {
-    final values = new List<String>();
-    $dom_attributes.forEach((String key, String value) {
-      if (_matches(key)) {
-        values.add(value);
-      }
-    });
-    return values;
-  }
-
-  int get length => keys.length;
-
-  // TODO: Use lazy iterator when it is available on Map.
-  bool get isEmpty => length == 0;
-
-  // Helpers.
-  String _attr(String key) => 'data-$key';
-  bool _matches(String key) => key.startsWith('data-');
-  String _strip(String key) => key.substring(5);
-}
-
-class _CssClassSet implements CSSClassSet {
-
-  final _ElementImpl _element;
-
-  _CssClassSet(this._element);
-
-  String toString() => _formatSet(_read());
-
-  // interface Iterable - BEGIN
-  Iterator<String> iterator() => _read().iterator();
-  // interface Iterable - END
-
-  // interface Collection - BEGIN
-  void forEach(void f(String element)) {
-    _read().forEach(f);
-  }
-
-  Collection map(f(String element)) => _read().map(f);
-
-  Collection<String> filter(bool f(String element)) => _read().filter(f);
-
-  bool every(bool f(String element)) => _read().every(f);
-
-  bool some(bool f(String element)) => _read().some(f);
-
-  bool get isEmpty => _read().isEmpty;
-
-  bool get frozen => false;
-
-  int get length =>_read().length;
-
-  // interface Collection - END
-
-  // interface Set - BEGIN
-  bool contains(String value) => _read().contains(value);
-
-  void add(String value) {
-    // TODO - figure out if we need to do any validation here
-    // or if the browser natively does enough
-    _modify((s) => s.add(value));
-  }
-
-  bool remove(String value) {
-    Set<String> s = _read();
-    bool result = s.remove(value);
-    _write(s);
-    return result;
-  }
-
-  bool toggle(String value) {
-    Set<String> s = _read();
-    bool result = false;
-    if (s.contains(value)) {
-      s.remove(value);
-    } else {
-      s.add(value);
-      result = true;
-    }
-    _write(s);
-    return result;
-  }
-
-  void addAll(Collection<String> collection) {
-    // TODO - see comment above about validation
-    _modify((s) => s.addAll(collection));
-  }
-
-  void removeAll(Collection<String> collection) {
-    _modify((s) => s.removeAll(collection));
-  }
-
-  bool isSubsetOf(Collection<String> collection) =>
-    _read().isSubsetOf(collection);
-
-  bool containsAll(Collection<String> collection) =>
-    _read().containsAll(collection);
-
-  Set<String> intersection(Collection<String> other) =>
-    _read().intersection(other);
-
-  void clear() {
-    _modify((s) => s.clear());
-  }
-  // interface Set - END
-
-  /**
-   * Helper method used to modify the set of css classes on this element.
-   *
-   *   f - callback with:
-   *      s - a Set of all the css class name currently on this element.
-   *
-   *   After f returns, the modified set is written to the
-   *       className property of this element.
-   */
-  void _modify( f(Set<String> s)) {
-    Set<String> s = _read();
-    f(s);
-    _write(s);
-  }
-
-  /**
-   * Read the class names from the Element class property,
-   * and put them into a set (duplicates are discarded).
-   */
-  Set<String> _read() {
-    // TODO(mattsh) simplify this once split can take regex.
-    Set<String> s = new Set<String>();
-    for (String name in _classname().split(' ')) {
-      String trimmed = name.trim();
-      if (!trimmed.isEmpty) {
-        s.add(trimmed);
-      }
-    }
-    return s;
-  }
-
-  /**
-   * Read the class names as a space-separated string. This is meant to be
-   * overridden by subclasses.
-   */
-  String _classname() => _element.$dom_className;
-
-  /**
-   * Join all the elements of a set into one string and write
-   * back to the element.
-   */
-  void _write(Set s) {
-    _element.$dom_className = _formatSet(s);
-  }
-
-  String _formatSet(Set<String> s) {
-    // TODO(mattsh) should be able to pass Set to String.joins http:/b/5398605
-    List list = new List.from(s);
-    return Strings.join(list, ' ');
-  }
-}
-
-class _SimpleClientRect implements ClientRect {
-  final num left;
-  final num top;
-  final num width;
-  final num height;
-  num get right => left + width;
-  num get bottom => top + height;
-
-  const _SimpleClientRect(this.left, this.top, this.width, this.height);
-
-  bool operator ==(ClientRect other) {
-    return other != null && left == other.left && top == other.top
-        && width == other.width && height == other.height;
-  }
-
-  String toString() => "($left, $top, $width, $height)";
-}
-
-// TODO(jacobr): we cannot currently be lazy about calculating the client
-// rects as we must perform all measurement queries at a safe point to avoid
-// triggering unneeded layouts.
-/**
- * All your element measurement needs in one place
- * @domName none
- */
-class _ElementRectImpl implements ElementRect {
-  final ClientRect client;
-  final ClientRect offset;
-  final ClientRect scroll;
-
-  // TODO(jacobr): should we move these outside of ElementRect to avoid the
-  // overhead of computing them every time even though they are rarely used.
-  final _ClientRectImpl _boundingClientRect;
-  final _ClientRectListImpl _clientRects;
-
-  _ElementRectImpl(_ElementImpl element) :
-    client = new _SimpleClientRect(element.clientLeft,
-                                  element.clientTop,
-                                  element.clientWidth,
-                                  element.clientHeight),
-    offset = new _SimpleClientRect(element.offsetLeft,
-                                  element.offsetTop,
-                                  element.offsetWidth,
-                                  element.offsetHeight),
-    scroll = new _SimpleClientRect(element.scrollLeft,
-                                  element.scrollTop,
-                                  element.scrollWidth,
-                                  element.scrollHeight),
-    _boundingClientRect = element.getBoundingClientRect(),
-    _clientRects = element.getClientRects();
-
-  _ClientRectImpl get bounding => _boundingClientRect;
-
-  // TODO(jacobr): cleanup.
-  List<ClientRect> get clientRects {
-    final out = new List(_clientRects.length);
-    for (num i = 0; i < _clientRects.length; i++) {
-      out[i] = _clientRects.item(i);
-    }
-    return out;
-  }
-}
-
-class _ElementImpl extends _NodeImpl implements Element native "*Element" {
-
-  /**
-   * @domName Element.hasAttribute, Element.getAttribute, Element.setAttribute,
-   *   Element.removeAttribute
-   */
-  _ElementAttributeMap get attributes => new _ElementAttributeMap(this);
-
-  void set attributes(Map<String, String> value) {
-    Map<String, String> attributes = this.attributes;
-    attributes.clear();
-    for (String key in value.keys) {
-      attributes[key] = value[key];
-    }
-  }
-
-  void set elements(Collection<Element> value) {
-    final elements = this.elements;
-    elements.clear();
-    elements.addAll(value);
-  }
-
-  List<Element> get elements => new _ChildrenElementList._wrap(this);
-
-  _ElementImpl query(String selectors) => $dom_querySelector(selectors);
-
-  List<Element> queryAll(String selectors) =>
-    new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
-
-  _CssClassSet get classes => new _CssClassSet(this);
-
-  void set classes(Collection<String> value) {
-    _CssClassSet classSet = classes;
-    classSet.clear();
-    classSet.addAll(value);
-  }
-
-  Map<String, String> get dataAttributes =>
-    new _DataAttributeMap(attributes);
-
-  void set dataAttributes(Map<String, String> value) {
-    final dataAttributes = this.dataAttributes;
-    dataAttributes.clear();
-    for (String key in value.keys) {
-      dataAttributes[key] = value[key];
-    }
-  }
-
-  Future<ElementRect> get rect {
-    return _createMeasurementFuture(
-        () => new _ElementRectImpl(this),
-        new Completer<ElementRect>());
-  }
-
-  Future<CSSStyleDeclaration> get computedStyle {
-     // TODO(jacobr): last param should be null, see b/5045788
-     return getComputedStyle('');
-  }
-
-  Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement) {
-    return _createMeasurementFuture(
-        () => _window.$dom_getComputedStyle(this, pseudoElement),
-        new Completer<CSSStyleDeclaration>());
-  }
-
-  void addText(String text) {
-    this.insertAdjacentText('beforeend', text);
-  }
-
-  void addHTML(String text) {
-    this.insertAdjacentHTML('beforeend', text);
-  }
-
-  // Hooks to support custom WebComponents.
-  var xtag;
-
-  // TODO(vsm): Implement noSuchMethod or similar for dart2js.
-
-  /** @domName Element.insertAdjacentText */
-  void insertAdjacentText(String where, String text) {
-    if (JS('bool', '!!#.insertAdjacentText', this)) {
-      _insertAdjacentText(where, text);
-    } else {
-      _insertAdjacentNode(where, new Text(text));
-    }
-  }
-
-  void _insertAdjacentText(String where, String text)
-      native 'insertAdjacentText';
-
-  /** @domName Element.insertAdjacentHTML */
-  void insertAdjacentHTML(String where, String text) {
-    if (JS('bool', '!!#.insertAdjacentHTML', this)) {
-      _insertAdjacentHTML(where, text);
-    } else {
-      _insertAdjacentNode(where, new DocumentFragment.html(text));
-    }
-  }
-
-  void _insertAdjacentHTML(String where, String text)
-      native 'insertAdjacentHTML';
-
-  /** @domName Element.insertAdjacentHTML */
-  Element insertAdjacentElement(String where, Element element) {
-    if (JS('bool', '!!#.insertAdjacentElement', this)) {
-      _insertAdjacentElement(where, element);
-    } else {
-      _insertAdjacentNode(where, element);
-    }
-    return element;
-  }
-
-  void _insertAdjacentElement(String where, Element element)
-      native 'insertAdjacentElement';
-
-  void _insertAdjacentNode(String where, Node node) {
-    switch (where.toLowerCase()) {
-      case 'beforebegin':
-        this.parent.insertBefore(node, this);
-        break;
-      case 'afterbegin':
-        var first = this.nodes.length > 0 ? this.nodes[0] : null;
-        this.insertBefore(node, first);
-        break;
-      case 'beforeend':
-        this.nodes.add(node);
-        break;
-      case 'afterend':
-        this.parent.insertBefore(node, this.nextNode);
-        break;
-      default:
-        throw new ArgumentError("Invalid position ${where}");
-    }
-  }
-
-
-  _ElementEventsImpl get on =>
-    new _ElementEventsImpl(this);
-
-  _HTMLCollectionImpl get $dom_children => JS("_HTMLCollectionImpl", "#.children", this);
-
-  String contentEditable;
-
-  String dir;
-
-  bool draggable;
-
-  bool hidden;
-
-  String id;
-
-  String innerHTML;
-
-  final bool isContentEditable;
-
-  String lang;
-
-  final String outerHTML;
-
-  bool spellcheck;
-
-  int tabIndex;
-
-  String title;
-
-  bool translate;
-
-  String webkitdropzone;
-
-  void click() native;
-
-  int get $dom_childElementCount => JS("int", "#.childElementCount", this);
-
-  String get $dom_className => JS("String", "#.className", this);
-
-  void set $dom_className(String value) {
-    JS("void", "#.className = #", this, value);
-  }
-
-  final int clientHeight;
-
-  final int clientLeft;
-
-  final int clientTop;
-
-  final int clientWidth;
-
-  final Map<String, String> dataset;
-
-  _ElementImpl get $dom_firstElementChild => JS("_ElementImpl", "#.firstElementChild", this);
-
-  _ElementImpl get $dom_lastElementChild => JS("_ElementImpl", "#.lastElementChild", this);
-
-  final _ElementImpl nextElementSibling;
-
-  final int offsetHeight;
-
-  final int offsetLeft;
-
-  final _ElementImpl offsetParent;
-
-  final int offsetTop;
-
-  final int offsetWidth;
-
-  final _ElementImpl previousElementSibling;
-
-  final int scrollHeight;
-
-  int scrollLeft;
-
-  int scrollTop;
-
-  final int scrollWidth;
-
-  final _CSSStyleDeclarationImpl style;
-
-  final String tagName;
-
-  void blur() native;
-
-  void focus() native;
-
-  String $dom_getAttribute(String name) native "getAttribute";
-
-  _ClientRectImpl getBoundingClientRect() native;
-
-  _ClientRectListImpl getClientRects() native;
-
-  List<Node> $dom_getElementsByClassName(String name) native "getElementsByClassName";
-
-  List<Node> $dom_getElementsByTagName(String name) native "getElementsByTagName";
-
-  bool $dom_hasAttribute(String name) native "hasAttribute";
-
-  _ElementImpl $dom_querySelector(String selectors) native "querySelector";
-
-  List<Node> $dom_querySelectorAll(String selectors) native "querySelectorAll";
-
-  void $dom_removeAttribute(String name) native "removeAttribute";
-
-  void scrollByLines(int lines) native;
-
-  void scrollByPages(int pages) native;
-
-  void scrollIntoView([bool centerIfNeeded]) native "scrollIntoViewIfNeeded";
-
-  void $dom_setAttribute(String name, String value) native "setAttribute";
-
-  bool matchesSelector(String selectors) native "webkitMatchesSelector";
-
-  void webkitRequestFullScreen(int flags) native;
-
-  void webkitRequestFullscreen() native;
-
-  void webkitRequestPointerLock() native;
-
-}
-
-// Temporary dispatch hook to support WebComponents.
-Function dynamicUnknownElementDispatcher;
-
-final _START_TAG_REGEXP = const RegExp('<(\\w+)');
-class _ElementFactoryProvider {
-  static final _CUSTOM_PARENT_TAG_MAP = const {
-    'body' : 'html',
-    'head' : 'html',
-    'caption' : 'table',
-    'td': 'tr',
-    'colgroup': 'table',
-    'col' : 'colgroup',
-    'tr' : 'tbody',
-    'tbody' : 'table',
-    'tfoot' : 'table',
-    'thead' : 'table',
-    'track' : 'audio',
-  };
-
-  /** @domName Document.createElement */
-  static Element createElement_html(String html) {
-    // TODO(jacobr): this method can be made more robust and performant.
-    // 1) Cache the dummy parent elements required to use innerHTML rather than
-    //    creating them every call.
-    // 2) Verify that the html does not contain leading or trailing text nodes.
-    // 3) Verify that the html does not contain both <head> and <body> tags.
-    // 4) Detatch the created element from its dummy parent.
-    String parentTag = 'div';
-    String tag;
-    final match = _START_TAG_REGEXP.firstMatch(html);
-    if (match != null) {
-      tag = match.group(1).toLowerCase();
-      if (_CUSTOM_PARENT_TAG_MAP.containsKey(tag)) {
-        parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
-      }
-    }
-    final _ElementImpl temp = new Element.tag(parentTag);
-    temp.innerHTML = html;
-
-    Element element;
-    if (temp.elements.length == 1) {
-      element = temp.elements[0];
-    } else if (parentTag == 'html' && temp.elements.length == 2) {
-      // Work around for edge case in WebKit and possibly other browsers where
-      // both body and head elements are created even though the inner html
-      // only contains a head or body element.
-      element = temp.elements[tag == 'head' ? 0 : 1];
-    } else {
-      throw new ArgumentError('HTML had ${temp.elements.length} '
-          'top level elements but 1 expected');
-    }
-    element.remove();
-    return element;
-  }
-
-  /** @domName Document.createElement */
-  // Optimization to improve performance until the dart2js compiler inlines this
-  // method.
-  static Element createElement_tag(String tag) =>
-      JS('Element', 'document.createElement(#)', tag);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _ElementEventsImpl extends _EventsImpl implements ElementEvents {
-  _ElementEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get beforeCopy => this['beforecopy'];
-
-  EventListenerList get beforeCut => this['beforecut'];
-
-  EventListenerList get beforePaste => this['beforepaste'];
-
-  EventListenerList get blur => this['blur'];
-
-  EventListenerList get change => this['change'];
-
-  EventListenerList get click => this['click'];
-
-  EventListenerList get contextMenu => this['contextmenu'];
-
-  EventListenerList get copy => this['copy'];
-
-  EventListenerList get cut => this['cut'];
-
-  EventListenerList get doubleClick => this['dblclick'];
-
-  EventListenerList get drag => this['drag'];
-
-  EventListenerList get dragEnd => this['dragend'];
-
-  EventListenerList get dragEnter => this['dragenter'];
-
-  EventListenerList get dragLeave => this['dragleave'];
-
-  EventListenerList get dragOver => this['dragover'];
-
-  EventListenerList get dragStart => this['dragstart'];
-
-  EventListenerList get drop => this['drop'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get focus => this['focus'];
-
-  EventListenerList get input => this['input'];
-
-  EventListenerList get invalid => this['invalid'];
-
-  EventListenerList get keyDown => this['keydown'];
-
-  EventListenerList get keyPress => this['keypress'];
-
-  EventListenerList get keyUp => this['keyup'];
-
-  EventListenerList get load => this['load'];
-
-  EventListenerList get mouseDown => this['mousedown'];
-
-  EventListenerList get mouseMove => this['mousemove'];
-
-  EventListenerList get mouseOut => this['mouseout'];
-
-  EventListenerList get mouseOver => this['mouseover'];
-
-  EventListenerList get mouseUp => this['mouseup'];
-
-  EventListenerList get paste => this['paste'];
-
-  EventListenerList get reset => this['reset'];
-
-  EventListenerList get scroll => this['scroll'];
-
-  EventListenerList get search => this['search'];
-
-  EventListenerList get select => this['select'];
-
-  EventListenerList get selectStart => this['selectstart'];
-
-  EventListenerList get submit => this['submit'];
-
-  EventListenerList get touchCancel => this['touchcancel'];
-
-  EventListenerList get touchEnd => this['touchend'];
-
-  EventListenerList get touchEnter => this['touchenter'];
-
-  EventListenerList get touchLeave => this['touchleave'];
-
-  EventListenerList get touchMove => this['touchmove'];
-
-  EventListenerList get touchStart => this['touchstart'];
-
-  EventListenerList get transitionEnd => this['webkitTransitionEnd'];
-
-  EventListenerList get fullscreenChange => this['webkitfullscreenchange'];
-
-  EventListenerList get fullscreenError => this['webkitfullscreenerror'];
-
-  EventListenerList get mouseWheel {
-    if (JS('bool', '#.onwheel !== undefined', _ptr)) {
-      // W3C spec, and should be IE9+, but IE has a bug exposing onwheel.
-      return this['wheel'];
-    } else if (JS('bool', '#.onmousewheel !== undefined', _ptr)) {
-      // Chrome & IE
-      return this['mousewheel'];
-    } else {
-      // Firefox
-      return this['DOMMouseScroll'];
-    }
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ElementTimeControl
-abstract class ElementTimeControl {
-
-  /** @domName ElementTimeControl.beginElement */
-  void beginElement();
-
-  /** @domName ElementTimeControl.beginElementAt */
-  void beginElementAt(num offset);
-
-  /** @domName ElementTimeControl.endElement */
-  void endElement();
-
-  /** @domName ElementTimeControl.endElementAt */
-  void endElementAt(num offset);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ElementTraversal
-abstract class ElementTraversal {
-
-  /** @domName ElementTraversal.childElementCount */
-  int get childElementCount;
-
-  /** @domName ElementTraversal.firstElementChild */
-  Element get firstElementChild;
-
-  /** @domName ElementTraversal.lastElementChild */
-  Element get lastElementChild;
-
-  /** @domName ElementTraversal.nextElementSibling */
-  Element get nextElementSibling;
-
-  /** @domName ElementTraversal.previousElementSibling */
-  Element get previousElementSibling;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLEmbedElement
-abstract class EmbedElement implements Element {
-
-  factory EmbedElement() => _Elements.createEmbedElement();
-
-  /** @domName HTMLEmbedElement.align */
-  String align;
-
-  /** @domName HTMLEmbedElement.height */
-  String height;
-
-  /** @domName HTMLEmbedElement.name */
-  String name;
-
-  /** @domName HTMLEmbedElement.src */
-  String src;
-
-  /** @domName HTMLEmbedElement.type */
-  String type;
-
-  /** @domName HTMLEmbedElement.width */
-  String width;
-}
-
-class _EmbedElementImpl extends _ElementImpl implements EmbedElement native "*HTMLEmbedElement" {
-
-  String align;
-
-  String height;
-
-  String name;
-
-  String src;
-
-  String type;
-
-  String width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName EntityReference
-abstract class EntityReference implements Node {
-}
-
-class _EntityReferenceImpl extends _NodeImpl implements EntityReference native "*EntityReference" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void EntriesCallback(List<Entry> entries);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Entry
-abstract class Entry {
-
-  /** @domName Entry.filesystem */
-  DOMFileSystem get filesystem;
-
-  /** @domName Entry.fullPath */
-  String get fullPath;
-
-  /** @domName Entry.isDirectory */
-  bool get isDirectory;
-
-  /** @domName Entry.isFile */
-  bool get isFile;
-
-  /** @domName Entry.name */
-  String get name;
-
-  /** @domName Entry.copyTo */
-  void copyTo(DirectoryEntry parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]);
-
-  /** @domName Entry.getMetadata */
-  void getMetadata(MetadataCallback successCallback, [ErrorCallback errorCallback]);
-
-  /** @domName Entry.getParent */
-  void getParent([EntryCallback successCallback, ErrorCallback errorCallback]);
-
-  /** @domName Entry.moveTo */
-  void moveTo(DirectoryEntry parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]);
-
-  /** @domName Entry.remove */
-  void remove(VoidCallback successCallback, [ErrorCallback errorCallback]);
-
-  /** @domName Entry.toURL */
-  String toURL();
-}
-
-class _EntryArrayImpl implements List<Entry>, JavaScriptIndexingBehavior native "*EntryArray" {
-
-  final int length;
-
-  _EntryImpl operator[](int index) => JS("_EntryImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _EntryImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<Entry> mixins.
-  // Entry is the element type.
-
-  // From Iterable<Entry>:
-
-  Iterator<Entry> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<Entry>(this);
-  }
-
-  // From Collection<Entry>:
-
-  void add(Entry value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(Entry value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<Entry> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(Entry element) => _Collections.contains(this, element);
-
-  void forEach(void f(Entry element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Entry element)) => _Collections.map(this, [], f);
-
-  Collection<Entry> filter(bool f(Entry element)) =>
-     _Collections.filter(this, <Entry>[], f);
-
-  bool every(bool f(Entry element)) => _Collections.every(this, f);
-
-  bool some(bool f(Entry element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Entry>:
-
-  void sort([Comparator<Entry> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Entry element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Entry element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  Entry get last => this[length - 1];
-
-  Entry removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<Entry> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [Entry initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<Entry> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <Entry>[]);
-
-  // -- end List<Entry> mixins.
-
-  _EntryImpl item(int index) native;
-}
-
-class _EntryArraySyncImpl implements List<EntrySync>, JavaScriptIndexingBehavior native "*EntryArraySync" {
-
-  final int length;
-
-  _EntrySyncImpl operator[](int index) => JS("_EntrySyncImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _EntrySyncImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<EntrySync> mixins.
-  // EntrySync is the element type.
-
-  // From Iterable<EntrySync>:
-
-  Iterator<EntrySync> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<EntrySync>(this);
-  }
-
-  // From Collection<EntrySync>:
-
-  void add(EntrySync value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(EntrySync value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<EntrySync> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(EntrySync element) => _Collections.contains(this, element);
-
-  void forEach(void f(EntrySync element)) => _Collections.forEach(this, f);
-
-  Collection map(f(EntrySync element)) => _Collections.map(this, [], f);
-
-  Collection<EntrySync> filter(bool f(EntrySync element)) =>
-     _Collections.filter(this, <EntrySync>[], f);
-
-  bool every(bool f(EntrySync element)) => _Collections.every(this, f);
-
-  bool some(bool f(EntrySync element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<EntrySync>:
-
-  void sort([Comparator<EntrySync> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(EntrySync element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(EntrySync element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  EntrySync get last => this[length - 1];
-
-  EntrySync removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<EntrySync> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [EntrySync initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<EntrySync> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <EntrySync>[]);
-
-  // -- end List<EntrySync> mixins.
-
-  _EntrySyncImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void EntryCallback(Entry entry);
-
-class _EntryImpl implements Entry native "*Entry" {
-
-  final _DOMFileSystemImpl filesystem;
-
-  final String fullPath;
-
-  final bool isDirectory;
-
-  final bool isFile;
-
-  final String name;
-
-  void copyTo(_DirectoryEntryImpl parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]) native;
-
-  void getMetadata(MetadataCallback successCallback, [ErrorCallback errorCallback]) native;
-
-  void getParent([EntryCallback successCallback, ErrorCallback errorCallback]) native;
-
-  void moveTo(_DirectoryEntryImpl parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]) native;
-
-  void remove(VoidCallback successCallback, [ErrorCallback errorCallback]) native;
-
-  String toURL() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName EntrySync
-abstract class EntrySync {
-
-  /** @domName EntrySync.filesystem */
-  DOMFileSystemSync get filesystem;
-
-  /** @domName EntrySync.fullPath */
-  String get fullPath;
-
-  /** @domName EntrySync.isDirectory */
-  bool get isDirectory;
-
-  /** @domName EntrySync.isFile */
-  bool get isFile;
-
-  /** @domName EntrySync.name */
-  String get name;
-
-  /** @domName EntrySync.copyTo */
-  EntrySync copyTo(DirectoryEntrySync parent, String name);
-
-  /** @domName EntrySync.getMetadata */
-  Metadata getMetadata();
-
-  /** @domName EntrySync.getParent */
-  EntrySync getParent();
-
-  /** @domName EntrySync.moveTo */
-  EntrySync moveTo(DirectoryEntrySync parent, String name);
-
-  /** @domName EntrySync.remove */
-  void remove();
-
-  /** @domName EntrySync.toURL */
-  String toURL();
-}
-
-class _EntrySyncImpl implements EntrySync native "*EntrySync" {
-
-  final _DOMFileSystemSyncImpl filesystem;
-
-  final String fullPath;
-
-  final bool isDirectory;
-
-  final bool isFile;
-
-  final String name;
-
-  _EntrySyncImpl copyTo(_DirectoryEntrySyncImpl parent, String name) native;
-
-  _MetadataImpl getMetadata() native;
-
-  _EntrySyncImpl getParent() native;
-
-  _EntrySyncImpl moveTo(_DirectoryEntrySyncImpl parent, String name) native;
-
-  void remove() native;
-
-  String toURL() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void ErrorCallback(FileError error);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ErrorEvent
-abstract class ErrorEvent implements Event {
-
-  /** @domName ErrorEvent.filename */
-  String get filename;
-
-  /** @domName ErrorEvent.lineno */
-  int get lineno;
-
-  /** @domName ErrorEvent.message */
-  String get message;
-}
-
-class _ErrorEventImpl extends _EventImpl implements ErrorEvent native "*ErrorEvent" {
-
-  final String filename;
-
-  final int lineno;
-
-  final String message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName Event
-abstract class Event {
-
-  // In JS, canBubble and cancelable are technically required parameters to
-  // init*Event. In practice, though, if they aren't provided they simply
-  // default to false (since that's Boolean(undefined)).
-  //
-  // Contrary to JS, we default canBubble and cancelable to true, since that's
-  // what people want most of the time anyway.
-  factory Event(String type, [bool canBubble = true, bool cancelable = true]) =>
-      _EventFactoryProvider.createEvent(type, canBubble, cancelable);
-
-  static const int AT_TARGET = 2;
-
-  static const int BLUR = 8192;
-
-  static const int BUBBLING_PHASE = 3;
-
-  static const int CAPTURING_PHASE = 1;
-
-  static const int CHANGE = 32768;
-
-  static const int CLICK = 64;
-
-  static const int DBLCLICK = 128;
-
-  static const int DRAGDROP = 2048;
-
-  static const int FOCUS = 4096;
-
-  static const int KEYDOWN = 256;
-
-  static const int KEYPRESS = 1024;
-
-  static const int KEYUP = 512;
-
-  static const int MOUSEDOWN = 1;
-
-  static const int MOUSEDRAG = 32;
-
-  static const int MOUSEMOVE = 16;
-
-  static const int MOUSEOUT = 8;
-
-  static const int MOUSEOVER = 4;
-
-  static const int MOUSEUP = 2;
-
-  static const int NONE = 0;
-
-  static const int SELECT = 16384;
-
-  /** @domName Event.bubbles */
-  bool get bubbles;
-
-  /** @domName Event.cancelBubble */
-  bool cancelBubble;
-
-  /** @domName Event.cancelable */
-  bool get cancelable;
-
-  /** @domName Event.clipboardData */
-  Clipboard get clipboardData;
-
-  /** @domName Event.currentTarget */
-  EventTarget get currentTarget;
-
-  /** @domName Event.defaultPrevented */
-  bool get defaultPrevented;
-
-  /** @domName Event.eventPhase */
-  int get eventPhase;
-
-  /** @domName Event.returnValue */
-  bool returnValue;
-
-  /** @domName Event.srcElement */
-  EventTarget get srcElement;
-
-  /** @domName Event.target */
-  EventTarget get target;
-
-  /** @domName Event.timeStamp */
-  int get timeStamp;
-
-  /** @domName Event.type */
-  String get type;
-
-  /** @domName Event.initEvent */
-  void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg);
-
-  /** @domName Event.preventDefault */
-  void preventDefault();
-
-  /** @domName Event.stopImmediatePropagation */
-  void stopImmediatePropagation();
-
-  /** @domName Event.stopPropagation */
-  void stopPropagation();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName EventException
-abstract class EventException {
-
-  static const int DISPATCH_REQUEST_ERR = 1;
-
-  static const int UNSPECIFIED_EVENT_TYPE_ERR = 0;
-
-  /** @domName EventException.code */
-  int get code;
-
-  /** @domName EventException.message */
-  String get message;
-
-  /** @domName EventException.name */
-  String get name;
-
-  /** @domName EventException.toString */
-  String toString();
-}
-
-class _EventExceptionImpl implements EventException native "*EventException" {
-
-  final int code;
-
-  final String message;
-
-  final String name;
-
-  String toString() native;
-}
-
-class _EventImpl implements Event native "*Event" {
-
-  final bool bubbles;
-
-  bool cancelBubble;
-
-  final bool cancelable;
-
-  final _ClipboardImpl clipboardData;
-
-  EventTarget get currentTarget => _convertNativeToDart_EventTarget(this._currentTarget);
-  EventTarget get _currentTarget => JS("EventTarget", "#.currentTarget", this);
-
-  final bool defaultPrevented;
-
-  final int eventPhase;
-
-  bool returnValue;
-
-  EventTarget get srcElement => _convertNativeToDart_EventTarget(this._srcElement);
-  EventTarget get _srcElement => JS("EventTarget", "#.srcElement", this);
-
-  EventTarget get target => _convertNativeToDart_EventTarget(this._target);
-  EventTarget get _target => JS("EventTarget", "#.target", this);
-
-  final int timeStamp;
-
-  final String type;
-
-  void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native "initEvent";
-
-  void preventDefault() native;
-
-  void stopImmediatePropagation() native;
-
-  void stopPropagation() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName EventSource
-abstract class EventSource implements EventTarget {
-
-  factory EventSource(String scriptUrl) => _EventSourceFactoryProvider.createEventSource(scriptUrl);
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  EventSourceEvents get on;
-
-  static const int CLOSED = 2;
-
-  static const int CONNECTING = 0;
-
-  static const int OPEN = 1;
-
-  /** @domName EventSource.URL */
-  String get URL;
-
-  /** @domName EventSource.readyState */
-  int get readyState;
-
-  /** @domName EventSource.url */
-  String get url;
-
-  /** @domName EventSource.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName EventSource.close */
-  void close();
-
-  /** @domName EventSource.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName EventSource.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class EventSourceEvents implements Events {
-
-  EventListenerList get error;
-
-  EventListenerList get message;
-
-  EventListenerList get open;
-}
-
-class _EventSourceImpl extends _EventTargetImpl implements EventSource native "*EventSource" {
-
-  _EventSourceEventsImpl get on =>
-    new _EventSourceEventsImpl(this);
-
-  final String URL;
-
-  final int readyState;
-
-  final String url;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  void close() native;
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _EventSourceEventsImpl extends _EventsImpl implements EventSourceEvents {
-  _EventSourceEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get message => this['message'];
-
-  EventListenerList get open => this['open'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-abstract class EventListenerList {
-  EventListenerList add(EventListener handler, [bool useCapture]);
-
-  EventListenerList remove(EventListener handler, [bool useCapture]);
-
-  bool dispatch(Event evt);
-}
-
-abstract class Events {
-  EventListenerList operator [](String type);
-}
-
-/// @domName EventTarget
-abstract class EventTarget {
-
-  /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
-  abstract Events get on;
-
-  /** @domName EventTarget.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName EventTarget.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName EventTarget.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _EventsImpl implements Events {
-  /* Raw event target. */
-  // TODO(jacobr): it would be nice if we could specify this as
-  // _EventTargetImpl or EventTarget
-  final _ptr;
-
-  _EventsImpl(this._ptr);
-
-  _EventListenerListImpl operator [](String type) {
-    return new _EventListenerListImpl(_ptr, type);
-  }
-}
-
-class _EventListenerListImpl implements EventListenerList {
-
-  // TODO(jacobr): make this _EventTargetImpl
-  final _ptr;
-  final String _type;
-
-  _EventListenerListImpl(this._ptr, this._type);
-
-  // TODO(jacobr): implement equals.
-
-  _EventListenerListImpl add(EventListener listener,
-      [bool useCapture = false]) {
-    _add(listener, useCapture);
-    return this;
-  }
-
-  _EventListenerListImpl remove(EventListener listener,
-      [bool useCapture = false]) {
-    _remove(listener, useCapture);
-    return this;
-  }
-
-  bool dispatch(Event evt) {
-    return _ptr.$dom_dispatchEvent(evt);
-  }
-
-  void _add(EventListener listener, bool useCapture) {
-    _ptr.$dom_addEventListener(_type, listener, useCapture);
-  }
-
-  void _remove(EventListener listener, bool useCapture) {
-    _ptr.$dom_removeEventListener(_type, listener, useCapture);
-  }
-}
-
-
-class _EventTargetImpl implements EventTarget native "*EventTarget" {
-
-  Events get on => new _EventsImpl(this);
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLFieldSetElement
-abstract class FieldSetElement implements Element {
-
-  factory FieldSetElement() => _Elements.createFieldSetElement();
-
-  /** @domName HTMLFieldSetElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLFieldSetElement.elements */
-  HTMLCollection get elements;
-
-  /** @domName HTMLFieldSetElement.form */
-  FormElement get form;
-
-  /** @domName HTMLFieldSetElement.name */
-  String name;
-
-  /** @domName HTMLFieldSetElement.type */
-  String get type;
-
-  /** @domName HTMLFieldSetElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLFieldSetElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLFieldSetElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLFieldSetElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLFieldSetElement.setCustomValidity */
-  void setCustomValidity(String error);
-}
-
-class _FieldSetElementImpl extends _ElementImpl implements FieldSetElement native "*HTMLFieldSetElement" {
-
-  bool disabled;
-
-  final _HTMLCollectionImpl elements;
-
-  final _FormElementImpl form;
-
-  String name;
-
-  final String type;
-
-  final String validationMessage;
-
-  final _ValidityStateImpl validity;
-
-  final bool willValidate;
-
-  bool checkValidity() native;
-
-  void setCustomValidity(String error) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName File
-abstract class File implements Blob {
-
-  /** @domName File.lastModifiedDate */
-  Date get lastModifiedDate;
-
-  /** @domName File.name */
-  String get name;
-
-  /** @domName File.webkitRelativePath */
-  String get webkitRelativePath;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void FileCallback(File file);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName FileEntry
-abstract class FileEntry implements Entry {
-
-  /** @domName FileEntry.createWriter */
-  void createWriter(FileWriterCallback successCallback, [ErrorCallback errorCallback]);
-
-  /** @domName FileEntry.file */
-  void file(FileCallback successCallback, [ErrorCallback errorCallback]);
-}
-
-class _FileEntryImpl extends _EntryImpl implements FileEntry native "*FileEntry" {
-
-  void createWriter(FileWriterCallback successCallback, [ErrorCallback errorCallback]) native;
-
-  void file(FileCallback successCallback, [ErrorCallback errorCallback]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName FileEntrySync
-abstract class FileEntrySync implements EntrySync {
-
-  /** @domName FileEntrySync.createWriter */
-  FileWriterSync createWriter();
-
-  /** @domName FileEntrySync.file */
-  File file();
-}
-
-class _FileEntrySyncImpl extends _EntrySyncImpl implements FileEntrySync native "*FileEntrySync" {
-
-  _FileWriterSyncImpl createWriter() native;
-
-  _FileImpl file() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName FileError
-abstract class FileError {
-
-  static const int ABORT_ERR = 3;
-
-  static const int ENCODING_ERR = 5;
-
-  static const int INVALID_MODIFICATION_ERR = 9;
-
-  static const int INVALID_STATE_ERR = 7;
-
-  static const int NOT_FOUND_ERR = 1;
-
-  static const int NOT_READABLE_ERR = 4;
-
-  static const int NO_MODIFICATION_ALLOWED_ERR = 6;
-
-  static const int PATH_EXISTS_ERR = 12;
-
-  static const int QUOTA_EXCEEDED_ERR = 10;
-
-  static const int SECURITY_ERR = 2;
-
-  static const int SYNTAX_ERR = 8;
-
-  static const int TYPE_MISMATCH_ERR = 11;
-
-  /** @domName FileError.code */
-  int get code;
-}
-
-class _FileErrorImpl implements FileError native "*FileError" {
-
-  final int code;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName FileException
-abstract class FileException {
-
-  static const int ABORT_ERR = 3;
-
-  static const int ENCODING_ERR = 5;
-
-  static const int INVALID_MODIFICATION_ERR = 9;
-
-  static const int INVALID_STATE_ERR = 7;
-
-  static const int NOT_FOUND_ERR = 1;
-
-  static const int NOT_READABLE_ERR = 4;
-
-  static const int NO_MODIFICATION_ALLOWED_ERR = 6;
-
-  static const int PATH_EXISTS_ERR = 12;
-
-  static const int QUOTA_EXCEEDED_ERR = 10;
-
-  static const int SECURITY_ERR = 2;
-
-  static const int SYNTAX_ERR = 8;
-
-  static const int TYPE_MISMATCH_ERR = 11;
-
-  /** @domName FileException.code */
-  int get code;
-
-  /** @domName FileException.message */
-  String get message;
-
-  /** @domName FileException.name */
-  String get name;
-
-  /** @domName FileException.toString */
-  String toString();
-}
-
-class _FileExceptionImpl implements FileException native "*FileException" {
-
-  final int code;
-
-  final String message;
-
-  final String name;
-
-  String toString() native;
-}
-
-class _FileImpl extends _BlobImpl implements File native "*File" {
-
-  final Date lastModifiedDate;
-
-  final String name;
-
-  final String webkitRelativePath;
-}
-
-class _FileListImpl implements List<File>, JavaScriptIndexingBehavior native "*FileList" {
-
-  final int length;
-
-  _FileImpl operator[](int index) => JS("_FileImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _FileImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<File> mixins.
-  // File is the element type.
-
-  // From Iterable<File>:
-
-  Iterator<File> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<File>(this);
-  }
-
-  // From Collection<File>:
-
-  void add(File value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(File value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<File> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(File element) => _Collections.contains(this, element);
-
-  void forEach(void f(File element)) => _Collections.forEach(this, f);
-
-  Collection map(f(File element)) => _Collections.map(this, [], f);
-
-  Collection<File> filter(bool f(File element)) =>
-     _Collections.filter(this, <File>[], f);
-
-  bool every(bool f(File element)) => _Collections.every(this, f);
-
-  bool some(bool f(File element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<File>:
-
-  void sort([Comparator<File> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(File element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(File element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  File get last => this[length - 1];
-
-  File removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<File> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [File initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<File> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <File>[]);
-
-  // -- end List<File> mixins.
-
-  _FileImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName FileReader
-abstract class FileReader implements EventTarget {
-
-  factory FileReader() => _FileReaderFactoryProvider.createFileReader();
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  FileReaderEvents get on;
-
-  static const int DONE = 2;
-
-  static const int EMPTY = 0;
-
-  static const int LOADING = 1;
-
-  /** @domName FileReader.error */
-  FileError get error;
-
-  /** @domName FileReader.readyState */
-  int get readyState;
-
-  /** @domName FileReader.result */
-  Object get result;
-
-  /** @domName FileReader.abort */
-  void abort();
-
-  /** @domName FileReader.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName FileReader.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName FileReader.readAsArrayBuffer */
-  void readAsArrayBuffer(Blob blob);
-
-  /** @domName FileReader.readAsBinaryString */
-  void readAsBinaryString(Blob blob);
-
-  /** @domName FileReader.readAsDataURL */
-  void readAsDataURL(Blob blob);
-
-  /** @domName FileReader.readAsText */
-  void readAsText(Blob blob, [String encoding]);
-
-  /** @domName FileReader.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class FileReaderEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get error;
-
-  EventListenerList get load;
-
-  EventListenerList get loadEnd;
-
-  EventListenerList get loadStart;
-
-  EventListenerList get progress;
-}
-
-class _FileReaderImpl extends _EventTargetImpl implements FileReader native "*FileReader" {
-
-  _FileReaderEventsImpl get on =>
-    new _FileReaderEventsImpl(this);
-
-  final _FileErrorImpl error;
-
-  final int readyState;
-
-  final Object result;
-
-  void abort() native;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void readAsArrayBuffer(_BlobImpl blob) native;
-
-  void readAsBinaryString(_BlobImpl blob) native;
-
-  void readAsDataURL(_BlobImpl blob) native;
-
-  void readAsText(_BlobImpl blob, [String encoding]) native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _FileReaderEventsImpl extends _EventsImpl implements FileReaderEvents {
-  _FileReaderEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get load => this['load'];
-
-  EventListenerList get loadEnd => this['loadend'];
-
-  EventListenerList get loadStart => this['loadstart'];
-
-  EventListenerList get progress => this['progress'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName FileReaderSync
-abstract class FileReaderSync {
-
-  factory FileReaderSync() => _FileReaderSyncFactoryProvider.createFileReaderSync();
-
-  /** @domName FileReaderSync.readAsArrayBuffer */
-  ArrayBuffer readAsArrayBuffer(Blob blob);
-
-  /** @domName FileReaderSync.readAsBinaryString */
-  String readAsBinaryString(Blob blob);
-
-  /** @domName FileReaderSync.readAsDataURL */
-  String readAsDataURL(Blob blob);
-
-  /** @domName FileReaderSync.readAsText */
-  String readAsText(Blob blob, [String encoding]);
-}
-
-class _FileReaderSyncImpl implements FileReaderSync native "*FileReaderSync" {
-
-  _ArrayBufferImpl readAsArrayBuffer(_BlobImpl blob) native;
-
-  String readAsBinaryString(_BlobImpl blob) native;
-
-  String readAsDataURL(_BlobImpl blob) native;
-
-  String readAsText(_BlobImpl blob, [String encoding]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void FileSystemCallback(DOMFileSystem fileSystem);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName FileWriter
-abstract class FileWriter implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  FileWriterEvents get on;
-
-  static const int DONE = 2;
-
-  static const int INIT = 0;
-
-  static const int WRITING = 1;
-
-  /** @domName FileWriter.error */
-  FileError get error;
-
-  /** @domName FileWriter.length */
-  int get length;
-
-  /** @domName FileWriter.position */
-  int get position;
-
-  /** @domName FileWriter.readyState */
-  int get readyState;
-
-  /** @domName FileWriter.abort */
-  void abort();
-
-  /** @domName FileWriter.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName FileWriter.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName FileWriter.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName FileWriter.seek */
-  void seek(int position);
-
-  /** @domName FileWriter.truncate */
-  void truncate(int size);
-
-  /** @domName FileWriter.write */
-  void write(Blob data);
-}
-
-abstract class FileWriterEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get error;
-
-  EventListenerList get progress;
-
-  EventListenerList get write;
-
-  EventListenerList get writeEnd;
-
-  EventListenerList get writeStart;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void FileWriterCallback(FileWriter fileWriter);
-
-class _FileWriterImpl extends _EventTargetImpl implements FileWriter native "*FileWriter" {
-
-  _FileWriterEventsImpl get on =>
-    new _FileWriterEventsImpl(this);
-
-  final _FileErrorImpl error;
-
-  final int length;
-
-  final int position;
-
-  final int readyState;
-
-  void abort() native;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  void seek(int position) native;
-
-  void truncate(int size) native;
-
-  void write(_BlobImpl data) native;
-}
-
-class _FileWriterEventsImpl extends _EventsImpl implements FileWriterEvents {
-  _FileWriterEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get progress => this['progress'];
-
-  EventListenerList get write => this['write'];
-
-  EventListenerList get writeEnd => this['writeend'];
-
-  EventListenerList get writeStart => this['writestart'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName FileWriterSync
-abstract class FileWriterSync {
-
-  /** @domName FileWriterSync.length */
-  int get length;
-
-  /** @domName FileWriterSync.position */
-  int get position;
-
-  /** @domName FileWriterSync.seek */
-  void seek(int position);
-
-  /** @domName FileWriterSync.truncate */
-  void truncate(int size);
-
-  /** @domName FileWriterSync.write */
-  void write(Blob data);
-}
-
-class _FileWriterSyncImpl implements FileWriterSync native "*FileWriterSync" {
-
-  final int length;
-
-  final int position;
-
-  void seek(int position) native;
-
-  void truncate(int size) native;
-
-  void write(_BlobImpl data) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Float32Array
-abstract class Float32Array implements ArrayBufferView, List<num> {
-
-  factory Float32Array(int length) =>
-    _TypedArrayFactoryProvider.createFloat32Array(length);
-
-  factory Float32Array.fromList(List<num> list) =>
-    _TypedArrayFactoryProvider.createFloat32Array_fromList(list);
-
-  factory Float32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
-    _TypedArrayFactoryProvider.createFloat32Array_fromBuffer(buffer, byteOffset, length);
-
-  static const int BYTES_PER_ELEMENT = 4;
-
-  /** @domName Float32Array.length */
-  int get length;
-
-  /** @domName Float32Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Float32Array.subarray */
-  Float32Array subarray(int start, [int end]);
-}
-
-class _Float32ArrayImpl extends _ArrayBufferViewImpl implements Float32Array, List<num>, JavaScriptIndexingBehavior native "*Float32Array" {
-
-  final int length;
-
-  num operator[](int index) => JS("num", "#[#]", this, index);
-
-  void operator[]=(int index, num value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<num> mixins.
-  // num is the element type.
-
-  // From Iterable<num>:
-
-  Iterator<num> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<num>(this);
-  }
-
-  // From Collection<num>:
-
-  void add(num value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(num value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<num> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(num element) => _Collections.contains(this, element);
-
-  void forEach(void f(num element)) => _Collections.forEach(this, f);
-
-  Collection map(f(num element)) => _Collections.map(this, [], f);
-
-  Collection<num> filter(bool f(num element)) =>
-     _Collections.filter(this, <num>[], f);
-
-  bool every(bool f(num element)) => _Collections.every(this, f);
-
-  bool some(bool f(num element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<num>:
-
-  void sort([Comparator<num> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(num element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(num element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  num get last => this[length - 1];
-
-  num removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [num initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<num> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <num>[]);
-
-  // -- end List<num> mixins.
-
-  void setElements(Object array, [int offset]) native "set";
-
-  _Float32ArrayImpl subarray(int start, [int end]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Float64Array
-abstract class Float64Array implements ArrayBufferView, List<num> {
-
-  factory Float64Array(int length) =>
-    _TypedArrayFactoryProvider.createFloat64Array(length);
-
-  factory Float64Array.fromList(List<num> list) =>
-    _TypedArrayFactoryProvider.createFloat64Array_fromList(list);
-
-  factory Float64Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
-    _TypedArrayFactoryProvider.createFloat64Array_fromBuffer(buffer, byteOffset, length);
-
-  static const int BYTES_PER_ELEMENT = 8;
-
-  /** @domName Float64Array.length */
-  int get length;
-
-  /** @domName Float64Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Float64Array.subarray */
-  Float64Array subarray(int start, [int end]);
-}
-
-class _Float64ArrayImpl extends _ArrayBufferViewImpl implements Float64Array, List<num>, JavaScriptIndexingBehavior native "*Float64Array" {
-
-  final int length;
-
-  num operator[](int index) => JS("num", "#[#]", this, index);
-
-  void operator[]=(int index, num value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<num> mixins.
-  // num is the element type.
-
-  // From Iterable<num>:
-
-  Iterator<num> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<num>(this);
-  }
-
-  // From Collection<num>:
-
-  void add(num value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(num value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<num> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(num element) => _Collections.contains(this, element);
-
-  void forEach(void f(num element)) => _Collections.forEach(this, f);
-
-  Collection map(f(num element)) => _Collections.map(this, [], f);
-
-  Collection<num> filter(bool f(num element)) =>
-     _Collections.filter(this, <num>[], f);
-
-  bool every(bool f(num element)) => _Collections.every(this, f);
-
-  bool some(bool f(num element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<num>:
-
-  void sort([Comparator<num> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(num element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(num element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  num get last => this[length - 1];
-
-  num removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [num initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<num> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <num>[]);
-
-  // -- end List<num> mixins.
-
-  void setElements(Object array, [int offset]) native "set";
-
-  _Float64ArrayImpl subarray(int start, [int end]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLFontElement
-abstract class FontElement implements Element {
-
-  /** @domName HTMLFontElement.color */
-  String color;
-
-  /** @domName HTMLFontElement.face */
-  String face;
-
-  /** @domName HTMLFontElement.size */
-  String size;
-}
-
-class _FontElementImpl extends _ElementImpl implements FontElement native "*HTMLFontElement" {
-
-  String color;
-
-  String face;
-
-  String size;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName FormData
-abstract class FormData {
-
-  factory FormData([FormElement form]) {
-    if (!?form) {
-      return _FormDataFactoryProvider.createFormData();
-    }
-    return _FormDataFactoryProvider.createFormData(form);
-  }
-
-  /** @domName FormData.append */
-  void append(String name, String value, String filename);
-}
-
-class _FormDataImpl implements FormData native "*FormData" {
-
-  void append(String name, String value, String filename) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLFormElement
-abstract class FormElement implements Element {
-
-  factory FormElement() => _Elements.createFormElement();
-
-  /** @domName HTMLFormElement.acceptCharset */
-  String acceptCharset;
-
-  /** @domName HTMLFormElement.action */
-  String action;
-
-  /** @domName HTMLFormElement.autocomplete */
-  String autocomplete;
-
-  /** @domName HTMLFormElement.encoding */
-  String encoding;
-
-  /** @domName HTMLFormElement.enctype */
-  String enctype;
-
-  /** @domName HTMLFormElement.length */
-  int get length;
-
-  /** @domName HTMLFormElement.method */
-  String method;
-
-  /** @domName HTMLFormElement.name */
-  String name;
-
-  /** @domName HTMLFormElement.noValidate */
-  bool noValidate;
-
-  /** @domName HTMLFormElement.target */
-  String target;
-
-  /** @domName HTMLFormElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLFormElement.reset */
-  void reset();
-
-  /** @domName HTMLFormElement.submit */
-  void submit();
-}
-
-class _FormElementImpl extends _ElementImpl implements FormElement native "*HTMLFormElement" {
-
-  String acceptCharset;
-
-  String action;
-
-  String autocomplete;
-
-  String encoding;
-
-  String enctype;
-
-  final int length;
-
-  String method;
-
-  String name;
-
-  bool noValidate;
-
-  String target;
-
-  bool checkValidity() native;
-
-  void reset() native;
-
-  void submit() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLFrameElement
-abstract class FrameElement implements Element {
-
-  /** @domName HTMLFrameElement.contentWindow */
-  Window get contentWindow;
-
-  /** @domName HTMLFrameElement.frameBorder */
-  String frameBorder;
-
-  /** @domName HTMLFrameElement.height */
-  int get height;
-
-  /** @domName HTMLFrameElement.location */
-  String location;
-
-  /** @domName HTMLFrameElement.longDesc */
-  String longDesc;
-
-  /** @domName HTMLFrameElement.marginHeight */
-  String marginHeight;
-
-  /** @domName HTMLFrameElement.marginWidth */
-  String marginWidth;
-
-  /** @domName HTMLFrameElement.name */
-  String name;
-
-  /** @domName HTMLFrameElement.noResize */
-  bool noResize;
-
-  /** @domName HTMLFrameElement.scrolling */
-  String scrolling;
-
-  /** @domName HTMLFrameElement.src */
-  String src;
-
-  /** @domName HTMLFrameElement.width */
-  int get width;
-}
-
-class _FrameElementImpl extends _ElementImpl implements FrameElement native "*HTMLFrameElement" {
-
-  Window get contentWindow => _convertNativeToDart_Window(this._contentWindow);
-  Window get _contentWindow => JS("Window", "#.contentWindow", this);
-
-  String frameBorder;
-
-  final int height;
-
-  String location;
-
-  String longDesc;
-
-  String marginHeight;
-
-  String marginWidth;
-
-  String name;
-
-  bool noResize;
-
-  String scrolling;
-
-  String src;
-
-  final int width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLFrameSetElement
-abstract class FrameSetElement implements Element {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  FrameSetElementEvents get on;
-
-  /** @domName HTMLFrameSetElement.cols */
-  String cols;
-
-  /** @domName HTMLFrameSetElement.rows */
-  String rows;
-}
-
-abstract class FrameSetElementEvents implements ElementEvents {
-
-  EventListenerList get beforeUnload;
-
-  EventListenerList get blur;
-
-  EventListenerList get error;
-
-  EventListenerList get focus;
-
-  EventListenerList get hashChange;
-
-  EventListenerList get load;
-
-  EventListenerList get message;
-
-  EventListenerList get offline;
-
-  EventListenerList get online;
-
-  EventListenerList get popState;
-
-  EventListenerList get resize;
-
-  EventListenerList get storage;
-
-  EventListenerList get unload;
-}
-
-class _FrameSetElementImpl extends _ElementImpl implements FrameSetElement native "*HTMLFrameSetElement" {
-
-  _FrameSetElementEventsImpl get on =>
-    new _FrameSetElementEventsImpl(this);
-
-  String cols;
-
-  String rows;
-}
-
-class _FrameSetElementEventsImpl extends _ElementEventsImpl implements FrameSetElementEvents {
-  _FrameSetElementEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get beforeUnload => this['beforeunload'];
-
-  EventListenerList get blur => this['blur'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get focus => this['focus'];
-
-  EventListenerList get hashChange => this['hashchange'];
-
-  EventListenerList get load => this['load'];
-
-  EventListenerList get message => this['message'];
-
-  EventListenerList get offline => this['offline'];
-
-  EventListenerList get online => this['online'];
-
-  EventListenerList get popState => this['popstate'];
-
-  EventListenerList get resize => this['resize'];
-
-  EventListenerList get storage => this['storage'];
-
-  EventListenerList get unload => this['unload'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName GainNode
-abstract class GainNode implements AudioNode {
-
-  /** @domName GainNode.gain */
-  AudioGain get gain;
-}
-
-class _GainNodeImpl extends _AudioNodeImpl implements GainNode native "*GainNode" {
-
-  final _AudioGainImpl gain;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Gamepad
-abstract class Gamepad {
-
-  /** @domName Gamepad.axes */
-  List<num> get axes;
-
-  /** @domName Gamepad.buttons */
-  List<num> get buttons;
-
-  /** @domName Gamepad.id */
-  String get id;
-
-  /** @domName Gamepad.index */
-  int get index;
-
-  /** @domName Gamepad.timestamp */
-  int get timestamp;
-}
-
-class _GamepadImpl implements Gamepad native "*Gamepad" {
-
-  final List<num> axes;
-
-  final List<num> buttons;
-
-  final String id;
-
-  final int index;
-
-  final int timestamp;
-}
-
-class _GamepadListImpl implements List<Gamepad>, JavaScriptIndexingBehavior native "*GamepadList" {
-
-  final int length;
-
-  _GamepadImpl operator[](int index) => JS("_GamepadImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _GamepadImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<Gamepad> mixins.
-  // Gamepad is the element type.
-
-  // From Iterable<Gamepad>:
-
-  Iterator<Gamepad> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<Gamepad>(this);
-  }
-
-  // From Collection<Gamepad>:
-
-  void add(Gamepad value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(Gamepad value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<Gamepad> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(Gamepad element) => _Collections.contains(this, element);
-
-  void forEach(void f(Gamepad element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Gamepad element)) => _Collections.map(this, [], f);
-
-  Collection<Gamepad> filter(bool f(Gamepad element)) =>
-     _Collections.filter(this, <Gamepad>[], f);
-
-  bool every(bool f(Gamepad element)) => _Collections.every(this, f);
-
-  bool some(bool f(Gamepad element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Gamepad>:
-
-  void sort([Comparator<Gamepad> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Gamepad element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Gamepad element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  Gamepad get last => this[length - 1];
-
-  Gamepad removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<Gamepad> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [Gamepad initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<Gamepad> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <Gamepad>[]);
-
-  // -- end List<Gamepad> mixins.
-
-  _GamepadImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Geolocation
-abstract class Geolocation {
-
-  /** @domName Geolocation.clearWatch */
-  void clearWatch(int watchId);
-
-  /** @domName Geolocation.getCurrentPosition */
-  void getCurrentPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]);
-
-  /** @domName Geolocation.watchPosition */
-  int watchPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]);
-}
-
-class _GeolocationImpl implements Geolocation native "*Geolocation" {
-
-  void clearWatch(int watchId) native;
-
-  void getCurrentPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native;
-
-  int watchPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Geoposition
-abstract class Geoposition {
-
-  /** @domName Geoposition.coords */
-  Coordinates get coords;
-
-  /** @domName Geoposition.timestamp */
-  int get timestamp;
-}
-
-class _GeopositionImpl implements Geoposition native "*Geoposition" {
-
-  final _CoordinatesImpl coords;
-
-  final int timestamp;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLHRElement
-abstract class HRElement implements Element {
-
-  factory HRElement() => _Elements.createHRElement();
-
-  /** @domName HTMLHRElement.align */
-  String align;
-
-  /** @domName HTMLHRElement.noShade */
-  bool noShade;
-
-  /** @domName HTMLHRElement.size */
-  String size;
-
-  /** @domName HTMLHRElement.width */
-  String width;
-}
-
-class _HRElementImpl extends _ElementImpl implements HRElement native "*HTMLHRElement" {
-
-  String align;
-
-  bool noShade;
-
-  String size;
-
-  String width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLAllCollection
-abstract class HTMLAllCollection implements List<Node> {
-
-  /** @domName HTMLAllCollection.length */
-  int get length;
-
-  /** @domName HTMLAllCollection.item */
-  Node item(int index);
-
-  /** @domName HTMLAllCollection.namedItem */
-  Node namedItem(String name);
-
-  /** @domName HTMLAllCollection.tags */
-  List<Node> tags(String name);
-}
-
-class _HTMLAllCollectionImpl implements HTMLAllCollection, JavaScriptIndexingBehavior native "*HTMLAllCollection" {
-
-  final int length;
-
-  _NodeImpl operator[](int index) => JS("_NodeImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _NodeImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<Node> mixins.
-  // Node is the element type.
-
-  // From Iterable<Node>:
-
-  Iterator<Node> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<Node>(this);
-  }
-
-  // From Collection<Node>:
-
-  void add(Node value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(Node value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<Node> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(Node element) => _Collections.contains(this, element);
-
-  void forEach(void f(Node element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Node element)) => _Collections.map(this, [], f);
-
-  Collection<Node> filter(bool f(Node element)) =>
-     _Collections.filter(this, <Node>[], f);
-
-  bool every(bool f(Node element)) => _Collections.every(this, f);
-
-  bool some(bool f(Node element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Node>:
-
-  void sort([Comparator<Node> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Node element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Node element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  Node get last => this[length - 1];
-
-  Node removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [Node initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<Node> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <Node>[]);
-
-  // -- end List<Node> mixins.
-
-  _NodeImpl item(int index) native;
-
-  _NodeImpl namedItem(String name) native;
-
-  List<Node> tags(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLCollection
-abstract class HTMLCollection implements List<Node> {
-
-  /** @domName HTMLCollection.length */
-  int get length;
-
-  /** @domName HTMLCollection.item */
-  Node item(int index);
-
-  /** @domName HTMLCollection.namedItem */
-  Node namedItem(String name);
-}
-
-class _HTMLCollectionImpl implements HTMLCollection, JavaScriptIndexingBehavior native "*HTMLCollection" {
-
-  final int length;
-
-  _NodeImpl operator[](int index) => JS("_NodeImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _NodeImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<Node> mixins.
-  // Node is the element type.
-
-  // From Iterable<Node>:
-
-  Iterator<Node> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<Node>(this);
-  }
-
-  // From Collection<Node>:
-
-  void add(Node value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(Node value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<Node> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(Node element) => _Collections.contains(this, element);
-
-  void forEach(void f(Node element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Node element)) => _Collections.map(this, [], f);
-
-  Collection<Node> filter(bool f(Node element)) =>
-     _Collections.filter(this, <Node>[], f);
-
-  bool every(bool f(Node element)) => _Collections.every(this, f);
-
-  bool some(bool f(Node element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Node>:
-
-  void sort([Comparator<Node> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Node element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Node element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  Node get last => this[length - 1];
-
-  Node removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [Node initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<Node> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <Node>[]);
-
-  // -- end List<Node> mixins.
-
-  _NodeImpl item(int index) native;
-
-  _NodeImpl namedItem(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLOptionsCollection
-abstract class HTMLOptionsCollection implements HTMLCollection {
-
-  /** @domName HTMLOptionsCollection.length */
-  int length;
-
-  /** @domName HTMLOptionsCollection.selectedIndex */
-  int selectedIndex;
-
-  /** @domName HTMLOptionsCollection.remove */
-  void remove(int index);
-}
-
-class _HTMLOptionsCollectionImpl extends _HTMLCollectionImpl implements HTMLOptionsCollection native "*HTMLOptionsCollection" {
-
-  // Shadowing definition.
-  int get length => JS("int", "#.length", this);
-
-  void set length(int value) {
-    JS("void", "#.length = #", this, value);
-  }
-
-  int selectedIndex;
-
-  void remove(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HashChangeEvent
-abstract class HashChangeEvent implements Event {
-
-  /** @domName HashChangeEvent.newURL */
-  String get newURL;
-
-  /** @domName HashChangeEvent.oldURL */
-  String get oldURL;
-
-  /** @domName HashChangeEvent.initHashChangeEvent */
-  void initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL);
-}
-
-class _HashChangeEventImpl extends _EventImpl implements HashChangeEvent native "*HashChangeEvent" {
-
-  final String newURL;
-
-  final String oldURL;
-
-  void initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLHeadElement
-abstract class HeadElement implements Element {
-
-  factory HeadElement() => _Elements.createHeadElement();
-
-  /** @domName HTMLHeadElement.profile */
-  String profile;
-}
-
-class _HeadElementImpl extends _ElementImpl implements HeadElement native "*HTMLHeadElement" {
-
-  String profile;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLHeadingElement
-abstract class HeadingElement implements Element {
-
-  factory HeadingElement.h1() => _Elements.createHeadingElement_h1();
-
-  factory HeadingElement.h2() => _Elements.createHeadingElement_h2();
-
-  factory HeadingElement.h3() => _Elements.createHeadingElement_h3();
-
-  factory HeadingElement.h4() => _Elements.createHeadingElement_h4();
-
-  factory HeadingElement.h5() => _Elements.createHeadingElement_h5();
-
-  factory HeadingElement.h6() => _Elements.createHeadingElement_h6();
-
-  /** @domName HTMLHeadingElement.align */
-  String align;
-}
-
-class _HeadingElementImpl extends _ElementImpl implements HeadingElement native "*HTMLHeadingElement" {
-
-  String align;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLHtmlElement
-abstract class HtmlElement implements Element {
-
-  factory HtmlElement() => _Elements.createHtmlElement();
-}
-
-class _HtmlElementImpl extends _ElementImpl implements HtmlElement native "*HTMLHtmlElement" {
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName XMLHttpRequest
-abstract class HttpRequest implements EventTarget {
-  factory HttpRequest.get(String url, onSuccess(HttpRequest request)) =>
-      _HttpRequestFactoryProvider.createHttpRequest_get(url, onSuccess);
-
-  factory HttpRequest.getWithCredentials(String url, onSuccess(HttpRequest request)) =>
-      _HttpRequestFactoryProvider.createHttpRequest_getWithCredentials(url, onSuccess);
-
-  factory HttpRequest() => _HttpRequestFactoryProvider.createHttpRequest();
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  HttpRequestEvents get on;
-
-  static const int DONE = 4;
-
-  static const int HEADERS_RECEIVED = 2;
-
-  static const int LOADING = 3;
-
-  static const int OPENED = 1;
-
-  static const int UNSENT = 0;
-
-  /** @domName XMLHttpRequest.readyState */
-  int get readyState;
-
-  /** @domName XMLHttpRequest.response */
-  Object get response;
-
-  /** @domName XMLHttpRequest.responseText */
-  String get responseText;
-
-  /** @domName XMLHttpRequest.responseType */
-  String responseType;
-
-  /** @domName XMLHttpRequest.responseXML */
-  Document get responseXML;
-
-  /** @domName XMLHttpRequest.status */
-  int get status;
-
-  /** @domName XMLHttpRequest.statusText */
-  String get statusText;
-
-  /** @domName XMLHttpRequest.upload */
-  HttpRequestUpload get upload;
-
-  /** @domName XMLHttpRequest.withCredentials */
-  bool withCredentials;
-
-  /** @domName XMLHttpRequest.abort */
-  void abort();
-
-  /** @domName XMLHttpRequest.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName XMLHttpRequest.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName XMLHttpRequest.getAllResponseHeaders */
-  String getAllResponseHeaders();
-
-  /** @domName XMLHttpRequest.getResponseHeader */
-  String getResponseHeader(String header);
-
-  /** @domName XMLHttpRequest.open */
-  void open(String method, String url, [bool async, String user, String password]);
-
-  /** @domName XMLHttpRequest.overrideMimeType */
-  void overrideMimeType(String override);
-
-  /** @domName XMLHttpRequest.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName XMLHttpRequest.send */
-  void send([data]);
-
-  /** @domName XMLHttpRequest.setRequestHeader */
-  void setRequestHeader(String header, String value);
-}
-
-abstract class HttpRequestEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get error;
-
-  EventListenerList get load;
-
-  EventListenerList get loadEnd;
-
-  EventListenerList get loadStart;
-
-  EventListenerList get progress;
-
-  EventListenerList get readyStateChange;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XMLHttpRequestException
-abstract class HttpRequestException {
-
-  static const int ABORT_ERR = 102;
-
-  static const int NETWORK_ERR = 101;
-
-  /** @domName XMLHttpRequestException.code */
-  int get code;
-
-  /** @domName XMLHttpRequestException.message */
-  String get message;
-
-  /** @domName XMLHttpRequestException.name */
-  String get name;
-
-  /** @domName XMLHttpRequestException.toString */
-  String toString();
-}
-
-class _HttpRequestExceptionImpl implements HttpRequestException native "*XMLHttpRequestException" {
-
-  final int code;
-
-  final String message;
-
-  final String name;
-
-  String toString() native;
-}
-
-class _HttpRequestImpl extends _EventTargetImpl implements HttpRequest native "*XMLHttpRequest" {
-
-  _HttpRequestEventsImpl get on =>
-    new _HttpRequestEventsImpl(this);
-
-  final int readyState;
-
-  final Object response;
-
-  final String responseText;
-
-  String responseType;
-
-  final _DocumentImpl responseXML;
-
-  final int status;
-
-  final String statusText;
-
-  final _HttpRequestUploadImpl upload;
-
-  bool withCredentials;
-
-  void abort() native;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  String getAllResponseHeaders() native;
-
-  String getResponseHeader(String header) native;
-
-  void open(String method, String url, [bool async, String user, String password]) native;
-
-  void overrideMimeType(String override) native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  void send([data]) native;
-
-  void setRequestHeader(String header, String value) native;
-}
-
-class _HttpRequestEventsImpl extends _EventsImpl implements HttpRequestEvents {
-  _HttpRequestEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get load => this['load'];
-
-  EventListenerList get loadEnd => this['loadend'];
-
-  EventListenerList get loadStart => this['loadstart'];
-
-  EventListenerList get progress => this['progress'];
-
-  EventListenerList get readyStateChange => this['readystatechange'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XMLHttpRequestProgressEvent
-abstract class HttpRequestProgressEvent implements ProgressEvent {
-
-  /** @domName XMLHttpRequestProgressEvent.position */
-  int get position;
-
-  /** @domName XMLHttpRequestProgressEvent.totalSize */
-  int get totalSize;
-}
-
-class _HttpRequestProgressEventImpl extends _ProgressEventImpl implements HttpRequestProgressEvent native "*XMLHttpRequestProgressEvent" {
-
-  final int position;
-
-  final int totalSize;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XMLHttpRequestUpload
-abstract class HttpRequestUpload implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  HttpRequestUploadEvents get on;
-
-  /** @domName XMLHttpRequestUpload.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName XMLHttpRequestUpload.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName XMLHttpRequestUpload.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class HttpRequestUploadEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get error;
-
-  EventListenerList get load;
-
-  EventListenerList get loadEnd;
-
-  EventListenerList get loadStart;
-
-  EventListenerList get progress;
-}
-
-class _HttpRequestUploadImpl extends _EventTargetImpl implements HttpRequestUpload native "*XMLHttpRequestUpload" {
-
-  _HttpRequestUploadEventsImpl get on =>
-    new _HttpRequestUploadEventsImpl(this);
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _HttpRequestUploadEventsImpl extends _EventsImpl implements HttpRequestUploadEvents {
-  _HttpRequestUploadEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get load => this['load'];
-
-  EventListenerList get loadEnd => this['loadend'];
-
-  EventListenerList get loadStart => this['loadstart'];
-
-  EventListenerList get progress => this['progress'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBAny
-abstract class IDBAny {
-}
-
-class _IDBAnyImpl implements IDBAny native "*IDBAny" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBCursor
-abstract class IDBCursor {
-
-  static const int NEXT = 0;
-
-  static const int NEXT_NO_DUPLICATE = 1;
-
-  static const int PREV = 2;
-
-  static const int PREV_NO_DUPLICATE = 3;
-
-  /** @domName IDBCursor.direction */
-  String get direction;
-
-  /** @domName IDBCursor.key */
-  Object get key;
-
-  /** @domName IDBCursor.primaryKey */
-  Object get primaryKey;
-
-  /** @domName IDBCursor.source */
-  dynamic get source;
-
-  /** @domName IDBCursor.advance */
-  void advance(int count);
-
-  /** @domName IDBCursor.continueFunction */
-  void continueFunction([/*IDBKey*/ key]);
-
-  /** @domName IDBCursor.delete */
-  IDBRequest delete();
-
-  /** @domName IDBCursor.update */
-  IDBRequest update(Object value);
-}
-
-class _IDBCursorImpl implements IDBCursor native "*IDBCursor" {
-
-  final String direction;
-
-  final Object key;
-
-  final Object primaryKey;
-
-  final dynamic source;
-
-  void advance(int count) native;
-
-  void continueFunction([key]) {
-    if (?key) {
-      var key_1 = _convertDartToNative_IDBKey(key);
-      _continueFunction_1(key_1);
-      return;
-    }
-    _continueFunction_2();
-    return;
-  }
-  void _continueFunction_1(key) native "continue";
-  void _continueFunction_2() native "continue";
-
-  _IDBRequestImpl delete() native;
-
-  _IDBRequestImpl update(/*any*/ value) {
-    var value_1 = _convertDartToNative_SerializedScriptValue(value);
-    return _update_1(value_1);
-  }
-  _IDBRequestImpl _update_1(value) native "update";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBCursorWithValue
-abstract class IDBCursorWithValue implements IDBCursor {
-
-  /** @domName IDBCursorWithValue.value */
-  Object get value;
-}
-
-class _IDBCursorWithValueImpl extends _IDBCursorImpl implements IDBCursorWithValue native "*IDBCursorWithValue" {
-
-  final Object value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBDatabase
-abstract class IDBDatabase implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  IDBDatabaseEvents get on;
-
-  /** @domName IDBDatabase.name */
-  String get name;
-
-  /** @domName IDBDatabase.objectStoreNames */
-  List<String> get objectStoreNames;
-
-  /** @domName IDBDatabase.version */
-  dynamic get version;
-
-  /** @domName IDBDatabase.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName IDBDatabase.close */
-  void close();
-
-  /** @domName IDBDatabase.createObjectStore */
-  IDBObjectStore createObjectStore(String name, [Map options]);
-
-  /** @domName IDBDatabase.deleteObjectStore */
-  void deleteObjectStore(String name);
-
-  /** @domName IDBDatabase.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName IDBDatabase.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName IDBDatabase.setVersion */
-  IDBVersionChangeRequest setVersion(String version);
-
-  /** @domName IDBDatabase.transaction */
-  IDBTransaction transaction(storeName_OR_storeNames, String mode);
-}
-
-abstract class IDBDatabaseEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get error;
-
-  EventListenerList get versionChange;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBDatabaseException
-abstract class IDBDatabaseException {
-
-  static const int ABORT_ERR = 20;
-
-  static const int CONSTRAINT_ERR = 4;
-
-  static const int DATA_ERR = 5;
-
-  static const int NON_TRANSIENT_ERR = 2;
-
-  static const int NOT_ALLOWED_ERR = 6;
-
-  static const int NOT_FOUND_ERR = 8;
-
-  static const int NO_ERR = 0;
-
-  static const int QUOTA_ERR = 22;
-
-  static const int READ_ONLY_ERR = 9;
-
-  static const int TIMEOUT_ERR = 23;
-
-  static const int TRANSACTION_INACTIVE_ERR = 7;
-
-  static const int UNKNOWN_ERR = 1;
-
-  static const int VER_ERR = 12;
-
-  /** @domName IDBDatabaseException.code */
-  int get code;
-
-  /** @domName IDBDatabaseException.message */
-  String get message;
-
-  /** @domName IDBDatabaseException.name */
-  String get name;
-
-  /** @domName IDBDatabaseException.toString */
-  String toString();
-}
-
-class _IDBDatabaseExceptionImpl implements IDBDatabaseException native "*IDBDatabaseException" {
-
-  final int code;
-
-  final String message;
-
-  final String name;
-
-  String toString() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _IDBDatabaseImpl extends _EventTargetImpl implements IDBDatabase native "*IDBDatabase" {
-
-  _IDBTransactionImpl transaction(storeName_OR_storeNames, String mode) {
-    if (mode != 'readonly' && mode != 'readwrite') {
-      throw new ArgumentError(mode);
-    }
-
-    // TODO(sra): Ensure storeName_OR_storeNames is a string or List<String>,
-    // and copy to JavaScript array if necessary.
-
-    if (_transaction_fn != null) {
-      return _transaction_fn(this, storeName_OR_storeNames, mode);
-    }
-
-    // Try and create a transaction with a string mode.  Browsers that expect a
-    // numeric mode tend to convert the string into a number.  This fails
-    // silently, resulting in zero ('readonly').
-    var txn = _transaction(storeName_OR_storeNames, mode);
-    if (_hasNumericMode(txn)) {
-      _transaction_fn = _transaction_numeric_mode;
-      txn = _transaction_fn(this, storeName_OR_storeNames, mode);
-    } else {
-      _transaction_fn = _transaction_string_mode;
-    }
-    return txn;
-  }
-
-  static _IDBTransactionImpl _transaction_string_mode(_IDBDatabaseImpl db, stores, mode) {
-    return db._transaction(stores, mode);
-  }
-
-  static _IDBTransactionImpl _transaction_numeric_mode(_IDBDatabaseImpl db, stores, mode) {
-    int intMode;
-    if (mode == 'readonly') intMode = IDBTransaction.READ_ONLY;
-    if (mode == 'readwrite') intMode = IDBTransaction.READ_WRITE;
-    return db._transaction(stores, intMode);
-  }
-
-  _IDBTransactionImpl _transaction(stores, mode) native 'transaction';
-
-  static bool _hasNumericMode(txn) =>
-      JS('bool', 'typeof(#.mode) === "number"', txn);
-
-
-  _IDBDatabaseEventsImpl get on =>
-    new _IDBDatabaseEventsImpl(this);
-
-  final String name;
-
-  final _DOMStringListImpl objectStoreNames;
-
-  final dynamic version;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  void close() native;
-
-  _IDBObjectStoreImpl createObjectStore(String name, [options]) {
-    if (?options) {
-      var options_1 = _convertDartToNative_Dictionary(options);
-      return _createObjectStore_1(name, options_1);
-    }
-    return _createObjectStore_2(name);
-  }
-  _IDBObjectStoreImpl _createObjectStore_1(name, options) native "createObjectStore";
-  _IDBObjectStoreImpl _createObjectStore_2(name) native "createObjectStore";
-
-  void deleteObjectStore(String name) native;
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  _IDBVersionChangeRequestImpl setVersion(String version) native;
-}
-
-// TODO(sra): This should be a static member of _IDBTransactionImpl but dart2js
-// can't handle that.  Move it back after dart2js is completely done.
-var _transaction_fn;  // Assigned one of the static methods.
-
-class _IDBDatabaseEventsImpl extends _EventsImpl implements IDBDatabaseEvents {
-  _IDBDatabaseEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get versionChange => this['versionchange'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBFactory
-abstract class IDBFactory {
-
-  /** @domName IDBFactory.cmp */
-  int cmp(/*IDBKey*/ first, /*IDBKey*/ second);
-
-  /** @domName IDBFactory.deleteDatabase */
-  IDBVersionChangeRequest deleteDatabase(String name);
-
-  /** @domName IDBFactory.open */
-  IDBOpenDBRequest open(String name, [int version]);
-
-  /** @domName IDBFactory.webkitGetDatabaseNames */
-  IDBRequest webkitGetDatabaseNames();
-}
-
-class _IDBFactoryImpl implements IDBFactory native "*IDBFactory" {
-
-  int cmp(/*IDBKey*/ first, /*IDBKey*/ second) {
-    var first_1 = _convertDartToNative_IDBKey(first);
-    var second_2 = _convertDartToNative_IDBKey(second);
-    return _cmp_1(first_1, second_2);
-  }
-  int _cmp_1(first, second) native "cmp";
-
-  _IDBVersionChangeRequestImpl deleteDatabase(String name) native;
-
-  _IDBOpenDBRequestImpl open(String name, [int version]) native;
-
-  _IDBRequestImpl webkitGetDatabaseNames() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBIndex
-abstract class IDBIndex {
-
-  /** @domName IDBIndex.keyPath */
-  dynamic get keyPath;
-
-  /** @domName IDBIndex.multiEntry */
-  bool get multiEntry;
-
-  /** @domName IDBIndex.name */
-  String get name;
-
-  /** @domName IDBIndex.objectStore */
-  IDBObjectStore get objectStore;
-
-  /** @domName IDBIndex.unique */
-  bool get unique;
-
-  /** @domName IDBIndex.count */
-  IDBRequest count([key_OR_range]);
-
-  /** @domName IDBIndex.get */
-  IDBRequest get(key);
-
-  /** @domName IDBIndex.getKey */
-  IDBRequest getKey(key);
-
-  /** @domName IDBIndex.openCursor */
-  IDBRequest openCursor([key_OR_range, String direction]);
-
-  /** @domName IDBIndex.openKeyCursor */
-  IDBRequest openKeyCursor([key_OR_range, String direction]);
-}
-
-class _IDBIndexImpl implements IDBIndex native "*IDBIndex" {
-
-  final dynamic keyPath;
-
-  final bool multiEntry;
-
-  final String name;
-
-  final _IDBObjectStoreImpl objectStore;
-
-  final bool unique;
-
-  _IDBRequestImpl count([key_OR_range]) {
-    if (!?key_OR_range) {
-      return _count_1();
-    }
-    if ((key_OR_range is IDBKeyRange || key_OR_range == null)) {
-      return _count_2(key_OR_range);
-    }
-    if (?key_OR_range) {
-      var key_1 = _convertDartToNative_IDBKey(key_OR_range);
-      return _count_3(key_1);
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  _IDBRequestImpl _count_1() native "count";
-  _IDBRequestImpl _count_2(_IDBKeyRangeImpl range) native "count";
-  _IDBRequestImpl _count_3(key) native "count";
-
-  _IDBRequestImpl get(key) {
-    if ((key is IDBKeyRange || key == null)) {
-      return _get_1(key);
-    }
-    if (?key) {
-      var key_1 = _convertDartToNative_IDBKey(key);
-      return _get_2(key_1);
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  _IDBRequestImpl _get_1(_IDBKeyRangeImpl key) native "get";
-  _IDBRequestImpl _get_2(key) native "get";
-
-  _IDBRequestImpl getKey(key) {
-    if ((key is IDBKeyRange || key == null)) {
-      return _getKey_1(key);
-    }
-    if (?key) {
-      var key_1 = _convertDartToNative_IDBKey(key);
-      return _getKey_2(key_1);
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  _IDBRequestImpl _getKey_1(_IDBKeyRangeImpl key) native "getKey";
-  _IDBRequestImpl _getKey_2(key) native "getKey";
-
-  _IDBRequestImpl openCursor([key_OR_range, direction]) {
-    if (!?key_OR_range &&
-        !?direction) {
-      return _openCursor_1();
-    }
-    if ((key_OR_range is IDBKeyRange || key_OR_range == null) &&
-        !?direction) {
-      return _openCursor_2(key_OR_range);
-    }
-    if ((key_OR_range is IDBKeyRange || key_OR_range == null) &&
-        (direction is String || direction == null)) {
-      return _openCursor_3(key_OR_range, direction);
-    }
-    if (?key_OR_range &&
-        !?direction) {
-      var key_1 = _convertDartToNative_IDBKey(key_OR_range);
-      return _openCursor_4(key_1);
-    }
-    if (?key_OR_range &&
-        (direction is String || direction == null)) {
-      var key_2 = _convertDartToNative_IDBKey(key_OR_range);
-      return _openCursor_5(key_2, direction);
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  _IDBRequestImpl _openCursor_1() native "openCursor";
-  _IDBRequestImpl _openCursor_2(_IDBKeyRangeImpl range) native "openCursor";
-  _IDBRequestImpl _openCursor_3(_IDBKeyRangeImpl range, String direction) native "openCursor";
-  _IDBRequestImpl _openCursor_4(key) native "openCursor";
-  _IDBRequestImpl _openCursor_5(key, String direction) native "openCursor";
-
-  _IDBRequestImpl openKeyCursor([key_OR_range, direction]) {
-    if (!?key_OR_range &&
-        !?direction) {
-      return _openKeyCursor_1();
-    }
-    if ((key_OR_range is IDBKeyRange || key_OR_range == null) &&
-        !?direction) {
-      return _openKeyCursor_2(key_OR_range);
-    }
-    if ((key_OR_range is IDBKeyRange || key_OR_range == null) &&
-        (direction is String || direction == null)) {
-      return _openKeyCursor_3(key_OR_range, direction);
-    }
-    if (?key_OR_range &&
-        !?direction) {
-      var key_1 = _convertDartToNative_IDBKey(key_OR_range);
-      return _openKeyCursor_4(key_1);
-    }
-    if (?key_OR_range &&
-        (direction is String || direction == null)) {
-      var key_2 = _convertDartToNative_IDBKey(key_OR_range);
-      return _openKeyCursor_5(key_2, direction);
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  _IDBRequestImpl _openKeyCursor_1() native "openKeyCursor";
-  _IDBRequestImpl _openKeyCursor_2(_IDBKeyRangeImpl range) native "openKeyCursor";
-  _IDBRequestImpl _openKeyCursor_3(_IDBKeyRangeImpl range, String direction) native "openKeyCursor";
-  _IDBRequestImpl _openKeyCursor_4(key) native "openKeyCursor";
-  _IDBRequestImpl _openKeyCursor_5(key, String direction) native "openKeyCursor";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBKey
-abstract class IDBKey {
-}
-
-class _IDBKeyImpl implements IDBKey native "*IDBKey" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName IDBKeyRange
-abstract class IDBKeyRange {
-
-  /**
-   * @domName IDBKeyRange.only
-   */
-  factory IDBKeyRange.only(/*IDBKey*/ value) =>
-      _IDBKeyRangeFactoryProvider.createIDBKeyRange_only(value);
-
-  /**
-   * @domName IDBKeyRange.lowerBound
-   */
-  factory IDBKeyRange.lowerBound(/*IDBKey*/ bound, [bool open = false]) =>
-      _IDBKeyRangeFactoryProvider.createIDBKeyRange_lowerBound(bound, open);
-
-  /**
-   * @domName IDBKeyRange.upperBound
-   */
-  factory IDBKeyRange.upperBound(/*IDBKey*/ bound, [bool open = false]) =>
-      _IDBKeyRangeFactoryProvider.createIDBKeyRange_upperBound(bound, open);
-
-  /**
-   * @domName IDBKeyRange.bound
-   */
-  factory IDBKeyRange.bound(/*IDBKey*/ lower, /*IDBKey*/ upper,
-                            [bool lowerOpen = false, bool upperOpen = false]) =>
-      _IDBKeyRangeFactoryProvider.createIDBKeyRange_bound(
-          lower, upper, lowerOpen, upperOpen);
-
-
-  /** @domName IDBKeyRange.lower */
-  dynamic get lower;
-
-  /** @domName IDBKeyRange.lowerOpen */
-  bool get lowerOpen;
-
-  /** @domName IDBKeyRange.upper */
-  dynamic get upper;
-
-  /** @domName IDBKeyRange.upperOpen */
-  bool get upperOpen;
-
-  /** @domName IDBKeyRange.bound_ */
-  static final bound_ = _IDBKeyRangeImpl.bound_;
-
-  /** @domName IDBKeyRange.lowerBound_ */
-  static final lowerBound_ = _IDBKeyRangeImpl.lowerBound_;
-
-  /** @domName IDBKeyRange.only_ */
-  static final only_ = _IDBKeyRangeImpl.only_;
-
-  /** @domName IDBKeyRange.upperBound_ */
-  static final upperBound_ = _IDBKeyRangeImpl.upperBound_;
-}
-
-class _IDBKeyRangeImpl implements IDBKeyRange native "*IDBKeyRange" {
-
-  dynamic get lower => _convertNativeToDart_IDBKey(this._lower);
-  dynamic get _lower => JS("dynamic", "#.lower", this);
-
-  final bool lowerOpen;
-
-  dynamic get upper => _convertNativeToDart_IDBKey(this._upper);
-  dynamic get _upper => JS("dynamic", "#.upper", this);
-
-  final bool upperOpen;
-
-  static _IDBKeyRangeImpl bound_(/*IDBKey*/ lower, /*IDBKey*/ upper, [lowerOpen, upperOpen]) {
-    if (?upperOpen) {
-      var lower_1 = _convertDartToNative_IDBKey(lower);
-      var upper_2 = _convertDartToNative_IDBKey(upper);
-      return _bound__1(lower_1, upper_2, lowerOpen, upperOpen);
-    }
-    if (?lowerOpen) {
-      var lower_3 = _convertDartToNative_IDBKey(lower);
-      var upper_4 = _convertDartToNative_IDBKey(upper);
-      return _bound__2(lower_3, upper_4, lowerOpen);
-    }
-    var lower_5 = _convertDartToNative_IDBKey(lower);
-    var upper_6 = _convertDartToNative_IDBKey(upper);
-    return _bound__3(lower_5, upper_6);
-  }
-  _IDBKeyRangeImpl _bound__1(lower, upper, bool lowerOpen, bool upperOpen) native "bound";
-  _IDBKeyRangeImpl _bound__2(lower, upper, bool lowerOpen) native "bound";
-  _IDBKeyRangeImpl _bound__3(lower, upper) native "bound";
-
-  static _IDBKeyRangeImpl lowerBound_(/*IDBKey*/ bound, [open]) {
-    if (?open) {
-      var bound_1 = _convertDartToNative_IDBKey(bound);
-      return _lowerBound__1(bound_1, open);
-    }
-    var bound_2 = _convertDartToNative_IDBKey(bound);
-    return _lowerBound__2(bound_2);
-  }
-  _IDBKeyRangeImpl _lowerBound__1(bound, bool open) native "lowerBound";
-  _IDBKeyRangeImpl _lowerBound__2(bound) native "lowerBound";
-
-  static _IDBKeyRangeImpl only_(/*IDBKey*/ value) {
-    var value_1 = _convertDartToNative_IDBKey(value);
-    return _only__1(value_1);
-  }
-  _IDBKeyRangeImpl _only__1(value) native "only";
-
-  static _IDBKeyRangeImpl upperBound_(/*IDBKey*/ bound, [open]) {
-    if (?open) {
-      var bound_1 = _convertDartToNative_IDBKey(bound);
-      return _upperBound__1(bound_1, open);
-    }
-    var bound_2 = _convertDartToNative_IDBKey(bound);
-    return _upperBound__2(bound_2);
-  }
-  _IDBKeyRangeImpl _upperBound__1(bound, bool open) native "upperBound";
-  _IDBKeyRangeImpl _upperBound__2(bound) native "upperBound";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBObjectStore
-abstract class IDBObjectStore {
-
-  /** @domName IDBObjectStore.autoIncrement */
-  bool get autoIncrement;
-
-  /** @domName IDBObjectStore.indexNames */
-  List<String> get indexNames;
-
-  /** @domName IDBObjectStore.keyPath */
-  dynamic get keyPath;
-
-  /** @domName IDBObjectStore.name */
-  String get name;
-
-  /** @domName IDBObjectStore.transaction */
-  IDBTransaction get transaction;
-
-  /** @domName IDBObjectStore.add */
-  IDBRequest add(Object value, [/*IDBKey*/ key]);
-
-  /** @domName IDBObjectStore.clear */
-  IDBRequest clear();
-
-  /** @domName IDBObjectStore.count */
-  IDBRequest count([key_OR_range]);
-
-  /** @domName IDBObjectStore.createIndex */
-  IDBIndex createIndex(String name, keyPath, [Map options]);
-
-  /** @domName IDBObjectStore.delete */
-  IDBRequest delete(key_OR_keyRange);
-
-  /** @domName IDBObjectStore.deleteIndex */
-  void deleteIndex(String name);
-
-  /** @domName IDBObjectStore.getObject */
-  IDBRequest getObject(key);
-
-  /** @domName IDBObjectStore.index */
-  IDBIndex index(String name);
-
-  /** @domName IDBObjectStore.openCursor */
-  IDBRequest openCursor([key_OR_range, String direction]);
-
-  /** @domName IDBObjectStore.put */
-  IDBRequest put(Object value, [/*IDBKey*/ key]);
-}
-
-class _IDBObjectStoreImpl implements IDBObjectStore native "*IDBObjectStore" {
-
-  final bool autoIncrement;
-
-  final _DOMStringListImpl indexNames;
-
-  final dynamic keyPath;
-
-  final String name;
-
-  final _IDBTransactionImpl transaction;
-
-  _IDBRequestImpl add(/*any*/ value, [key]) {
-    if (?key) {
-      var value_1 = _convertDartToNative_SerializedScriptValue(value);
-      var key_2 = _convertDartToNative_IDBKey(key);
-      return _add_1(value_1, key_2);
-    }
-    var value_3 = _convertDartToNative_SerializedScriptValue(value);
-    return _add_2(value_3);
-  }
-  _IDBRequestImpl _add_1(value, key) native "add";
-  _IDBRequestImpl _add_2(value) native "add";
-
-  _IDBRequestImpl clear() native;
-
-  _IDBRequestImpl count([key_OR_range]) {
-    if (!?key_OR_range) {
-      return _count_1();
-    }
-    if ((key_OR_range is IDBKeyRange || key_OR_range == null)) {
-      return _count_2(key_OR_range);
-    }
-    if (?key_OR_range) {
-      var key_1 = _convertDartToNative_IDBKey(key_OR_range);
-      return _count_3(key_1);
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  _IDBRequestImpl _count_1() native "count";
-  _IDBRequestImpl _count_2(_IDBKeyRangeImpl range) native "count";
-  _IDBRequestImpl _count_3(key) native "count";
-
-  _IDBIndexImpl createIndex(String name, keyPath, [options]) {
-    if ((keyPath is List<String> || keyPath == null) &&
-        !?options) {
-      List keyPath_1 = _convertDartToNative_StringArray(keyPath);
-      return _createIndex_1(name, keyPath_1);
-    }
-    if ((keyPath is List<String> || keyPath == null) &&
-        (options is Map || options == null)) {
-      List keyPath_2 = _convertDartToNative_StringArray(keyPath);
-      var options_3 = _convertDartToNative_Dictionary(options);
-      return _createIndex_2(name, keyPath_2, options_3);
-    }
-    if ((keyPath is String || keyPath == null) &&
-        !?options) {
-      return _createIndex_3(name, keyPath);
-    }
-    if ((keyPath is String || keyPath == null) &&
-        (options is Map || options == null)) {
-      var options_4 = _convertDartToNative_Dictionary(options);
-      return _createIndex_4(name, keyPath, options_4);
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  _IDBIndexImpl _createIndex_1(name, List keyPath) native "createIndex";
-  _IDBIndexImpl _createIndex_2(name, List keyPath, options) native "createIndex";
-  _IDBIndexImpl _createIndex_3(name, String keyPath) native "createIndex";
-  _IDBIndexImpl _createIndex_4(name, String keyPath, options) native "createIndex";
-
-  _IDBRequestImpl delete(key_OR_keyRange) {
-    if ((key_OR_keyRange is IDBKeyRange || key_OR_keyRange == null)) {
-      return _delete_1(key_OR_keyRange);
-    }
-    if (?key_OR_keyRange) {
-      var key_1 = _convertDartToNative_IDBKey(key_OR_keyRange);
-      return _delete_2(key_1);
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  _IDBRequestImpl _delete_1(_IDBKeyRangeImpl keyRange) native "delete";
-  _IDBRequestImpl _delete_2(key) native "delete";
-
-  void deleteIndex(String name) native;
-
-  _IDBRequestImpl getObject(key) {
-    if ((key is IDBKeyRange || key == null)) {
-      return _getObject_1(key);
-    }
-    if (?key) {
-      var key_1 = _convertDartToNative_IDBKey(key);
-      return _getObject_2(key_1);
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  _IDBRequestImpl _getObject_1(_IDBKeyRangeImpl key) native "get";
-  _IDBRequestImpl _getObject_2(key) native "get";
-
-  _IDBIndexImpl index(String name) native;
-
-  _IDBRequestImpl openCursor([key_OR_range, direction]) {
-    if (!?key_OR_range &&
-        !?direction) {
-      return _openCursor_1();
-    }
-    if ((key_OR_range is IDBKeyRange || key_OR_range == null) &&
-        !?direction) {
-      return _openCursor_2(key_OR_range);
-    }
-    if ((key_OR_range is IDBKeyRange || key_OR_range == null) &&
-        (direction is String || direction == null)) {
-      return _openCursor_3(key_OR_range, direction);
-    }
-    if (?key_OR_range &&
-        !?direction) {
-      var key_1 = _convertDartToNative_IDBKey(key_OR_range);
-      return _openCursor_4(key_1);
-    }
-    if (?key_OR_range &&
-        (direction is String || direction == null)) {
-      var key_2 = _convertDartToNative_IDBKey(key_OR_range);
-      return _openCursor_5(key_2, direction);
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  _IDBRequestImpl _openCursor_1() native "openCursor";
-  _IDBRequestImpl _openCursor_2(_IDBKeyRangeImpl range) native "openCursor";
-  _IDBRequestImpl _openCursor_3(_IDBKeyRangeImpl range, String direction) native "openCursor";
-  _IDBRequestImpl _openCursor_4(key) native "openCursor";
-  _IDBRequestImpl _openCursor_5(key, String direction) native "openCursor";
-
-  _IDBRequestImpl put(/*any*/ value, [key]) {
-    if (?key) {
-      var value_1 = _convertDartToNative_SerializedScriptValue(value);
-      var key_2 = _convertDartToNative_IDBKey(key);
-      return _put_1(value_1, key_2);
-    }
-    var value_3 = _convertDartToNative_SerializedScriptValue(value);
-    return _put_2(value_3);
-  }
-  _IDBRequestImpl _put_1(value, key) native "put";
-  _IDBRequestImpl _put_2(value) native "put";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBOpenDBRequest
-abstract class IDBOpenDBRequest implements IDBRequest, EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  IDBOpenDBRequestEvents get on;
-}
-
-abstract class IDBOpenDBRequestEvents implements IDBRequestEvents {
-
-  EventListenerList get blocked;
-
-  EventListenerList get upgradeNeeded;
-}
-
-class _IDBOpenDBRequestImpl extends _IDBRequestImpl implements IDBOpenDBRequest native "*IDBOpenDBRequest" {
-
-  _IDBOpenDBRequestEventsImpl get on =>
-    new _IDBOpenDBRequestEventsImpl(this);
-}
-
-class _IDBOpenDBRequestEventsImpl extends _IDBRequestEventsImpl implements IDBOpenDBRequestEvents {
-  _IDBOpenDBRequestEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get blocked => this['blocked'];
-
-  EventListenerList get upgradeNeeded => this['upgradeneeded'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBRequest
-abstract class IDBRequest implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  IDBRequestEvents get on;
-
-  /** @domName IDBRequest.error */
-  DOMError get error;
-
-  /** @domName IDBRequest.errorCode */
-  int get errorCode;
-
-  /** @domName IDBRequest.readyState */
-  String get readyState;
-
-  /** @domName IDBRequest.result */
-  dynamic get result;
-
-  /** @domName IDBRequest.source */
-  dynamic get source;
-
-  /** @domName IDBRequest.transaction */
-  IDBTransaction get transaction;
-
-  /** @domName IDBRequest.webkitErrorMessage */
-  String get webkitErrorMessage;
-
-  /** @domName IDBRequest.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName IDBRequest.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName IDBRequest.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class IDBRequestEvents implements Events {
-
-  EventListenerList get error;
-
-  EventListenerList get success;
-}
-
-class _IDBRequestImpl extends _EventTargetImpl implements IDBRequest native "*IDBRequest" {
-
-  _IDBRequestEventsImpl get on =>
-    new _IDBRequestEventsImpl(this);
-
-  final _DOMErrorImpl error;
-
-  final int errorCode;
-
-  final String readyState;
-
-  dynamic get result => _convertNativeToDart_IDBAny(this._result);
-  dynamic get _result => JS("dynamic", "#.result", this);
-
-  final dynamic source;
-
-  final _IDBTransactionImpl transaction;
-
-  final String webkitErrorMessage;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _IDBRequestEventsImpl extends _EventsImpl implements IDBRequestEvents {
-  _IDBRequestEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get success => this['success'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBTransaction
-abstract class IDBTransaction implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  IDBTransactionEvents get on;
-
-  static const int READ_ONLY = 0;
-
-  static const int READ_WRITE = 1;
-
-  static const int VERSION_CHANGE = 2;
-
-  /** @domName IDBTransaction.db */
-  IDBDatabase get db;
-
-  /** @domName IDBTransaction.error */
-  DOMError get error;
-
-  /** @domName IDBTransaction.mode */
-  String get mode;
-
-  /** @domName IDBTransaction.abort */
-  void abort();
-
-  /** @domName IDBTransaction.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName IDBTransaction.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName IDBTransaction.objectStore */
-  IDBObjectStore objectStore(String name);
-
-  /** @domName IDBTransaction.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class IDBTransactionEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get complete;
-
-  EventListenerList get error;
-}
-
-class _IDBTransactionImpl extends _EventTargetImpl implements IDBTransaction native "*IDBTransaction" {
-
-  _IDBTransactionEventsImpl get on =>
-    new _IDBTransactionEventsImpl(this);
-
-  final _IDBDatabaseImpl db;
-
-  final _DOMErrorImpl error;
-
-  final String mode;
-
-  void abort() native;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  _IDBObjectStoreImpl objectStore(String name) native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _IDBTransactionEventsImpl extends _EventsImpl implements IDBTransactionEvents {
-  _IDBTransactionEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get complete => this['complete'];
-
-  EventListenerList get error => this['error'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBVersionChangeEvent
-abstract class IDBUpgradeNeededEvent implements Event {
-
-  /** @domName IDBVersionChangeEvent.newVersion */
-  int get newVersion;
-
-  /** @domName IDBVersionChangeEvent.oldVersion */
-  int get oldVersion;
-}
-
-class _IDBUpgradeNeededEventImpl extends _EventImpl implements IDBUpgradeNeededEvent native "*IDBVersionChangeEvent" {
-
-  final int newVersion;
-
-  final int oldVersion;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBVersionChangeEvent
-abstract class IDBVersionChangeEvent implements Event {
-
-  /** @domName IDBVersionChangeEvent.version */
-  String get version;
-}
-
-class _IDBVersionChangeEventImpl extends _EventImpl implements IDBVersionChangeEvent native "*IDBVersionChangeEvent" {
-
-  final String version;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IDBVersionChangeRequest
-abstract class IDBVersionChangeRequest implements IDBRequest, EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  IDBVersionChangeRequestEvents get on;
-}
-
-abstract class IDBVersionChangeRequestEvents implements IDBRequestEvents {
-
-  EventListenerList get blocked;
-}
-
-class _IDBVersionChangeRequestImpl extends _IDBRequestImpl implements IDBVersionChangeRequest native "*IDBVersionChangeRequest" {
-
-  _IDBVersionChangeRequestEventsImpl get on =>
-    new _IDBVersionChangeRequestEventsImpl(this);
-}
-
-class _IDBVersionChangeRequestEventsImpl extends _IDBRequestEventsImpl implements IDBVersionChangeRequestEvents {
-  _IDBVersionChangeRequestEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get blocked => this['blocked'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLIFrameElement
-abstract class IFrameElement implements Element {
-
-  factory IFrameElement() => _Elements.createIFrameElement();
-
-  /** @domName HTMLIFrameElement.align */
-  String align;
-
-  /** @domName HTMLIFrameElement.contentWindow */
-  Window get contentWindow;
-
-  /** @domName HTMLIFrameElement.frameBorder */
-  String frameBorder;
-
-  /** @domName HTMLIFrameElement.height */
-  String height;
-
-  /** @domName HTMLIFrameElement.longDesc */
-  String longDesc;
-
-  /** @domName HTMLIFrameElement.marginHeight */
-  String marginHeight;
-
-  /** @domName HTMLIFrameElement.marginWidth */
-  String marginWidth;
-
-  /** @domName HTMLIFrameElement.name */
-  String name;
-
-  /** @domName HTMLIFrameElement.sandbox */
-  String sandbox;
-
-  /** @domName HTMLIFrameElement.scrolling */
-  String scrolling;
-
-  /** @domName HTMLIFrameElement.src */
-  String src;
-
-  /** @domName HTMLIFrameElement.srcdoc */
-  String srcdoc;
-
-  /** @domName HTMLIFrameElement.width */
-  String width;
-}
-
-class _IFrameElementImpl extends _ElementImpl implements IFrameElement native "*HTMLIFrameElement" {
-
-  String align;
-
-  Window get contentWindow => _convertNativeToDart_Window(this._contentWindow);
-  Window get _contentWindow => JS("Window", "#.contentWindow", this);
-
-  String frameBorder;
-
-  String height;
-
-  String longDesc;
-
-  String marginHeight;
-
-  String marginWidth;
-
-  String name;
-
-  String sandbox;
-
-  String scrolling;
-
-  String src;
-
-  String srcdoc;
-
-  String width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void IceCallback(IceCandidate candidate, bool moreToFollow, PeerConnection00 source);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName IceCandidate
-abstract class IceCandidate {
-
-  factory IceCandidate(String label, String candidateLine) => _IceCandidateFactoryProvider.createIceCandidate(label, candidateLine);
-
-  /** @domName IceCandidate.label */
-  String get label;
-
-  /** @domName IceCandidate.toSdp */
-  String toSdp();
-}
-
-class _IceCandidateImpl implements IceCandidate native "*IceCandidate" {
-
-  final String label;
-
-  String toSdp() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ImageData
-abstract class ImageData {
-
-  /** @domName ImageData.data */
-  Uint8ClampedArray get data;
-
-  /** @domName ImageData.height */
-  int get height;
-
-  /** @domName ImageData.width */
-  int get width;
-}
-
-class _ImageDataImpl implements ImageData native "*ImageData" {
-
-  final _Uint8ClampedArrayImpl data;
-
-  final int height;
-
-  final int width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLImageElement
-abstract class ImageElement implements Element {
-
-  factory ImageElement({String src, int width, int height}) {
-    if (!?src) {
-      return _Elements.createImageElement();
-    }
-    if (!?width) {
-      return _Elements.createImageElement(src);
-    }
-    if (!?height) {
-      return _Elements.createImageElement(src, width);
-    }
-    return _Elements.createImageElement(src, width, height);
-  }
-
-  /** @domName HTMLImageElement.align */
-  String align;
-
-  /** @domName HTMLImageElement.alt */
-  String alt;
-
-  /** @domName HTMLImageElement.border */
-  String border;
-
-  /** @domName HTMLImageElement.complete */
-  bool get complete;
-
-  /** @domName HTMLImageElement.crossOrigin */
-  String crossOrigin;
-
-  /** @domName HTMLImageElement.height */
-  int height;
-
-  /** @domName HTMLImageElement.hspace */
-  int hspace;
-
-  /** @domName HTMLImageElement.isMap */
-  bool isMap;
-
-  /** @domName HTMLImageElement.longDesc */
-  String longDesc;
-
-  /** @domName HTMLImageElement.lowsrc */
-  String lowsrc;
-
-  /** @domName HTMLImageElement.name */
-  String name;
-
-  /** @domName HTMLImageElement.naturalHeight */
-  int get naturalHeight;
-
-  /** @domName HTMLImageElement.naturalWidth */
-  int get naturalWidth;
-
-  /** @domName HTMLImageElement.src */
-  String src;
-
-  /** @domName HTMLImageElement.useMap */
-  String useMap;
-
-  /** @domName HTMLImageElement.vspace */
-  int vspace;
-
-  /** @domName HTMLImageElement.width */
-  int width;
-
-  /** @domName HTMLImageElement.x */
-  int get x;
-
-  /** @domName HTMLImageElement.y */
-  int get y;
-}
-
-class _ImageElementImpl extends _ElementImpl implements ImageElement native "*HTMLImageElement" {
-
-  String align;
-
-  String alt;
-
-  String border;
-
-  final bool complete;
-
-  String crossOrigin;
-
-  int height;
-
-  int hspace;
-
-  bool isMap;
-
-  String longDesc;
-
-  String lowsrc;
-
-  String name;
-
-  final int naturalHeight;
-
-  final int naturalWidth;
-
-  String src;
-
-  String useMap;
-
-  int vspace;
-
-  int width;
-
-  final int x;
-
-  final int y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLInputElement
-abstract class InputElement implements Element {
-
-  factory InputElement({String type}) {
-    if (!?type) {
-      return _Elements.createInputElement();
-    }
-    return _Elements.createInputElement(type);
-  }
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  InputElementEvents get on;
-
-  /** @domName HTMLInputElement.accept */
-  String accept;
-
-  /** @domName HTMLInputElement.align */
-  String align;
-
-  /** @domName HTMLInputElement.alt */
-  String alt;
-
-  /** @domName HTMLInputElement.autocomplete */
-  String autocomplete;
-
-  /** @domName HTMLInputElement.autofocus */
-  bool autofocus;
-
-  /** @domName HTMLInputElement.checked */
-  bool checked;
-
-  /** @domName HTMLInputElement.defaultChecked */
-  bool defaultChecked;
-
-  /** @domName HTMLInputElement.defaultValue */
-  String defaultValue;
-
-  /** @domName HTMLInputElement.dirName */
-  String dirName;
-
-  /** @domName HTMLInputElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLInputElement.files */
-  List<File> files;
-
-  /** @domName HTMLInputElement.form */
-  FormElement get form;
-
-  /** @domName HTMLInputElement.formAction */
-  String formAction;
-
-  /** @domName HTMLInputElement.formEnctype */
-  String formEnctype;
-
-  /** @domName HTMLInputElement.formMethod */
-  String formMethod;
-
-  /** @domName HTMLInputElement.formNoValidate */
-  bool formNoValidate;
-
-  /** @domName HTMLInputElement.formTarget */
-  String formTarget;
-
-  /** @domName HTMLInputElement.height */
-  int height;
-
-  /** @domName HTMLInputElement.incremental */
-  bool incremental;
-
-  /** @domName HTMLInputElement.indeterminate */
-  bool indeterminate;
-
-  /** @domName HTMLInputElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLInputElement.list */
-  Element get list;
-
-  /** @domName HTMLInputElement.max */
-  String max;
-
-  /** @domName HTMLInputElement.maxLength */
-  int maxLength;
-
-  /** @domName HTMLInputElement.min */
-  String min;
-
-  /** @domName HTMLInputElement.multiple */
-  bool multiple;
-
-  /** @domName HTMLInputElement.name */
-  String name;
-
-  /** @domName HTMLInputElement.pattern */
-  String pattern;
-
-  /** @domName HTMLInputElement.placeholder */
-  String placeholder;
-
-  /** @domName HTMLInputElement.readOnly */
-  bool readOnly;
-
-  /** @domName HTMLInputElement.required */
-  bool required;
-
-  /** @domName HTMLInputElement.selectionDirection */
-  String selectionDirection;
-
-  /** @domName HTMLInputElement.selectionEnd */
-  int selectionEnd;
-
-  /** @domName HTMLInputElement.selectionStart */
-  int selectionStart;
-
-  /** @domName HTMLInputElement.size */
-  int size;
-
-  /** @domName HTMLInputElement.src */
-  String src;
-
-  /** @domName HTMLInputElement.step */
-  String step;
-
-  /** @domName HTMLInputElement.type */
-  String type;
-
-  /** @domName HTMLInputElement.useMap */
-  String useMap;
-
-  /** @domName HTMLInputElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLInputElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLInputElement.value */
-  String value;
-
-  /** @domName HTMLInputElement.valueAsDate */
-  Date valueAsDate;
-
-  /** @domName HTMLInputElement.valueAsNumber */
-  num valueAsNumber;
-
-  /** @domName HTMLInputElement.webkitEntries */
-  List<Entry> get webkitEntries;
-
-  /** @domName HTMLInputElement.webkitGrammar */
-  bool webkitGrammar;
-
-  /** @domName HTMLInputElement.webkitSpeech */
-  bool webkitSpeech;
-
-  /** @domName HTMLInputElement.webkitdirectory */
-  bool webkitdirectory;
-
-  /** @domName HTMLInputElement.width */
-  int width;
-
-  /** @domName HTMLInputElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLInputElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLInputElement.select */
-  void select();
-
-  /** @domName HTMLInputElement.setCustomValidity */
-  void setCustomValidity(String error);
-
-  /** @domName HTMLInputElement.setRangeText */
-  void setRangeText(String replacement, [int start, int end, String selectionMode]);
-
-  /** @domName HTMLInputElement.setSelectionRange */
-  void setSelectionRange(int start, int end, [String direction]);
-
-  /** @domName HTMLInputElement.stepDown */
-  void stepDown([int n]);
-
-  /** @domName HTMLInputElement.stepUp */
-  void stepUp([int n]);
-}
-
-abstract class InputElementEvents implements ElementEvents {
-
-  EventListenerList get speechChange;
-}
-
-class _InputElementImpl extends _ElementImpl implements InputElement native "*HTMLInputElement" {
-
-  _InputElementEventsImpl get on =>
-    new _InputElementEventsImpl(this);
-
-  String accept;
-
-  String align;
-
-  String alt;
-
-  String autocomplete;
-
-  bool autofocus;
-
-  bool checked;
-
-  bool defaultChecked;
-
-  String defaultValue;
-
-  String dirName;
-
-  bool disabled;
-
-  _FileListImpl files;
-
-  final _FormElementImpl form;
-
-  String formAction;
-
-  String formEnctype;
-
-  String formMethod;
-
-  bool formNoValidate;
-
-  String formTarget;
-
-  int height;
-
-  bool incremental;
-
-  bool indeterminate;
-
-  final List<Node> labels;
-
-  final _ElementImpl list;
-
-  String max;
-
-  int maxLength;
-
-  String min;
-
-  bool multiple;
-
-  String name;
-
-  String pattern;
-
-  String placeholder;
-
-  bool readOnly;
-
-  bool required;
-
-  String selectionDirection;
-
-  int selectionEnd;
-
-  int selectionStart;
-
-  int size;
-
-  String src;
-
-  String step;
-
-  String type;
-
-  String useMap;
-
-  final String validationMessage;
-
-  final _ValidityStateImpl validity;
-
-  String value;
-
-  Date valueAsDate;
-
-  num valueAsNumber;
-
-  final _EntryArrayImpl webkitEntries;
-
-  bool webkitGrammar;
-
-  bool webkitSpeech;
-
-  bool webkitdirectory;
-
-  int width;
-
-  final bool willValidate;
-
-  bool checkValidity() native;
-
-  void select() native;
-
-  void setCustomValidity(String error) native;
-
-  void setRangeText(String replacement, [int start, int end, String selectionMode]) native;
-
-  void setSelectionRange(int start, int end, [String direction]) native;
-
-  void stepDown([int n]) native;
-
-  void stepUp([int n]) native;
-}
-
-class _InputElementEventsImpl extends _ElementEventsImpl implements InputElementEvents {
-  _InputElementEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get speechChange => this['webkitSpeechChange'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Int16Array
-abstract class Int16Array implements ArrayBufferView, List<int> {
-
-  factory Int16Array(int length) =>
-    _TypedArrayFactoryProvider.createInt16Array(length);
-
-  factory Int16Array.fromList(List<int> list) =>
-    _TypedArrayFactoryProvider.createInt16Array_fromList(list);
-
-  factory Int16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
-    _TypedArrayFactoryProvider.createInt16Array_fromBuffer(buffer, byteOffset, length);
-
-  static const int BYTES_PER_ELEMENT = 2;
-
-  /** @domName Int16Array.length */
-  int get length;
-
-  /** @domName Int16Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Int16Array.subarray */
-  Int16Array subarray(int start, [int end]);
-}
-
-class _Int16ArrayImpl extends _ArrayBufferViewImpl implements Int16Array, List<int>, JavaScriptIndexingBehavior native "*Int16Array" {
-
-  final int length;
-
-  int operator[](int index) => JS("int", "#[#]", this, index);
-
-  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<int> mixins.
-  // int is the element type.
-
-  // From Iterable<int>:
-
-  Iterator<int> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<int>(this);
-  }
-
-  // From Collection<int>:
-
-  void add(int value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(int value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<int> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(int element) => _Collections.contains(this, element);
-
-  void forEach(void f(int element)) => _Collections.forEach(this, f);
-
-  Collection map(f(int element)) => _Collections.map(this, [], f);
-
-  Collection<int> filter(bool f(int element)) =>
-     _Collections.filter(this, <int>[], f);
-
-  bool every(bool f(int element)) => _Collections.every(this, f);
-
-  bool some(bool f(int element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<int>:
-
-  void sort([Comparator<int> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(int element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(int element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  int get last => this[length - 1];
-
-  int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [int initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<int> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <int>[]);
-
-  // -- end List<int> mixins.
-
-  void setElements(Object array, [int offset]) native "set";
-
-  _Int16ArrayImpl subarray(int start, [int end]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Int32Array
-abstract class Int32Array implements ArrayBufferView, List<int> {
-
-  factory Int32Array(int length) =>
-    _TypedArrayFactoryProvider.createInt32Array(length);
-
-  factory Int32Array.fromList(List<int> list) =>
-    _TypedArrayFactoryProvider.createInt32Array_fromList(list);
-
-  factory Int32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
-    _TypedArrayFactoryProvider.createInt32Array_fromBuffer(buffer, byteOffset, length);
-
-  static const int BYTES_PER_ELEMENT = 4;
-
-  /** @domName Int32Array.length */
-  int get length;
-
-  /** @domName Int32Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Int32Array.subarray */
-  Int32Array subarray(int start, [int end]);
-}
-
-class _Int32ArrayImpl extends _ArrayBufferViewImpl implements Int32Array, List<int>, JavaScriptIndexingBehavior native "*Int32Array" {
-
-  final int length;
-
-  int operator[](int index) => JS("int", "#[#]", this, index);
-
-  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<int> mixins.
-  // int is the element type.
-
-  // From Iterable<int>:
-
-  Iterator<int> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<int>(this);
-  }
-
-  // From Collection<int>:
-
-  void add(int value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(int value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<int> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(int element) => _Collections.contains(this, element);
-
-  void forEach(void f(int element)) => _Collections.forEach(this, f);
-
-  Collection map(f(int element)) => _Collections.map(this, [], f);
-
-  Collection<int> filter(bool f(int element)) =>
-     _Collections.filter(this, <int>[], f);
-
-  bool every(bool f(int element)) => _Collections.every(this, f);
-
-  bool some(bool f(int element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<int>:
-
-  void sort([Comparator<int> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(int element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(int element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  int get last => this[length - 1];
-
-  int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [int initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<int> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <int>[]);
-
-  // -- end List<int> mixins.
-
-  void setElements(Object array, [int offset]) native "set";
-
-  _Int32ArrayImpl subarray(int start, [int end]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Int8Array
-abstract class Int8Array implements ArrayBufferView, List<int> {
-
-  factory Int8Array(int length) =>
-    _TypedArrayFactoryProvider.createInt8Array(length);
-
-  factory Int8Array.fromList(List<int> list) =>
-    _TypedArrayFactoryProvider.createInt8Array_fromList(list);
-
-  factory Int8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
-    _TypedArrayFactoryProvider.createInt8Array_fromBuffer(buffer, byteOffset, length);
-
-  static const int BYTES_PER_ELEMENT = 1;
-
-  /** @domName Int8Array.length */
-  int get length;
-
-  /** @domName Int8Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Int8Array.subarray */
-  Int8Array subarray(int start, [int end]);
-}
-
-class _Int8ArrayImpl extends _ArrayBufferViewImpl implements Int8Array, List<int>, JavaScriptIndexingBehavior native "*Int8Array" {
-
-  final int length;
-
-  int operator[](int index) => JS("int", "#[#]", this, index);
-
-  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<int> mixins.
-  // int is the element type.
-
-  // From Iterable<int>:
-
-  Iterator<int> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<int>(this);
-  }
-
-  // From Collection<int>:
-
-  void add(int value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(int value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<int> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(int element) => _Collections.contains(this, element);
-
-  void forEach(void f(int element)) => _Collections.forEach(this, f);
-
-  Collection map(f(int element)) => _Collections.map(this, [], f);
-
-  Collection<int> filter(bool f(int element)) =>
-     _Collections.filter(this, <int>[], f);
-
-  bool every(bool f(int element)) => _Collections.every(this, f);
-
-  bool some(bool f(int element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<int>:
-
-  void sort([Comparator<int> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(int element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(int element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  int get last => this[length - 1];
-
-  int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [int initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<int> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <int>[]);
-
-  // -- end List<int> mixins.
-
-  void setElements(Object array, [int offset]) native "set";
-
-  _Int8ArrayImpl subarray(int start, [int end]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName JavaScriptCallFrame
-abstract class JavaScriptCallFrame {
-
-  static const int CATCH_SCOPE = 4;
-
-  static const int CLOSURE_SCOPE = 3;
-
-  static const int GLOBAL_SCOPE = 0;
-
-  static const int LOCAL_SCOPE = 1;
-
-  static const int WITH_SCOPE = 2;
-
-  /** @domName JavaScriptCallFrame.caller */
-  JavaScriptCallFrame get caller;
-
-  /** @domName JavaScriptCallFrame.column */
-  int get column;
-
-  /** @domName JavaScriptCallFrame.functionName */
-  String get functionName;
-
-  /** @domName JavaScriptCallFrame.line */
-  int get line;
-
-  /** @domName JavaScriptCallFrame.scopeChain */
-  List get scopeChain;
-
-  /** @domName JavaScriptCallFrame.sourceID */
-  int get sourceID;
-
-  /** @domName JavaScriptCallFrame.thisObject */
-  Object get thisObject;
-
-  /** @domName JavaScriptCallFrame.type */
-  String get type;
-
-  /** @domName JavaScriptCallFrame.evaluate */
-  void evaluate(String script);
-
-  /** @domName JavaScriptCallFrame.restart */
-  Object restart();
-
-  /** @domName JavaScriptCallFrame.scopeType */
-  int scopeType(int scopeIndex);
-}
-
-class _JavaScriptCallFrameImpl implements JavaScriptCallFrame native "*JavaScriptCallFrame" {
-
-  final _JavaScriptCallFrameImpl caller;
-
-  final int column;
-
-  final String functionName;
-
-  final int line;
-
-  final List scopeChain;
-
-  final int sourceID;
-
-  final Object thisObject;
-
-  final String type;
-
-  void evaluate(String script) native;
-
-  Object restart() native;
-
-  int scopeType(int scopeIndex) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName KeyboardEvent
-abstract class KeyboardEvent implements UIEvent {
-
-  /** @domName KeyboardEvent.altGraphKey */
-  bool get altGraphKey;
-
-  /** @domName KeyboardEvent.altKey */
-  bool get altKey;
-
-  /** @domName KeyboardEvent.ctrlKey */
-  bool get ctrlKey;
-
-  /** @domName KeyboardEvent.keyIdentifier */
-  String get keyIdentifier;
-
-  /** @domName KeyboardEvent.keyLocation */
-  int get keyLocation;
-
-  /** @domName KeyboardEvent.metaKey */
-  bool get metaKey;
-
-  /** @domName KeyboardEvent.shiftKey */
-  bool get shiftKey;
-
-  /** @domName KeyboardEvent.initKeyboardEvent */
-  void initKeyboardEvent(String type, bool canBubble, bool cancelable, LocalWindow view, String keyIdentifier, int keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey);
-}
-
-class _KeyboardEventImpl extends _UIEventImpl implements KeyboardEvent native "*KeyboardEvent" {
-
-  final bool altGraphKey;
-
-  final bool altKey;
-
-  final bool ctrlKey;
-
-  final String keyIdentifier;
-
-  final int keyLocation;
-
-  final bool metaKey;
-
-  final bool shiftKey;
-
-  void initKeyboardEvent(String type, bool canBubble, bool cancelable, _LocalWindowImpl view, String keyIdentifier, int keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLKeygenElement
-abstract class KeygenElement implements Element {
-
-  factory KeygenElement() => _Elements.createKeygenElement();
-
-  /** @domName HTMLKeygenElement.autofocus */
-  bool autofocus;
-
-  /** @domName HTMLKeygenElement.challenge */
-  String challenge;
-
-  /** @domName HTMLKeygenElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLKeygenElement.form */
-  FormElement get form;
-
-  /** @domName HTMLKeygenElement.keytype */
-  String keytype;
-
-  /** @domName HTMLKeygenElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLKeygenElement.name */
-  String name;
-
-  /** @domName HTMLKeygenElement.type */
-  String get type;
-
-  /** @domName HTMLKeygenElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLKeygenElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLKeygenElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLKeygenElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLKeygenElement.setCustomValidity */
-  void setCustomValidity(String error);
-}
-
-class _KeygenElementImpl extends _ElementImpl implements KeygenElement native "*HTMLKeygenElement" {
-
-  bool autofocus;
-
-  String challenge;
-
-  bool disabled;
-
-  final _FormElementImpl form;
-
-  String keytype;
-
-  final List<Node> labels;
-
-  String name;
-
-  final String type;
-
-  final String validationMessage;
-
-  final _ValidityStateImpl validity;
-
-  final bool willValidate;
-
-  bool checkValidity() native;
-
-  void setCustomValidity(String error) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLLIElement
-abstract class LIElement implements Element {
-
-  factory LIElement() => _Elements.createLIElement();
-
-  /** @domName HTMLLIElement.type */
-  String type;
-
-  /** @domName HTMLLIElement.value */
-  int value;
-}
-
-class _LIElementImpl extends _ElementImpl implements LIElement native "*HTMLLIElement" {
-
-  String type;
-
-  int value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLLabelElement
-abstract class LabelElement implements Element {
-
-  factory LabelElement() => _Elements.createLabelElement();
-
-  /** @domName HTMLLabelElement.control */
-  Element get control;
-
-  /** @domName HTMLLabelElement.form */
-  FormElement get form;
-
-  /** @domName HTMLLabelElement.htmlFor */
-  String htmlFor;
-}
-
-class _LabelElementImpl extends _ElementImpl implements LabelElement native "*HTMLLabelElement" {
-
-  final _ElementImpl control;
-
-  final _FormElementImpl form;
-
-  String htmlFor;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLLegendElement
-abstract class LegendElement implements Element {
-
-  factory LegendElement() => _Elements.createLegendElement();
-
-  /** @domName HTMLLegendElement.align */
-  String align;
-
-  /** @domName HTMLLegendElement.form */
-  FormElement get form;
-}
-
-class _LegendElementImpl extends _ElementImpl implements LegendElement native "*HTMLLegendElement" {
-
-  String align;
-
-  final _FormElementImpl form;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLLinkElement
-abstract class LinkElement implements Element {
-
-  factory LinkElement() => _Elements.createLinkElement();
-
-  /** @domName HTMLLinkElement.charset */
-  String charset;
-
-  /** @domName HTMLLinkElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLLinkElement.href */
-  String href;
-
-  /** @domName HTMLLinkElement.hreflang */
-  String hreflang;
-
-  /** @domName HTMLLinkElement.media */
-  String media;
-
-  /** @domName HTMLLinkElement.rel */
-  String rel;
-
-  /** @domName HTMLLinkElement.rev */
-  String rev;
-
-  /** @domName HTMLLinkElement.sheet */
-  StyleSheet get sheet;
-
-  /** @domName HTMLLinkElement.sizes */
-  DOMSettableTokenList sizes;
-
-  /** @domName HTMLLinkElement.target */
-  String target;
-
-  /** @domName HTMLLinkElement.type */
-  String type;
-}
-
-class _LinkElementImpl extends _ElementImpl implements LinkElement native "*HTMLLinkElement" {
-
-  String charset;
-
-  bool disabled;
-
-  String href;
-
-  String hreflang;
-
-  String media;
-
-  String rel;
-
-  String rev;
-
-  final _StyleSheetImpl sheet;
-
-  _DOMSettableTokenListImpl sizes;
-
-  String target;
-
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName History
-abstract class LocalHistory implements History {
-
-  /** @domName History.length */
-  int get length;
-
-  /** @domName History.state */
-  dynamic get state;
-
-  /** @domName History.back */
-  void back();
-
-  /** @domName History.forward */
-  void forward();
-
-  /** @domName History.go */
-  void go(int distance);
-
-  /** @domName History.pushState */
-  void pushState(Object data, String title, [String url]);
-
-  /** @domName History.replaceState */
-  void replaceState(Object data, String title, [String url]);
-}
-
-class _LocalHistoryImpl implements LocalHistory native "*History" {
-
-  final int length;
-
-  final dynamic state;
-
-  void back() native;
-
-  void forward() native;
-
-  void go(int distance) native;
-
-  void pushState(Object data, String title, [String url]) native;
-
-  void replaceState(Object data, String title, [String url]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Location
-abstract class LocalLocation implements Location {
-
-  /** @domName Location.ancestorOrigins */
-  List<String> get ancestorOrigins;
-
-  /** @domName Location.hash */
-  String hash;
-
-  /** @domName Location.host */
-  String host;
-
-  /** @domName Location.hostname */
-  String hostname;
-
-  /** @domName Location.href */
-  String href;
-
-  /** @domName Location.origin */
-  String get origin;
-
-  /** @domName Location.pathname */
-  String pathname;
-
-  /** @domName Location.port */
-  String port;
-
-  /** @domName Location.protocol */
-  String protocol;
-
-  /** @domName Location.search */
-  String search;
-
-  /** @domName Location.assign */
-  void assign(String url);
-
-  /** @domName Location.reload */
-  void reload();
-
-  /** @domName Location.replace */
-  void replace(String url);
-
-  /** @domName Location.toString */
-  String toString();
-}
-
-class _LocalLocationImpl implements LocalLocation native "*Location" {
-
-  final _DOMStringListImpl ancestorOrigins;
-
-  String hash;
-
-  String host;
-
-  String hostname;
-
-  String href;
-
-  final String origin;
-
-  String pathname;
-
-  String port;
-
-  String protocol;
-
-  String search;
-
-  void assign(String url) native;
-
-  void reload() native;
-
-  void replace(String url) native;
-
-  String toString() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName LocalMediaStream
-abstract class LocalMediaStream implements MediaStream, EventTarget {
-
-  /** @domName LocalMediaStream.stop */
-  void stop();
-}
-
-class _LocalMediaStreamImpl extends _MediaStreamImpl implements LocalMediaStream native "*LocalMediaStream" {
-
-  void stop() native;
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName Window
-abstract class LocalWindow implements EventTarget, Window {
-
-  /**
-   * Register a [port] on this window under the given [name].  This
-   * port may be retrieved by any isolate (or JavaScript script)
-   * running in this window.
-   */
-  void registerPort(String name, SendPortSync port);
-
-  /**
-   * Lookup a port by its [name].  Return null if no port is
-   * registered under [name].
-   */
-  SendPortSync lookupPort(String name);
-
-  /**
-   * Executes a [callback] after the next batch of browser layout measurements
-   * has completed or would have completed if any browser layout measurements
-   * had been scheduled.
-   */
-  void requestLayoutFrame(TimeoutHandler callback);
-
-  /**
-   * Creates a new object URL for the specified object. The URL will be
-   * available until revokeObjectUrl is called.
-   * [object] can be a Blob, MediaStream or MediaSource.
-   */
-  String createObjectUrl(object);
-
-  /** @domName DOMURL.revokeObjectURL */
-  void revokeObjectUrl(String objectUrl);
-
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  LocalWindowEvents get on;
-
-  static const int PERSISTENT = 1;
-
-  static const int TEMPORARY = 0;
-
-  /** @domName Window.applicationCache */
-  DOMApplicationCache get applicationCache;
-
-  /** @domName Window.clientInformation */
-  Navigator get clientInformation;
-
-  /** @domName Window.closed */
-  bool get closed;
-
-  /** @domName Window.console */
-  Console get console;
-
-  /** @domName Window.crypto */
-  Crypto get crypto;
-
-  /** @domName Window.defaultStatus */
-  String defaultStatus;
-
-  /** @domName Window.defaultstatus */
-  String defaultstatus;
-
-  /** @domName Window.devicePixelRatio */
-  num get devicePixelRatio;
-
-  /** @domName Window.document */
-  Document get document;
-
-  /** @domName Window.event */
-  Event get event;
-
-  /** @domName Window.history */
-  LocalHistory get history;
-
-  /** @domName DOMWindow.indexedDB */
-  IDBFactory get indexedDB;
-
-  /** @domName Window.innerHeight */
-  int get innerHeight;
-
-  /** @domName Window.innerWidth */
-  int get innerWidth;
-
-  /** @domName Window.localStorage */
-  Storage get localStorage;
-
-  /** @domName Window.location */
-  LocalLocation location;
-
-  /** @domName Window.locationbar */
-  BarInfo get locationbar;
-
-  /** @domName Window.menubar */
-  BarInfo get menubar;
-
-  /** @domName Window.name */
-  String name;
-
-  /** @domName Window.navigator */
-  Navigator get navigator;
-
-  /** @domName Window.offscreenBuffering */
-  bool get offscreenBuffering;
-
-  /** @domName Window.opener */
-  Window get opener;
-
-  /** @domName Window.outerHeight */
-  int get outerHeight;
-
-  /** @domName Window.outerWidth */
-  int get outerWidth;
-
-  /** @domName DOMWindow.pagePopupController */
-  PagePopupController get pagePopupController;
-
-  /** @domName Window.pageXOffset */
-  int get pageXOffset;
-
-  /** @domName Window.pageYOffset */
-  int get pageYOffset;
-
-  /** @domName Window.parent */
-  Window get parent;
-
-  /** @domName Window.performance */
-  Performance get performance;
-
-  /** @domName Window.personalbar */
-  BarInfo get personalbar;
-
-  /** @domName Window.screen */
-  Screen get screen;
-
-  /** @domName Window.screenLeft */
-  int get screenLeft;
-
-  /** @domName Window.screenTop */
-  int get screenTop;
-
-  /** @domName Window.screenX */
-  int get screenX;
-
-  /** @domName Window.screenY */
-  int get screenY;
-
-  /** @domName Window.scrollX */
-  int get scrollX;
-
-  /** @domName Window.scrollY */
-  int get scrollY;
-
-  /** @domName Window.scrollbars */
-  BarInfo get scrollbars;
-
-  /** @domName Window.self */
-  Window get self;
-
-  /** @domName Window.sessionStorage */
-  Storage get sessionStorage;
-
-  /** @domName Window.status */
-  String status;
-
-  /** @domName Window.statusbar */
-  BarInfo get statusbar;
-
-  /** @domName Window.styleMedia */
-  StyleMedia get styleMedia;
-
-  /** @domName Window.toolbar */
-  BarInfo get toolbar;
-
-  /** @domName Window.top */
-  Window get top;
-
-  /** @domName DOMWindow.webkitIndexedDB */
-  IDBFactory get webkitIndexedDB;
-
-  /** @domName DOMWindow.webkitNotifications */
-  NotificationCenter get webkitNotifications;
-
-  /** @domName DOMWindow.webkitStorageInfo */
-  StorageInfo get webkitStorageInfo;
-
-  /** @domName Window.window */
-  Window get window;
-
-  /** @domName Window.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Window.alert */
-  void alert(String message);
-
-  /** @domName Window.atob */
-  String atob(String string);
-
-  /** @domName Window.blur */
-  void blur();
-
-  /** @domName Window.btoa */
-  String btoa(String string);
-
-  /** @domName Window.cancelAnimationFrame */
-  void cancelAnimationFrame(int id);
-
-  /** @domName Window.captureEvents */
-  void captureEvents();
-
-  /** @domName Window.clearInterval */
-  void clearInterval(int handle);
-
-  /** @domName Window.clearTimeout */
-  void clearTimeout(int handle);
-
-  /** @domName Window.close */
-  void close();
-
-  /** @domName Window.confirm */
-  bool confirm(String message);
-
-  /** @domName Window.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName Window.find */
-  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog);
-
-  /** @domName Window.focus */
-  void focus();
-
-  /** @domName Window.getComputedStyle */
-  CSSStyleDeclaration $dom_getComputedStyle(Element element, String pseudoElement);
-
-  /** @domName Window.getMatchedCSSRules */
-  List<CSSRule> getMatchedCSSRules(Element element, String pseudoElement);
-
-  /** @domName Window.getSelection */
-  DOMSelection getSelection();
-
-  /** @domName Window.matchMedia */
-  MediaQueryList matchMedia(String query);
-
-  /** @domName Window.moveBy */
-  void moveBy(num x, num y);
-
-  /** @domName Window.moveTo */
-  void moveTo(num x, num y);
-
-  /** @domName Window.open */
-  Window open(String url, String name, [String options]);
-
-  /** @domName DOMWindow.openDatabase */
-  Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]);
-
-  /** @domName Window.postMessage */
-  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]);
-
-  /** @domName Window.print */
-  void print();
-
-  /** @domName Window.prompt */
-  String prompt(String message, String defaultValue);
-
-  /** @domName Window.releaseEvents */
-  void releaseEvents();
-
-  /** @domName Window.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Window.requestAnimationFrame */
-  int requestAnimationFrame(RequestAnimationFrameCallback callback);
-
-  /** @domName Window.resizeBy */
-  void resizeBy(num x, num y);
-
-  /** @domName Window.resizeTo */
-  void resizeTo(num width, num height);
-
-  /** @domName Window.scroll */
-  void scroll(int x, int y);
-
-  /** @domName Window.scrollBy */
-  void scrollBy(int x, int y);
-
-  /** @domName Window.scrollTo */
-  void scrollTo(int x, int y);
-
-  /** @domName Window.setInterval */
-  int setInterval(TimeoutHandler handler, int timeout);
-
-  /** @domName Window.setTimeout */
-  int setTimeout(TimeoutHandler handler, int timeout);
-
-  /** @domName Window.showModalDialog */
-  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]);
-
-  /** @domName Window.stop */
-  void stop();
-
-  /** @domName Window.webkitCancelAnimationFrame */
-  void webkitCancelAnimationFrame(int id);
-
-  /** @domName Window.webkitConvertPointFromNodeToPage */
-  Point webkitConvertPointFromNodeToPage(Node node, Point p);
-
-  /** @domName Window.webkitConvertPointFromPageToNode */
-  Point webkitConvertPointFromPageToNode(Node node, Point p);
-
-  /** @domName Window.webkitRequestAnimationFrame */
-  int webkitRequestAnimationFrame(RequestAnimationFrameCallback callback);
-
-  /** @domName DOMWindow.webkitRequestFileSystem */
-  void webkitRequestFileSystem(int type, int size, FileSystemCallback successCallback, [ErrorCallback errorCallback]);
-
-  /** @domName DOMWindow.webkitResolveLocalFileSystemURL */
-  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]);
-
-}
-
-abstract class LocalWindowEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get beforeUnload;
-
-  EventListenerList get blur;
-
-  EventListenerList get canPlay;
-
-  EventListenerList get canPlayThrough;
-
-  EventListenerList get change;
-
-  EventListenerList get click;
-
-  EventListenerList get contextMenu;
-
-  EventListenerList get doubleClick;
-
-  EventListenerList get deviceMotion;
-
-  EventListenerList get deviceOrientation;
-
-  EventListenerList get drag;
-
-  EventListenerList get dragEnd;
-
-  EventListenerList get dragEnter;
-
-  EventListenerList get dragLeave;
-
-  EventListenerList get dragOver;
-
-  EventListenerList get dragStart;
-
-  EventListenerList get drop;
-
-  EventListenerList get durationChange;
-
-  EventListenerList get emptied;
-
-  EventListenerList get ended;
-
-  EventListenerList get error;
-
-  EventListenerList get focus;
-
-  EventListenerList get hashChange;
-
-  EventListenerList get input;
-
-  EventListenerList get invalid;
-
-  EventListenerList get keyDown;
-
-  EventListenerList get keyPress;
-
-  EventListenerList get keyUp;
-
-  EventListenerList get load;
-
-  EventListenerList get loadedData;
-
-  EventListenerList get loadedMetadata;
-
-  EventListenerList get loadStart;
-
-  EventListenerList get message;
-
-  EventListenerList get mouseDown;
-
-  EventListenerList get mouseMove;
-
-  EventListenerList get mouseOut;
-
-  EventListenerList get mouseOver;
-
-  EventListenerList get mouseUp;
-
-  EventListenerList get mouseWheel;
-
-  EventListenerList get offline;
-
-  EventListenerList get online;
-
-  EventListenerList get pageHide;
-
-  EventListenerList get pageShow;
-
-  EventListenerList get pause;
-
-  EventListenerList get play;
-
-  EventListenerList get playing;
-
-  EventListenerList get popState;
-
-  EventListenerList get progress;
-
-  EventListenerList get rateChange;
-
-  EventListenerList get reset;
-
-  EventListenerList get resize;
-
-  EventListenerList get scroll;
-
-  EventListenerList get search;
-
-  EventListenerList get seeked;
-
-  EventListenerList get seeking;
-
-  EventListenerList get select;
-
-  EventListenerList get stalled;
-
-  EventListenerList get storage;
-
-  EventListenerList get submit;
-
-  EventListenerList get suspend;
-
-  EventListenerList get timeUpdate;
-
-  EventListenerList get touchCancel;
-
-  EventListenerList get touchEnd;
-
-  EventListenerList get touchMove;
-
-  EventListenerList get touchStart;
-
-  EventListenerList get unload;
-
-  EventListenerList get volumeChange;
-
-  EventListenerList get waiting;
-
-  EventListenerList get animationEnd;
-
-  EventListenerList get animationIteration;
-
-  EventListenerList get animationStart;
-
-  EventListenerList get transitionEnd;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _LocalWindowImpl extends _EventTargetImpl implements LocalWindow native "@*DOMWindow" {
-
-  _DocumentImpl get document => JS('_DocumentImpl', '#.document', this);
-
-  Window _open2(url, name) => JS('Window', '#.open(#,#)', this, url, name);
-
-  Window _open3(url, name, options) =>
-      JS('Window', '#.open(#,#,#)', this, url, name, options);
-
-  Window open(String url, String name, [String options]) {
-    if (options == null) {
-      return _DOMWindowCrossFrameImpl._createSafe(_open2(url, name));
-    } else {
-      return _DOMWindowCrossFrameImpl._createSafe(_open3(url, name, options));
-    }
-  }
-
-  // API level getter and setter for Location.
-  // TODO: The cross domain safe wrapper can be inserted here or folded into
-  // _LocationWrapper.
-  LocalLocation get location => _get_location();
-
-  // TODO: consider forcing users to do: window.location.assign('string').
-  /**
-   * Sets the window's location, which causes the browser to navigate to the new
-   * location. [value] may be a Location object or a string.
-   */
-  void set location(value) => _set_location(value);
-
-  // Firefox work-around for Location.  The Firefox location object cannot be
-  // made to behave like a Dart object so must be wrapped.
-
-  LocalLocation _get_location() {
-    var result = _location;
-    if (_isDartLocation(result)) return result;  // e.g. on Chrome.
-    if (null == _location_wrapper) {
-      _location_wrapper = new _LocationWrapper(result);
-    }
-    return _location_wrapper;
-  }
-
-  void _set_location(value) {
-    if (value is _LocationWrapper) {
-      _location = value._ptr;
-    } else {
-      _location = value;
-    }
-  }
-
-  var _location_wrapper;  // Cached wrapped Location object.
-
-  // Native getter and setter to access raw Location object.
-  Location get _location => JS('Location', '#.location', this);
-  void set _location(Location value) {
-    JS('void', '#.location = #', this, value);
-  }
-  // Prevent compiled from thinking 'location' property is available for a Dart
-  // member.
-  _protect_location() native 'location';
-
-  static _isDartLocation(thing) {
-    // On Firefox the code that implements 'is Location' fails to find the patch
-    // stub on Object.prototype and throws an exception.
-    try {
-      return thing is Location;
-    } catch (e) {
-      return false;
-    }
-  }
-
-
-  void requestLayoutFrame(TimeoutHandler callback) {
-    _addMeasurementFrameCallback(callback);
-  }
-
-  /** @domName DOMWindow.requestAnimationFrame */
-  int requestAnimationFrame(RequestAnimationFrameCallback callback) {
-    _ensureRequestAnimationFrame();
-    return _requestAnimationFrame(callback);
-  }
-
-  void cancelAnimationFrame(id) {
-    _ensureRequestAnimationFrame();
-    _cancelAnimationFrame(id);
-  }
-
-  int _requestAnimationFrame(RequestAnimationFrameCallback callback)
-      native 'requestAnimationFrame';
-
-  void _cancelAnimationFrame(int id)
-      native 'cancelAnimationFrame';
-
-  _ensureRequestAnimationFrame() {
-    if (JS('bool',
-           '!!(#.requestAnimationFrame && #.cancelAnimationFrame)', this, this))
-      return;
-
-    JS('void',
-       r"""
-  (function($this) {
-   var vendors = ['ms', 'moz', 'webkit', 'o'];
-   for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
-     $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
-     $this.cancelAnimationFrame =
-         $this[vendors[i]+'CancelAnimationFrame'] ||
-         $this[vendors[i]+'CancelRequestAnimationFrame'];
-   }
-   if ($this.requestAnimationFrame && $this.cancelAnimationFrame) return;
-   $this.requestAnimationFrame = function(callback) {
-      return window.setTimeout(function() {
-        callback(Date.now());
-      }, 16 /* 16ms ~= 60fps */);
-   };
-   $this.cancelAnimationFrame = function(id) { clearTimeout(id); }
-  })(#)""",
-       this);
-  }
-
-
-  _IDBFactoryImpl get indexedDB => _get_indexedDB();
-
-  _IDBFactoryImpl _get_indexedDB() =>
-      JS('_IDBFactoryImpl',
-         '#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
-         this, this, this);
-
-  // TODO(kasperl): Document these.
-  lookupPort(String name) {
-    var port = JSON.parse(localStorage['dart-port:$name']);
-    return _deserialize(port);
-  }
-
-  registerPort(String name, var port) {
-    var serialized = _serialize(port);
-    localStorage['dart-port:$name'] = JSON.stringify(serialized);
-  }
-
-  String createObjectUrl(object) =>
-      JS('String',
-         '(window.URL || window.webkitURL).createObjectURL(#)', object);
-
-  void revokeObjectUrl(String objectUrl) {
-    JS('void',
-       '(window.URL || window.webkitURL).revokeObjectURL(#)', objectUrl);
-  }
-
-
-  _LocalWindowEventsImpl get on =>
-    new _LocalWindowEventsImpl(this);
-
-  final _DOMApplicationCacheImpl applicationCache;
-
-  final _NavigatorImpl clientInformation;
-
-  final bool closed;
-
-  final _ConsoleImpl console;
-
-  final _CryptoImpl crypto;
-
-  String defaultStatus;
-
-  String defaultstatus;
-
-  final num devicePixelRatio;
-
-  final _EventImpl event;
-
-  final _LocalHistoryImpl history;
-
-  final int innerHeight;
-
-  final int innerWidth;
-
-  final _StorageImpl localStorage;
-
-  final _BarInfoImpl locationbar;
-
-  final _BarInfoImpl menubar;
-
-  String name;
-
-  final _NavigatorImpl navigator;
-
-  final bool offscreenBuffering;
-
-  Window get opener => _convertNativeToDart_Window(this._opener);
-  Window get _opener => JS("Window", "#.opener", this);
-
-  final int outerHeight;
-
-  final int outerWidth;
-
-  final _PagePopupControllerImpl pagePopupController;
-
-  final int pageXOffset;
-
-  final int pageYOffset;
-
-  Window get parent => _convertNativeToDart_Window(this._parent);
-  Window get _parent => JS("Window", "#.parent", this);
-
-  final _PerformanceImpl performance;
-
-  final _BarInfoImpl personalbar;
-
-  final _ScreenImpl screen;
-
-  final int screenLeft;
-
-  final int screenTop;
-
-  final int screenX;
-
-  final int screenY;
-
-  final int scrollX;
-
-  final int scrollY;
-
-  final _BarInfoImpl scrollbars;
-
-  Window get self => _convertNativeToDart_Window(this._self);
-  Window get _self => JS("Window", "#.self", this);
-
-  final _StorageImpl sessionStorage;
-
-  String status;
-
-  final _BarInfoImpl statusbar;
-
-  final _StyleMediaImpl styleMedia;
-
-  final _BarInfoImpl toolbar;
-
-  Window get top => _convertNativeToDart_Window(this._top);
-  Window get _top => JS("Window", "#.top", this);
-
-  final _IDBFactoryImpl webkitIndexedDB;
-
-  final _NotificationCenterImpl webkitNotifications;
-
-  final _StorageInfoImpl webkitStorageInfo;
-
-  Window get window => _convertNativeToDart_Window(this._window);
-  Window get _window => JS("Window", "#.window", this);
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  void alert(String message) native;
-
-  String atob(String string) native;
-
-  void blur() native;
-
-  String btoa(String string) native;
-
-  void captureEvents() native;
-
-  void clearInterval(int handle) native;
-
-  void clearTimeout(int handle) native;
-
-  void close() native;
-
-  bool confirm(String message) native;
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native;
-
-  void focus() native;
-
-  _CSSStyleDeclarationImpl $dom_getComputedStyle(_ElementImpl element, String pseudoElement) native "getComputedStyle";
-
-  _CSSRuleListImpl getMatchedCSSRules(_ElementImpl element, String pseudoElement) native;
-
-  _DOMSelectionImpl getSelection() native;
-
-  _MediaQueryListImpl matchMedia(String query) native;
-
-  void moveBy(num x, num y) native;
-
-  void moveTo(num x, num y) native;
-
-  _DatabaseImpl openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
-
-  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [messagePorts]) {
-    if (?message &&
-        !?messagePorts) {
-      var message_1 = _convertDartToNative_SerializedScriptValue(message);
-      _postMessage_1(message_1, targetOrigin);
-      return;
-    }
-    if (?message &&
-        (messagePorts is List || messagePorts == null)) {
-      var message_2 = _convertDartToNative_SerializedScriptValue(message);
-      _postMessage_2(message_2, targetOrigin, messagePorts);
-      return;
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  void _postMessage_1(message, targetOrigin) native "postMessage";
-  void _postMessage_2(message, targetOrigin, List messagePorts) native "postMessage";
-
-  void print() native;
-
-  String prompt(String message, String defaultValue) native;
-
-  void releaseEvents() native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  void resizeBy(num x, num y) native;
-
-  void resizeTo(num width, num height) native;
-
-  void scroll(int x, int y) native;
-
-  void scrollBy(int x, int y) native;
-
-  void scrollTo(int x, int y) native;
-
-  int setInterval(TimeoutHandler handler, int timeout) native;
-
-  int setTimeout(TimeoutHandler handler, int timeout) native;
-
-  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native;
-
-  void stop() native;
-
-  _PointImpl webkitConvertPointFromNodeToPage(_NodeImpl node, _PointImpl p) native;
-
-  _PointImpl webkitConvertPointFromPageToNode(_NodeImpl node, _PointImpl p) native;
-
-  void webkitRequestFileSystem(int type, int size, FileSystemCallback successCallback, [ErrorCallback errorCallback]) native;
-
-  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native;
-
-}
-
-class _LocalWindowEventsImpl extends _EventsImpl implements LocalWindowEvents {
-  _LocalWindowEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get beforeUnload => this['beforeunload'];
-
-  EventListenerList get blur => this['blur'];
-
-  EventListenerList get canPlay => this['canplay'];
-
-  EventListenerList get canPlayThrough => this['canplaythrough'];
-
-  EventListenerList get change => this['change'];
-
-  EventListenerList get click => this['click'];
-
-  EventListenerList get contextMenu => this['contextmenu'];
-
-  EventListenerList get doubleClick => this['dblclick'];
-
-  EventListenerList get deviceMotion => this['devicemotion'];
-
-  EventListenerList get deviceOrientation => this['deviceorientation'];
-
-  EventListenerList get drag => this['drag'];
-
-  EventListenerList get dragEnd => this['dragend'];
-
-  EventListenerList get dragEnter => this['dragenter'];
-
-  EventListenerList get dragLeave => this['dragleave'];
-
-  EventListenerList get dragOver => this['dragover'];
-
-  EventListenerList get dragStart => this['dragstart'];
-
-  EventListenerList get drop => this['drop'];
-
-  EventListenerList get durationChange => this['durationchange'];
-
-  EventListenerList get emptied => this['emptied'];
-
-  EventListenerList get ended => this['ended'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get focus => this['focus'];
-
-  EventListenerList get hashChange => this['hashchange'];
-
-  EventListenerList get input => this['input'];
-
-  EventListenerList get invalid => this['invalid'];
-
-  EventListenerList get keyDown => this['keydown'];
-
-  EventListenerList get keyPress => this['keypress'];
-
-  EventListenerList get keyUp => this['keyup'];
-
-  EventListenerList get load => this['load'];
-
-  EventListenerList get loadedData => this['loadeddata'];
-
-  EventListenerList get loadedMetadata => this['loadedmetadata'];
-
-  EventListenerList get loadStart => this['loadstart'];
-
-  EventListenerList get message => this['message'];
-
-  EventListenerList get mouseDown => this['mousedown'];
-
-  EventListenerList get mouseMove => this['mousemove'];
-
-  EventListenerList get mouseOut => this['mouseout'];
-
-  EventListenerList get mouseOver => this['mouseover'];
-
-  EventListenerList get mouseUp => this['mouseup'];
-
-  EventListenerList get mouseWheel => this['mousewheel'];
-
-  EventListenerList get offline => this['offline'];
-
-  EventListenerList get online => this['online'];
-
-  EventListenerList get pageHide => this['pagehide'];
-
-  EventListenerList get pageShow => this['pageshow'];
-
-  EventListenerList get pause => this['pause'];
-
-  EventListenerList get play => this['play'];
-
-  EventListenerList get playing => this['playing'];
-
-  EventListenerList get popState => this['popstate'];
-
-  EventListenerList get progress => this['progress'];
-
-  EventListenerList get rateChange => this['ratechange'];
-
-  EventListenerList get reset => this['reset'];
-
-  EventListenerList get resize => this['resize'];
-
-  EventListenerList get scroll => this['scroll'];
-
-  EventListenerList get search => this['search'];
-
-  EventListenerList get seeked => this['seeked'];
-
-  EventListenerList get seeking => this['seeking'];
-
-  EventListenerList get select => this['select'];
-
-  EventListenerList get stalled => this['stalled'];
-
-  EventListenerList get storage => this['storage'];
-
-  EventListenerList get submit => this['submit'];
-
-  EventListenerList get suspend => this['suspend'];
-
-  EventListenerList get timeUpdate => this['timeupdate'];
-
-  EventListenerList get touchCancel => this['touchcancel'];
-
-  EventListenerList get touchEnd => this['touchend'];
-
-  EventListenerList get touchMove => this['touchmove'];
-
-  EventListenerList get touchStart => this['touchstart'];
-
-  EventListenerList get unload => this['unload'];
-
-  EventListenerList get volumeChange => this['volumechange'];
-
-  EventListenerList get waiting => this['waiting'];
-
-  EventListenerList get animationEnd => this['webkitAnimationEnd'];
-
-  EventListenerList get animationIteration => this['webkitAnimationIteration'];
-
-  EventListenerList get animationStart => this['webkitAnimationStart'];
-
-  EventListenerList get transitionEnd => this['webkitTransitionEnd'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLMapElement
-abstract class MapElement implements Element {
-
-  factory MapElement() => _Elements.createMapElement();
-
-  /** @domName HTMLMapElement.areas */
-  HTMLCollection get areas;
-
-  /** @domName HTMLMapElement.name */
-  String name;
-}
-
-class _MapElementImpl extends _ElementImpl implements MapElement native "*HTMLMapElement" {
-
-  final _HTMLCollectionImpl areas;
-
-  String name;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLMarqueeElement
-abstract class MarqueeElement implements Element {
-
-  /** @domName HTMLMarqueeElement.behavior */
-  String behavior;
-
-  /** @domName HTMLMarqueeElement.bgColor */
-  String bgColor;
-
-  /** @domName HTMLMarqueeElement.direction */
-  String direction;
-
-  /** @domName HTMLMarqueeElement.height */
-  String height;
-
-  /** @domName HTMLMarqueeElement.hspace */
-  int hspace;
-
-  /** @domName HTMLMarqueeElement.loop */
-  int loop;
-
-  /** @domName HTMLMarqueeElement.scrollAmount */
-  int scrollAmount;
-
-  /** @domName HTMLMarqueeElement.scrollDelay */
-  int scrollDelay;
-
-  /** @domName HTMLMarqueeElement.trueSpeed */
-  bool trueSpeed;
-
-  /** @domName HTMLMarqueeElement.vspace */
-  int vspace;
-
-  /** @domName HTMLMarqueeElement.width */
-  String width;
-
-  /** @domName HTMLMarqueeElement.start */
-  void start();
-
-  /** @domName HTMLMarqueeElement.stop */
-  void stop();
-}
-
-class _MarqueeElementImpl extends _ElementImpl implements MarqueeElement native "*HTMLMarqueeElement" {
-
-  String behavior;
-
-  String bgColor;
-
-  String direction;
-
-  String height;
-
-  int hspace;
-
-  int loop;
-
-  int scrollAmount;
-
-  int scrollDelay;
-
-  bool trueSpeed;
-
-  int vspace;
-
-  String width;
-
-  void start() native;
-
-  void stop() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaController
-abstract class MediaController implements EventTarget {
-
-  factory MediaController() => _MediaControllerFactoryProvider.createMediaController();
-
-  /** @domName MediaController.buffered */
-  TimeRanges get buffered;
-
-  /** @domName MediaController.currentTime */
-  num currentTime;
-
-  /** @domName MediaController.defaultPlaybackRate */
-  num defaultPlaybackRate;
-
-  /** @domName MediaController.duration */
-  num get duration;
-
-  /** @domName MediaController.muted */
-  bool muted;
-
-  /** @domName MediaController.paused */
-  bool get paused;
-
-  /** @domName MediaController.playbackRate */
-  num playbackRate;
-
-  /** @domName MediaController.played */
-  TimeRanges get played;
-
-  /** @domName MediaController.seekable */
-  TimeRanges get seekable;
-
-  /** @domName MediaController.volume */
-  num volume;
-
-  /** @domName MediaController.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MediaController.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName MediaController.pause */
-  void pause();
-
-  /** @domName MediaController.play */
-  void play();
-
-  /** @domName MediaController.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-class _MediaControllerImpl extends _EventTargetImpl implements MediaController native "*MediaController" {
-
-  final _TimeRangesImpl buffered;
-
-  num currentTime;
-
-  num defaultPlaybackRate;
-
-  final num duration;
-
-  bool muted;
-
-  final bool paused;
-
-  num playbackRate;
-
-  final _TimeRangesImpl played;
-
-  final _TimeRangesImpl seekable;
-
-  num volume;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void pause() native;
-
-  void play() native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLMediaElement
-abstract class MediaElement implements Element {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  MediaElementEvents get on;
-
-  static const int HAVE_CURRENT_DATA = 2;
-
-  static const int HAVE_ENOUGH_DATA = 4;
-
-  static const int HAVE_FUTURE_DATA = 3;
-
-  static const int HAVE_METADATA = 1;
-
-  static const int HAVE_NOTHING = 0;
-
-  static const int NETWORK_EMPTY = 0;
-
-  static const int NETWORK_IDLE = 1;
-
-  static const int NETWORK_LOADING = 2;
-
-  static const int NETWORK_NO_SOURCE = 3;
-
-  /** @domName HTMLMediaElement.autoplay */
-  bool autoplay;
-
-  /** @domName HTMLMediaElement.buffered */
-  TimeRanges get buffered;
-
-  /** @domName HTMLMediaElement.controller */
-  MediaController controller;
-
-  /** @domName HTMLMediaElement.controls */
-  bool controls;
-
-  /** @domName HTMLMediaElement.currentSrc */
-  String get currentSrc;
-
-  /** @domName HTMLMediaElement.currentTime */
-  num currentTime;
-
-  /** @domName HTMLMediaElement.defaultMuted */
-  bool defaultMuted;
-
-  /** @domName HTMLMediaElement.defaultPlaybackRate */
-  num defaultPlaybackRate;
-
-  /** @domName HTMLMediaElement.duration */
-  num get duration;
-
-  /** @domName HTMLMediaElement.ended */
-  bool get ended;
-
-  /** @domName HTMLMediaElement.error */
-  MediaError get error;
-
-  /** @domName HTMLMediaElement.initialTime */
-  num get initialTime;
-
-  /** @domName HTMLMediaElement.loop */
-  bool loop;
-
-  /** @domName HTMLMediaElement.mediaGroup */
-  String mediaGroup;
-
-  /** @domName HTMLMediaElement.muted */
-  bool muted;
-
-  /** @domName HTMLMediaElement.networkState */
-  int get networkState;
-
-  /** @domName HTMLMediaElement.paused */
-  bool get paused;
-
-  /** @domName HTMLMediaElement.playbackRate */
-  num playbackRate;
-
-  /** @domName HTMLMediaElement.played */
-  TimeRanges get played;
-
-  /** @domName HTMLMediaElement.preload */
-  String preload;
-
-  /** @domName HTMLMediaElement.readyState */
-  int get readyState;
-
-  /** @domName HTMLMediaElement.seekable */
-  TimeRanges get seekable;
-
-  /** @domName HTMLMediaElement.seeking */
-  bool get seeking;
-
-  /** @domName HTMLMediaElement.src */
-  String src;
-
-  /** @domName HTMLMediaElement.startTime */
-  num get startTime;
-
-  /** @domName HTMLMediaElement.textTracks */
-  TextTrackList get textTracks;
-
-  /** @domName HTMLMediaElement.volume */
-  num volume;
-
-  /** @domName HTMLMediaElement.webkitAudioDecodedByteCount */
-  int get webkitAudioDecodedByteCount;
-
-  /** @domName HTMLMediaElement.webkitClosedCaptionsVisible */
-  bool webkitClosedCaptionsVisible;
-
-  /** @domName HTMLMediaElement.webkitHasClosedCaptions */
-  bool get webkitHasClosedCaptions;
-
-  /** @domName HTMLMediaElement.webkitPreservesPitch */
-  bool webkitPreservesPitch;
-
-  /** @domName HTMLMediaElement.webkitVideoDecodedByteCount */
-  int get webkitVideoDecodedByteCount;
-
-  /** @domName HTMLMediaElement.addTextTrack */
-  TextTrack addTextTrack(String kind, [String label, String language]);
-
-  /** @domName HTMLMediaElement.canPlayType */
-  String canPlayType(String type, String keySystem);
-
-  /** @domName HTMLMediaElement.load */
-  void load();
-
-  /** @domName HTMLMediaElement.pause */
-  void pause();
-
-  /** @domName HTMLMediaElement.play */
-  void play();
-
-  /** @domName HTMLMediaElement.webkitAddKey */
-  void webkitAddKey(String keySystem, Uint8Array key, [Uint8Array initData, String sessionId]);
-
-  /** @domName HTMLMediaElement.webkitCancelKeyRequest */
-  void webkitCancelKeyRequest(String keySystem, String sessionId);
-
-  /** @domName HTMLMediaElement.webkitGenerateKeyRequest */
-  void webkitGenerateKeyRequest(String keySystem, [Uint8Array initData]);
-}
-
-abstract class MediaElementEvents implements ElementEvents {
-
-  EventListenerList get canPlay;
-
-  EventListenerList get canPlayThrough;
-
-  EventListenerList get durationChange;
-
-  EventListenerList get emptied;
-
-  EventListenerList get ended;
-
-  EventListenerList get loadedData;
-
-  EventListenerList get loadedMetadata;
-
-  EventListenerList get loadStart;
-
-  EventListenerList get pause;
-
-  EventListenerList get play;
-
-  EventListenerList get playing;
-
-  EventListenerList get progress;
-
-  EventListenerList get rateChange;
-
-  EventListenerList get seeked;
-
-  EventListenerList get seeking;
-
-  EventListenerList get show;
-
-  EventListenerList get stalled;
-
-  EventListenerList get suspend;
-
-  EventListenerList get timeUpdate;
-
-  EventListenerList get volumeChange;
-
-  EventListenerList get waiting;
-
-  EventListenerList get keyAdded;
-
-  EventListenerList get keyError;
-
-  EventListenerList get keyMessage;
-
-  EventListenerList get needKey;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaElementAudioSourceNode
-abstract class MediaElementAudioSourceNode implements AudioSourceNode {
-
-  /** @domName MediaElementAudioSourceNode.mediaElement */
-  MediaElement get mediaElement;
-}
-
-class _MediaElementAudioSourceNodeImpl extends _AudioSourceNodeImpl implements MediaElementAudioSourceNode native "*MediaElementAudioSourceNode" {
-
-  final _MediaElementImpl mediaElement;
-}
-
-class _MediaElementImpl extends _ElementImpl implements MediaElement native "*HTMLMediaElement" {
-
-  _MediaElementEventsImpl get on =>
-    new _MediaElementEventsImpl(this);
-
-  bool autoplay;
-
-  final _TimeRangesImpl buffered;
-
-  _MediaControllerImpl controller;
-
-  bool controls;
-
-  final String currentSrc;
-
-  num currentTime;
-
-  bool defaultMuted;
-
-  num defaultPlaybackRate;
-
-  final num duration;
-
-  final bool ended;
-
-  final _MediaErrorImpl error;
-
-  final num initialTime;
-
-  bool loop;
-
-  String mediaGroup;
-
-  bool muted;
-
-  final int networkState;
-
-  final bool paused;
-
-  num playbackRate;
-
-  final _TimeRangesImpl played;
-
-  String preload;
-
-  final int readyState;
-
-  final _TimeRangesImpl seekable;
-
-  final bool seeking;
-
-  String src;
-
-  final num startTime;
-
-  final _TextTrackListImpl textTracks;
-
-  num volume;
-
-  final int webkitAudioDecodedByteCount;
-
-  bool webkitClosedCaptionsVisible;
-
-  final bool webkitHasClosedCaptions;
-
-  bool webkitPreservesPitch;
-
-  final int webkitVideoDecodedByteCount;
-
-  _TextTrackImpl addTextTrack(String kind, [String label, String language]) native;
-
-  String canPlayType(String type, String keySystem) native;
-
-  void load() native;
-
-  void pause() native;
-
-  void play() native;
-
-  void webkitAddKey(String keySystem, _Uint8ArrayImpl key, [_Uint8ArrayImpl initData, String sessionId]) native;
-
-  void webkitCancelKeyRequest(String keySystem, String sessionId) native;
-
-  void webkitGenerateKeyRequest(String keySystem, [_Uint8ArrayImpl initData]) native;
-}
-
-class _MediaElementEventsImpl extends _ElementEventsImpl implements MediaElementEvents {
-  _MediaElementEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get canPlay => this['canplay'];
-
-  EventListenerList get canPlayThrough => this['canplaythrough'];
-
-  EventListenerList get durationChange => this['durationchange'];
-
-  EventListenerList get emptied => this['emptied'];
-
-  EventListenerList get ended => this['ended'];
-
-  EventListenerList get loadedData => this['loadeddata'];
-
-  EventListenerList get loadedMetadata => this['loadedmetadata'];
-
-  EventListenerList get loadStart => this['loadstart'];
-
-  EventListenerList get pause => this['pause'];
-
-  EventListenerList get play => this['play'];
-
-  EventListenerList get playing => this['playing'];
-
-  EventListenerList get progress => this['progress'];
-
-  EventListenerList get rateChange => this['ratechange'];
-
-  EventListenerList get seeked => this['seeked'];
-
-  EventListenerList get seeking => this['seeking'];
-
-  EventListenerList get show => this['show'];
-
-  EventListenerList get stalled => this['stalled'];
-
-  EventListenerList get suspend => this['suspend'];
-
-  EventListenerList get timeUpdate => this['timeupdate'];
-
-  EventListenerList get volumeChange => this['volumechange'];
-
-  EventListenerList get waiting => this['waiting'];
-
-  EventListenerList get keyAdded => this['webkitkeyadded'];
-
-  EventListenerList get keyError => this['webkitkeyerror'];
-
-  EventListenerList get keyMessage => this['webkitkeymessage'];
-
-  EventListenerList get needKey => this['webkitneedkey'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaError
-abstract class MediaError {
-
-  static const int MEDIA_ERR_ABORTED = 1;
-
-  static const int MEDIA_ERR_DECODE = 3;
-
-  static const int MEDIA_ERR_ENCRYPTED = 5;
-
-  static const int MEDIA_ERR_NETWORK = 2;
-
-  static const int MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
-
-  /** @domName MediaError.code */
-  int get code;
-}
-
-class _MediaErrorImpl implements MediaError native "*MediaError" {
-
-  final int code;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaKeyError
-abstract class MediaKeyError {
-
-  static const int MEDIA_KEYERR_CLIENT = 2;
-
-  static const int MEDIA_KEYERR_DOMAIN = 6;
-
-  static const int MEDIA_KEYERR_HARDWARECHANGE = 5;
-
-  static const int MEDIA_KEYERR_OUTPUT = 4;
-
-  static const int MEDIA_KEYERR_SERVICE = 3;
-
-  static const int MEDIA_KEYERR_UNKNOWN = 1;
-
-  /** @domName MediaKeyError.code */
-  int get code;
-}
-
-class _MediaKeyErrorImpl implements MediaKeyError native "*MediaKeyError" {
-
-  final int code;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaKeyEvent
-abstract class MediaKeyEvent implements Event {
-
-  /** @domName MediaKeyEvent.defaultURL */
-  String get defaultURL;
-
-  /** @domName MediaKeyEvent.errorCode */
-  MediaKeyError get errorCode;
-
-  /** @domName MediaKeyEvent.initData */
-  Uint8Array get initData;
-
-  /** @domName MediaKeyEvent.keySystem */
-  String get keySystem;
-
-  /** @domName MediaKeyEvent.message */
-  Uint8Array get message;
-
-  /** @domName MediaKeyEvent.sessionId */
-  String get sessionId;
-
-  /** @domName MediaKeyEvent.systemCode */
-  int get systemCode;
-}
-
-class _MediaKeyEventImpl extends _EventImpl implements MediaKeyEvent native "*MediaKeyEvent" {
-
-  final String defaultURL;
-
-  final _MediaKeyErrorImpl errorCode;
-
-  final _Uint8ArrayImpl initData;
-
-  final String keySystem;
-
-  final _Uint8ArrayImpl message;
-
-  final String sessionId;
-
-  final int systemCode;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaList
-abstract class MediaList {
-
-  /** @domName MediaList.length */
-  int get length;
-
-  /** @domName MediaList.mediaText */
-  String mediaText;
-
-  /** @domName MediaList.appendMedium */
-  void appendMedium(String newMedium);
-
-  /** @domName MediaList.deleteMedium */
-  void deleteMedium(String oldMedium);
-
-  /** @domName MediaList.item */
-  String item(int index);
-}
-
-class _MediaListImpl implements MediaList native "*MediaList" {
-
-  final int length;
-
-  String mediaText;
-
-  void appendMedium(String newMedium) native;
-
-  void deleteMedium(String oldMedium) native;
-
-  String item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaQueryList
-abstract class MediaQueryList {
-
-  /** @domName MediaQueryList.matches */
-  bool get matches;
-
-  /** @domName MediaQueryList.media */
-  String get media;
-
-  /** @domName MediaQueryList.addListener */
-  void addListener(MediaQueryListListener listener);
-
-  /** @domName MediaQueryList.removeListener */
-  void removeListener(MediaQueryListListener listener);
-}
-
-class _MediaQueryListImpl implements MediaQueryList native "*MediaQueryList" {
-
-  final bool matches;
-
-  final String media;
-
-  void addListener(MediaQueryListListener listener) native;
-
-  void removeListener(MediaQueryListListener listener) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaQueryListListener
-abstract class MediaQueryListListener {
-
-  /** @domName MediaQueryListListener.queryChanged */
-  void queryChanged(MediaQueryList list);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaSource
-abstract class MediaSource implements EventTarget {
-
-  factory MediaSource() => _MediaSourceFactoryProvider.createMediaSource();
-
-  /** @domName MediaSource.activeSourceBuffers */
-  SourceBufferList get activeSourceBuffers;
-
-  /** @domName MediaSource.duration */
-  num duration;
-
-  /** @domName MediaSource.readyState */
-  String get readyState;
-
-  /** @domName MediaSource.sourceBuffers */
-  SourceBufferList get sourceBuffers;
-
-  /** @domName MediaSource.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MediaSource.addSourceBuffer */
-  SourceBuffer addSourceBuffer(String type);
-
-  /** @domName MediaSource.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName MediaSource.endOfStream */
-  void endOfStream(String error);
-
-  /** @domName MediaSource.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MediaSource.removeSourceBuffer */
-  void removeSourceBuffer(SourceBuffer buffer);
-}
-
-class _MediaSourceImpl extends _EventTargetImpl implements MediaSource native "*MediaSource" {
-
-  final _SourceBufferListImpl activeSourceBuffers;
-
-  num duration;
-
-  final String readyState;
-
-  final _SourceBufferListImpl sourceBuffers;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  _SourceBufferImpl addSourceBuffer(String type) native;
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  void endOfStream(String error) native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  void removeSourceBuffer(_SourceBufferImpl buffer) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaStream
-abstract class MediaStream implements EventTarget {
-
-  factory MediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) => _MediaStreamFactoryProvider.createMediaStream(audioTracks, videoTracks);
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  MediaStreamEvents get on;
-
-  static const int ENDED = 2;
-
-  static const int LIVE = 1;
-
-  /** @domName MediaStream.audioTracks */
-  MediaStreamTrackList get audioTracks;
-
-  /** @domName MediaStream.label */
-  String get label;
-
-  /** @domName MediaStream.readyState */
-  int get readyState;
-
-  /** @domName MediaStream.videoTracks */
-  MediaStreamTrackList get videoTracks;
-
-  /** @domName MediaStream.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MediaStream.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName MediaStream.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class MediaStreamEvents implements Events {
-
-  EventListenerList get ended;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaStreamAudioSourceNode
-abstract class MediaStreamAudioSourceNode implements AudioSourceNode {
-
-  /** @domName MediaStreamAudioSourceNode.mediaStream */
-  MediaStream get mediaStream;
-}
-
-class _MediaStreamAudioSourceNodeImpl extends _AudioSourceNodeImpl implements MediaStreamAudioSourceNode native "*MediaStreamAudioSourceNode" {
-
-  final _MediaStreamImpl mediaStream;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaStreamEvent
-abstract class MediaStreamEvent implements Event {
-
-  /** @domName MediaStreamEvent.stream */
-  MediaStream get stream;
-}
-
-class _MediaStreamEventImpl extends _EventImpl implements MediaStreamEvent native "*MediaStreamEvent" {
-
-  final _MediaStreamImpl stream;
-}
-
-class _MediaStreamImpl extends _EventTargetImpl implements MediaStream native "*MediaStream" {
-
-  _MediaStreamEventsImpl get on =>
-    new _MediaStreamEventsImpl(this);
-
-  final _MediaStreamTrackListImpl audioTracks;
-
-  final String label;
-
-  final int readyState;
-
-  final _MediaStreamTrackListImpl videoTracks;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _MediaStreamEventsImpl extends _EventsImpl implements MediaStreamEvents {
-  _MediaStreamEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get ended => this['ended'];
-}
-
-class _MediaStreamListImpl implements List<MediaStream>, JavaScriptIndexingBehavior native "*MediaStreamList" {
-
-  final int length;
-
-  _MediaStreamImpl operator[](int index) => JS("_MediaStreamImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _MediaStreamImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<MediaStream> mixins.
-  // MediaStream is the element type.
-
-  // From Iterable<MediaStream>:
-
-  Iterator<MediaStream> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<MediaStream>(this);
-  }
-
-  // From Collection<MediaStream>:
-
-  void add(MediaStream value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(MediaStream value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<MediaStream> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(MediaStream element) => _Collections.contains(this, element);
-
-  void forEach(void f(MediaStream element)) => _Collections.forEach(this, f);
-
-  Collection map(f(MediaStream element)) => _Collections.map(this, [], f);
-
-  Collection<MediaStream> filter(bool f(MediaStream element)) =>
-     _Collections.filter(this, <MediaStream>[], f);
-
-  bool every(bool f(MediaStream element)) => _Collections.every(this, f);
-
-  bool some(bool f(MediaStream element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<MediaStream>:
-
-  void sort([Comparator<MediaStream> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(MediaStream element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(MediaStream element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  MediaStream get last => this[length - 1];
-
-  MediaStream removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<MediaStream> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [MediaStream initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<MediaStream> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <MediaStream>[]);
-
-  // -- end List<MediaStream> mixins.
-
-  _MediaStreamImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaStreamTrack
-abstract class MediaStreamTrack implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  MediaStreamTrackEvents get on;
-
-  static const int ENDED = 2;
-
-  static const int LIVE = 0;
-
-  static const int MUTED = 1;
-
-  /** @domName MediaStreamTrack.enabled */
-  bool enabled;
-
-  /** @domName MediaStreamTrack.kind */
-  String get kind;
-
-  /** @domName MediaStreamTrack.label */
-  String get label;
-
-  /** @domName MediaStreamTrack.readyState */
-  int get readyState;
-
-  /** @domName MediaStreamTrack.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MediaStreamTrack.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName MediaStreamTrack.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class MediaStreamTrackEvents implements Events {
-
-  EventListenerList get ended;
-
-  EventListenerList get mute;
-
-  EventListenerList get unmute;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaStreamTrackEvent
-abstract class MediaStreamTrackEvent implements Event {
-
-  /** @domName MediaStreamTrackEvent.track */
-  MediaStreamTrack get track;
-}
-
-class _MediaStreamTrackEventImpl extends _EventImpl implements MediaStreamTrackEvent native "*MediaStreamTrackEvent" {
-
-  final _MediaStreamTrackImpl track;
-}
-
-class _MediaStreamTrackImpl extends _EventTargetImpl implements MediaStreamTrack native "*MediaStreamTrack" {
-
-  _MediaStreamTrackEventsImpl get on =>
-    new _MediaStreamTrackEventsImpl(this);
-
-  bool enabled;
-
-  final String kind;
-
-  final String label;
-
-  final int readyState;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _MediaStreamTrackEventsImpl extends _EventsImpl implements MediaStreamTrackEvents {
-  _MediaStreamTrackEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get ended => this['ended'];
-
-  EventListenerList get mute => this['mute'];
-
-  EventListenerList get unmute => this['unmute'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaStreamTrackList
-abstract class MediaStreamTrackList implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  MediaStreamTrackListEvents get on;
-
-  /** @domName MediaStreamTrackList.length */
-  int get length;
-
-  /** @domName MediaStreamTrackList.add */
-  void add(MediaStreamTrack track);
-
-  /** @domName MediaStreamTrackList.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MediaStreamTrackList.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName MediaStreamTrackList.item */
-  MediaStreamTrack item(int index);
-
-  /** @domName MediaStreamTrackList.remove */
-  void remove(MediaStreamTrack track);
-
-  /** @domName MediaStreamTrackList.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class MediaStreamTrackListEvents implements Events {
-
-  EventListenerList get addTrack;
-
-  EventListenerList get removeTrack;
-}
-
-class _MediaStreamTrackListImpl extends _EventTargetImpl implements MediaStreamTrackList native "*MediaStreamTrackList" {
-
-  _MediaStreamTrackListEventsImpl get on =>
-    new _MediaStreamTrackListEventsImpl(this);
-
-  final int length;
-
-  void add(_MediaStreamTrackImpl track) native;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  _MediaStreamTrackImpl item(int index) native;
-
-  void remove(_MediaStreamTrackImpl track) native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _MediaStreamTrackListEventsImpl extends _EventsImpl implements MediaStreamTrackListEvents {
-  _MediaStreamTrackListEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get addTrack => this['addtrack'];
-
-  EventListenerList get removeTrack => this['removetrack'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MemoryInfo
-abstract class MemoryInfo {
-
-  /** @domName MemoryInfo.jsHeapSizeLimit */
-  int get jsHeapSizeLimit;
-
-  /** @domName MemoryInfo.totalJSHeapSize */
-  int get totalJSHeapSize;
-
-  /** @domName MemoryInfo.usedJSHeapSize */
-  int get usedJSHeapSize;
-}
-
-class _MemoryInfoImpl implements MemoryInfo native "*MemoryInfo" {
-
-  final int jsHeapSizeLimit;
-
-  final int totalJSHeapSize;
-
-  final int usedJSHeapSize;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLMenuElement
-abstract class MenuElement implements Element {
-
-  factory MenuElement() => _Elements.createMenuElement();
-
-  /** @domName HTMLMenuElement.compact */
-  bool compact;
-}
-
-class _MenuElementImpl extends _ElementImpl implements MenuElement native "*HTMLMenuElement" {
-
-  bool compact;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MessageChannel
-abstract class MessageChannel {
-
-  factory MessageChannel() => _MessageChannelFactoryProvider.createMessageChannel();
-
-  /** @domName MessageChannel.port1 */
-  MessagePort get port1;
-
-  /** @domName MessageChannel.port2 */
-  MessagePort get port2;
-}
-
-class _MessageChannelImpl implements MessageChannel native "*MessageChannel" {
-
-  final _MessagePortImpl port1;
-
-  final _MessagePortImpl port2;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MessageEvent
-abstract class MessageEvent implements Event {
-
-  /** @domName MessageEvent.data */
-  Object get data;
-
-  /** @domName MessageEvent.lastEventId */
-  String get lastEventId;
-
-  /** @domName MessageEvent.origin */
-  String get origin;
-
-  /** @domName MessageEvent.ports */
-  List get ports;
-
-  /** @domName MessageEvent.source */
-  Window get source;
-
-  /** @domName MessageEvent.initMessageEvent */
-  void initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List messagePorts);
-
-  /** @domName MessageEvent.webkitInitMessageEvent */
-  void webkitInitMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List transferables);
-}
-
-class _MessageEventImpl extends _EventImpl implements MessageEvent native "*MessageEvent" {
-
-  dynamic get data => _convertNativeToDart_SerializedScriptValue(this._data);
-  dynamic get _data => JS("dynamic", "#.data", this);
-
-  final String lastEventId;
-
-  final String origin;
-
-  final List ports;
-
-  Window get source => _convertNativeToDart_Window(this._source);
-  Window get _source => JS("Window", "#.source", this);
-
-  void initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, _LocalWindowImpl sourceArg, List messagePorts) native;
-
-  void webkitInitMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, _LocalWindowImpl sourceArg, List transferables) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MessagePort
-abstract class MessagePort implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  MessagePortEvents get on;
-
-  /** @domName MessagePort.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MessagePort.close */
-  void close();
-
-  /** @domName MessagePort.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName MessagePort.postMessage */
-  void postMessage(Object message, [List messagePorts]);
-
-  /** @domName MessagePort.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MessagePort.start */
-  void start();
-}
-
-abstract class MessagePortEvents implements Events {
-
-  EventListenerList get message;
-}
-
-class _MessagePortImpl extends _EventTargetImpl implements MessagePort native "*MessagePort" {
-
-  _MessagePortEventsImpl get on =>
-    new _MessagePortEventsImpl(this);
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  void close() native;
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void postMessage(/*any*/ message, [messagePorts]) {
-    if (?messagePorts) {
-      var message_1 = _convertDartToNative_SerializedScriptValue(message);
-      _postMessage_1(message_1, messagePorts);
-      return;
-    }
-    var message_2 = _convertDartToNative_SerializedScriptValue(message);
-    _postMessage_2(message_2);
-    return;
-  }
-  void _postMessage_1(message, List messagePorts) native "postMessage";
-  void _postMessage_2(message) native "postMessage";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  void start() native;
-}
-
-class _MessagePortEventsImpl extends _EventsImpl implements MessagePortEvents {
-  _MessagePortEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get message => this['message'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLMetaElement
-abstract class MetaElement implements Element {
-
-  /** @domName HTMLMetaElement.content */
-  String content;
-
-  /** @domName HTMLMetaElement.httpEquiv */
-  String httpEquiv;
-
-  /** @domName HTMLMetaElement.name */
-  String name;
-
-  /** @domName HTMLMetaElement.scheme */
-  String scheme;
-}
-
-class _MetaElementImpl extends _ElementImpl implements MetaElement native "*HTMLMetaElement" {
-
-  String content;
-
-  String httpEquiv;
-
-  String name;
-
-  String scheme;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Metadata
-abstract class Metadata {
-
-  /** @domName Metadata.modificationTime */
-  Date get modificationTime;
-
-  /** @domName Metadata.size */
-  int get size;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void MetadataCallback(Metadata metadata);
-
-class _MetadataImpl implements Metadata native "*Metadata" {
-
-  final Date modificationTime;
-
-  final int size;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLMeterElement
-abstract class MeterElement implements Element {
-
-  factory MeterElement() => _Elements.createMeterElement();
-
-  /** @domName HTMLMeterElement.high */
-  num high;
-
-  /** @domName HTMLMeterElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLMeterElement.low */
-  num low;
-
-  /** @domName HTMLMeterElement.max */
-  num max;
-
-  /** @domName HTMLMeterElement.min */
-  num min;
-
-  /** @domName HTMLMeterElement.optimum */
-  num optimum;
-
-  /** @domName HTMLMeterElement.value */
-  num value;
-}
-
-class _MeterElementImpl extends _ElementImpl implements MeterElement native "*HTMLMeterElement" {
-
-  num high;
-
-  final List<Node> labels;
-
-  num low;
-
-  num max;
-
-  num min;
-
-  num optimum;
-
-  num value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLModElement
-abstract class ModElement implements Element {
-
-  /** @domName HTMLModElement.cite */
-  String cite;
-
-  /** @domName HTMLModElement.dateTime */
-  String dateTime;
-}
-
-class _ModElementImpl extends _ElementImpl implements ModElement native "*HTMLModElement" {
-
-  String cite;
-
-  String dateTime;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName MouseEvent
-abstract class MouseEvent implements UIEvent {
-
-  factory MouseEvent(String type, Window view, int detail, int screenX, int screenY,
-      int clientX, int clientY, int button, [bool canBubble = true,
-      bool cancelable = true, bool ctrlKey = false, bool altKey = false,
-      bool shiftKey = false, bool metaKey = false,
-      EventTarget relatedTarget = null]) =>
-      _MouseEventFactoryProvider.createMouseEvent(
-          type, view, detail, screenX, screenY,
-          clientX, clientY, button, canBubble, cancelable,
-          ctrlKey, altKey, shiftKey, metaKey,
-          relatedTarget);
-
-
-  /** @domName MouseEvent.altKey */
-  bool get altKey;
-
-  /** @domName MouseEvent.button */
-  int get button;
-
-  /** @domName MouseEvent.clientX */
-  int get clientX;
-
-  /** @domName MouseEvent.clientY */
-  int get clientY;
-
-  /** @domName MouseEvent.ctrlKey */
-  bool get ctrlKey;
-
-  /** @domName MouseEvent.dataTransfer */
-  Clipboard get dataTransfer;
-
-  /** @domName MouseEvent.fromElement */
-  Node get fromElement;
-
-  /** @domName MouseEvent.metaKey */
-  bool get metaKey;
-
-  /** @domName MouseEvent.offsetX */
-  int get offsetX;
-
-  /** @domName MouseEvent.offsetY */
-  int get offsetY;
-
-  /** @domName MouseEvent.relatedTarget */
-  EventTarget get relatedTarget;
-
-  /** @domName MouseEvent.screenX */
-  int get screenX;
-
-  /** @domName MouseEvent.screenY */
-  int get screenY;
-
-  /** @domName MouseEvent.shiftKey */
-  bool get shiftKey;
-
-  /** @domName MouseEvent.toElement */
-  Node get toElement;
-
-  /** @domName MouseEvent.webkitMovementX */
-  int get webkitMovementX;
-
-  /** @domName MouseEvent.webkitMovementY */
-  int get webkitMovementY;
-
-  /** @domName MouseEvent.x */
-  int get x;
-
-  /** @domName MouseEvent.y */
-  int get y;
-
-  /** @domName MouseEvent.initMouseEvent */
-  void $dom_initMouseEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _MouseEventImpl extends _UIEventImpl implements MouseEvent native "*MouseEvent" {
-
-  final bool altKey;
-
-  final int button;
-
-  final int clientX;
-
-  final int clientY;
-
-  final bool ctrlKey;
-
-  final _ClipboardImpl dataTransfer;
-
-  final _NodeImpl fromElement;
-
-  final bool metaKey;
-
-  EventTarget get relatedTarget => _convertNativeToDart_EventTarget(this._relatedTarget);
-  EventTarget get _relatedTarget => JS("EventTarget", "#.relatedTarget", this);
-
-  final int screenX;
-
-  final int screenY;
-
-  final bool shiftKey;
-
-  final _NodeImpl toElement;
-
-  final int webkitMovementX;
-
-  final int webkitMovementY;
-
-  final int x;
-
-  final int y;
-
-  void $dom_initMouseEvent(String type, bool canBubble, bool cancelable, _LocalWindowImpl view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) {
-    EventTarget relatedTarget_1 = _convertDartToNative_EventTarget(relatedTarget);
-    _$dom_initMouseEvent_1(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
-    return;
-  }
-  void _$dom_initMouseEvent_1(type, canBubble, cancelable, _LocalWindowImpl view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, EventTarget relatedTarget) native "initMouseEvent";
-
-
-  int get offsetX {
-  if (JS('bool', '!!#.offsetX', this)) {
-      return JS('int', '#.offsetX', this);
-    } else {
-      // Firefox does not support offsetX.
-      var target = this.target;
-      if (!(target is Element)) {
-        throw new UnsupportedError(
-            'offsetX is only supported on elements');
-      }
-      return this.clientX - this.target.getBoundingClientRect().left;
-    }
-  }
-
-  int get offsetY {
-    if (JS('bool', '!!#.offsetY', this)) {
-      return JS('int', '#.offsetY', this);
-    } else {
-      // Firefox does not support offsetY.
-      var target = this.target;
-      if (!(target is Element)) {
-        throw new UnsupportedError(
-            'offsetY is only supported on elements');
-      }
-      return this.clientY - this.target.getBoundingClientRect().top;
-    }
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void MutationCallback(List<MutationRecord> mutations, MutationObserver observer);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MutationEvent
-abstract class MutationEvent implements Event {
-
-  static const int ADDITION = 2;
-
-  static const int MODIFICATION = 1;
-
-  static const int REMOVAL = 3;
-
-  /** @domName MutationEvent.attrChange */
-  int get attrChange;
-
-  /** @domName MutationEvent.attrName */
-  String get attrName;
-
-  /** @domName MutationEvent.newValue */
-  String get newValue;
-
-  /** @domName MutationEvent.prevValue */
-  String get prevValue;
-
-  /** @domName MutationEvent.relatedNode */
-  Node get relatedNode;
-
-  /** @domName MutationEvent.initMutationEvent */
-  void initMutationEvent(String type, bool canBubble, bool cancelable, Node relatedNode, String prevValue, String newValue, String attrName, int attrChange);
-}
-
-class _MutationEventImpl extends _EventImpl implements MutationEvent native "*MutationEvent" {
-
-  final int attrChange;
-
-  final String attrName;
-
-  final String newValue;
-
-  final String prevValue;
-
-  final _NodeImpl relatedNode;
-
-  void initMutationEvent(String type, bool canBubble, bool cancelable, _NodeImpl relatedNode, String prevValue, String newValue, String attrName, int attrChange) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName MutationObserver
-abstract class MutationObserver {
-
-  factory MutationObserver(MutationCallback callback) => _MutationObserverFactoryProvider.createMutationObserver(callback);
-
-  /** @domName MutationObserver.disconnect */
-  void disconnect();
-
-  /** @domName MutationObserver.takeRecords */
-  List<MutationRecord> takeRecords();
-
-  void observe(Node target,
-               {Map options,
-                bool childList,
-                bool attributes,
-                bool characterData,
-                bool subtree,
-                bool attributeOldValue,
-                bool characterDataOldValue,
-                List<String> attributeFilter});
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _MutationObserverImpl implements MutationObserver native "*MutationObserver" {
-
-  void disconnect() native;
-
-  void _observe(_NodeImpl target, Map options) {
-    var options_1 = _convertDartToNative_Dictionary(options);
-    __observe_1(target, options_1);
-    return;
-  }
-  void __observe_1(_NodeImpl target, options) native "observe";
-
-  List<MutationRecord> takeRecords() native;
-
-  void observe(Node target,
-               {Map options,
-                bool childList,
-                bool attributes,
-                bool characterData,
-                bool subtree,
-                bool attributeOldValue,
-                bool characterDataOldValue,
-                List<String> attributeFilter}) {
-
-    // Parse options into map of known type.
-    var parsedOptions = _createDict();
-
-    if (options != null) {
-      options.forEach((k, v) {
-          if (_boolKeys.containsKey(k)) {
-            _add(parsedOptions, k, true == v);
-          } else if (k == 'attributeFilter') {
-            _add(parsedOptions, k, _fixupList(v));
-          } else {
-            throw new ArgumentError(
-                "Illegal MutationObserver.observe option '$k'");
-          }
-        });
-    }
-
-    // Override options passed in the map with named optional arguments.
-    override(key, value) {
-      if (value != null) _add(parsedOptions, key, value);
-    }
-
-    override('childList', childList);
-    override('attributes', attributes);
-    override('characterData', characterData);
-    override('subtree', subtree);
-    override('attributeOldValue', attributeOldValue);
-    override('characterDataOldValue', characterDataOldValue);
-    if (attributeFilter != null) {
-      override('attributeFilter', _fixupList(attributeFilter));
-    }
-
-    _call(target, parsedOptions);
-  }
-
-   // TODO: Change to a set when const Sets are available.
-  static final _boolKeys =
-    const {'childList': true,
-           'attributes': true,
-           'characterData': true,
-           'subtree': true,
-           'attributeOldValue': true,
-           'characterDataOldValue': true };
-
-
-  static _createDict() => JS('var', '{}');
-  static _add(m, String key, value) { JS('void', '#[#] = #', m, key, value); }
-  static _fixupList(list) => list;  // TODO: Ensure is a JavaScript Array.
-
-  // Call native function with no conversions.
-  _call(target, options) native 'observe';
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MutationRecord
-abstract class MutationRecord {
-
-  /** @domName MutationRecord.addedNodes */
-  List<Node> get addedNodes;
-
-  /** @domName MutationRecord.attributeName */
-  String get attributeName;
-
-  /** @domName MutationRecord.attributeNamespace */
-  String get attributeNamespace;
-
-  /** @domName MutationRecord.nextSibling */
-  Node get nextSibling;
-
-  /** @domName MutationRecord.oldValue */
-  String get oldValue;
-
-  /** @domName MutationRecord.previousSibling */
-  Node get previousSibling;
-
-  /** @domName MutationRecord.removedNodes */
-  List<Node> get removedNodes;
-
-  /** @domName MutationRecord.target */
-  Node get target;
-
-  /** @domName MutationRecord.type */
-  String get type;
-}
-
-class _MutationRecordImpl implements MutationRecord native "*MutationRecord" {
-
-  final List<Node> addedNodes;
-
-  final String attributeName;
-
-  final String attributeNamespace;
-
-  final _NodeImpl nextSibling;
-
-  final String oldValue;
-
-  final _NodeImpl previousSibling;
-
-  final List<Node> removedNodes;
-
-  final _NodeImpl target;
-
-  final String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName NamedNodeMap
-abstract class NamedNodeMap implements List<Node> {
-
-  /** @domName NamedNodeMap.length */
-  int get length;
-
-  /** @domName NamedNodeMap.getNamedItem */
-  Node getNamedItem(String name);
-
-  /** @domName NamedNodeMap.getNamedItemNS */
-  Node getNamedItemNS(String namespaceURI, String localName);
-
-  /** @domName NamedNodeMap.item */
-  Node item(int index);
-
-  /** @domName NamedNodeMap.removeNamedItem */
-  Node removeNamedItem(String name);
-
-  /** @domName NamedNodeMap.removeNamedItemNS */
-  Node removeNamedItemNS(String namespaceURI, String localName);
-
-  /** @domName NamedNodeMap.setNamedItem */
-  Node setNamedItem(Node node);
-
-  /** @domName NamedNodeMap.setNamedItemNS */
-  Node setNamedItemNS(Node node);
-}
-
-class _NamedNodeMapImpl implements NamedNodeMap, JavaScriptIndexingBehavior native "*NamedNodeMap" {
-
-  final int length;
-
-  _NodeImpl operator[](int index) => JS("_NodeImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _NodeImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<Node> mixins.
-  // Node is the element type.
-
-  // From Iterable<Node>:
-
-  Iterator<Node> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<Node>(this);
-  }
-
-  // From Collection<Node>:
-
-  void add(Node value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(Node value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<Node> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(Node element) => _Collections.contains(this, element);
-
-  void forEach(void f(Node element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Node element)) => _Collections.map(this, [], f);
-
-  Collection<Node> filter(bool f(Node element)) =>
-     _Collections.filter(this, <Node>[], f);
-
-  bool every(bool f(Node element)) => _Collections.every(this, f);
-
-  bool some(bool f(Node element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Node>:
-
-  void sort([Comparator<Node> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Node element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Node element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  Node get last => this[length - 1];
-
-  Node removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [Node initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<Node> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <Node>[]);
-
-  // -- end List<Node> mixins.
-
-  _NodeImpl getNamedItem(String name) native;
-
-  _NodeImpl getNamedItemNS(String namespaceURI, String localName) native;
-
-  _NodeImpl item(int index) native;
-
-  _NodeImpl removeNamedItem(String name) native;
-
-  _NodeImpl removeNamedItemNS(String namespaceURI, String localName) native;
-
-  _NodeImpl setNamedItem(_NodeImpl node) native;
-
-  _NodeImpl setNamedItemNS(_NodeImpl node) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Navigator
-abstract class Navigator {
-
-  /** @domName Navigator.appCodeName */
-  String get appCodeName;
-
-  /** @domName Navigator.appName */
-  String get appName;
-
-  /** @domName Navigator.appVersion */
-  String get appVersion;
-
-  /** @domName Navigator.cookieEnabled */
-  bool get cookieEnabled;
-
-  /** @domName Navigator.geolocation */
-  Geolocation get geolocation;
-
-  /** @domName Navigator.language */
-  String get language;
-
-  /** @domName Navigator.mimeTypes */
-  DOMMimeTypeArray get mimeTypes;
-
-  /** @domName Navigator.onLine */
-  bool get onLine;
-
-  /** @domName Navigator.platform */
-  String get platform;
-
-  /** @domName Navigator.plugins */
-  DOMPluginArray get plugins;
-
-  /** @domName Navigator.product */
-  String get product;
-
-  /** @domName Navigator.productSub */
-  String get productSub;
-
-  /** @domName Navigator.userAgent */
-  String get userAgent;
-
-  /** @domName Navigator.vendor */
-  String get vendor;
-
-  /** @domName Navigator.vendorSub */
-  String get vendorSub;
-
-  /** @domName Navigator.webkitBattery */
-  BatteryManager get webkitBattery;
-
-  /** @domName Navigator.getStorageUpdates */
-  void getStorageUpdates();
-
-  /** @domName Navigator.javaEnabled */
-  bool javaEnabled();
-
-  /** @domName Navigator.webkitGetGamepads */
-  List<Gamepad> webkitGetGamepads();
-
-  /** @domName Navigator.webkitGetUserMedia */
-  void webkitGetUserMedia(Map options, NavigatorUserMediaSuccessCallback successCallback, [NavigatorUserMediaErrorCallback errorCallback]);
-}
-
-class _NavigatorImpl implements Navigator native "*Navigator" {
-
-  final String appCodeName;
-
-  final String appName;
-
-  final String appVersion;
-
-  final bool cookieEnabled;
-
-  final _GeolocationImpl geolocation;
-
-  final String language;
-
-  final _DOMMimeTypeArrayImpl mimeTypes;
-
-  final bool onLine;
-
-  final String platform;
-
-  final _DOMPluginArrayImpl plugins;
-
-  final String product;
-
-  final String productSub;
-
-  final String userAgent;
-
-  final String vendor;
-
-  final String vendorSub;
-
-  final _BatteryManagerImpl webkitBattery;
-
-  void getStorageUpdates() native;
-
-  bool javaEnabled() native;
-
-  _GamepadListImpl webkitGetGamepads() native;
-
-  void webkitGetUserMedia(Map options, NavigatorUserMediaSuccessCallback successCallback, [errorCallback]) {
-    if (?errorCallback) {
-      var options_1 = _convertDartToNative_Dictionary(options);
-      _webkitGetUserMedia_1(options_1, successCallback, errorCallback);
-      return;
-    }
-    var options_2 = _convertDartToNative_Dictionary(options);
-    _webkitGetUserMedia_2(options_2, successCallback);
-    return;
-  }
-  void _webkitGetUserMedia_1(options, NavigatorUserMediaSuccessCallback successCallback, NavigatorUserMediaErrorCallback errorCallback) native "webkitGetUserMedia";
-  void _webkitGetUserMedia_2(options, NavigatorUserMediaSuccessCallback successCallback) native "webkitGetUserMedia";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName NavigatorUserMediaError
-abstract class NavigatorUserMediaError {
-
-  static const int PERMISSION_DENIED = 1;
-
-  /** @domName NavigatorUserMediaError.code */
-  int get code;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void NavigatorUserMediaErrorCallback(NavigatorUserMediaError error);
-
-class _NavigatorUserMediaErrorImpl implements NavigatorUserMediaError native "*NavigatorUserMediaError" {
-
-  final int code;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void NavigatorUserMediaSuccessCallback(LocalMediaStream stream);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName Node
-abstract class Node implements EventTarget {
-  List<Node> get nodes;
-
-  void set nodes(Collection<Node> value);
-
-  /**
-   * Replaces this node with another node.
-   * @domName Node.replaceChild
-   */
-  Node replaceWith(Node otherNode);
-
-  /**
-   * Removes this node from the DOM.
-   * @domName Node.removeChild
-   */
-  void remove();
-
-
-  static const int ATTRIBUTE_NODE = 2;
-
-  static const int CDATA_SECTION_NODE = 4;
-
-  static const int COMMENT_NODE = 8;
-
-  static const int DOCUMENT_FRAGMENT_NODE = 11;
-
-  static const int DOCUMENT_NODE = 9;
-
-  static const int DOCUMENT_POSITION_CONTAINED_BY = 0x10;
-
-  static const int DOCUMENT_POSITION_CONTAINS = 0x08;
-
-  static const int DOCUMENT_POSITION_DISCONNECTED = 0x01;
-
-  static const int DOCUMENT_POSITION_FOLLOWING = 0x04;
-
-  static const int DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
-
-  static const int DOCUMENT_POSITION_PRECEDING = 0x02;
-
-  static const int DOCUMENT_TYPE_NODE = 10;
-
-  static const int ELEMENT_NODE = 1;
-
-  static const int ENTITY_NODE = 6;
-
-  static const int ENTITY_REFERENCE_NODE = 5;
-
-  static const int NOTATION_NODE = 12;
-
-  static const int PROCESSING_INSTRUCTION_NODE = 7;
-
-  static const int TEXT_NODE = 3;
-
-  /** @domName Node.attributes */
-  NamedNodeMap get $dom_attributes;
-
-  /** @domName Node.childNodes */
-  List<Node> get $dom_childNodes;
-
-  /** @domName Node.firstChild */
-  Node get $dom_firstChild;
-
-  /** @domName Node.lastChild */
-  Node get $dom_lastChild;
-
-  /** @domName Node.nextSibling */
-  Node get nextNode;
-
-  /** @domName Node.nodeType */
-  int get $dom_nodeType;
-
-  /** @domName Node.ownerDocument */
-  Document get document;
-
-  /** @domName Node.parentNode */
-  Node get parent;
-
-  /** @domName Node.previousSibling */
-  Node get previousNode;
-
-  /** @domName Node.textContent */
-  String text;
-
-  /** @domName Node.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Node.appendChild */
-  Node $dom_appendChild(Node newChild);
-
-  /** @domName Node.cloneNode */
-  Node clone(bool deep);
-
-  /** @domName Node.contains */
-  bool contains(Node other);
-
-  /** @domName Node.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName Node.hasChildNodes */
-  bool hasChildNodes();
-
-  /** @domName Node.insertBefore */
-  Node insertBefore(Node newChild, Node refChild);
-
-  /** @domName Node.removeChild */
-  Node $dom_removeChild(Node oldChild);
-
-  /** @domName Node.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Node.replaceChild */
-  Node $dom_replaceChild(Node newChild, Node oldChild);
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName NodeFilter
-abstract class NodeFilter {
-
-  static const int FILTER_ACCEPT = 1;
-
-  static const int FILTER_REJECT = 2;
-
-  static const int FILTER_SKIP = 3;
-
-  static const int SHOW_ALL = 0xFFFFFFFF;
-
-  static const int SHOW_ATTRIBUTE = 0x00000002;
-
-  static const int SHOW_CDATA_SECTION = 0x00000008;
-
-  static const int SHOW_COMMENT = 0x00000080;
-
-  static const int SHOW_DOCUMENT = 0x00000100;
-
-  static const int SHOW_DOCUMENT_FRAGMENT = 0x00000400;
-
-  static const int SHOW_DOCUMENT_TYPE = 0x00000200;
-
-  static const int SHOW_ELEMENT = 0x00000001;
-
-  static const int SHOW_ENTITY = 0x00000020;
-
-  static const int SHOW_ENTITY_REFERENCE = 0x00000010;
-
-  static const int SHOW_NOTATION = 0x00000800;
-
-  static const int SHOW_PROCESSING_INSTRUCTION = 0x00000040;
-
-  static const int SHOW_TEXT = 0x00000004;
-
-  /** @domName NodeFilter.acceptNode */
-  int acceptNode(Node n);
-}
-
-class _NodeFilterImpl implements NodeFilter native "*NodeFilter" {
-
-  int acceptNode(_NodeImpl n) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Lazy implementation of the child nodes of an element that does not request
- * the actual child nodes of an element until strictly necessary greatly
- * improving performance for the typical cases where it is not required.
- */
-class _ChildNodeListLazy implements List {
-  final _NodeImpl _this;
-
-  _ChildNodeListLazy(this._this);
-
-
-  _NodeImpl get first => JS('_NodeImpl', '#.firstChild', _this);
-  _NodeImpl get last => JS('_NodeImpl', '#.lastChild', _this);
-
-  void add(_NodeImpl value) {
-    _this.$dom_appendChild(value);
-  }
-
-  void addLast(_NodeImpl value) {
-    _this.$dom_appendChild(value);
-  }
-
-
-  void addAll(Collection<_NodeImpl> collection) {
-    for (_NodeImpl node in collection) {
-      _this.$dom_appendChild(node);
-    }
-  }
-
-  _NodeImpl removeLast() {
-    final result = last;
-    if (result != null) {
-      _this.$dom_removeChild(result);
-    }
-    return result;
-  }
-
-  void clear() {
-    _this.text = '';
-  }
-
-  void operator []=(int index, _NodeImpl value) {
-    _this.$dom_replaceChild(value, this[index]);
-  }
-
-  Iterator<Node> iterator() => _this.$dom_childNodes.iterator();
-
-  // TODO(jacobr): We can implement these methods much more efficiently by
-  // looking up the nodeList only once instead of once per iteration.
-  bool contains(Node element) => _Collections.contains(this, element);
-
-  void forEach(void f(Node element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Node element)) => _Collections.map(this, [], f);
-
-  Collection<Node> filter(bool f(Node element)) =>
-     new _NodeListWrapper(_Collections.filter(this, <Node>[], f));
-
-  bool every(bool f(Node element)) => _Collections.every(this, f);
-
-  bool some(bool f(Node element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Node>:
-
-  // TODO(jacobr): this could be implemented for child node lists.
-  // The exception we throw here is misleading.
-  void sort([Comparator<Node> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Node element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Node element, [int start = 0]) =>
-      _Lists.lastIndexOf(this, element, start);
-
-  // FIXME: implement these.
-  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
-    throw new UnsupportedError(
-        "Cannot setRange on immutable List.");
-  }
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError(
-        "Cannot removeRange on immutable List.");
-  }
-  void insertRange(int start, int rangeLength, [Node initialValue]) {
-    throw new UnsupportedError(
-        "Cannot insertRange on immutable List.");
-  }
-  List<Node> getRange(int start, int rangeLength) =>
-    new _NodeListWrapper(_Lists.getRange(this, start, rangeLength, <Node>[]));
-
-  // -- end List<Node> mixins.
-
-  // TODO(jacobr): benchmark whether this is more efficient or whether caching
-  // a local copy of $dom_childNodes is more efficient.
-  int get length => _this.$dom_childNodes.length;
-
-  _NodeImpl operator[](int index) => _this.$dom_childNodes[index];
-}
-
-class _NodeImpl extends _EventTargetImpl implements Node native "*Node" {
-  _ChildNodeListLazy get nodes {
-    return new _ChildNodeListLazy(this);
-  }
-
-  void set nodes(Collection<Node> value) {
-    // Copy list first since we don't want liveness during iteration.
-    // TODO(jacobr): there is a better way to do this.
-    List copy = new List.from(value);
-    text = '';
-    for (Node node in copy) {
-      $dom_appendChild(node);
-    }
-  }
-
-  // TODO(jacobr): should we throw an exception if parent is already null?
-  // TODO(vsm): Use the native remove when available.
-  void remove() {
-    if (this.parent != null) {
-      final _NodeImpl parent = this.parent;
-      parent.$dom_removeChild(this);
-    }
-  }
-
-  _NodeImpl replaceWith(Node otherNode) {
-    try {
-      final _NodeImpl parent = this.parent;
-      parent.$dom_replaceChild(otherNode, this);
-    } catch (e) {
-
-    };
-    return this;
-  }
-
-
-  _NamedNodeMapImpl get $dom_attributes => JS("_NamedNodeMapImpl", "#.attributes", this);
-
-  List<Node> get $dom_childNodes => JS("List<Node>", "#.childNodes", this);
-
-  _NodeImpl get $dom_firstChild => JS("_NodeImpl", "#.firstChild", this);
-
-  _NodeImpl get $dom_lastChild => JS("_NodeImpl", "#.lastChild", this);
-
-  _NodeImpl get nextNode => JS("_NodeImpl", "#.nextSibling", this);
-
-  int get $dom_nodeType => JS("int", "#.nodeType", this);
-
-  _DocumentImpl get document => JS("_DocumentImpl", "#.ownerDocument", this);
-
-  _NodeImpl get parent => JS("_NodeImpl", "#.parentNode", this);
-
-  _NodeImpl get previousNode => JS("_NodeImpl", "#.previousSibling", this);
-
-  String get text => JS("String", "#.textContent", this);
-
-  void set text(String value) {
-    JS("void", "#.textContent = #", this, value);
-  }
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  _NodeImpl $dom_appendChild(_NodeImpl newChild) native "appendChild";
-
-  _NodeImpl clone(bool deep) native "cloneNode";
-
-  bool contains(_NodeImpl other) native;
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  bool hasChildNodes() native;
-
-  _NodeImpl insertBefore(_NodeImpl newChild, _NodeImpl refChild) native;
-
-  _NodeImpl $dom_removeChild(_NodeImpl oldChild) native "removeChild";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  _NodeImpl $dom_replaceChild(_NodeImpl newChild, _NodeImpl oldChild) native "replaceChild";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName NodeIterator
-abstract class NodeIterator {
-
-  /** @domName NodeIterator.expandEntityReferences */
-  bool get expandEntityReferences;
-
-  /** @domName NodeIterator.filter */
-  NodeFilter get filter;
-
-  /** @domName NodeIterator.pointerBeforeReferenceNode */
-  bool get pointerBeforeReferenceNode;
-
-  /** @domName NodeIterator.referenceNode */
-  Node get referenceNode;
-
-  /** @domName NodeIterator.root */
-  Node get root;
-
-  /** @domName NodeIterator.whatToShow */
-  int get whatToShow;
-
-  /** @domName NodeIterator.detach */
-  void detach();
-
-  /** @domName NodeIterator.nextNode */
-  Node nextNode();
-
-  /** @domName NodeIterator.previousNode */
-  Node previousNode();
-}
-
-class _NodeIteratorImpl implements NodeIterator native "*NodeIterator" {
-
-  final bool expandEntityReferences;
-
-  final _NodeFilterImpl filter;
-
-  final bool pointerBeforeReferenceNode;
-
-  final _NodeImpl referenceNode;
-
-  final _NodeImpl root;
-
-  final int whatToShow;
-
-  void detach() native;
-
-  _NodeImpl nextNode() native;
-
-  _NodeImpl previousNode() native;
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName NodeList
-abstract class NodeList implements List<Node> {
-
-  List<Node> filter(bool f(Node element));
-
-  List<Node> getRange(int start, int length);
-
-  Node get first;
-
-
-  /** @domName NodeList.length */
-  int get length;
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// TODO(nweiz): when all implementations we target have the same name for the
-// coreimpl implementation of List<E>, extend that rather than wrapping.
-class _ListWrapper<E> implements List<E> {
-  List _list;
-
-  _ListWrapper(List this._list);
-
-  Iterator<E> iterator() => _list.iterator();
-
-  bool contains(E element) => _list.contains(element);
-
-  void forEach(void f(E element)) => _list.forEach(f);
-
-  Collection map(f(E element)) => _list.map(f);
-
-  List<E> filter(bool f(E element)) => _list.filter(f);
-
-  bool every(bool f(E element)) => _list.every(f);
-
-  bool some(bool f(E element)) => _list.some(f);
-
-  bool get isEmpty => _list.isEmpty;
-
-  int get length => _list.length;
-
-  E operator [](int index) => _list[index];
-
-  void operator []=(int index, E value) { _list[index] = value; }
-
-  void set length(int newLength) { _list.length = newLength; }
-
-  void add(E value) => _list.add(value);
-
-  void addLast(E value) => _list.addLast(value);
-
-  void addAll(Collection<E> collection) => _list.addAll(collection);
-
-  void sort([Comparator<E> compare = Comparable.compare]) => _list.sort(compare);
-
-  int indexOf(E element, [int start = 0]) => _list.indexOf(element, start);
-
-  int lastIndexOf(E element, [int start = 0]) =>
-    _list.lastIndexOf(element, start);
-
-  void clear() => _list.clear();
-
-  E removeLast() => _list.removeLast();
-
-  E get last => _list.last;
-
-  List<E> getRange(int start, int rangeLength) =>
-    _list.getRange(start, rangeLength);
-
-  void setRange(int start, int rangeLength, List<E> from, [int startFrom = 0])
-      => _list.setRange(start, rangeLength, from, startFrom);
-
-  void removeRange(int start, int rangeLength) =>
-    _list.removeRange(start, rangeLength);
-
-  void insertRange(int start, int rangeLength, [E initialValue = null]) =>
-    _list.insertRange(start, rangeLength, initialValue);
-
-  E get first => _list[0];
-}
-
-/**
- * This class is used to insure the results of list operations are NodeLists
- * instead of lists.
- */
-class _NodeListWrapper extends _ListWrapper<Node> implements List {
-  _NodeListWrapper(List list) : super(list);
-
-  List<Node> filter(bool f(Node element)) =>
-    new _NodeListWrapper(_list.filter(f));
-
-  List<Node> getRange(int start, int rangeLength) =>
-    new _NodeListWrapper(_list.getRange(start, rangeLength));
-}
-
-class _NodeListImpl implements NodeList, JavaScriptIndexingBehavior native "*NodeList" {
-  _NodeImpl _parent;
-
-  // -- start List<Node> mixins.
-  // Node is the element type.
-
-  // From Iterable<Node>:
-
-  Iterator<Node> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<Node>(this);
-  }
-
-  // From Collection<Node>:
-
-  void add(_NodeImpl value) {
-    _parent.$dom_appendChild(value);
-  }
-
-  void addLast(_NodeImpl value) {
-    _parent.$dom_appendChild(value);
-  }
-
-  void addAll(Collection<_NodeImpl> collection) {
-    for (_NodeImpl node in collection) {
-      _parent.$dom_appendChild(node);
-    }
-  }
-
-  _NodeImpl removeLast() {
-    final result = this.last;
-    if (result != null) {
-      _parent.$dom_removeChild(result);
-    }
-    return result;
-  }
-
-  void clear() {
-    _parent.text = '';
-  }
-
-  void operator []=(int index, _NodeImpl value) {
-    _parent.$dom_replaceChild(value, this[index]);
-  }
-
-  bool contains(Node element) => _Collections.contains(this, element);
-
-  void forEach(void f(Node element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Node element)) => _Collections.map(this, [], f);
-
-  Collection<Node> filter(bool f(Node element)) =>
-     new _NodeListWrapper(_Collections.filter(this, <Node>[], f));
-
-  bool every(bool f(Node element)) => _Collections.every(this, f);
-
-  bool some(bool f(Node element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Node>:
-
-  void sort([Comparator<Node> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Node element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Node element, [int start = 0]) =>
-      _Lists.lastIndexOf(this, element, start);
-
-  Node get last => this[length - 1];
-  Node get first => this[0];
-
-  // FIXME: implement thesee.
-  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-  void insertRange(int start, int rangeLength, [Node initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-  List<Node> getRange(int start, int rangeLength) =>
-    new _NodeListWrapper(_Lists.getRange(this, start, rangeLength, <Node>[]));
-
-  // -- end List<Node> mixins.
-
-
-  final int length;
-
-  _NodeImpl operator[](int index) => JS("_NodeImpl", "#[#]", this, index);
-
-  _NodeImpl _item(int index) native "item";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Notation
-abstract class Notation implements Node {
-
-  /** @domName Notation.publicId */
-  String get publicId;
-
-  /** @domName Notation.systemId */
-  String get systemId;
-}
-
-class _NotationImpl extends _NodeImpl implements Notation native "*Notation" {
-
-  final String publicId;
-
-  final String systemId;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Notification
-abstract class Notification implements EventTarget {
-
-  factory Notification(String title, [Map options]) {
-    if (!?options) {
-      return _NotificationFactoryProvider.createNotification(title);
-    }
-    return _NotificationFactoryProvider.createNotification(title, options);
-  }
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  NotificationEvents get on;
-
-  /** @domName Notification.dir */
-  String dir;
-
-  /** @domName Notification.permission */
-  String get permission;
-
-  /** @domName Notification.replaceId */
-  String replaceId;
-
-  /** @domName Notification.tag */
-  String tag;
-
-  /** @domName Notification.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Notification.cancel */
-  void cancel();
-
-  /** @domName Notification.close */
-  void close();
-
-  /** @domName Notification.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName Notification.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Notification.requestPermission */
-  static final requestPermission = _NotificationImpl.requestPermission;
-
-  /** @domName Notification.show */
-  void show();
-}
-
-abstract class NotificationEvents implements Events {
-
-  EventListenerList get click;
-
-  EventListenerList get close;
-
-  EventListenerList get display;
-
-  EventListenerList get error;
-
-  EventListenerList get show;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName NotificationCenter
-abstract class NotificationCenter {
-
-  /** @domName NotificationCenter.checkPermission */
-  int checkPermission();
-
-  /** @domName NotificationCenter.createHTMLNotification */
-  Notification createHTMLNotification(String url);
-
-  /** @domName NotificationCenter.createNotification */
-  Notification createNotification(String iconUrl, String title, String body);
-
-  /** @domName NotificationCenter.requestPermission */
-  void requestPermission(VoidCallback callback);
-}
-
-class _NotificationCenterImpl implements NotificationCenter native "*NotificationCenter" {
-
-  int checkPermission() native;
-
-  _NotificationImpl createHTMLNotification(String url) native;
-
-  _NotificationImpl createNotification(String iconUrl, String title, String body) native;
-
-  void requestPermission(VoidCallback callback) native;
-}
-
-class _NotificationImpl extends _EventTargetImpl implements Notification native "*Notification" {
-
-  _NotificationEventsImpl get on =>
-    new _NotificationEventsImpl(this);
-
-  String dir;
-
-  final String permission;
-
-  String replaceId;
-
-  String tag;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  void cancel() native;
-
-  void close() native;
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  static void requestPermission(NotificationPermissionCallback callback) native;
-
-  void show() native;
-}
-
-class _NotificationEventsImpl extends _EventsImpl implements NotificationEvents {
-  _NotificationEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get click => this['click'];
-
-  EventListenerList get close => this['close'];
-
-  EventListenerList get display => this['display'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get show => this['show'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void NotificationPermissionCallback(String permission);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName OESElementIndexUint
-abstract class OESElementIndexUint {
-}
-
-class _OESElementIndexUintImpl implements OESElementIndexUint native "*OESElementIndexUint" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName OESStandardDerivatives
-abstract class OESStandardDerivatives {
-
-  static const int FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;
-}
-
-class _OESStandardDerivativesImpl implements OESStandardDerivatives native "*OESStandardDerivatives" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName OESTextureFloat
-abstract class OESTextureFloat {
-}
-
-class _OESTextureFloatImpl implements OESTextureFloat native "*OESTextureFloat" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName OESVertexArrayObject
-abstract class OESVertexArrayObject {
-
-  static const int VERTEX_ARRAY_BINDING_OES = 0x85B5;
-
-  /** @domName OESVertexArrayObject.bindVertexArrayOES */
-  void bindVertexArrayOES(WebGLVertexArrayObjectOES arrayObject);
-
-  /** @domName OESVertexArrayObject.createVertexArrayOES */
-  WebGLVertexArrayObjectOES createVertexArrayOES();
-
-  /** @domName OESVertexArrayObject.deleteVertexArrayOES */
-  void deleteVertexArrayOES(WebGLVertexArrayObjectOES arrayObject);
-
-  /** @domName OESVertexArrayObject.isVertexArrayOES */
-  bool isVertexArrayOES(WebGLVertexArrayObjectOES arrayObject);
-}
-
-class _OESVertexArrayObjectImpl implements OESVertexArrayObject native "*OESVertexArrayObject" {
-
-  void bindVertexArrayOES(_WebGLVertexArrayObjectOESImpl arrayObject) native;
-
-  _WebGLVertexArrayObjectOESImpl createVertexArrayOES() native;
-
-  void deleteVertexArrayOES(_WebGLVertexArrayObjectOESImpl arrayObject) native;
-
-  bool isVertexArrayOES(_WebGLVertexArrayObjectOESImpl arrayObject) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLOListElement
-abstract class OListElement implements Element {
-
-  factory OListElement() => _Elements.createOListElement();
-
-  /** @domName HTMLOListElement.compact */
-  bool compact;
-
-  /** @domName HTMLOListElement.reversed */
-  bool reversed;
-
-  /** @domName HTMLOListElement.start */
-  int start;
-
-  /** @domName HTMLOListElement.type */
-  String type;
-}
-
-class _OListElementImpl extends _ElementImpl implements OListElement native "*HTMLOListElement" {
-
-  bool compact;
-
-  bool reversed;
-
-  int start;
-
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLObjectElement
-abstract class ObjectElement implements Element {
-
-  factory ObjectElement() => _Elements.createObjectElement();
-
-  /** @domName HTMLObjectElement.align */
-  String align;
-
-  /** @domName HTMLObjectElement.archive */
-  String archive;
-
-  /** @domName HTMLObjectElement.border */
-  String border;
-
-  /** @domName HTMLObjectElement.code */
-  String code;
-
-  /** @domName HTMLObjectElement.codeBase */
-  String codeBase;
-
-  /** @domName HTMLObjectElement.codeType */
-  String codeType;
-
-  /** @domName HTMLObjectElement.data */
-  String data;
-
-  /** @domName HTMLObjectElement.declare */
-  bool declare;
-
-  /** @domName HTMLObjectElement.form */
-  FormElement get form;
-
-  /** @domName HTMLObjectElement.height */
-  String height;
-
-  /** @domName HTMLObjectElement.hspace */
-  int hspace;
-
-  /** @domName HTMLObjectElement.name */
-  String name;
-
-  /** @domName HTMLObjectElement.standby */
-  String standby;
-
-  /** @domName HTMLObjectElement.type */
-  String type;
-
-  /** @domName HTMLObjectElement.useMap */
-  String useMap;
-
-  /** @domName HTMLObjectElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLObjectElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLObjectElement.vspace */
-  int vspace;
-
-  /** @domName HTMLObjectElement.width */
-  String width;
-
-  /** @domName HTMLObjectElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLObjectElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLObjectElement.setCustomValidity */
-  void setCustomValidity(String error);
-}
-
-class _ObjectElementImpl extends _ElementImpl implements ObjectElement native "*HTMLObjectElement" {
-
-  String align;
-
-  String archive;
-
-  String border;
-
-  String code;
-
-  String codeBase;
-
-  String codeType;
-
-  String data;
-
-  bool declare;
-
-  final _FormElementImpl form;
-
-  String height;
-
-  int hspace;
-
-  String name;
-
-  String standby;
-
-  String type;
-
-  String useMap;
-
-  final String validationMessage;
-
-  final _ValidityStateImpl validity;
-
-  int vspace;
-
-  String width;
-
-  final bool willValidate;
-
-  bool checkValidity() native;
-
-  void setCustomValidity(String error) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName OfflineAudioCompletionEvent
-abstract class OfflineAudioCompletionEvent implements Event {
-
-  /** @domName OfflineAudioCompletionEvent.renderedBuffer */
-  AudioBuffer get renderedBuffer;
-}
-
-class _OfflineAudioCompletionEventImpl extends _EventImpl implements OfflineAudioCompletionEvent native "*OfflineAudioCompletionEvent" {
-
-  final _AudioBufferImpl renderedBuffer;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLOptGroupElement
-abstract class OptGroupElement implements Element {
-
-  factory OptGroupElement() => _Elements.createOptGroupElement();
-
-  /** @domName HTMLOptGroupElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLOptGroupElement.label */
-  String label;
-}
-
-class _OptGroupElementImpl extends _ElementImpl implements OptGroupElement native "*HTMLOptGroupElement" {
-
-  bool disabled;
-
-  String label;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLOptionElement
-abstract class OptionElement implements Element {
-
-  factory OptionElement([String data, String value, bool defaultSelected, bool selected]) {
-    if (!?data) {
-      return _OptionElementFactoryProvider.createOptionElement();
-    }
-    if (!?value) {
-      return _OptionElementFactoryProvider.createOptionElement(data);
-    }
-    if (!?defaultSelected) {
-      return _OptionElementFactoryProvider.createOptionElement(data, value);
-    }
-    if (!?selected) {
-      return _OptionElementFactoryProvider.createOptionElement(data, value, defaultSelected);
-    }
-    return _OptionElementFactoryProvider.createOptionElement(data, value, defaultSelected, selected);
-  }
-
-  /** @domName HTMLOptionElement.defaultSelected */
-  bool defaultSelected;
-
-  /** @domName HTMLOptionElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLOptionElement.form */
-  FormElement get form;
-
-  /** @domName HTMLOptionElement.index */
-  int get index;
-
-  /** @domName HTMLOptionElement.label */
-  String label;
-
-  /** @domName HTMLOptionElement.selected */
-  bool selected;
-
-  /** @domName HTMLOptionElement.value */
-  String value;
-}
-
-class _OptionElementImpl extends _ElementImpl implements OptionElement native "*HTMLOptionElement" {
-
-  bool defaultSelected;
-
-  bool disabled;
-
-  final _FormElementImpl form;
-
-  final int index;
-
-  String label;
-
-  bool selected;
-
-  String value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName OscillatorNode
-abstract class OscillatorNode implements AudioSourceNode {
-
-  static const int CUSTOM = 4;
-
-  static const int FINISHED_STATE = 3;
-
-  static const int PLAYING_STATE = 2;
-
-  static const int SAWTOOTH = 2;
-
-  static const int SCHEDULED_STATE = 1;
-
-  static const int SINE = 0;
-
-  static const int SQUARE = 1;
-
-  static const int TRIANGLE = 3;
-
-  static const int UNSCHEDULED_STATE = 0;
-
-  /** @domName OscillatorNode.detune */
-  AudioParam get detune;
-
-  /** @domName OscillatorNode.frequency */
-  AudioParam get frequency;
-
-  /** @domName OscillatorNode.playbackState */
-  int get playbackState;
-
-  /** @domName OscillatorNode.type */
-  int type;
-
-  /** @domName OscillatorNode.setWaveTable */
-  void setWaveTable(WaveTable waveTable);
-
-  /** @domName OscillatorNode.start */
-  void start(num when);
-
-  /** @domName OscillatorNode.stop */
-  void stop(num when);
-}
-
-class _OscillatorNodeImpl extends _AudioSourceNodeImpl implements OscillatorNode native "*OscillatorNode" {
-
-  final _AudioParamImpl detune;
-
-  final _AudioParamImpl frequency;
-
-  final int playbackState;
-
-  int type;
-
-  void setWaveTable(_WaveTableImpl waveTable) native;
-
-  void start(num when) native;
-
-  void stop(num when) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLOutputElement
-abstract class OutputElement implements Element {
-
-  factory OutputElement() => _Elements.createOutputElement();
-
-  /** @domName HTMLOutputElement.defaultValue */
-  String defaultValue;
-
-  /** @domName HTMLOutputElement.form */
-  FormElement get form;
-
-  /** @domName HTMLOutputElement.htmlFor */
-  DOMSettableTokenList htmlFor;
-
-  /** @domName HTMLOutputElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLOutputElement.name */
-  String name;
-
-  /** @domName HTMLOutputElement.type */
-  String get type;
-
-  /** @domName HTMLOutputElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLOutputElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLOutputElement.value */
-  String value;
-
-  /** @domName HTMLOutputElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLOutputElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLOutputElement.setCustomValidity */
-  void setCustomValidity(String error);
-}
-
-class _OutputElementImpl extends _ElementImpl implements OutputElement native "*HTMLOutputElement" {
-
-  String defaultValue;
-
-  final _FormElementImpl form;
-
-  _DOMSettableTokenListImpl htmlFor;
-
-  final List<Node> labels;
-
-  String name;
-
-  final String type;
-
-  final String validationMessage;
-
-  final _ValidityStateImpl validity;
-
-  String value;
-
-  final bool willValidate;
-
-  bool checkValidity() native;
-
-  void setCustomValidity(String error) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName OverflowEvent
-abstract class OverflowEvent implements Event {
-
-  static const int BOTH = 2;
-
-  static const int HORIZONTAL = 0;
-
-  static const int VERTICAL = 1;
-
-  /** @domName OverflowEvent.horizontalOverflow */
-  bool get horizontalOverflow;
-
-  /** @domName OverflowEvent.orient */
-  int get orient;
-
-  /** @domName OverflowEvent.verticalOverflow */
-  bool get verticalOverflow;
-}
-
-class _OverflowEventImpl extends _EventImpl implements OverflowEvent native "*OverflowEvent" {
-
-  final bool horizontalOverflow;
-
-  final int orient;
-
-  final bool verticalOverflow;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName PagePopupController
-abstract class PagePopupController {
-
-  /** @domName PagePopupController.localizeNumberString */
-  String localizeNumberString(String numberString);
-
-  /** @domName PagePopupController.setValueAndClosePopup */
-  void setValueAndClosePopup(int numberValue, String stringValue);
-}
-
-class _PagePopupControllerImpl implements PagePopupController native "*PagePopupController" {
-
-  String localizeNumberString(String numberString) native;
-
-  void setValueAndClosePopup(int numberValue, String stringValue) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName PageTransitionEvent
-abstract class PageTransitionEvent implements Event {
-
-  /** @domName PageTransitionEvent.persisted */
-  bool get persisted;
-}
-
-class _PageTransitionEventImpl extends _EventImpl implements PageTransitionEvent native "*PageTransitionEvent" {
-
-  final bool persisted;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName PannerNode
-abstract class PannerNode implements AudioNode {
-
-  static const int EQUALPOWER = 0;
-
-  static const int EXPONENTIAL_DISTANCE = 2;
-
-  static const int HRTF = 1;
-
-  static const int INVERSE_DISTANCE = 1;
-
-  static const int LINEAR_DISTANCE = 0;
-
-  static const int SOUNDFIELD = 2;
-
-  /** @domName PannerNode.coneGain */
-  AudioGain get coneGain;
-
-  /** @domName PannerNode.coneInnerAngle */
-  num coneInnerAngle;
-
-  /** @domName PannerNode.coneOuterAngle */
-  num coneOuterAngle;
-
-  /** @domName PannerNode.coneOuterGain */
-  num coneOuterGain;
-
-  /** @domName PannerNode.distanceGain */
-  AudioGain get distanceGain;
-
-  /** @domName PannerNode.distanceModel */
-  int distanceModel;
-
-  /** @domName PannerNode.maxDistance */
-  num maxDistance;
-
-  /** @domName PannerNode.panningModel */
-  int panningModel;
-
-  /** @domName PannerNode.refDistance */
-  num refDistance;
-
-  /** @domName PannerNode.rolloffFactor */
-  num rolloffFactor;
-
-  /** @domName PannerNode.setOrientation */
-  void setOrientation(num x, num y, num z);
-
-  /** @domName PannerNode.setPosition */
-  void setPosition(num x, num y, num z);
-
-  /** @domName PannerNode.setVelocity */
-  void setVelocity(num x, num y, num z);
-}
-
-class _PannerNodeImpl extends _AudioNodeImpl implements PannerNode native "*PannerNode" {
-
-  final _AudioGainImpl coneGain;
-
-  num coneInnerAngle;
-
-  num coneOuterAngle;
-
-  num coneOuterGain;
-
-  final _AudioGainImpl distanceGain;
-
-  int distanceModel;
-
-  num maxDistance;
-
-  int panningModel;
-
-  num refDistance;
-
-  num rolloffFactor;
-
-  void setOrientation(num x, num y, num z) native;
-
-  void setPosition(num x, num y, num z) native;
-
-  void setVelocity(num x, num y, num z) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLParagraphElement
-abstract class ParagraphElement implements Element {
-
-  factory ParagraphElement() => _Elements.createParagraphElement();
-
-  /** @domName HTMLParagraphElement.align */
-  String align;
-}
-
-class _ParagraphElementImpl extends _ElementImpl implements ParagraphElement native "*HTMLParagraphElement" {
-
-  String align;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLParamElement
-abstract class ParamElement implements Element {
-
-  factory ParamElement() => _Elements.createParamElement();
-
-  /** @domName HTMLParamElement.name */
-  String name;
-
-  /** @domName HTMLParamElement.type */
-  String type;
-
-  /** @domName HTMLParamElement.value */
-  String value;
-
-  /** @domName HTMLParamElement.valueType */
-  String valueType;
-}
-
-class _ParamElementImpl extends _ElementImpl implements ParamElement native "*HTMLParamElement" {
-
-  String name;
-
-  String type;
-
-  String value;
-
-  String valueType;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName PeerConnection00
-abstract class PeerConnection00 implements EventTarget {
-
-  factory PeerConnection00(String serverConfiguration, IceCallback iceCallback) => _PeerConnection00FactoryProvider.createPeerConnection00(serverConfiguration, iceCallback);
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  PeerConnection00Events get on;
-
-  static const int ACTIVE = 2;
-
-  static const int CLOSED = 3;
-
-  static const int ICE_CHECKING = 0x300;
-
-  static const int ICE_CLOSED = 0x700;
-
-  static const int ICE_COMPLETED = 0x500;
-
-  static const int ICE_CONNECTED = 0x400;
-
-  static const int ICE_FAILED = 0x600;
-
-  static const int ICE_GATHERING = 0x100;
-
-  static const int ICE_WAITING = 0x200;
-
-  static const int NEW = 0;
-
-  static const int OPENING = 1;
-
-  static const int SDP_ANSWER = 0x300;
-
-  static const int SDP_OFFER = 0x100;
-
-  static const int SDP_PRANSWER = 0x200;
-
-  /** @domName PeerConnection00.iceState */
-  int get iceState;
-
-  /** @domName PeerConnection00.localDescription */
-  SessionDescription get localDescription;
-
-  /** @domName PeerConnection00.localStreams */
-  List<MediaStream> get localStreams;
-
-  /** @domName PeerConnection00.readyState */
-  int get readyState;
-
-  /** @domName PeerConnection00.remoteDescription */
-  SessionDescription get remoteDescription;
-
-  /** @domName PeerConnection00.remoteStreams */
-  List<MediaStream> get remoteStreams;
-
-  /** @domName PeerConnection00.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName PeerConnection00.addStream */
-  void addStream(MediaStream stream, [Map mediaStreamHints]);
-
-  /** @domName PeerConnection00.close */
-  void close();
-
-  /** @domName PeerConnection00.createAnswer */
-  SessionDescription createAnswer(String offer, [Map mediaHints]);
-
-  /** @domName PeerConnection00.createOffer */
-  SessionDescription createOffer([Map mediaHints]);
-
-  /** @domName PeerConnection00.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName PeerConnection00.processIceMessage */
-  void processIceMessage(IceCandidate candidate);
-
-  /** @domName PeerConnection00.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName PeerConnection00.removeStream */
-  void removeStream(MediaStream stream);
-
-  /** @domName PeerConnection00.setLocalDescription */
-  void setLocalDescription(int action, SessionDescription desc);
-
-  /** @domName PeerConnection00.setRemoteDescription */
-  void setRemoteDescription(int action, SessionDescription desc);
-
-  /** @domName PeerConnection00.startIce */
-  void startIce([Map iceOptions]);
-}
-
-abstract class PeerConnection00Events implements Events {
-
-  EventListenerList get addStream;
-
-  EventListenerList get connecting;
-
-  EventListenerList get open;
-
-  EventListenerList get removeStream;
-
-  EventListenerList get stateChange;
-}
-
-class _PeerConnection00Impl extends _EventTargetImpl implements PeerConnection00 native "*PeerConnection00" {
-
-  _PeerConnection00EventsImpl get on =>
-    new _PeerConnection00EventsImpl(this);
-
-  final int iceState;
-
-  final _SessionDescriptionImpl localDescription;
-
-  final _MediaStreamListImpl localStreams;
-
-  final int readyState;
-
-  final _SessionDescriptionImpl remoteDescription;
-
-  final _MediaStreamListImpl remoteStreams;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  void addStream(_MediaStreamImpl stream, [mediaStreamHints]) {
-    if (?mediaStreamHints) {
-      var mediaStreamHints_1 = _convertDartToNative_Dictionary(mediaStreamHints);
-      _addStream_1(stream, mediaStreamHints_1);
-      return;
-    }
-    _addStream_2(stream);
-    return;
-  }
-  void _addStream_1(_MediaStreamImpl stream, mediaStreamHints) native "addStream";
-  void _addStream_2(_MediaStreamImpl stream) native "addStream";
-
-  void close() native;
-
-  _SessionDescriptionImpl createAnswer(String offer, [mediaHints]) {
-    if (?mediaHints) {
-      var mediaHints_1 = _convertDartToNative_Dictionary(mediaHints);
-      return _createAnswer_1(offer, mediaHints_1);
-    }
-    return _createAnswer_2(offer);
-  }
-  _SessionDescriptionImpl _createAnswer_1(offer, mediaHints) native "createAnswer";
-  _SessionDescriptionImpl _createAnswer_2(offer) native "createAnswer";
-
-  _SessionDescriptionImpl createOffer([mediaHints]) {
-    if (?mediaHints) {
-      var mediaHints_1 = _convertDartToNative_Dictionary(mediaHints);
-      return _createOffer_1(mediaHints_1);
-    }
-    return _createOffer_2();
-  }
-  _SessionDescriptionImpl _createOffer_1(mediaHints) native "createOffer";
-  _SessionDescriptionImpl _createOffer_2() native "createOffer";
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  void processIceMessage(_IceCandidateImpl candidate) native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  void removeStream(_MediaStreamImpl stream) native;
-
-  void setLocalDescription(int action, _SessionDescriptionImpl desc) native;
-
-  void setRemoteDescription(int action, _SessionDescriptionImpl desc) native;
-
-  void startIce([iceOptions]) {
-    if (?iceOptions) {
-      var iceOptions_1 = _convertDartToNative_Dictionary(iceOptions);
-      _startIce_1(iceOptions_1);
-      return;
-    }
-    _startIce_2();
-    return;
-  }
-  void _startIce_1(iceOptions) native "startIce";
-  void _startIce_2() native "startIce";
-}
-
-class _PeerConnection00EventsImpl extends _EventsImpl implements PeerConnection00Events {
-  _PeerConnection00EventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get addStream => this['addstream'];
-
-  EventListenerList get connecting => this['connecting'];
-
-  EventListenerList get open => this['open'];
-
-  EventListenerList get removeStream => this['removestream'];
-
-  EventListenerList get stateChange => this['statechange'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Performance
-abstract class Performance implements EventTarget {
-
-  /** @domName Performance.memory */
-  MemoryInfo get memory;
-
-  /** @domName Performance.navigation */
-  PerformanceNavigation get navigation;
-
-  /** @domName Performance.timing */
-  PerformanceTiming get timing;
-
-  /** @domName Performance.now */
-  num now();
-}
-
-class _PerformanceImpl extends _EventTargetImpl implements Performance native "*Performance" {
-
-  final _MemoryInfoImpl memory;
-
-  final _PerformanceNavigationImpl navigation;
-
-  final _PerformanceTimingImpl timing;
-
-  num now() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName PerformanceNavigation
-abstract class PerformanceNavigation {
-
-  static const int TYPE_BACK_FORWARD = 2;
-
-  static const int TYPE_NAVIGATE = 0;
-
-  static const int TYPE_RELOAD = 1;
-
-  static const int TYPE_RESERVED = 255;
-
-  /** @domName PerformanceNavigation.redirectCount */
-  int get redirectCount;
-
-  /** @domName PerformanceNavigation.type */
-  int get type;
-}
-
-class _PerformanceNavigationImpl implements PerformanceNavigation native "*PerformanceNavigation" {
-
-  final int redirectCount;
-
-  final int type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName PerformanceTiming
-abstract class PerformanceTiming {
-
-  /** @domName PerformanceTiming.connectEnd */
-  int get connectEnd;
-
-  /** @domName PerformanceTiming.connectStart */
-  int get connectStart;
-
-  /** @domName PerformanceTiming.domComplete */
-  int get domComplete;
-
-  /** @domName PerformanceTiming.domContentLoadedEventEnd */
-  int get domContentLoadedEventEnd;
-
-  /** @domName PerformanceTiming.domContentLoadedEventStart */
-  int get domContentLoadedEventStart;
-
-  /** @domName PerformanceTiming.domInteractive */
-  int get domInteractive;
-
-  /** @domName PerformanceTiming.domLoading */
-  int get domLoading;
-
-  /** @domName PerformanceTiming.domainLookupEnd */
-  int get domainLookupEnd;
-
-  /** @domName PerformanceTiming.domainLookupStart */
-  int get domainLookupStart;
-
-  /** @domName PerformanceTiming.fetchStart */
-  int get fetchStart;
-
-  /** @domName PerformanceTiming.loadEventEnd */
-  int get loadEventEnd;
-
-  /** @domName PerformanceTiming.loadEventStart */
-  int get loadEventStart;
-
-  /** @domName PerformanceTiming.navigationStart */
-  int get navigationStart;
-
-  /** @domName PerformanceTiming.redirectEnd */
-  int get redirectEnd;
-
-  /** @domName PerformanceTiming.redirectStart */
-  int get redirectStart;
-
-  /** @domName PerformanceTiming.requestStart */
-  int get requestStart;
-
-  /** @domName PerformanceTiming.responseEnd */
-  int get responseEnd;
-
-  /** @domName PerformanceTiming.responseStart */
-  int get responseStart;
-
-  /** @domName PerformanceTiming.secureConnectionStart */
-  int get secureConnectionStart;
-
-  /** @domName PerformanceTiming.unloadEventEnd */
-  int get unloadEventEnd;
-
-  /** @domName PerformanceTiming.unloadEventStart */
-  int get unloadEventStart;
-}
-
-class _PerformanceTimingImpl implements PerformanceTiming native "*PerformanceTiming" {
-
-  final int connectEnd;
-
-  final int connectStart;
-
-  final int domComplete;
-
-  final int domContentLoadedEventEnd;
-
-  final int domContentLoadedEventStart;
-
-  final int domInteractive;
-
-  final int domLoading;
-
-  final int domainLookupEnd;
-
-  final int domainLookupStart;
-
-  final int fetchStart;
-
-  final int loadEventEnd;
-
-  final int loadEventStart;
-
-  final int navigationStart;
-
-  final int redirectEnd;
-
-  final int redirectStart;
-
-  final int requestStart;
-
-  final int responseEnd;
-
-  final int responseStart;
-
-  final int secureConnectionStart;
-
-  final int unloadEventEnd;
-
-  final int unloadEventStart;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName WebKitPoint
-abstract class Point {
-
-  factory Point(num x, num y) => _PointFactoryProvider.createPoint(x, y);
-
-  /** @domName WebKitPoint.x */
-  num x;
-
-  /** @domName WebKitPoint.y */
-  num y;
-}
-
-class _PointImpl implements Point native "*WebKitPoint" {
-
-  num x;
-
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName PopStateEvent
-abstract class PopStateEvent implements Event {
-
-  /** @domName PopStateEvent.state */
-  Object get state;
-}
-
-class _PopStateEventImpl extends _EventImpl implements PopStateEvent native "*PopStateEvent" {
-
-  final Object state;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void PositionCallback(Geoposition position);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName PositionError
-abstract class PositionError {
-
-  static const int PERMISSION_DENIED = 1;
-
-  static const int POSITION_UNAVAILABLE = 2;
-
-  static const int TIMEOUT = 3;
-
-  /** @domName PositionError.code */
-  int get code;
-
-  /** @domName PositionError.message */
-  String get message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void PositionErrorCallback(PositionError error);
-
-class _PositionErrorImpl implements PositionError native "*PositionError" {
-
-  final int code;
-
-  final String message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLPreElement
-abstract class PreElement implements Element {
-
-  factory PreElement() => _Elements.createPreElement();
-
-  /** @domName HTMLPreElement.width */
-  int width;
-
-  /** @domName HTMLPreElement.wrap */
-  bool wrap;
-}
-
-class _PreElementImpl extends _ElementImpl implements PreElement native "*HTMLPreElement" {
-
-  int width;
-
-  bool wrap;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ProcessingInstruction
-abstract class ProcessingInstruction implements Node {
-
-  /** @domName ProcessingInstruction.data */
-  String data;
-
-  /** @domName ProcessingInstruction.sheet */
-  StyleSheet get sheet;
-
-  /** @domName ProcessingInstruction.target */
-  String get target;
-}
-
-class _ProcessingInstructionImpl extends _NodeImpl implements ProcessingInstruction native "*ProcessingInstruction" {
-
-  String data;
-
-  final _StyleSheetImpl sheet;
-
-  final String target;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLProgressElement
-abstract class ProgressElement implements Element {
-
-  factory ProgressElement() => _Elements.createProgressElement();
-
-  /** @domName HTMLProgressElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLProgressElement.max */
-  num max;
-
-  /** @domName HTMLProgressElement.position */
-  num get position;
-
-  /** @domName HTMLProgressElement.value */
-  num value;
-}
-
-class _ProgressElementImpl extends _ElementImpl implements ProgressElement native "*HTMLProgressElement" {
-
-  final List<Node> labels;
-
-  num max;
-
-  final num position;
-
-  num value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ProgressEvent
-abstract class ProgressEvent implements Event {
-
-  /** @domName ProgressEvent.lengthComputable */
-  bool get lengthComputable;
-
-  /** @domName ProgressEvent.loaded */
-  int get loaded;
-
-  /** @domName ProgressEvent.total */
-  int get total;
-}
-
-class _ProgressEventImpl extends _EventImpl implements ProgressEvent native "*ProgressEvent" {
-
-  final bool lengthComputable;
-
-  final int loaded;
-
-  final int total;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLQuoteElement
-abstract class QuoteElement implements Element {
-
-  /** @domName HTMLQuoteElement.cite */
-  String cite;
-}
-
-class _QuoteElementImpl extends _ElementImpl implements QuoteElement native "*HTMLQuoteElement" {
-
-  String cite;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RGBColor
-abstract class RGBColor {
-
-  /** @domName RGBColor.blue */
-  CSSPrimitiveValue get blue;
-
-  /** @domName RGBColor.green */
-  CSSPrimitiveValue get green;
-
-  /** @domName RGBColor.red */
-  CSSPrimitiveValue get red;
-}
-
-class _RGBColorImpl implements RGBColor native "*RGBColor" {
-
-  final _CSSPrimitiveValueImpl blue;
-
-  final _CSSPrimitiveValueImpl green;
-
-  final _CSSPrimitiveValueImpl red;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RTCDataChannel
-abstract class RTCDataChannel implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  RTCDataChannelEvents get on;
-
-  /** @domName RTCDataChannel.binaryType */
-  String binaryType;
-
-  /** @domName RTCDataChannel.bufferedAmount */
-  int get bufferedAmount;
-
-  /** @domName RTCDataChannel.label */
-  String get label;
-
-  /** @domName RTCDataChannel.readyState */
-  String get readyState;
-
-  /** @domName RTCDataChannel.reliable */
-  bool get reliable;
-
-  /** @domName RTCDataChannel.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName RTCDataChannel.close */
-  void close();
-
-  /** @domName RTCDataChannel.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName RTCDataChannel.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName RTCDataChannel.send */
-  void send(data);
-}
-
-abstract class RTCDataChannelEvents implements Events {
-
-  EventListenerList get close;
-
-  EventListenerList get error;
-
-  EventListenerList get message;
-
-  EventListenerList get open;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RTCDataChannelEvent
-abstract class RTCDataChannelEvent implements Event {
-
-  /** @domName RTCDataChannelEvent.channel */
-  RTCDataChannel get channel;
-}
-
-class _RTCDataChannelEventImpl extends _EventImpl implements RTCDataChannelEvent native "*RTCDataChannelEvent" {
-
-  final _RTCDataChannelImpl channel;
-}
-
-class _RTCDataChannelImpl extends _EventTargetImpl implements RTCDataChannel native "*RTCDataChannel" {
-
-  _RTCDataChannelEventsImpl get on =>
-    new _RTCDataChannelEventsImpl(this);
-
-  String binaryType;
-
-  final int bufferedAmount;
-
-  final String label;
-
-  final String readyState;
-
-  final bool reliable;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  void close() native;
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  void send(data) native;
-}
-
-class _RTCDataChannelEventsImpl extends _EventsImpl implements RTCDataChannelEvents {
-  _RTCDataChannelEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get close => this['close'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get message => this['message'];
-
-  EventListenerList get open => this['open'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void RTCErrorCallback(String errorInformation);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RTCIceCandidate
-abstract class RTCIceCandidate {
-
-  factory RTCIceCandidate(Map dictionary) => _RTCIceCandidateFactoryProvider.createRTCIceCandidate(dictionary);
-
-  /** @domName RTCIceCandidate.candidate */
-  String get candidate;
-
-  /** @domName RTCIceCandidate.sdpMLineIndex */
-  int get sdpMLineIndex;
-
-  /** @domName RTCIceCandidate.sdpMid */
-  String get sdpMid;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RTCIceCandidateEvent
-abstract class RTCIceCandidateEvent implements Event {
-
-  /** @domName RTCIceCandidateEvent.candidate */
-  RTCIceCandidate get candidate;
-}
-
-class _RTCIceCandidateEventImpl extends _EventImpl implements RTCIceCandidateEvent native "*RTCIceCandidateEvent" {
-
-  final _RTCIceCandidateImpl candidate;
-}
-
-class _RTCIceCandidateImpl implements RTCIceCandidate native "*RTCIceCandidate" {
-
-  final String candidate;
-
-  final int sdpMLineIndex;
-
-  final String sdpMid;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RTCPeerConnection
-abstract class RTCPeerConnection implements EventTarget {
-
-  factory RTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
-    if (!?mediaConstraints) {
-      return _RTCPeerConnectionFactoryProvider.createRTCPeerConnection(rtcIceServers);
-    }
-    return _RTCPeerConnectionFactoryProvider.createRTCPeerConnection(rtcIceServers, mediaConstraints);
-  }
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  RTCPeerConnectionEvents get on;
-
-  /** @domName RTCPeerConnection.iceState */
-  String get iceState;
-
-  /** @domName RTCPeerConnection.localDescription */
-  RTCSessionDescription get localDescription;
-
-  /** @domName RTCPeerConnection.localStreams */
-  List<MediaStream> get localStreams;
-
-  /** @domName RTCPeerConnection.readyState */
-  String get readyState;
-
-  /** @domName RTCPeerConnection.remoteDescription */
-  RTCSessionDescription get remoteDescription;
-
-  /** @domName RTCPeerConnection.remoteStreams */
-  List<MediaStream> get remoteStreams;
-
-  /** @domName RTCPeerConnection.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName RTCPeerConnection.addIceCandidate */
-  void addIceCandidate(RTCIceCandidate candidate);
-
-  /** @domName RTCPeerConnection.addStream */
-  void addStream(MediaStream stream, [Map mediaConstraints]);
-
-  /** @domName RTCPeerConnection.close */
-  void close();
-
-  /** @domName RTCPeerConnection.createAnswer */
-  void createAnswer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]);
-
-  /** @domName RTCPeerConnection.createDataChannel */
-  RTCDataChannel createDataChannel(String label, [Map options]);
-
-  /** @domName RTCPeerConnection.createOffer */
-  void createOffer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]);
-
-  /** @domName RTCPeerConnection.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName RTCPeerConnection.getStats */
-  void getStats(RTCStatsCallback successCallback, MediaStreamTrack selector);
-
-  /** @domName RTCPeerConnection.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName RTCPeerConnection.removeStream */
-  void removeStream(MediaStream stream);
-
-  /** @domName RTCPeerConnection.setLocalDescription */
-  void setLocalDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]);
-
-  /** @domName RTCPeerConnection.setRemoteDescription */
-  void setRemoteDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]);
-
-  /** @domName RTCPeerConnection.updateIce */
-  void updateIce([Map configuration, Map mediaConstraints]);
-}
-
-abstract class RTCPeerConnectionEvents implements Events {
-
-  EventListenerList get addStream;
-
-  EventListenerList get iceCandidate;
-
-  EventListenerList get iceChange;
-
-  EventListenerList get negotiationNeeded;
-
-  EventListenerList get open;
-
-  EventListenerList get removeStream;
-
-  EventListenerList get stateChange;
-}
-
-class _RTCPeerConnectionImpl extends _EventTargetImpl implements RTCPeerConnection native "*RTCPeerConnection" {
-
-  _RTCPeerConnectionEventsImpl get on =>
-    new _RTCPeerConnectionEventsImpl(this);
-
-  final String iceState;
-
-  final _RTCSessionDescriptionImpl localDescription;
-
-  final _MediaStreamListImpl localStreams;
-
-  final String readyState;
-
-  final _RTCSessionDescriptionImpl remoteDescription;
-
-  final _MediaStreamListImpl remoteStreams;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  void addIceCandidate(_RTCIceCandidateImpl candidate) native;
-
-  void addStream(_MediaStreamImpl stream, [mediaConstraints]) {
-    if (?mediaConstraints) {
-      var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
-      _addStream_1(stream, mediaConstraints_1);
-      return;
-    }
-    _addStream_2(stream);
-    return;
-  }
-  void _addStream_1(_MediaStreamImpl stream, mediaConstraints) native "addStream";
-  void _addStream_2(_MediaStreamImpl stream) native "addStream";
-
-  void close() native;
-
-  void createAnswer(RTCSessionDescriptionCallback successCallback, [failureCallback, mediaConstraints]) {
-    if (?mediaConstraints) {
-      var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
-      _createAnswer_1(successCallback, failureCallback, mediaConstraints_1);
-      return;
-    }
-    _createAnswer_2(successCallback, failureCallback);
-    return;
-  }
-  void _createAnswer_1(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback, mediaConstraints) native "createAnswer";
-  void _createAnswer_2(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback) native "createAnswer";
-
-  _RTCDataChannelImpl createDataChannel(String label, [options]) {
-    if (?options) {
-      var options_1 = _convertDartToNative_Dictionary(options);
-      return _createDataChannel_1(label, options_1);
-    }
-    return _createDataChannel_2(label);
-  }
-  _RTCDataChannelImpl _createDataChannel_1(label, options) native "createDataChannel";
-  _RTCDataChannelImpl _createDataChannel_2(label) native "createDataChannel";
-
-  void createOffer(RTCSessionDescriptionCallback successCallback, [failureCallback, mediaConstraints]) {
-    if (?mediaConstraints) {
-      var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
-      _createOffer_1(successCallback, failureCallback, mediaConstraints_1);
-      return;
-    }
-    _createOffer_2(successCallback, failureCallback);
-    return;
-  }
-  void _createOffer_1(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback, mediaConstraints) native "createOffer";
-  void _createOffer_2(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback) native "createOffer";
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  void getStats(RTCStatsCallback successCallback, _MediaStreamTrackImpl selector) native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  void removeStream(_MediaStreamImpl stream) native;
-
-  void setLocalDescription(_RTCSessionDescriptionImpl description, [VoidCallback successCallback, RTCErrorCallback failureCallback]) native;
-
-  void setRemoteDescription(_RTCSessionDescriptionImpl description, [VoidCallback successCallback, RTCErrorCallback failureCallback]) native;
-
-  void updateIce([configuration, mediaConstraints]) {
-    if (?mediaConstraints) {
-      var configuration_1 = _convertDartToNative_Dictionary(configuration);
-      var mediaConstraints_2 = _convertDartToNative_Dictionary(mediaConstraints);
-      _updateIce_1(configuration_1, mediaConstraints_2);
-      return;
-    }
-    if (?configuration) {
-      var configuration_3 = _convertDartToNative_Dictionary(configuration);
-      _updateIce_2(configuration_3);
-      return;
-    }
-    _updateIce_3();
-    return;
-  }
-  void _updateIce_1(configuration, mediaConstraints) native "updateIce";
-  void _updateIce_2(configuration) native "updateIce";
-  void _updateIce_3() native "updateIce";
-}
-
-class _RTCPeerConnectionEventsImpl extends _EventsImpl implements RTCPeerConnectionEvents {
-  _RTCPeerConnectionEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get addStream => this['addstream'];
-
-  EventListenerList get iceCandidate => this['icecandidate'];
-
-  EventListenerList get iceChange => this['icechange'];
-
-  EventListenerList get negotiationNeeded => this['negotiationneeded'];
-
-  EventListenerList get open => this['open'];
-
-  EventListenerList get removeStream => this['removestream'];
-
-  EventListenerList get stateChange => this['statechange'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RTCSessionDescription
-abstract class RTCSessionDescription {
-
-  factory RTCSessionDescription(Map dictionary) => _RTCSessionDescriptionFactoryProvider.createRTCSessionDescription(dictionary);
-
-  /** @domName RTCSessionDescription.sdp */
-  String sdp;
-
-  /** @domName RTCSessionDescription.type */
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void RTCSessionDescriptionCallback(RTCSessionDescription sdp);
-
-class _RTCSessionDescriptionImpl implements RTCSessionDescription native "*RTCSessionDescription" {
-
-  String sdp;
-
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void RTCStatsCallback(RTCStatsResponse response);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RTCStatsElement
-abstract class RTCStatsElement {
-
-  /** @domName RTCStatsElement.timestamp */
-  Date get timestamp;
-
-  /** @domName RTCStatsElement.stat */
-  String stat(String name);
-}
-
-class _RTCStatsElementImpl implements RTCStatsElement native "*RTCStatsElement" {
-
-  final Date timestamp;
-
-  String stat(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RTCStatsReport
-abstract class RTCStatsReport {
-
-  /** @domName RTCStatsReport.local */
-  RTCStatsElement get local;
-
-  /** @domName RTCStatsReport.remote */
-  RTCStatsElement get remote;
-}
-
-class _RTCStatsReportImpl implements RTCStatsReport native "*RTCStatsReport" {
-
-  final _RTCStatsElementImpl local;
-
-  final _RTCStatsElementImpl remote;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RTCStatsResponse
-abstract class RTCStatsResponse {
-
-  /** @domName RTCStatsResponse.result */
-  List<RTCStatsReport> result();
-}
-
-class _RTCStatsResponseImpl implements RTCStatsResponse native "*RTCStatsResponse" {
-
-  List<RTCStatsReport> result() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RadioNodeList
-abstract class RadioNodeList implements NodeList {
-
-  /** @domName RadioNodeList.value */
-  String value;
-}
-
-class _RadioNodeListImpl extends _NodeListImpl implements RadioNodeList native "*RadioNodeList" {
-
-  String value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Range
-abstract class Range {
-
-  static const int END_TO_END = 2;
-
-  static const int END_TO_START = 3;
-
-  static const int NODE_AFTER = 1;
-
-  static const int NODE_BEFORE = 0;
-
-  static const int NODE_BEFORE_AND_AFTER = 2;
-
-  static const int NODE_INSIDE = 3;
-
-  static const int START_TO_END = 1;
-
-  static const int START_TO_START = 0;
-
-  /** @domName Range.collapsed */
-  bool get collapsed;
-
-  /** @domName Range.commonAncestorContainer */
-  Node get commonAncestorContainer;
-
-  /** @domName Range.endContainer */
-  Node get endContainer;
-
-  /** @domName Range.endOffset */
-  int get endOffset;
-
-  /** @domName Range.startContainer */
-  Node get startContainer;
-
-  /** @domName Range.startOffset */
-  int get startOffset;
-
-  /** @domName Range.cloneContents */
-  DocumentFragment cloneContents();
-
-  /** @domName Range.cloneRange */
-  Range cloneRange();
-
-  /** @domName Range.collapse */
-  void collapse(bool toStart);
-
-  /** @domName Range.compareNode */
-  int compareNode(Node refNode);
-
-  /** @domName Range.comparePoint */
-  int comparePoint(Node refNode, int offset);
-
-  /** @domName Range.createContextualFragment */
-  DocumentFragment createContextualFragment(String html);
-
-  /** @domName Range.deleteContents */
-  void deleteContents();
-
-  /** @domName Range.detach */
-  void detach();
-
-  /** @domName Range.expand */
-  void expand(String unit);
-
-  /** @domName Range.extractContents */
-  DocumentFragment extractContents();
-
-  /** @domName Range.getBoundingClientRect */
-  ClientRect getBoundingClientRect();
-
-  /** @domName Range.getClientRects */
-  List<ClientRect> getClientRects();
-
-  /** @domName Range.insertNode */
-  void insertNode(Node newNode);
-
-  /** @domName Range.intersectsNode */
-  bool intersectsNode(Node refNode);
-
-  /** @domName Range.isPointInRange */
-  bool isPointInRange(Node refNode, int offset);
-
-  /** @domName Range.selectNode */
-  void selectNode(Node refNode);
-
-  /** @domName Range.selectNodeContents */
-  void selectNodeContents(Node refNode);
-
-  /** @domName Range.setEnd */
-  void setEnd(Node refNode, int offset);
-
-  /** @domName Range.setEndAfter */
-  void setEndAfter(Node refNode);
-
-  /** @domName Range.setEndBefore */
-  void setEndBefore(Node refNode);
-
-  /** @domName Range.setStart */
-  void setStart(Node refNode, int offset);
-
-  /** @domName Range.setStartAfter */
-  void setStartAfter(Node refNode);
-
-  /** @domName Range.setStartBefore */
-  void setStartBefore(Node refNode);
-
-  /** @domName Range.surroundContents */
-  void surroundContents(Node newParent);
-
-  /** @domName Range.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RangeException
-abstract class RangeException {
-
-  static const int BAD_BOUNDARYPOINTS_ERR = 1;
-
-  static const int INVALID_NODE_TYPE_ERR = 2;
-
-  /** @domName RangeException.code */
-  int get code;
-
-  /** @domName RangeException.message */
-  String get message;
-
-  /** @domName RangeException.name */
-  String get name;
-
-  /** @domName RangeException.toString */
-  String toString();
-}
-
-class _RangeExceptionImpl implements RangeException native "*RangeException" {
-
-  final int code;
-
-  final String message;
-
-  final String name;
-
-  String toString() native;
-}
-
-class _RangeImpl implements Range native "*Range" {
-
-  final bool collapsed;
-
-  final _NodeImpl commonAncestorContainer;
-
-  final _NodeImpl endContainer;
-
-  final int endOffset;
-
-  final _NodeImpl startContainer;
-
-  final int startOffset;
-
-  _DocumentFragmentImpl cloneContents() native;
-
-  _RangeImpl cloneRange() native;
-
-  void collapse(bool toStart) native;
-
-  int compareNode(_NodeImpl refNode) native;
-
-  int comparePoint(_NodeImpl refNode, int offset) native;
-
-  _DocumentFragmentImpl createContextualFragment(String html) native;
-
-  void deleteContents() native;
-
-  void detach() native;
-
-  void expand(String unit) native;
-
-  _DocumentFragmentImpl extractContents() native;
-
-  _ClientRectImpl getBoundingClientRect() native;
-
-  _ClientRectListImpl getClientRects() native;
-
-  void insertNode(_NodeImpl newNode) native;
-
-  bool intersectsNode(_NodeImpl refNode) native;
-
-  bool isPointInRange(_NodeImpl refNode, int offset) native;
-
-  void selectNode(_NodeImpl refNode) native;
-
-  void selectNodeContents(_NodeImpl refNode) native;
-
-  void setEnd(_NodeImpl refNode, int offset) native;
-
-  void setEndAfter(_NodeImpl refNode) native;
-
-  void setEndBefore(_NodeImpl refNode) native;
-
-  void setStart(_NodeImpl refNode, int offset) native;
-
-  void setStartAfter(_NodeImpl refNode) native;
-
-  void setStartBefore(_NodeImpl refNode) native;
-
-  void surroundContents(_NodeImpl newParent) native;
-
-  String toString() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Rect
-abstract class Rect {
-
-  /** @domName Rect.bottom */
-  CSSPrimitiveValue get bottom;
-
-  /** @domName Rect.left */
-  CSSPrimitiveValue get left;
-
-  /** @domName Rect.right */
-  CSSPrimitiveValue get right;
-
-  /** @domName Rect.top */
-  CSSPrimitiveValue get top;
-}
-
-class _RectImpl implements Rect native "*Rect" {
-
-  final _CSSPrimitiveValueImpl bottom;
-
-  final _CSSPrimitiveValueImpl left;
-
-  final _CSSPrimitiveValueImpl right;
-
-  final _CSSPrimitiveValueImpl top;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void RequestAnimationFrameCallback(num highResTime);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SQLError
-abstract class SQLError {
-
-  static const int CONSTRAINT_ERR = 6;
-
-  static const int DATABASE_ERR = 1;
-
-  static const int QUOTA_ERR = 4;
-
-  static const int SYNTAX_ERR = 5;
-
-  static const int TIMEOUT_ERR = 7;
-
-  static const int TOO_LARGE_ERR = 3;
-
-  static const int UNKNOWN_ERR = 0;
-
-  static const int VERSION_ERR = 2;
-
-  /** @domName SQLError.code */
-  int get code;
-
-  /** @domName SQLError.message */
-  String get message;
-}
-
-class _SQLErrorImpl implements SQLError native "*SQLError" {
-
-  final int code;
-
-  final String message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SQLException
-abstract class SQLException {
-
-  static const int CONSTRAINT_ERR = 6;
-
-  static const int DATABASE_ERR = 1;
-
-  static const int QUOTA_ERR = 4;
-
-  static const int SYNTAX_ERR = 5;
-
-  static const int TIMEOUT_ERR = 7;
-
-  static const int TOO_LARGE_ERR = 3;
-
-  static const int UNKNOWN_ERR = 0;
-
-  static const int VERSION_ERR = 2;
-
-  /** @domName SQLException.code */
-  int get code;
-
-  /** @domName SQLException.message */
-  String get message;
-}
-
-class _SQLExceptionImpl implements SQLException native "*SQLException" {
-
-  final int code;
-
-  final String message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SQLResultSet
-abstract class SQLResultSet {
-
-  /** @domName SQLResultSet.insertId */
-  int get insertId;
-
-  /** @domName SQLResultSet.rows */
-  SQLResultSetRowList get rows;
-
-  /** @domName SQLResultSet.rowsAffected */
-  int get rowsAffected;
-}
-
-class _SQLResultSetImpl implements SQLResultSet native "*SQLResultSet" {
-
-  final int insertId;
-
-  final _SQLResultSetRowListImpl rows;
-
-  final int rowsAffected;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SQLResultSetRowList
-abstract class SQLResultSetRowList implements List<Map> {
-
-  /** @domName SQLResultSetRowList.length */
-  int get length;
-
-  /** @domName SQLResultSetRowList.item */
-  Map item(int index);
-}
-
-class _SQLResultSetRowListImpl implements SQLResultSetRowList, JavaScriptIndexingBehavior native "*SQLResultSetRowList" {
-
-  final int length;
-
-  Map operator[](int index) => JS("Map", "#[#]", this, index);
-
-  void operator[]=(int index, Map value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<Map> mixins.
-  // Map is the element type.
-
-  // From Iterable<Map>:
-
-  Iterator<Map> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<Map>(this);
-  }
-
-  // From Collection<Map>:
-
-  void add(Map value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(Map value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<Map> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(Map element) => _Collections.contains(this, element);
-
-  void forEach(void f(Map element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Map element)) => _Collections.map(this, [], f);
-
-  Collection<Map> filter(bool f(Map element)) =>
-     _Collections.filter(this, <Map>[], f);
-
-  bool every(bool f(Map element)) => _Collections.every(this, f);
-
-  bool some(bool f(Map element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Map>:
-
-  void sort([Comparator<Map> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Map element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Map element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  Map get last => this[length - 1];
-
-  Map removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<Map> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [Map initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<Map> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <Map>[]);
-
-  // -- end List<Map> mixins.
-
-  Map item(int index) {
-    return _convertNativeToDart_Dictionary(_item_1(index));
-  }
-  _item_1(index) native "item";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void SQLStatementCallback(SQLTransaction transaction, SQLResultSet resultSet);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void SQLStatementErrorCallback(SQLTransaction transaction, SQLError error);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SQLTransaction
-abstract class SQLTransaction {
-
-  /** @domName SQLTransaction.executeSql */
-  void executeSql(String sqlStatement, List arguments, [SQLStatementCallback callback, SQLStatementErrorCallback errorCallback]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void SQLTransactionCallback(SQLTransaction transaction);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void SQLTransactionErrorCallback(SQLError error);
-
-class _SQLTransactionImpl implements SQLTransaction native "*SQLTransaction" {
-
-  void executeSql(String sqlStatement, List arguments, [SQLStatementCallback callback, SQLStatementErrorCallback errorCallback]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SQLTransactionSync
-abstract class SQLTransactionSync {
-
-  /** @domName SQLTransactionSync.executeSql */
-  SQLResultSet executeSql(String sqlStatement, List arguments);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void SQLTransactionSyncCallback(SQLTransactionSync transaction);
-
-class _SQLTransactionSyncImpl implements SQLTransactionSync native "*SQLTransactionSync" {
-
-  _SQLResultSetImpl executeSql(String sqlStatement, List arguments) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAElement
-abstract class SVGAElement implements SVGElement, SVGURIReference, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-
-  /** @domName SVGAElement.target */
-  SVGAnimatedString get target;
-}
-
-class _SVGAElementImpl extends _SVGElementImpl implements SVGAElement native "*SVGAElement" {
-
-  final _SVGAnimatedStringImpl target;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAltGlyphDefElement
-abstract class SVGAltGlyphDefElement implements SVGElement {
-}
-
-class _SVGAltGlyphDefElementImpl extends _SVGElementImpl implements SVGAltGlyphDefElement native "*SVGAltGlyphDefElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAltGlyphElement
-abstract class SVGAltGlyphElement implements SVGTextPositioningElement, SVGURIReference {
-
-  /** @domName SVGAltGlyphElement.format */
-  String format;
-
-  /** @domName SVGAltGlyphElement.glyphRef */
-  String glyphRef;
-}
-
-class _SVGAltGlyphElementImpl extends _SVGTextPositioningElementImpl implements SVGAltGlyphElement native "*SVGAltGlyphElement" {
-
-  String format;
-
-  String glyphRef;
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAltGlyphItemElement
-abstract class SVGAltGlyphItemElement implements SVGElement {
-}
-
-class _SVGAltGlyphItemElementImpl extends _SVGElementImpl implements SVGAltGlyphItemElement native "*SVGAltGlyphItemElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAngle
-abstract class SVGAngle {
-
-  static const int SVG_ANGLETYPE_DEG = 2;
-
-  static const int SVG_ANGLETYPE_GRAD = 4;
-
-  static const int SVG_ANGLETYPE_RAD = 3;
-
-  static const int SVG_ANGLETYPE_UNKNOWN = 0;
-
-  static const int SVG_ANGLETYPE_UNSPECIFIED = 1;
-
-  /** @domName SVGAngle.unitType */
-  int get unitType;
-
-  /** @domName SVGAngle.value */
-  num value;
-
-  /** @domName SVGAngle.valueAsString */
-  String valueAsString;
-
-  /** @domName SVGAngle.valueInSpecifiedUnits */
-  num valueInSpecifiedUnits;
-
-  /** @domName SVGAngle.convertToSpecifiedUnits */
-  void convertToSpecifiedUnits(int unitType);
-
-  /** @domName SVGAngle.newValueSpecifiedUnits */
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits);
-}
-
-class _SVGAngleImpl implements SVGAngle native "*SVGAngle" {
-
-  final int unitType;
-
-  num value;
-
-  String valueAsString;
-
-  num valueInSpecifiedUnits;
-
-  void convertToSpecifiedUnits(int unitType) native;
-
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimateColorElement
-abstract class SVGAnimateColorElement implements SVGAnimationElement {
-}
-
-class _SVGAnimateColorElementImpl extends _SVGAnimationElementImpl implements SVGAnimateColorElement native "*SVGAnimateColorElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimateElement
-abstract class SVGAnimateElement implements SVGAnimationElement {
-}
-
-class _SVGAnimateElementImpl extends _SVGAnimationElementImpl implements SVGAnimateElement native "*SVGAnimateElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimateMotionElement
-abstract class SVGAnimateMotionElement implements SVGAnimationElement {
-}
-
-class _SVGAnimateMotionElementImpl extends _SVGAnimationElementImpl implements SVGAnimateMotionElement native "*SVGAnimateMotionElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimateTransformElement
-abstract class SVGAnimateTransformElement implements SVGAnimationElement {
-}
-
-class _SVGAnimateTransformElementImpl extends _SVGAnimationElementImpl implements SVGAnimateTransformElement native "*SVGAnimateTransformElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimatedAngle
-abstract class SVGAnimatedAngle {
-
-  /** @domName SVGAnimatedAngle.animVal */
-  SVGAngle get animVal;
-
-  /** @domName SVGAnimatedAngle.baseVal */
-  SVGAngle get baseVal;
-}
-
-class _SVGAnimatedAngleImpl implements SVGAnimatedAngle native "*SVGAnimatedAngle" {
-
-  final _SVGAngleImpl animVal;
-
-  final _SVGAngleImpl baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimatedBoolean
-abstract class SVGAnimatedBoolean {
-
-  /** @domName SVGAnimatedBoolean.animVal */
-  bool get animVal;
-
-  /** @domName SVGAnimatedBoolean.baseVal */
-  bool baseVal;
-}
-
-class _SVGAnimatedBooleanImpl implements SVGAnimatedBoolean native "*SVGAnimatedBoolean" {
-
-  final bool animVal;
-
-  bool baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimatedEnumeration
-abstract class SVGAnimatedEnumeration {
-
-  /** @domName SVGAnimatedEnumeration.animVal */
-  int get animVal;
-
-  /** @domName SVGAnimatedEnumeration.baseVal */
-  int baseVal;
-}
-
-class _SVGAnimatedEnumerationImpl implements SVGAnimatedEnumeration native "*SVGAnimatedEnumeration" {
-
-  final int animVal;
-
-  int baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimatedInteger
-abstract class SVGAnimatedInteger {
-
-  /** @domName SVGAnimatedInteger.animVal */
-  int get animVal;
-
-  /** @domName SVGAnimatedInteger.baseVal */
-  int baseVal;
-}
-
-class _SVGAnimatedIntegerImpl implements SVGAnimatedInteger native "*SVGAnimatedInteger" {
-
-  final int animVal;
-
-  int baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimatedLength
-abstract class SVGAnimatedLength {
-
-  /** @domName SVGAnimatedLength.animVal */
-  SVGLength get animVal;
-
-  /** @domName SVGAnimatedLength.baseVal */
-  SVGLength get baseVal;
-}
-
-class _SVGAnimatedLengthImpl implements SVGAnimatedLength native "*SVGAnimatedLength" {
-
-  final _SVGLengthImpl animVal;
-
-  final _SVGLengthImpl baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimatedLengthList
-abstract class SVGAnimatedLengthList implements List<SVGAnimatedLength> {
-
-  /** @domName SVGAnimatedLengthList.animVal */
-  SVGLengthList get animVal;
-
-  /** @domName SVGAnimatedLengthList.baseVal */
-  SVGLengthList get baseVal;
-}
-
-class _SVGAnimatedLengthListImpl implements SVGAnimatedLengthList, JavaScriptIndexingBehavior native "*SVGAnimatedLengthList" {
-
-  final _SVGLengthListImpl animVal;
-
-  final _SVGLengthListImpl baseVal;
-
-  _SVGAnimatedLengthImpl operator[](int index) => JS("_SVGAnimatedLengthImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _SVGAnimatedLengthImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SVGAnimatedLength> mixins.
-  // SVGAnimatedLength is the element type.
-
-  // From Iterable<SVGAnimatedLength>:
-
-  Iterator<SVGAnimatedLength> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SVGAnimatedLength>(this);
-  }
-
-  // From Collection<SVGAnimatedLength>:
-
-  void add(SVGAnimatedLength value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SVGAnimatedLength value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SVGAnimatedLength> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SVGAnimatedLength element) => _Collections.contains(this, element);
-
-  void forEach(void f(SVGAnimatedLength element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SVGAnimatedLength element)) => _Collections.map(this, [], f);
-
-  Collection<SVGAnimatedLength> filter(bool f(SVGAnimatedLength element)) =>
-     _Collections.filter(this, <SVGAnimatedLength>[], f);
-
-  bool every(bool f(SVGAnimatedLength element)) => _Collections.every(this, f);
-
-  bool some(bool f(SVGAnimatedLength element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SVGAnimatedLength>:
-
-  void sort([Comparator<SVGAnimatedLength> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SVGAnimatedLength element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SVGAnimatedLength element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SVGAnimatedLength get last => this[length - 1];
-
-  SVGAnimatedLength removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SVGAnimatedLength> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SVGAnimatedLength initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SVGAnimatedLength> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGAnimatedLength>[]);
-
-  // -- end List<SVGAnimatedLength> mixins.
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimatedNumber
-abstract class SVGAnimatedNumber {
-
-  /** @domName SVGAnimatedNumber.animVal */
-  num get animVal;
-
-  /** @domName SVGAnimatedNumber.baseVal */
-  num baseVal;
-}
-
-class _SVGAnimatedNumberImpl implements SVGAnimatedNumber native "*SVGAnimatedNumber" {
-
-  final num animVal;
-
-  num baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimatedNumberList
-abstract class SVGAnimatedNumberList implements List<SVGAnimatedNumber> {
-
-  /** @domName SVGAnimatedNumberList.animVal */
-  SVGNumberList get animVal;
-
-  /** @domName SVGAnimatedNumberList.baseVal */
-  SVGNumberList get baseVal;
-}
-
-class _SVGAnimatedNumberListImpl implements SVGAnimatedNumberList, JavaScriptIndexingBehavior native "*SVGAnimatedNumberList" {
-
-  final _SVGNumberListImpl animVal;
-
-  final _SVGNumberListImpl baseVal;
-
-  _SVGAnimatedNumberImpl operator[](int index) => JS("_SVGAnimatedNumberImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _SVGAnimatedNumberImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SVGAnimatedNumber> mixins.
-  // SVGAnimatedNumber is the element type.
-
-  // From Iterable<SVGAnimatedNumber>:
-
-  Iterator<SVGAnimatedNumber> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SVGAnimatedNumber>(this);
-  }
-
-  // From Collection<SVGAnimatedNumber>:
-
-  void add(SVGAnimatedNumber value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SVGAnimatedNumber value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SVGAnimatedNumber> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SVGAnimatedNumber element) => _Collections.contains(this, element);
-
-  void forEach(void f(SVGAnimatedNumber element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SVGAnimatedNumber element)) => _Collections.map(this, [], f);
-
-  Collection<SVGAnimatedNumber> filter(bool f(SVGAnimatedNumber element)) =>
-     _Collections.filter(this, <SVGAnimatedNumber>[], f);
-
-  bool every(bool f(SVGAnimatedNumber element)) => _Collections.every(this, f);
-
-  bool some(bool f(SVGAnimatedNumber element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SVGAnimatedNumber>:
-
-  void sort([Comparator<SVGAnimatedNumber> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SVGAnimatedNumber element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SVGAnimatedNumber element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SVGAnimatedNumber get last => this[length - 1];
-
-  SVGAnimatedNumber removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SVGAnimatedNumber> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SVGAnimatedNumber initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SVGAnimatedNumber> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGAnimatedNumber>[]);
-
-  // -- end List<SVGAnimatedNumber> mixins.
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimatedPreserveAspectRatio
-abstract class SVGAnimatedPreserveAspectRatio {
-
-  /** @domName SVGAnimatedPreserveAspectRatio.animVal */
-  SVGPreserveAspectRatio get animVal;
-
-  /** @domName SVGAnimatedPreserveAspectRatio.baseVal */
-  SVGPreserveAspectRatio get baseVal;
-}
-
-class _SVGAnimatedPreserveAspectRatioImpl implements SVGAnimatedPreserveAspectRatio native "*SVGAnimatedPreserveAspectRatio" {
-
-  final _SVGPreserveAspectRatioImpl animVal;
-
-  final _SVGPreserveAspectRatioImpl baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimatedRect
-abstract class SVGAnimatedRect {
-
-  /** @domName SVGAnimatedRect.animVal */
-  SVGRect get animVal;
-
-  /** @domName SVGAnimatedRect.baseVal */
-  SVGRect get baseVal;
-}
-
-class _SVGAnimatedRectImpl implements SVGAnimatedRect native "*SVGAnimatedRect" {
-
-  final _SVGRectImpl animVal;
-
-  final _SVGRectImpl baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimatedString
-abstract class SVGAnimatedString {
-
-  /** @domName SVGAnimatedString.animVal */
-  String get animVal;
-
-  /** @domName SVGAnimatedString.baseVal */
-  String baseVal;
-}
-
-class _SVGAnimatedStringImpl implements SVGAnimatedString native "*SVGAnimatedString" {
-
-  final String animVal;
-
-  String baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimatedTransformList
-abstract class SVGAnimatedTransformList implements List<SVGAnimateTransformElement> {
-
-  /** @domName SVGAnimatedTransformList.animVal */
-  SVGTransformList get animVal;
-
-  /** @domName SVGAnimatedTransformList.baseVal */
-  SVGTransformList get baseVal;
-}
-
-class _SVGAnimatedTransformListImpl implements SVGAnimatedTransformList, JavaScriptIndexingBehavior native "*SVGAnimatedTransformList" {
-
-  final _SVGTransformListImpl animVal;
-
-  final _SVGTransformListImpl baseVal;
-
-  _SVGAnimateTransformElementImpl operator[](int index) => JS("_SVGAnimateTransformElementImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _SVGAnimateTransformElementImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SVGAnimateTransformElement> mixins.
-  // SVGAnimateTransformElement is the element type.
-
-  // From Iterable<SVGAnimateTransformElement>:
-
-  Iterator<SVGAnimateTransformElement> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SVGAnimateTransformElement>(this);
-  }
-
-  // From Collection<SVGAnimateTransformElement>:
-
-  void add(SVGAnimateTransformElement value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SVGAnimateTransformElement value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SVGAnimateTransformElement> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SVGAnimateTransformElement element) => _Collections.contains(this, element);
-
-  void forEach(void f(SVGAnimateTransformElement element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SVGAnimateTransformElement element)) => _Collections.map(this, [], f);
-
-  Collection<SVGAnimateTransformElement> filter(bool f(SVGAnimateTransformElement element)) =>
-     _Collections.filter(this, <SVGAnimateTransformElement>[], f);
-
-  bool every(bool f(SVGAnimateTransformElement element)) => _Collections.every(this, f);
-
-  bool some(bool f(SVGAnimateTransformElement element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SVGAnimateTransformElement>:
-
-  void sort([Comparator<SVGAnimateTransformElement> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SVGAnimateTransformElement element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SVGAnimateTransformElement element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SVGAnimateTransformElement get last => this[length - 1];
-
-  SVGAnimateTransformElement removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SVGAnimateTransformElement> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SVGAnimateTransformElement initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SVGAnimateTransformElement> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGAnimateTransformElement>[]);
-
-  // -- end List<SVGAnimateTransformElement> mixins.
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGAnimationElement
-abstract class SVGAnimationElement implements SVGElement, SVGTests, SVGExternalResourcesRequired, ElementTimeControl {
-
-  /** @domName SVGAnimationElement.targetElement */
-  SVGElement get targetElement;
-
-  /** @domName SVGAnimationElement.getCurrentTime */
-  num getCurrentTime();
-
-  /** @domName SVGAnimationElement.getSimpleDuration */
-  num getSimpleDuration();
-
-  /** @domName SVGAnimationElement.getStartTime */
-  num getStartTime();
-}
-
-class _SVGAnimationElementImpl extends _SVGElementImpl implements SVGAnimationElement native "*SVGAnimationElement" {
-
-  final _SVGElementImpl targetElement;
-
-  num getCurrentTime() native;
-
-  num getSimpleDuration() native;
-
-  num getStartTime() native;
-
-  // From ElementTimeControl
-
-  void beginElement() native;
-
-  void beginElementAt(num offset) native;
-
-  void endElement() native;
-
-  void endElementAt(num offset) native;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGCircleElement
-abstract class SVGCircleElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-
-  /** @domName SVGCircleElement.cx */
-  SVGAnimatedLength get cx;
-
-  /** @domName SVGCircleElement.cy */
-  SVGAnimatedLength get cy;
-
-  /** @domName SVGCircleElement.r */
-  SVGAnimatedLength get r;
-}
-
-class _SVGCircleElementImpl extends _SVGElementImpl implements SVGCircleElement native "*SVGCircleElement" {
-
-  final _SVGAnimatedLengthImpl cx;
-
-  final _SVGAnimatedLengthImpl cy;
-
-  final _SVGAnimatedLengthImpl r;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGClipPathElement
-abstract class SVGClipPathElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-
-  /** @domName SVGClipPathElement.clipPathUnits */
-  SVGAnimatedEnumeration get clipPathUnits;
-}
-
-class _SVGClipPathElementImpl extends _SVGElementImpl implements SVGClipPathElement native "*SVGClipPathElement" {
-
-  final _SVGAnimatedEnumerationImpl clipPathUnits;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGColor
-abstract class SVGColor implements CSSValue {
-
-  static const int SVG_COLORTYPE_CURRENTCOLOR = 3;
-
-  static const int SVG_COLORTYPE_RGBCOLOR = 1;
-
-  static const int SVG_COLORTYPE_RGBCOLOR_ICCCOLOR = 2;
-
-  static const int SVG_COLORTYPE_UNKNOWN = 0;
-
-  /** @domName SVGColor.colorType */
-  int get colorType;
-
-  /** @domName SVGColor.rgbColor */
-  RGBColor get rgbColor;
-
-  /** @domName SVGColor.setColor */
-  void setColor(int colorType, String rgbColor, String iccColor);
-
-  /** @domName SVGColor.setRGBColor */
-  void setRGBColor(String rgbColor);
-
-  /** @domName SVGColor.setRGBColorICCColor */
-  void setRGBColorICCColor(String rgbColor, String iccColor);
-}
-
-class _SVGColorImpl extends _CSSValueImpl implements SVGColor native "*SVGColor" {
-
-  final int colorType;
-
-  final _RGBColorImpl rgbColor;
-
-  void setColor(int colorType, String rgbColor, String iccColor) native;
-
-  void setRGBColor(String rgbColor) native;
-
-  void setRGBColorICCColor(String rgbColor, String iccColor) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGComponentTransferFunctionElement
-abstract class SVGComponentTransferFunctionElement implements SVGElement {
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2;
-
-  static const int SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;
-
-  /** @domName SVGComponentTransferFunctionElement.amplitude */
-  SVGAnimatedNumber get amplitude;
-
-  /** @domName SVGComponentTransferFunctionElement.exponent */
-  SVGAnimatedNumber get exponent;
-
-  /** @domName SVGComponentTransferFunctionElement.intercept */
-  SVGAnimatedNumber get intercept;
-
-  /** @domName SVGComponentTransferFunctionElement.offset */
-  SVGAnimatedNumber get offset;
-
-  /** @domName SVGComponentTransferFunctionElement.slope */
-  SVGAnimatedNumber get slope;
-
-  /** @domName SVGComponentTransferFunctionElement.tableValues */
-  SVGAnimatedNumberList get tableValues;
-
-  /** @domName SVGComponentTransferFunctionElement.type */
-  SVGAnimatedEnumeration get type;
-}
-
-class _SVGComponentTransferFunctionElementImpl extends _SVGElementImpl implements SVGComponentTransferFunctionElement native "*SVGComponentTransferFunctionElement" {
-
-  final _SVGAnimatedNumberImpl amplitude;
-
-  final _SVGAnimatedNumberImpl exponent;
-
-  final _SVGAnimatedNumberImpl intercept;
-
-  final _SVGAnimatedNumberImpl offset;
-
-  final _SVGAnimatedNumberImpl slope;
-
-  final _SVGAnimatedNumberListImpl tableValues;
-
-  final _SVGAnimatedEnumerationImpl type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGCursorElement
-abstract class SVGCursorElement implements SVGElement, SVGURIReference, SVGTests, SVGExternalResourcesRequired {
-
-  /** @domName SVGCursorElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGCursorElement.y */
-  SVGAnimatedLength get y;
-}
-
-class _SVGCursorElementImpl extends _SVGElementImpl implements SVGCursorElement native "*SVGCursorElement" {
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGDefsElement
-abstract class SVGDefsElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-}
-
-class _SVGDefsElementImpl extends _SVGElementImpl implements SVGDefsElement native "*SVGDefsElement" {
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGDescElement
-abstract class SVGDescElement implements SVGElement, SVGLangSpace, SVGStylable {
-}
-
-class _SVGDescElementImpl extends _SVGElementImpl implements SVGDescElement native "*SVGDescElement" {
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGDocument
-abstract class SVGDocument implements Document {
-
-  /** @domName SVGDocument.rootElement */
-  SVGSVGElement get rootElement;
-
-  /** @domName SVGDocument.createEvent */
-  Event $dom_createEvent(String eventType);
-}
-
-class _SVGDocumentImpl extends _DocumentImpl implements SVGDocument native "*SVGDocument" {
-
-  final _SVGSVGElementImpl rootElement;
-
-  _EventImpl $dom_createEvent(String eventType) native "createEvent";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName SVGElement
-abstract class SVGElement implements Element {
-
-  factory SVGElement.tag(String tag) =>
-      _SVGElementFactoryProvider.createSVGElement_tag(tag);
-  factory SVGElement.svg(String svg) =>
-      _SVGElementFactoryProvider.createSVGElement_svg(svg);
-
-  SVGElement clone(bool deep);
-
-
-  /** @domName SVGElement.id */
-  String id;
-
-  /** @domName SVGElement.ownerSVGElement */
-  SVGSVGElement get ownerSVGElement;
-
-  /** @domName SVGElement.viewportElement */
-  SVGElement get viewportElement;
-
-  /** @domName SVGElement.xmlbase */
-  String xmlbase;
-
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _AttributeClassSet extends _CssClassSet {
-  _AttributeClassSet(element) : super(element);
-
-  String $dom_className() => _element.attributes['class'];
-
-  void _write(Set s) {
-    _element.attributes['class'] = _formatSet(s);
-  }
-}
-
-class _SVGElementImpl extends _ElementImpl implements SVGElement native "*SVGElement" {
-  CSSClassSet get classes {
-    if (_cssClassSet == null) {
-      _cssClassSet = new _AttributeClassSet(_ptr);
-    }
-    return _cssClassSet;
-  }
-
-  List<Element> get elements => new _FilteredElementList(this);
-
-  void set elements(Collection<Element> value) {
-    final elements = this.elements;
-    elements.clear();
-    elements.addAll(value);
-  }
-
-  String get outerHTML {
-    final container = new Element.tag("div");
-    final SVGElement cloned = this.clone(true);
-    container.elements.add(cloned);
-    return container.innerHTML;
-  }
-
-  String get innerHTML {
-    final container = new Element.tag("div");
-    final SVGElement cloned = this.clone(true);
-    container.elements.addAll(cloned.elements);
-    return container.innerHTML;
-  }
-
-  void set innerHTML(String svg) {
-    final container = new Element.tag("div");
-    // Wrap the SVG string in <svg> so that SVGElements are created, rather than
-    // HTMLElements.
-    container.innerHTML = '<svg version="1.1">$svg</svg>';
-    this.elements = container.elements[0].elements;
-  }
-
-
-  // Shadowing definition.
-  String get id => JS("String", "#.id", this);
-
-  void set id(String value) {
-    JS("void", "#.id = #", this, value);
-  }
-
-  final _SVGSVGElementImpl ownerSVGElement;
-
-  final _SVGElementImpl viewportElement;
-
-  String xmlbase;
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGElementInstance
-abstract class SVGElementInstance implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  SVGElementInstanceEvents get on;
-
-  /** @domName SVGElementInstance.childNodes */
-  List<SVGElementInstance> get childNodes;
-
-  /** @domName SVGElementInstance.correspondingElement */
-  SVGElement get correspondingElement;
-
-  /** @domName SVGElementInstance.correspondingUseElement */
-  SVGUseElement get correspondingUseElement;
-
-  /** @domName SVGElementInstance.firstChild */
-  SVGElementInstance get firstChild;
-
-  /** @domName SVGElementInstance.lastChild */
-  SVGElementInstance get lastChild;
-
-  /** @domName SVGElementInstance.nextSibling */
-  SVGElementInstance get nextSibling;
-
-  /** @domName SVGElementInstance.parentNode */
-  SVGElementInstance get parentNode;
-
-  /** @domName SVGElementInstance.previousSibling */
-  SVGElementInstance get previousSibling;
-}
-
-abstract class SVGElementInstanceEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get beforeCopy;
-
-  EventListenerList get beforeCut;
-
-  EventListenerList get beforePaste;
-
-  EventListenerList get blur;
-
-  EventListenerList get change;
-
-  EventListenerList get click;
-
-  EventListenerList get contextMenu;
-
-  EventListenerList get copy;
-
-  EventListenerList get cut;
-
-  EventListenerList get doubleClick;
-
-  EventListenerList get drag;
-
-  EventListenerList get dragEnd;
-
-  EventListenerList get dragEnter;
-
-  EventListenerList get dragLeave;
-
-  EventListenerList get dragOver;
-
-  EventListenerList get dragStart;
-
-  EventListenerList get drop;
-
-  EventListenerList get error;
-
-  EventListenerList get focus;
-
-  EventListenerList get input;
-
-  EventListenerList get keyDown;
-
-  EventListenerList get keyPress;
-
-  EventListenerList get keyUp;
-
-  EventListenerList get load;
-
-  EventListenerList get mouseDown;
-
-  EventListenerList get mouseMove;
-
-  EventListenerList get mouseOut;
-
-  EventListenerList get mouseOver;
-
-  EventListenerList get mouseUp;
-
-  EventListenerList get mouseWheel;
-
-  EventListenerList get paste;
-
-  EventListenerList get reset;
-
-  EventListenerList get resize;
-
-  EventListenerList get scroll;
-
-  EventListenerList get search;
-
-  EventListenerList get select;
-
-  EventListenerList get selectStart;
-
-  EventListenerList get submit;
-
-  EventListenerList get unload;
-}
-
-class _SVGElementInstanceImpl extends _EventTargetImpl implements SVGElementInstance native "*SVGElementInstance" {
-
-  _SVGElementInstanceEventsImpl get on =>
-    new _SVGElementInstanceEventsImpl(this);
-
-  final _SVGElementInstanceListImpl childNodes;
-
-  final _SVGElementImpl correspondingElement;
-
-  final _SVGUseElementImpl correspondingUseElement;
-
-  final _SVGElementInstanceImpl firstChild;
-
-  final _SVGElementInstanceImpl lastChild;
-
-  final _SVGElementInstanceImpl nextSibling;
-
-  final _SVGElementInstanceImpl parentNode;
-
-  final _SVGElementInstanceImpl previousSibling;
-}
-
-class _SVGElementInstanceEventsImpl extends _EventsImpl implements SVGElementInstanceEvents {
-  _SVGElementInstanceEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get beforeCopy => this['beforecopy'];
-
-  EventListenerList get beforeCut => this['beforecut'];
-
-  EventListenerList get beforePaste => this['beforepaste'];
-
-  EventListenerList get blur => this['blur'];
-
-  EventListenerList get change => this['change'];
-
-  EventListenerList get click => this['click'];
-
-  EventListenerList get contextMenu => this['contextmenu'];
-
-  EventListenerList get copy => this['copy'];
-
-  EventListenerList get cut => this['cut'];
-
-  EventListenerList get doubleClick => this['dblclick'];
-
-  EventListenerList get drag => this['drag'];
-
-  EventListenerList get dragEnd => this['dragend'];
-
-  EventListenerList get dragEnter => this['dragenter'];
-
-  EventListenerList get dragLeave => this['dragleave'];
-
-  EventListenerList get dragOver => this['dragover'];
-
-  EventListenerList get dragStart => this['dragstart'];
-
-  EventListenerList get drop => this['drop'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get focus => this['focus'];
-
-  EventListenerList get input => this['input'];
-
-  EventListenerList get keyDown => this['keydown'];
-
-  EventListenerList get keyPress => this['keypress'];
-
-  EventListenerList get keyUp => this['keyup'];
-
-  EventListenerList get load => this['load'];
-
-  EventListenerList get mouseDown => this['mousedown'];
-
-  EventListenerList get mouseMove => this['mousemove'];
-
-  EventListenerList get mouseOut => this['mouseout'];
-
-  EventListenerList get mouseOver => this['mouseover'];
-
-  EventListenerList get mouseUp => this['mouseup'];
-
-  EventListenerList get mouseWheel => this['mousewheel'];
-
-  EventListenerList get paste => this['paste'];
-
-  EventListenerList get reset => this['reset'];
-
-  EventListenerList get resize => this['resize'];
-
-  EventListenerList get scroll => this['scroll'];
-
-  EventListenerList get search => this['search'];
-
-  EventListenerList get select => this['select'];
-
-  EventListenerList get selectStart => this['selectstart'];
-
-  EventListenerList get submit => this['submit'];
-
-  EventListenerList get unload => this['unload'];
-}
-
-class _SVGElementInstanceListImpl implements List<SVGElementInstance>, JavaScriptIndexingBehavior native "*SVGElementInstanceList" {
-
-  final int length;
-
-  _SVGElementInstanceImpl operator[](int index) => JS("_SVGElementInstanceImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _SVGElementInstanceImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SVGElementInstance> mixins.
-  // SVGElementInstance is the element type.
-
-  // From Iterable<SVGElementInstance>:
-
-  Iterator<SVGElementInstance> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SVGElementInstance>(this);
-  }
-
-  // From Collection<SVGElementInstance>:
-
-  void add(SVGElementInstance value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SVGElementInstance value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SVGElementInstance> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SVGElementInstance element) => _Collections.contains(this, element);
-
-  void forEach(void f(SVGElementInstance element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SVGElementInstance element)) => _Collections.map(this, [], f);
-
-  Collection<SVGElementInstance> filter(bool f(SVGElementInstance element)) =>
-     _Collections.filter(this, <SVGElementInstance>[], f);
-
-  bool every(bool f(SVGElementInstance element)) => _Collections.every(this, f);
-
-  bool some(bool f(SVGElementInstance element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SVGElementInstance>:
-
-  void sort([Comparator<SVGElementInstance> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SVGElementInstance element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SVGElementInstance element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SVGElementInstance get last => this[length - 1];
-
-  SVGElementInstance removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SVGElementInstance> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SVGElementInstance initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SVGElementInstance> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGElementInstance>[]);
-
-  // -- end List<SVGElementInstance> mixins.
-
-  _SVGElementInstanceImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGEllipseElement
-abstract class SVGEllipseElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-
-  /** @domName SVGEllipseElement.cx */
-  SVGAnimatedLength get cx;
-
-  /** @domName SVGEllipseElement.cy */
-  SVGAnimatedLength get cy;
-
-  /** @domName SVGEllipseElement.rx */
-  SVGAnimatedLength get rx;
-
-  /** @domName SVGEllipseElement.ry */
-  SVGAnimatedLength get ry;
-}
-
-class _SVGEllipseElementImpl extends _SVGElementImpl implements SVGEllipseElement native "*SVGEllipseElement" {
-
-  final _SVGAnimatedLengthImpl cx;
-
-  final _SVGAnimatedLengthImpl cy;
-
-  final _SVGAnimatedLengthImpl rx;
-
-  final _SVGAnimatedLengthImpl ry;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGException
-abstract class SVGException {
-
-  static const int SVG_INVALID_VALUE_ERR = 1;
-
-  static const int SVG_MATRIX_NOT_INVERTABLE = 2;
-
-  static const int SVG_WRONG_TYPE_ERR = 0;
-
-  /** @domName SVGException.code */
-  int get code;
-
-  /** @domName SVGException.message */
-  String get message;
-
-  /** @domName SVGException.name */
-  String get name;
-
-  /** @domName SVGException.toString */
-  String toString();
-}
-
-class _SVGExceptionImpl implements SVGException native "*SVGException" {
-
-  final int code;
-
-  final String message;
-
-  final String name;
-
-  String toString() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGExternalResourcesRequired
-abstract class SVGExternalResourcesRequired {
-
-  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEBlendElement
-abstract class SVGFEBlendElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  static const int SVG_FEBLEND_MODE_DARKEN = 4;
-
-  static const int SVG_FEBLEND_MODE_LIGHTEN = 5;
-
-  static const int SVG_FEBLEND_MODE_MULTIPLY = 2;
-
-  static const int SVG_FEBLEND_MODE_NORMAL = 1;
-
-  static const int SVG_FEBLEND_MODE_SCREEN = 3;
-
-  static const int SVG_FEBLEND_MODE_UNKNOWN = 0;
-
-  /** @domName SVGFEBlendElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEBlendElement.in2 */
-  SVGAnimatedString get in2;
-
-  /** @domName SVGFEBlendElement.mode */
-  SVGAnimatedEnumeration get mode;
-}
-
-class _SVGFEBlendElementImpl extends _SVGElementImpl implements SVGFEBlendElement native "*SVGFEBlendElement" {
-
-  final _SVGAnimatedStringImpl in1;
-
-  final _SVGAnimatedStringImpl in2;
-
-  final _SVGAnimatedEnumerationImpl mode;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEColorMatrixElement
-abstract class SVGFEColorMatrixElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  static const int SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
-
-  static const int SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;
-
-  static const int SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
-
-  static const int SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
-
-  static const int SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
-
-  /** @domName SVGFEColorMatrixElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEColorMatrixElement.type */
-  SVGAnimatedEnumeration get type;
-
-  /** @domName SVGFEColorMatrixElement.values */
-  SVGAnimatedNumberList get values;
-}
-
-class _SVGFEColorMatrixElementImpl extends _SVGElementImpl implements SVGFEColorMatrixElement native "*SVGFEColorMatrixElement" {
-
-  final _SVGAnimatedStringImpl in1;
-
-  final _SVGAnimatedEnumerationImpl type;
-
-  final _SVGAnimatedNumberListImpl values;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEComponentTransferElement
-abstract class SVGFEComponentTransferElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  /** @domName SVGFEComponentTransferElement.in1 */
-  SVGAnimatedString get in1;
-}
-
-class _SVGFEComponentTransferElementImpl extends _SVGElementImpl implements SVGFEComponentTransferElement native "*SVGFEComponentTransferElement" {
-
-  final _SVGAnimatedStringImpl in1;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFECompositeElement
-abstract class SVGFECompositeElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  static const int SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
-
-  static const int SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
-
-  static const int SVG_FECOMPOSITE_OPERATOR_IN = 2;
-
-  static const int SVG_FECOMPOSITE_OPERATOR_OUT = 3;
-
-  static const int SVG_FECOMPOSITE_OPERATOR_OVER = 1;
-
-  static const int SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
-
-  static const int SVG_FECOMPOSITE_OPERATOR_XOR = 5;
-
-  /** @domName SVGFECompositeElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFECompositeElement.in2 */
-  SVGAnimatedString get in2;
-
-  /** @domName SVGFECompositeElement.k1 */
-  SVGAnimatedNumber get k1;
-
-  /** @domName SVGFECompositeElement.k2 */
-  SVGAnimatedNumber get k2;
-
-  /** @domName SVGFECompositeElement.k3 */
-  SVGAnimatedNumber get k3;
-
-  /** @domName SVGFECompositeElement.k4 */
-  SVGAnimatedNumber get k4;
-
-  /** @domName SVGFECompositeElement.operator */
-  SVGAnimatedEnumeration get operator;
-}
-
-class _SVGFECompositeElementImpl extends _SVGElementImpl implements SVGFECompositeElement native "*SVGFECompositeElement" {
-
-  final _SVGAnimatedStringImpl in1;
-
-  final _SVGAnimatedStringImpl in2;
-
-  final _SVGAnimatedNumberImpl k1;
-
-  final _SVGAnimatedNumberImpl k2;
-
-  final _SVGAnimatedNumberImpl k3;
-
-  final _SVGAnimatedNumberImpl k4;
-
-  final _SVGAnimatedEnumerationImpl operator;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEConvolveMatrixElement
-abstract class SVGFEConvolveMatrixElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  static const int SVG_EDGEMODE_DUPLICATE = 1;
-
-  static const int SVG_EDGEMODE_NONE = 3;
-
-  static const int SVG_EDGEMODE_UNKNOWN = 0;
-
-  static const int SVG_EDGEMODE_WRAP = 2;
-
-  /** @domName SVGFEConvolveMatrixElement.bias */
-  SVGAnimatedNumber get bias;
-
-  /** @domName SVGFEConvolveMatrixElement.divisor */
-  SVGAnimatedNumber get divisor;
-
-  /** @domName SVGFEConvolveMatrixElement.edgeMode */
-  SVGAnimatedEnumeration get edgeMode;
-
-  /** @domName SVGFEConvolveMatrixElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEConvolveMatrixElement.kernelMatrix */
-  SVGAnimatedNumberList get kernelMatrix;
-
-  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthX */
-  SVGAnimatedNumber get kernelUnitLengthX;
-
-  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthY */
-  SVGAnimatedNumber get kernelUnitLengthY;
-
-  /** @domName SVGFEConvolveMatrixElement.orderX */
-  SVGAnimatedInteger get orderX;
-
-  /** @domName SVGFEConvolveMatrixElement.orderY */
-  SVGAnimatedInteger get orderY;
-
-  /** @domName SVGFEConvolveMatrixElement.preserveAlpha */
-  SVGAnimatedBoolean get preserveAlpha;
-
-  /** @domName SVGFEConvolveMatrixElement.targetX */
-  SVGAnimatedInteger get targetX;
-
-  /** @domName SVGFEConvolveMatrixElement.targetY */
-  SVGAnimatedInteger get targetY;
-}
-
-class _SVGFEConvolveMatrixElementImpl extends _SVGElementImpl implements SVGFEConvolveMatrixElement native "*SVGFEConvolveMatrixElement" {
-
-  final _SVGAnimatedNumberImpl bias;
-
-  final _SVGAnimatedNumberImpl divisor;
-
-  final _SVGAnimatedEnumerationImpl edgeMode;
-
-  final _SVGAnimatedStringImpl in1;
-
-  final _SVGAnimatedNumberListImpl kernelMatrix;
-
-  final _SVGAnimatedNumberImpl kernelUnitLengthX;
-
-  final _SVGAnimatedNumberImpl kernelUnitLengthY;
-
-  final _SVGAnimatedIntegerImpl orderX;
-
-  final _SVGAnimatedIntegerImpl orderY;
-
-  final _SVGAnimatedBooleanImpl preserveAlpha;
-
-  final _SVGAnimatedIntegerImpl targetX;
-
-  final _SVGAnimatedIntegerImpl targetY;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEDiffuseLightingElement
-abstract class SVGFEDiffuseLightingElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  /** @domName SVGFEDiffuseLightingElement.diffuseConstant */
-  SVGAnimatedNumber get diffuseConstant;
-
-  /** @domName SVGFEDiffuseLightingElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthX */
-  SVGAnimatedNumber get kernelUnitLengthX;
-
-  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthY */
-  SVGAnimatedNumber get kernelUnitLengthY;
-
-  /** @domName SVGFEDiffuseLightingElement.surfaceScale */
-  SVGAnimatedNumber get surfaceScale;
-}
-
-class _SVGFEDiffuseLightingElementImpl extends _SVGElementImpl implements SVGFEDiffuseLightingElement native "*SVGFEDiffuseLightingElement" {
-
-  final _SVGAnimatedNumberImpl diffuseConstant;
-
-  final _SVGAnimatedStringImpl in1;
-
-  final _SVGAnimatedNumberImpl kernelUnitLengthX;
-
-  final _SVGAnimatedNumberImpl kernelUnitLengthY;
-
-  final _SVGAnimatedNumberImpl surfaceScale;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEDisplacementMapElement
-abstract class SVGFEDisplacementMapElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  static const int SVG_CHANNEL_A = 4;
-
-  static const int SVG_CHANNEL_B = 3;
-
-  static const int SVG_CHANNEL_G = 2;
-
-  static const int SVG_CHANNEL_R = 1;
-
-  static const int SVG_CHANNEL_UNKNOWN = 0;
-
-  /** @domName SVGFEDisplacementMapElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEDisplacementMapElement.in2 */
-  SVGAnimatedString get in2;
-
-  /** @domName SVGFEDisplacementMapElement.scale */
-  SVGAnimatedNumber get scale;
-
-  /** @domName SVGFEDisplacementMapElement.xChannelSelector */
-  SVGAnimatedEnumeration get xChannelSelector;
-
-  /** @domName SVGFEDisplacementMapElement.yChannelSelector */
-  SVGAnimatedEnumeration get yChannelSelector;
-}
-
-class _SVGFEDisplacementMapElementImpl extends _SVGElementImpl implements SVGFEDisplacementMapElement native "*SVGFEDisplacementMapElement" {
-
-  final _SVGAnimatedStringImpl in1;
-
-  final _SVGAnimatedStringImpl in2;
-
-  final _SVGAnimatedNumberImpl scale;
-
-  final _SVGAnimatedEnumerationImpl xChannelSelector;
-
-  final _SVGAnimatedEnumerationImpl yChannelSelector;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEDistantLightElement
-abstract class SVGFEDistantLightElement implements SVGElement {
-
-  /** @domName SVGFEDistantLightElement.azimuth */
-  SVGAnimatedNumber get azimuth;
-
-  /** @domName SVGFEDistantLightElement.elevation */
-  SVGAnimatedNumber get elevation;
-}
-
-class _SVGFEDistantLightElementImpl extends _SVGElementImpl implements SVGFEDistantLightElement native "*SVGFEDistantLightElement" {
-
-  final _SVGAnimatedNumberImpl azimuth;
-
-  final _SVGAnimatedNumberImpl elevation;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEDropShadowElement
-abstract class SVGFEDropShadowElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  /** @domName SVGFEDropShadowElement.dx */
-  SVGAnimatedNumber get dx;
-
-  /** @domName SVGFEDropShadowElement.dy */
-  SVGAnimatedNumber get dy;
-
-  /** @domName SVGFEDropShadowElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEDropShadowElement.stdDeviationX */
-  SVGAnimatedNumber get stdDeviationX;
-
-  /** @domName SVGFEDropShadowElement.stdDeviationY */
-  SVGAnimatedNumber get stdDeviationY;
-
-  /** @domName SVGFEDropShadowElement.setStdDeviation */
-  void setStdDeviation(num stdDeviationX, num stdDeviationY);
-}
-
-class _SVGFEDropShadowElementImpl extends _SVGElementImpl implements SVGFEDropShadowElement native "*SVGFEDropShadowElement" {
-
-  final _SVGAnimatedNumberImpl dx;
-
-  final _SVGAnimatedNumberImpl dy;
-
-  final _SVGAnimatedStringImpl in1;
-
-  final _SVGAnimatedNumberImpl stdDeviationX;
-
-  final _SVGAnimatedNumberImpl stdDeviationY;
-
-  void setStdDeviation(num stdDeviationX, num stdDeviationY) native;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEFloodElement
-abstract class SVGFEFloodElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-}
-
-class _SVGFEFloodElementImpl extends _SVGElementImpl implements SVGFEFloodElement native "*SVGFEFloodElement" {
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEFuncAElement
-abstract class SVGFEFuncAElement implements SVGComponentTransferFunctionElement {
-}
-
-class _SVGFEFuncAElementImpl extends _SVGComponentTransferFunctionElementImpl implements SVGFEFuncAElement native "*SVGFEFuncAElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEFuncBElement
-abstract class SVGFEFuncBElement implements SVGComponentTransferFunctionElement {
-}
-
-class _SVGFEFuncBElementImpl extends _SVGComponentTransferFunctionElementImpl implements SVGFEFuncBElement native "*SVGFEFuncBElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEFuncGElement
-abstract class SVGFEFuncGElement implements SVGComponentTransferFunctionElement {
-}
-
-class _SVGFEFuncGElementImpl extends _SVGComponentTransferFunctionElementImpl implements SVGFEFuncGElement native "*SVGFEFuncGElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEFuncRElement
-abstract class SVGFEFuncRElement implements SVGComponentTransferFunctionElement {
-}
-
-class _SVGFEFuncRElementImpl extends _SVGComponentTransferFunctionElementImpl implements SVGFEFuncRElement native "*SVGFEFuncRElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEGaussianBlurElement
-abstract class SVGFEGaussianBlurElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  /** @domName SVGFEGaussianBlurElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEGaussianBlurElement.stdDeviationX */
-  SVGAnimatedNumber get stdDeviationX;
-
-  /** @domName SVGFEGaussianBlurElement.stdDeviationY */
-  SVGAnimatedNumber get stdDeviationY;
-
-  /** @domName SVGFEGaussianBlurElement.setStdDeviation */
-  void setStdDeviation(num stdDeviationX, num stdDeviationY);
-}
-
-class _SVGFEGaussianBlurElementImpl extends _SVGElementImpl implements SVGFEGaussianBlurElement native "*SVGFEGaussianBlurElement" {
-
-  final _SVGAnimatedStringImpl in1;
-
-  final _SVGAnimatedNumberImpl stdDeviationX;
-
-  final _SVGAnimatedNumberImpl stdDeviationY;
-
-  void setStdDeviation(num stdDeviationX, num stdDeviationY) native;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEImageElement
-abstract class SVGFEImageElement implements SVGElement, SVGURIReference, SVGLangSpace, SVGExternalResourcesRequired, SVGFilterPrimitiveStandardAttributes {
-
-  /** @domName SVGFEImageElement.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio;
-}
-
-class _SVGFEImageElementImpl extends _SVGElementImpl implements SVGFEImageElement native "*SVGFEImageElement" {
-
-  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEMergeElement
-abstract class SVGFEMergeElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-}
-
-class _SVGFEMergeElementImpl extends _SVGElementImpl implements SVGFEMergeElement native "*SVGFEMergeElement" {
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEMergeNodeElement
-abstract class SVGFEMergeNodeElement implements SVGElement {
-
-  /** @domName SVGFEMergeNodeElement.in1 */
-  SVGAnimatedString get in1;
-}
-
-class _SVGFEMergeNodeElementImpl extends _SVGElementImpl implements SVGFEMergeNodeElement native "*SVGFEMergeNodeElement" {
-
-  final _SVGAnimatedStringImpl in1;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEMorphologyElement
-abstract class SVGFEMorphologyElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  static const int SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
-
-  static const int SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
-
-  static const int SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
-
-  /** @domName SVGFEMorphologyElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEMorphologyElement.operator */
-  SVGAnimatedEnumeration get operator;
-
-  /** @domName SVGFEMorphologyElement.radiusX */
-  SVGAnimatedNumber get radiusX;
-
-  /** @domName SVGFEMorphologyElement.radiusY */
-  SVGAnimatedNumber get radiusY;
-
-  /** @domName SVGFEMorphologyElement.setRadius */
-  void setRadius(num radiusX, num radiusY);
-}
-
-class _SVGFEMorphologyElementImpl extends _SVGElementImpl implements SVGFEMorphologyElement native "*SVGFEMorphologyElement" {
-
-  final _SVGAnimatedStringImpl in1;
-
-  final _SVGAnimatedEnumerationImpl operator;
-
-  final _SVGAnimatedNumberImpl radiusX;
-
-  final _SVGAnimatedNumberImpl radiusY;
-
-  void setRadius(num radiusX, num radiusY) native;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEOffsetElement
-abstract class SVGFEOffsetElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  /** @domName SVGFEOffsetElement.dx */
-  SVGAnimatedNumber get dx;
-
-  /** @domName SVGFEOffsetElement.dy */
-  SVGAnimatedNumber get dy;
-
-  /** @domName SVGFEOffsetElement.in1 */
-  SVGAnimatedString get in1;
-}
-
-class _SVGFEOffsetElementImpl extends _SVGElementImpl implements SVGFEOffsetElement native "*SVGFEOffsetElement" {
-
-  final _SVGAnimatedNumberImpl dx;
-
-  final _SVGAnimatedNumberImpl dy;
-
-  final _SVGAnimatedStringImpl in1;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFEPointLightElement
-abstract class SVGFEPointLightElement implements SVGElement {
-
-  /** @domName SVGFEPointLightElement.x */
-  SVGAnimatedNumber get x;
-
-  /** @domName SVGFEPointLightElement.y */
-  SVGAnimatedNumber get y;
-
-  /** @domName SVGFEPointLightElement.z */
-  SVGAnimatedNumber get z;
-}
-
-class _SVGFEPointLightElementImpl extends _SVGElementImpl implements SVGFEPointLightElement native "*SVGFEPointLightElement" {
-
-  final _SVGAnimatedNumberImpl x;
-
-  final _SVGAnimatedNumberImpl y;
-
-  final _SVGAnimatedNumberImpl z;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFESpecularLightingElement
-abstract class SVGFESpecularLightingElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  /** @domName SVGFESpecularLightingElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFESpecularLightingElement.specularConstant */
-  SVGAnimatedNumber get specularConstant;
-
-  /** @domName SVGFESpecularLightingElement.specularExponent */
-  SVGAnimatedNumber get specularExponent;
-
-  /** @domName SVGFESpecularLightingElement.surfaceScale */
-  SVGAnimatedNumber get surfaceScale;
-}
-
-class _SVGFESpecularLightingElementImpl extends _SVGElementImpl implements SVGFESpecularLightingElement native "*SVGFESpecularLightingElement" {
-
-  final _SVGAnimatedStringImpl in1;
-
-  final _SVGAnimatedNumberImpl specularConstant;
-
-  final _SVGAnimatedNumberImpl specularExponent;
-
-  final _SVGAnimatedNumberImpl surfaceScale;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFESpotLightElement
-abstract class SVGFESpotLightElement implements SVGElement {
-
-  /** @domName SVGFESpotLightElement.limitingConeAngle */
-  SVGAnimatedNumber get limitingConeAngle;
-
-  /** @domName SVGFESpotLightElement.pointsAtX */
-  SVGAnimatedNumber get pointsAtX;
-
-  /** @domName SVGFESpotLightElement.pointsAtY */
-  SVGAnimatedNumber get pointsAtY;
-
-  /** @domName SVGFESpotLightElement.pointsAtZ */
-  SVGAnimatedNumber get pointsAtZ;
-
-  /** @domName SVGFESpotLightElement.specularExponent */
-  SVGAnimatedNumber get specularExponent;
-
-  /** @domName SVGFESpotLightElement.x */
-  SVGAnimatedNumber get x;
-
-  /** @domName SVGFESpotLightElement.y */
-  SVGAnimatedNumber get y;
-
-  /** @domName SVGFESpotLightElement.z */
-  SVGAnimatedNumber get z;
-}
-
-class _SVGFESpotLightElementImpl extends _SVGElementImpl implements SVGFESpotLightElement native "*SVGFESpotLightElement" {
-
-  final _SVGAnimatedNumberImpl limitingConeAngle;
-
-  final _SVGAnimatedNumberImpl pointsAtX;
-
-  final _SVGAnimatedNumberImpl pointsAtY;
-
-  final _SVGAnimatedNumberImpl pointsAtZ;
-
-  final _SVGAnimatedNumberImpl specularExponent;
-
-  final _SVGAnimatedNumberImpl x;
-
-  final _SVGAnimatedNumberImpl y;
-
-  final _SVGAnimatedNumberImpl z;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFETileElement
-abstract class SVGFETileElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  /** @domName SVGFETileElement.in1 */
-  SVGAnimatedString get in1;
-}
-
-class _SVGFETileElementImpl extends _SVGElementImpl implements SVGFETileElement native "*SVGFETileElement" {
-
-  final _SVGAnimatedStringImpl in1;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFETurbulenceElement
-abstract class SVGFETurbulenceElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-
-  static const int SVG_STITCHTYPE_NOSTITCH = 2;
-
-  static const int SVG_STITCHTYPE_STITCH = 1;
-
-  static const int SVG_STITCHTYPE_UNKNOWN = 0;
-
-  static const int SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
-
-  static const int SVG_TURBULENCE_TYPE_TURBULENCE = 2;
-
-  static const int SVG_TURBULENCE_TYPE_UNKNOWN = 0;
-
-  /** @domName SVGFETurbulenceElement.baseFrequencyX */
-  SVGAnimatedNumber get baseFrequencyX;
-
-  /** @domName SVGFETurbulenceElement.baseFrequencyY */
-  SVGAnimatedNumber get baseFrequencyY;
-
-  /** @domName SVGFETurbulenceElement.numOctaves */
-  SVGAnimatedInteger get numOctaves;
-
-  /** @domName SVGFETurbulenceElement.seed */
-  SVGAnimatedNumber get seed;
-
-  /** @domName SVGFETurbulenceElement.stitchTiles */
-  SVGAnimatedEnumeration get stitchTiles;
-
-  /** @domName SVGFETurbulenceElement.type */
-  SVGAnimatedEnumeration get type;
-}
-
-class _SVGFETurbulenceElementImpl extends _SVGElementImpl implements SVGFETurbulenceElement native "*SVGFETurbulenceElement" {
-
-  final _SVGAnimatedNumberImpl baseFrequencyX;
-
-  final _SVGAnimatedNumberImpl baseFrequencyY;
-
-  final _SVGAnimatedIntegerImpl numOctaves;
-
-  final _SVGAnimatedNumberImpl seed;
-
-  final _SVGAnimatedEnumerationImpl stitchTiles;
-
-  final _SVGAnimatedEnumerationImpl type;
-
-  // From SVGFilterPrimitiveStandardAttributes
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedStringImpl result;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFilterElement
-abstract class SVGFilterElement implements SVGElement, SVGURIReference, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable {
-
-  /** @domName SVGFilterElement.filterResX */
-  SVGAnimatedInteger get filterResX;
-
-  /** @domName SVGFilterElement.filterResY */
-  SVGAnimatedInteger get filterResY;
-
-  /** @domName SVGFilterElement.filterUnits */
-  SVGAnimatedEnumeration get filterUnits;
-
-  /** @domName SVGFilterElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGFilterElement.primitiveUnits */
-  SVGAnimatedEnumeration get primitiveUnits;
-
-  /** @domName SVGFilterElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGFilterElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGFilterElement.y */
-  SVGAnimatedLength get y;
-
-  /** @domName SVGFilterElement.setFilterRes */
-  void setFilterRes(int filterResX, int filterResY);
-}
-
-class _SVGFilterElementImpl extends _SVGElementImpl implements SVGFilterElement native "*SVGFilterElement" {
-
-  final _SVGAnimatedIntegerImpl filterResX;
-
-  final _SVGAnimatedIntegerImpl filterResY;
-
-  final _SVGAnimatedEnumerationImpl filterUnits;
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedEnumerationImpl primitiveUnits;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  void setFilterRes(int filterResX, int filterResY) native;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFilterPrimitiveStandardAttributes
-abstract class SVGFilterPrimitiveStandardAttributes implements SVGStylable {
-
-  /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  SVGAnimatedString get result;
-
-  /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  SVGAnimatedLength get y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFitToViewBox
-abstract class SVGFitToViewBox {
-
-  /** @domName SVGFitToViewBox.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio;
-
-  /** @domName SVGFitToViewBox.viewBox */
-  SVGAnimatedRect get viewBox;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFontElement
-abstract class SVGFontElement implements SVGElement {
-}
-
-class _SVGFontElementImpl extends _SVGElementImpl implements SVGFontElement native "*SVGFontElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFontFaceElement
-abstract class SVGFontFaceElement implements SVGElement {
-}
-
-class _SVGFontFaceElementImpl extends _SVGElementImpl implements SVGFontFaceElement native "*SVGFontFaceElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFontFaceFormatElement
-abstract class SVGFontFaceFormatElement implements SVGElement {
-}
-
-class _SVGFontFaceFormatElementImpl extends _SVGElementImpl implements SVGFontFaceFormatElement native "*SVGFontFaceFormatElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFontFaceNameElement
-abstract class SVGFontFaceNameElement implements SVGElement {
-}
-
-class _SVGFontFaceNameElementImpl extends _SVGElementImpl implements SVGFontFaceNameElement native "*SVGFontFaceNameElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFontFaceSrcElement
-abstract class SVGFontFaceSrcElement implements SVGElement {
-}
-
-class _SVGFontFaceSrcElementImpl extends _SVGElementImpl implements SVGFontFaceSrcElement native "*SVGFontFaceSrcElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGFontFaceUriElement
-abstract class SVGFontFaceUriElement implements SVGElement {
-}
-
-class _SVGFontFaceUriElementImpl extends _SVGElementImpl implements SVGFontFaceUriElement native "*SVGFontFaceUriElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGForeignObjectElement
-abstract class SVGForeignObjectElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-
-  /** @domName SVGForeignObjectElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGForeignObjectElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGForeignObjectElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGForeignObjectElement.y */
-  SVGAnimatedLength get y;
-}
-
-class _SVGForeignObjectElementImpl extends _SVGElementImpl implements SVGForeignObjectElement native "*SVGForeignObjectElement" {
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGGElement
-abstract class SVGGElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-}
-
-class _SVGGElementImpl extends _SVGElementImpl implements SVGGElement native "*SVGGElement" {
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGGlyphElement
-abstract class SVGGlyphElement implements SVGElement {
-}
-
-class _SVGGlyphElementImpl extends _SVGElementImpl implements SVGGlyphElement native "*SVGGlyphElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGGlyphRefElement
-abstract class SVGGlyphRefElement implements SVGElement, SVGURIReference, SVGStylable {
-
-  /** @domName SVGGlyphRefElement.dx */
-  num dx;
-
-  /** @domName SVGGlyphRefElement.dy */
-  num dy;
-
-  /** @domName SVGGlyphRefElement.format */
-  String format;
-
-  /** @domName SVGGlyphRefElement.glyphRef */
-  String glyphRef;
-
-  /** @domName SVGGlyphRefElement.x */
-  num x;
-
-  /** @domName SVGGlyphRefElement.y */
-  num y;
-}
-
-class _SVGGlyphRefElementImpl extends _SVGElementImpl implements SVGGlyphRefElement native "*SVGGlyphRefElement" {
-
-  num dx;
-
-  num dy;
-
-  String format;
-
-  String glyphRef;
-
-  num x;
-
-  num y;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGGradientElement
-abstract class SVGGradientElement implements SVGElement, SVGURIReference, SVGExternalResourcesRequired, SVGStylable {
-
-  static const int SVG_SPREADMETHOD_PAD = 1;
-
-  static const int SVG_SPREADMETHOD_REFLECT = 2;
-
-  static const int SVG_SPREADMETHOD_REPEAT = 3;
-
-  static const int SVG_SPREADMETHOD_UNKNOWN = 0;
-
-  /** @domName SVGGradientElement.gradientTransform */
-  SVGAnimatedTransformList get gradientTransform;
-
-  /** @domName SVGGradientElement.gradientUnits */
-  SVGAnimatedEnumeration get gradientUnits;
-
-  /** @domName SVGGradientElement.spreadMethod */
-  SVGAnimatedEnumeration get spreadMethod;
-}
-
-class _SVGGradientElementImpl extends _SVGElementImpl implements SVGGradientElement native "*SVGGradientElement" {
-
-  final _SVGAnimatedTransformListImpl gradientTransform;
-
-  final _SVGAnimatedEnumerationImpl gradientUnits;
-
-  final _SVGAnimatedEnumerationImpl spreadMethod;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGHKernElement
-abstract class SVGHKernElement implements SVGElement {
-}
-
-class _SVGHKernElementImpl extends _SVGElementImpl implements SVGHKernElement native "*SVGHKernElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGImageElement
-abstract class SVGImageElement implements SVGElement, SVGURIReference, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-
-  /** @domName SVGImageElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGImageElement.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio;
-
-  /** @domName SVGImageElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGImageElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGImageElement.y */
-  SVGAnimatedLength get y;
-}
-
-class _SVGImageElementImpl extends _SVGElementImpl implements SVGImageElement native "*SVGImageElement" {
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGLangSpace
-abstract class SVGLangSpace {
-
-  /** @domName SVGLangSpace.xmllang */
-  String xmllang;
-
-  /** @domName SVGLangSpace.xmlspace */
-  String xmlspace;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGLength
-abstract class SVGLength {
-
-  static const int SVG_LENGTHTYPE_CM = 6;
-
-  static const int SVG_LENGTHTYPE_EMS = 3;
-
-  static const int SVG_LENGTHTYPE_EXS = 4;
-
-  static const int SVG_LENGTHTYPE_IN = 8;
-
-  static const int SVG_LENGTHTYPE_MM = 7;
-
-  static const int SVG_LENGTHTYPE_NUMBER = 1;
-
-  static const int SVG_LENGTHTYPE_PC = 10;
-
-  static const int SVG_LENGTHTYPE_PERCENTAGE = 2;
-
-  static const int SVG_LENGTHTYPE_PT = 9;
-
-  static const int SVG_LENGTHTYPE_PX = 5;
-
-  static const int SVG_LENGTHTYPE_UNKNOWN = 0;
-
-  /** @domName SVGLength.unitType */
-  int get unitType;
-
-  /** @domName SVGLength.value */
-  num value;
-
-  /** @domName SVGLength.valueAsString */
-  String valueAsString;
-
-  /** @domName SVGLength.valueInSpecifiedUnits */
-  num valueInSpecifiedUnits;
-
-  /** @domName SVGLength.convertToSpecifiedUnits */
-  void convertToSpecifiedUnits(int unitType);
-
-  /** @domName SVGLength.newValueSpecifiedUnits */
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits);
-}
-
-class _SVGLengthImpl implements SVGLength native "*SVGLength" {
-
-  final int unitType;
-
-  num value;
-
-  String valueAsString;
-
-  num valueInSpecifiedUnits;
-
-  void convertToSpecifiedUnits(int unitType) native;
-
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGLengthList
-abstract class SVGLengthList implements List<SVGLength> {
-
-  /** @domName SVGLengthList.numberOfItems */
-  int get numberOfItems;
-
-  /** @domName SVGLengthList.appendItem */
-  SVGLength appendItem(SVGLength item);
-
-  /** @domName SVGLengthList.clear */
-  void clear();
-
-  /** @domName SVGLengthList.getItem */
-  SVGLength getItem(int index);
-
-  /** @domName SVGLengthList.initialize */
-  SVGLength initialize(SVGLength item);
-
-  /** @domName SVGLengthList.insertItemBefore */
-  SVGLength insertItemBefore(SVGLength item, int index);
-
-  /** @domName SVGLengthList.removeItem */
-  SVGLength removeItem(int index);
-
-  /** @domName SVGLengthList.replaceItem */
-  SVGLength replaceItem(SVGLength item, int index);
-}
-
-class _SVGLengthListImpl implements SVGLengthList, JavaScriptIndexingBehavior native "*SVGLengthList" {
-
-  final int numberOfItems;
-
-  _SVGLengthImpl operator[](int index) => JS("_SVGLengthImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _SVGLengthImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SVGLength> mixins.
-  // SVGLength is the element type.
-
-  // From Iterable<SVGLength>:
-
-  Iterator<SVGLength> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SVGLength>(this);
-  }
-
-  // From Collection<SVGLength>:
-
-  void add(SVGLength value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SVGLength value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SVGLength> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SVGLength element) => _Collections.contains(this, element);
-
-  void forEach(void f(SVGLength element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SVGLength element)) => _Collections.map(this, [], f);
-
-  Collection<SVGLength> filter(bool f(SVGLength element)) =>
-     _Collections.filter(this, <SVGLength>[], f);
-
-  bool every(bool f(SVGLength element)) => _Collections.every(this, f);
-
-  bool some(bool f(SVGLength element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SVGLength>:
-
-  void sort([Comparator<SVGLength> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SVGLength element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SVGLength element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SVGLength get last => this[length - 1];
-
-  SVGLength removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SVGLength> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SVGLength initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SVGLength> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGLength>[]);
-
-  // -- end List<SVGLength> mixins.
-
-  _SVGLengthImpl appendItem(_SVGLengthImpl item) native;
-
-  void clear() native;
-
-  _SVGLengthImpl getItem(int index) native;
-
-  _SVGLengthImpl initialize(_SVGLengthImpl item) native;
-
-  _SVGLengthImpl insertItemBefore(_SVGLengthImpl item, int index) native;
-
-  _SVGLengthImpl removeItem(int index) native;
-
-  _SVGLengthImpl replaceItem(_SVGLengthImpl item, int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGLineElement
-abstract class SVGLineElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-
-  /** @domName SVGLineElement.x1 */
-  SVGAnimatedLength get x1;
-
-  /** @domName SVGLineElement.x2 */
-  SVGAnimatedLength get x2;
-
-  /** @domName SVGLineElement.y1 */
-  SVGAnimatedLength get y1;
-
-  /** @domName SVGLineElement.y2 */
-  SVGAnimatedLength get y2;
-}
-
-class _SVGLineElementImpl extends _SVGElementImpl implements SVGLineElement native "*SVGLineElement" {
-
-  final _SVGAnimatedLengthImpl x1;
-
-  final _SVGAnimatedLengthImpl x2;
-
-  final _SVGAnimatedLengthImpl y1;
-
-  final _SVGAnimatedLengthImpl y2;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGLinearGradientElement
-abstract class SVGLinearGradientElement implements SVGGradientElement {
-
-  /** @domName SVGLinearGradientElement.x1 */
-  SVGAnimatedLength get x1;
-
-  /** @domName SVGLinearGradientElement.x2 */
-  SVGAnimatedLength get x2;
-
-  /** @domName SVGLinearGradientElement.y1 */
-  SVGAnimatedLength get y1;
-
-  /** @domName SVGLinearGradientElement.y2 */
-  SVGAnimatedLength get y2;
-}
-
-class _SVGLinearGradientElementImpl extends _SVGGradientElementImpl implements SVGLinearGradientElement native "*SVGLinearGradientElement" {
-
-  final _SVGAnimatedLengthImpl x1;
-
-  final _SVGAnimatedLengthImpl x2;
-
-  final _SVGAnimatedLengthImpl y1;
-
-  final _SVGAnimatedLengthImpl y2;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGLocatable
-abstract class SVGLocatable {
-
-  /** @domName SVGLocatable.farthestViewportElement */
-  SVGElement get farthestViewportElement;
-
-  /** @domName SVGLocatable.nearestViewportElement */
-  SVGElement get nearestViewportElement;
-
-  /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox();
-
-  /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM();
-
-  /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM();
-
-  /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGMPathElement
-abstract class SVGMPathElement implements SVGElement, SVGURIReference, SVGExternalResourcesRequired {
-}
-
-class _SVGMPathElementImpl extends _SVGElementImpl implements SVGMPathElement native "*SVGMPathElement" {
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGMarkerElement
-abstract class SVGMarkerElement implements SVGElement, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGFitToViewBox {
-
-  static const int SVG_MARKERUNITS_STROKEWIDTH = 2;
-
-  static const int SVG_MARKERUNITS_UNKNOWN = 0;
-
-  static const int SVG_MARKERUNITS_USERSPACEONUSE = 1;
-
-  static const int SVG_MARKER_ORIENT_ANGLE = 2;
-
-  static const int SVG_MARKER_ORIENT_AUTO = 1;
-
-  static const int SVG_MARKER_ORIENT_UNKNOWN = 0;
-
-  /** @domName SVGMarkerElement.markerHeight */
-  SVGAnimatedLength get markerHeight;
-
-  /** @domName SVGMarkerElement.markerUnits */
-  SVGAnimatedEnumeration get markerUnits;
-
-  /** @domName SVGMarkerElement.markerWidth */
-  SVGAnimatedLength get markerWidth;
-
-  /** @domName SVGMarkerElement.orientAngle */
-  SVGAnimatedAngle get orientAngle;
-
-  /** @domName SVGMarkerElement.orientType */
-  SVGAnimatedEnumeration get orientType;
-
-  /** @domName SVGMarkerElement.refX */
-  SVGAnimatedLength get refX;
-
-  /** @domName SVGMarkerElement.refY */
-  SVGAnimatedLength get refY;
-
-  /** @domName SVGMarkerElement.setOrientToAngle */
-  void setOrientToAngle(SVGAngle angle);
-
-  /** @domName SVGMarkerElement.setOrientToAuto */
-  void setOrientToAuto();
-}
-
-class _SVGMarkerElementImpl extends _SVGElementImpl implements SVGMarkerElement native "*SVGMarkerElement" {
-
-  final _SVGAnimatedLengthImpl markerHeight;
-
-  final _SVGAnimatedEnumerationImpl markerUnits;
-
-  final _SVGAnimatedLengthImpl markerWidth;
-
-  final _SVGAnimatedAngleImpl orientAngle;
-
-  final _SVGAnimatedEnumerationImpl orientType;
-
-  final _SVGAnimatedLengthImpl refX;
-
-  final _SVGAnimatedLengthImpl refY;
-
-  void setOrientToAngle(_SVGAngleImpl angle) native;
-
-  void setOrientToAuto() native;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGFitToViewBox
-
-  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
-
-  final _SVGAnimatedRectImpl viewBox;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGMaskElement
-abstract class SVGMaskElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable {
-
-  /** @domName SVGMaskElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGMaskElement.maskContentUnits */
-  SVGAnimatedEnumeration get maskContentUnits;
-
-  /** @domName SVGMaskElement.maskUnits */
-  SVGAnimatedEnumeration get maskUnits;
-
-  /** @domName SVGMaskElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGMaskElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGMaskElement.y */
-  SVGAnimatedLength get y;
-}
-
-class _SVGMaskElementImpl extends _SVGElementImpl implements SVGMaskElement native "*SVGMaskElement" {
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedEnumerationImpl maskContentUnits;
-
-  final _SVGAnimatedEnumerationImpl maskUnits;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGMatrix
-abstract class SVGMatrix {
-
-  /** @domName SVGMatrix.a */
-  num a;
-
-  /** @domName SVGMatrix.b */
-  num b;
-
-  /** @domName SVGMatrix.c */
-  num c;
-
-  /** @domName SVGMatrix.d */
-  num d;
-
-  /** @domName SVGMatrix.e */
-  num e;
-
-  /** @domName SVGMatrix.f */
-  num f;
-
-  /** @domName SVGMatrix.flipX */
-  SVGMatrix flipX();
-
-  /** @domName SVGMatrix.flipY */
-  SVGMatrix flipY();
-
-  /** @domName SVGMatrix.inverse */
-  SVGMatrix inverse();
-
-  /** @domName SVGMatrix.multiply */
-  SVGMatrix multiply(SVGMatrix secondMatrix);
-
-  /** @domName SVGMatrix.rotate */
-  SVGMatrix rotate(num angle);
-
-  /** @domName SVGMatrix.rotateFromVector */
-  SVGMatrix rotateFromVector(num x, num y);
-
-  /** @domName SVGMatrix.scale */
-  SVGMatrix scale(num scaleFactor);
-
-  /** @domName SVGMatrix.scaleNonUniform */
-  SVGMatrix scaleNonUniform(num scaleFactorX, num scaleFactorY);
-
-  /** @domName SVGMatrix.skewX */
-  SVGMatrix skewX(num angle);
-
-  /** @domName SVGMatrix.skewY */
-  SVGMatrix skewY(num angle);
-
-  /** @domName SVGMatrix.translate */
-  SVGMatrix translate(num x, num y);
-}
-
-class _SVGMatrixImpl implements SVGMatrix native "*SVGMatrix" {
-
-  num a;
-
-  num b;
-
-  num c;
-
-  num d;
-
-  num e;
-
-  num f;
-
-  _SVGMatrixImpl flipX() native;
-
-  _SVGMatrixImpl flipY() native;
-
-  _SVGMatrixImpl inverse() native;
-
-  _SVGMatrixImpl multiply(_SVGMatrixImpl secondMatrix) native;
-
-  _SVGMatrixImpl rotate(num angle) native;
-
-  _SVGMatrixImpl rotateFromVector(num x, num y) native;
-
-  _SVGMatrixImpl scale(num scaleFactor) native;
-
-  _SVGMatrixImpl scaleNonUniform(num scaleFactorX, num scaleFactorY) native;
-
-  _SVGMatrixImpl skewX(num angle) native;
-
-  _SVGMatrixImpl skewY(num angle) native;
-
-  _SVGMatrixImpl translate(num x, num y) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGMetadataElement
-abstract class SVGMetadataElement implements SVGElement {
-}
-
-class _SVGMetadataElementImpl extends _SVGElementImpl implements SVGMetadataElement native "*SVGMetadataElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGMissingGlyphElement
-abstract class SVGMissingGlyphElement implements SVGElement {
-}
-
-class _SVGMissingGlyphElementImpl extends _SVGElementImpl implements SVGMissingGlyphElement native "*SVGMissingGlyphElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGNumber
-abstract class SVGNumber {
-
-  /** @domName SVGNumber.value */
-  num value;
-}
-
-class _SVGNumberImpl implements SVGNumber native "*SVGNumber" {
-
-  num value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGNumberList
-abstract class SVGNumberList implements List<SVGNumber> {
-
-  /** @domName SVGNumberList.numberOfItems */
-  int get numberOfItems;
-
-  /** @domName SVGNumberList.appendItem */
-  SVGNumber appendItem(SVGNumber item);
-
-  /** @domName SVGNumberList.clear */
-  void clear();
-
-  /** @domName SVGNumberList.getItem */
-  SVGNumber getItem(int index);
-
-  /** @domName SVGNumberList.initialize */
-  SVGNumber initialize(SVGNumber item);
-
-  /** @domName SVGNumberList.insertItemBefore */
-  SVGNumber insertItemBefore(SVGNumber item, int index);
-
-  /** @domName SVGNumberList.removeItem */
-  SVGNumber removeItem(int index);
-
-  /** @domName SVGNumberList.replaceItem */
-  SVGNumber replaceItem(SVGNumber item, int index);
-}
-
-class _SVGNumberListImpl implements SVGNumberList, JavaScriptIndexingBehavior native "*SVGNumberList" {
-
-  final int numberOfItems;
-
-  _SVGNumberImpl operator[](int index) => JS("_SVGNumberImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _SVGNumberImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SVGNumber> mixins.
-  // SVGNumber is the element type.
-
-  // From Iterable<SVGNumber>:
-
-  Iterator<SVGNumber> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SVGNumber>(this);
-  }
-
-  // From Collection<SVGNumber>:
-
-  void add(SVGNumber value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SVGNumber value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SVGNumber> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SVGNumber element) => _Collections.contains(this, element);
-
-  void forEach(void f(SVGNumber element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SVGNumber element)) => _Collections.map(this, [], f);
-
-  Collection<SVGNumber> filter(bool f(SVGNumber element)) =>
-     _Collections.filter(this, <SVGNumber>[], f);
-
-  bool every(bool f(SVGNumber element)) => _Collections.every(this, f);
-
-  bool some(bool f(SVGNumber element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SVGNumber>:
-
-  void sort([Comparator<SVGNumber> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SVGNumber element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SVGNumber element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SVGNumber get last => this[length - 1];
-
-  SVGNumber removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SVGNumber> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SVGNumber initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SVGNumber> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGNumber>[]);
-
-  // -- end List<SVGNumber> mixins.
-
-  _SVGNumberImpl appendItem(_SVGNumberImpl item) native;
-
-  void clear() native;
-
-  _SVGNumberImpl getItem(int index) native;
-
-  _SVGNumberImpl initialize(_SVGNumberImpl item) native;
-
-  _SVGNumberImpl insertItemBefore(_SVGNumberImpl item, int index) native;
-
-  _SVGNumberImpl removeItem(int index) native;
-
-  _SVGNumberImpl replaceItem(_SVGNumberImpl item, int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPaint
-abstract class SVGPaint implements SVGColor {
-
-  static const int SVG_PAINTTYPE_CURRENTCOLOR = 102;
-
-  static const int SVG_PAINTTYPE_NONE = 101;
-
-  static const int SVG_PAINTTYPE_RGBCOLOR = 1;
-
-  static const int SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR = 2;
-
-  static const int SVG_PAINTTYPE_UNKNOWN = 0;
-
-  static const int SVG_PAINTTYPE_URI = 107;
-
-  static const int SVG_PAINTTYPE_URI_CURRENTCOLOR = 104;
-
-  static const int SVG_PAINTTYPE_URI_NONE = 103;
-
-  static const int SVG_PAINTTYPE_URI_RGBCOLOR = 105;
-
-  static const int SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106;
-
-  /** @domName SVGPaint.paintType */
-  int get paintType;
-
-  /** @domName SVGPaint.uri */
-  String get uri;
-
-  /** @domName SVGPaint.setPaint */
-  void setPaint(int paintType, String uri, String rgbColor, String iccColor);
-
-  /** @domName SVGPaint.setUri */
-  void setUri(String uri);
-}
-
-class _SVGPaintImpl extends _SVGColorImpl implements SVGPaint native "*SVGPaint" {
-
-  final int paintType;
-
-  final String uri;
-
-  void setPaint(int paintType, String uri, String rgbColor, String iccColor) native;
-
-  void setUri(String uri) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathElement
-abstract class SVGPathElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-
-  /** @domName SVGPathElement.animatedNormalizedPathSegList */
-  SVGPathSegList get animatedNormalizedPathSegList;
-
-  /** @domName SVGPathElement.animatedPathSegList */
-  SVGPathSegList get animatedPathSegList;
-
-  /** @domName SVGPathElement.normalizedPathSegList */
-  SVGPathSegList get normalizedPathSegList;
-
-  /** @domName SVGPathElement.pathLength */
-  SVGAnimatedNumber get pathLength;
-
-  /** @domName SVGPathElement.pathSegList */
-  SVGPathSegList get pathSegList;
-
-  /** @domName SVGPathElement.createSVGPathSegArcAbs */
-  SVGPathSegArcAbs createSVGPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag);
-
-  /** @domName SVGPathElement.createSVGPathSegArcRel */
-  SVGPathSegArcRel createSVGPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag);
-
-  /** @domName SVGPathElement.createSVGPathSegClosePath */
-  SVGPathSegClosePath createSVGPathSegClosePath();
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicAbs */
-  SVGPathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicRel */
-  SVGPathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs */
-  SVGPathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel */
-  SVGPathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticAbs */
-  SVGPathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticRel */
-  SVGPathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs */
-  SVGPathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(num x, num y);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel */
-  SVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(num x, num y);
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoAbs */
-  SVGPathSegLinetoAbs createSVGPathSegLinetoAbs(num x, num y);
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalAbs */
-  SVGPathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(num x);
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalRel */
-  SVGPathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(num x);
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoRel */
-  SVGPathSegLinetoRel createSVGPathSegLinetoRel(num x, num y);
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalAbs */
-  SVGPathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(num y);
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalRel */
-  SVGPathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(num y);
-
-  /** @domName SVGPathElement.createSVGPathSegMovetoAbs */
-  SVGPathSegMovetoAbs createSVGPathSegMovetoAbs(num x, num y);
-
-  /** @domName SVGPathElement.createSVGPathSegMovetoRel */
-  SVGPathSegMovetoRel createSVGPathSegMovetoRel(num x, num y);
-
-  /** @domName SVGPathElement.getPathSegAtLength */
-  int getPathSegAtLength(num distance);
-
-  /** @domName SVGPathElement.getPointAtLength */
-  SVGPoint getPointAtLength(num distance);
-
-  /** @domName SVGPathElement.getTotalLength */
-  num getTotalLength();
-}
-
-class _SVGPathElementImpl extends _SVGElementImpl implements SVGPathElement native "*SVGPathElement" {
-
-  final _SVGPathSegListImpl animatedNormalizedPathSegList;
-
-  final _SVGPathSegListImpl animatedPathSegList;
-
-  final _SVGPathSegListImpl normalizedPathSegList;
-
-  final _SVGAnimatedNumberImpl pathLength;
-
-  final _SVGPathSegListImpl pathSegList;
-
-  _SVGPathSegArcAbsImpl createSVGPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
-
-  _SVGPathSegArcRelImpl createSVGPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
-
-  _SVGPathSegClosePathImpl createSVGPathSegClosePath() native;
-
-  _SVGPathSegCurvetoCubicAbsImpl createSVGPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native;
-
-  _SVGPathSegCurvetoCubicRelImpl createSVGPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) native;
-
-  _SVGPathSegCurvetoCubicSmoothAbsImpl createSVGPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) native;
-
-  _SVGPathSegCurvetoCubicSmoothRelImpl createSVGPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native;
-
-  _SVGPathSegCurvetoQuadraticAbsImpl createSVGPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native;
-
-  _SVGPathSegCurvetoQuadraticRelImpl createSVGPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native;
-
-  _SVGPathSegCurvetoQuadraticSmoothAbsImpl createSVGPathSegCurvetoQuadraticSmoothAbs(num x, num y) native;
-
-  _SVGPathSegCurvetoQuadraticSmoothRelImpl createSVGPathSegCurvetoQuadraticSmoothRel(num x, num y) native;
-
-  _SVGPathSegLinetoAbsImpl createSVGPathSegLinetoAbs(num x, num y) native;
-
-  _SVGPathSegLinetoHorizontalAbsImpl createSVGPathSegLinetoHorizontalAbs(num x) native;
-
-  _SVGPathSegLinetoHorizontalRelImpl createSVGPathSegLinetoHorizontalRel(num x) native;
-
-  _SVGPathSegLinetoRelImpl createSVGPathSegLinetoRel(num x, num y) native;
-
-  _SVGPathSegLinetoVerticalAbsImpl createSVGPathSegLinetoVerticalAbs(num y) native;
-
-  _SVGPathSegLinetoVerticalRelImpl createSVGPathSegLinetoVerticalRel(num y) native;
-
-  _SVGPathSegMovetoAbsImpl createSVGPathSegMovetoAbs(num x, num y) native;
-
-  _SVGPathSegMovetoRelImpl createSVGPathSegMovetoRel(num x, num y) native;
-
-  int getPathSegAtLength(num distance) native;
-
-  _SVGPointImpl getPointAtLength(num distance) native;
-
-  num getTotalLength() native;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSeg
-abstract class SVGPathSeg {
-
-  static const int PATHSEG_ARC_ABS = 10;
-
-  static const int PATHSEG_ARC_REL = 11;
-
-  static const int PATHSEG_CLOSEPATH = 1;
-
-  static const int PATHSEG_CURVETO_CUBIC_ABS = 6;
-
-  static const int PATHSEG_CURVETO_CUBIC_REL = 7;
-
-  static const int PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
-
-  static const int PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
-
-  static const int PATHSEG_CURVETO_QUADRATIC_ABS = 8;
-
-  static const int PATHSEG_CURVETO_QUADRATIC_REL = 9;
-
-  static const int PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
-
-  static const int PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
-
-  static const int PATHSEG_LINETO_ABS = 4;
-
-  static const int PATHSEG_LINETO_HORIZONTAL_ABS = 12;
-
-  static const int PATHSEG_LINETO_HORIZONTAL_REL = 13;
-
-  static const int PATHSEG_LINETO_REL = 5;
-
-  static const int PATHSEG_LINETO_VERTICAL_ABS = 14;
-
-  static const int PATHSEG_LINETO_VERTICAL_REL = 15;
-
-  static const int PATHSEG_MOVETO_ABS = 2;
-
-  static const int PATHSEG_MOVETO_REL = 3;
-
-  static const int PATHSEG_UNKNOWN = 0;
-
-  /** @domName SVGPathSeg.pathSegType */
-  int get pathSegType;
-
-  /** @domName SVGPathSeg.pathSegTypeAsLetter */
-  String get pathSegTypeAsLetter;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegArcAbs
-abstract class SVGPathSegArcAbs implements SVGPathSeg {
-
-  /** @domName SVGPathSegArcAbs.angle */
-  num angle;
-
-  /** @domName SVGPathSegArcAbs.largeArcFlag */
-  bool largeArcFlag;
-
-  /** @domName SVGPathSegArcAbs.r1 */
-  num r1;
-
-  /** @domName SVGPathSegArcAbs.r2 */
-  num r2;
-
-  /** @domName SVGPathSegArcAbs.sweepFlag */
-  bool sweepFlag;
-
-  /** @domName SVGPathSegArcAbs.x */
-  num x;
-
-  /** @domName SVGPathSegArcAbs.y */
-  num y;
-}
-
-class _SVGPathSegArcAbsImpl extends _SVGPathSegImpl implements SVGPathSegArcAbs native "*SVGPathSegArcAbs" {
-
-  num angle;
-
-  bool largeArcFlag;
-
-  num r1;
-
-  num r2;
-
-  bool sweepFlag;
-
-  num x;
-
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegArcRel
-abstract class SVGPathSegArcRel implements SVGPathSeg {
-
-  /** @domName SVGPathSegArcRel.angle */
-  num angle;
-
-  /** @domName SVGPathSegArcRel.largeArcFlag */
-  bool largeArcFlag;
-
-  /** @domName SVGPathSegArcRel.r1 */
-  num r1;
-
-  /** @domName SVGPathSegArcRel.r2 */
-  num r2;
-
-  /** @domName SVGPathSegArcRel.sweepFlag */
-  bool sweepFlag;
-
-  /** @domName SVGPathSegArcRel.x */
-  num x;
-
-  /** @domName SVGPathSegArcRel.y */
-  num y;
-}
-
-class _SVGPathSegArcRelImpl extends _SVGPathSegImpl implements SVGPathSegArcRel native "*SVGPathSegArcRel" {
-
-  num angle;
-
-  bool largeArcFlag;
-
-  num r1;
-
-  num r2;
-
-  bool sweepFlag;
-
-  num x;
-
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegClosePath
-abstract class SVGPathSegClosePath implements SVGPathSeg {
-}
-
-class _SVGPathSegClosePathImpl extends _SVGPathSegImpl implements SVGPathSegClosePath native "*SVGPathSegClosePath" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegCurvetoCubicAbs
-abstract class SVGPathSegCurvetoCubicAbs implements SVGPathSeg {
-
-  /** @domName SVGPathSegCurvetoCubicAbs.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoCubicAbs.x1 */
-  num x1;
-
-  /** @domName SVGPathSegCurvetoCubicAbs.x2 */
-  num x2;
-
-  /** @domName SVGPathSegCurvetoCubicAbs.y */
-  num y;
-
-  /** @domName SVGPathSegCurvetoCubicAbs.y1 */
-  num y1;
-
-  /** @domName SVGPathSegCurvetoCubicAbs.y2 */
-  num y2;
-}
-
-class _SVGPathSegCurvetoCubicAbsImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoCubicAbs native "*SVGPathSegCurvetoCubicAbs" {
-
-  num x;
-
-  num x1;
-
-  num x2;
-
-  num y;
-
-  num y1;
-
-  num y2;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegCurvetoCubicRel
-abstract class SVGPathSegCurvetoCubicRel implements SVGPathSeg {
-
-  /** @domName SVGPathSegCurvetoCubicRel.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoCubicRel.x1 */
-  num x1;
-
-  /** @domName SVGPathSegCurvetoCubicRel.x2 */
-  num x2;
-
-  /** @domName SVGPathSegCurvetoCubicRel.y */
-  num y;
-
-  /** @domName SVGPathSegCurvetoCubicRel.y1 */
-  num y1;
-
-  /** @domName SVGPathSegCurvetoCubicRel.y2 */
-  num y2;
-}
-
-class _SVGPathSegCurvetoCubicRelImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoCubicRel native "*SVGPathSegCurvetoCubicRel" {
-
-  num x;
-
-  num x1;
-
-  num x2;
-
-  num y;
-
-  num y1;
-
-  num y2;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegCurvetoCubicSmoothAbs
-abstract class SVGPathSegCurvetoCubicSmoothAbs implements SVGPathSeg {
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x2 */
-  num x2;
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y */
-  num y;
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y2 */
-  num y2;
-}
-
-class _SVGPathSegCurvetoCubicSmoothAbsImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoCubicSmoothAbs native "*SVGPathSegCurvetoCubicSmoothAbs" {
-
-  num x;
-
-  num x2;
-
-  num y;
-
-  num y2;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegCurvetoCubicSmoothRel
-abstract class SVGPathSegCurvetoCubicSmoothRel implements SVGPathSeg {
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.x2 */
-  num x2;
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.y */
-  num y;
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.y2 */
-  num y2;
-}
-
-class _SVGPathSegCurvetoCubicSmoothRelImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoCubicSmoothRel native "*SVGPathSegCurvetoCubicSmoothRel" {
-
-  num x;
-
-  num x2;
-
-  num y;
-
-  num y2;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegCurvetoQuadraticAbs
-abstract class SVGPathSegCurvetoQuadraticAbs implements SVGPathSeg {
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.x1 */
-  num x1;
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.y */
-  num y;
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.y1 */
-  num y1;
-}
-
-class _SVGPathSegCurvetoQuadraticAbsImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoQuadraticAbs native "*SVGPathSegCurvetoQuadraticAbs" {
-
-  num x;
-
-  num x1;
-
-  num y;
-
-  num y1;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegCurvetoQuadraticRel
-abstract class SVGPathSegCurvetoQuadraticRel implements SVGPathSeg {
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.x1 */
-  num x1;
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.y */
-  num y;
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.y1 */
-  num y1;
-}
-
-class _SVGPathSegCurvetoQuadraticRelImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoQuadraticRel native "*SVGPathSegCurvetoQuadraticRel" {
-
-  num x;
-
-  num x1;
-
-  num y;
-
-  num y1;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegCurvetoQuadraticSmoothAbs
-abstract class SVGPathSegCurvetoQuadraticSmoothAbs implements SVGPathSeg {
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.y */
-  num y;
-}
-
-class _SVGPathSegCurvetoQuadraticSmoothAbsImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoQuadraticSmoothAbs native "*SVGPathSegCurvetoQuadraticSmoothAbs" {
-
-  num x;
-
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegCurvetoQuadraticSmoothRel
-abstract class SVGPathSegCurvetoQuadraticSmoothRel implements SVGPathSeg {
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.y */
-  num y;
-}
-
-class _SVGPathSegCurvetoQuadraticSmoothRelImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoQuadraticSmoothRel native "*SVGPathSegCurvetoQuadraticSmoothRel" {
-
-  num x;
-
-  num y;
-}
-
-class _SVGPathSegImpl implements SVGPathSeg native "*SVGPathSeg" {
-
-  final int pathSegType;
-
-  final String pathSegTypeAsLetter;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegLinetoAbs
-abstract class SVGPathSegLinetoAbs implements SVGPathSeg {
-
-  /** @domName SVGPathSegLinetoAbs.x */
-  num x;
-
-  /** @domName SVGPathSegLinetoAbs.y */
-  num y;
-}
-
-class _SVGPathSegLinetoAbsImpl extends _SVGPathSegImpl implements SVGPathSegLinetoAbs native "*SVGPathSegLinetoAbs" {
-
-  num x;
-
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegLinetoHorizontalAbs
-abstract class SVGPathSegLinetoHorizontalAbs implements SVGPathSeg {
-
-  /** @domName SVGPathSegLinetoHorizontalAbs.x */
-  num x;
-}
-
-class _SVGPathSegLinetoHorizontalAbsImpl extends _SVGPathSegImpl implements SVGPathSegLinetoHorizontalAbs native "*SVGPathSegLinetoHorizontalAbs" {
-
-  num x;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegLinetoHorizontalRel
-abstract class SVGPathSegLinetoHorizontalRel implements SVGPathSeg {
-
-  /** @domName SVGPathSegLinetoHorizontalRel.x */
-  num x;
-}
-
-class _SVGPathSegLinetoHorizontalRelImpl extends _SVGPathSegImpl implements SVGPathSegLinetoHorizontalRel native "*SVGPathSegLinetoHorizontalRel" {
-
-  num x;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegLinetoRel
-abstract class SVGPathSegLinetoRel implements SVGPathSeg {
-
-  /** @domName SVGPathSegLinetoRel.x */
-  num x;
-
-  /** @domName SVGPathSegLinetoRel.y */
-  num y;
-}
-
-class _SVGPathSegLinetoRelImpl extends _SVGPathSegImpl implements SVGPathSegLinetoRel native "*SVGPathSegLinetoRel" {
-
-  num x;
-
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegLinetoVerticalAbs
-abstract class SVGPathSegLinetoVerticalAbs implements SVGPathSeg {
-
-  /** @domName SVGPathSegLinetoVerticalAbs.y */
-  num y;
-}
-
-class _SVGPathSegLinetoVerticalAbsImpl extends _SVGPathSegImpl implements SVGPathSegLinetoVerticalAbs native "*SVGPathSegLinetoVerticalAbs" {
-
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegLinetoVerticalRel
-abstract class SVGPathSegLinetoVerticalRel implements SVGPathSeg {
-
-  /** @domName SVGPathSegLinetoVerticalRel.y */
-  num y;
-}
-
-class _SVGPathSegLinetoVerticalRelImpl extends _SVGPathSegImpl implements SVGPathSegLinetoVerticalRel native "*SVGPathSegLinetoVerticalRel" {
-
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegList
-abstract class SVGPathSegList implements List<SVGPathSeg> {
-
-  /** @domName SVGPathSegList.numberOfItems */
-  int get numberOfItems;
-
-  /** @domName SVGPathSegList.appendItem */
-  SVGPathSeg appendItem(SVGPathSeg newItem);
-
-  /** @domName SVGPathSegList.clear */
-  void clear();
-
-  /** @domName SVGPathSegList.getItem */
-  SVGPathSeg getItem(int index);
-
-  /** @domName SVGPathSegList.initialize */
-  SVGPathSeg initialize(SVGPathSeg newItem);
-
-  /** @domName SVGPathSegList.insertItemBefore */
-  SVGPathSeg insertItemBefore(SVGPathSeg newItem, int index);
-
-  /** @domName SVGPathSegList.removeItem */
-  SVGPathSeg removeItem(int index);
-
-  /** @domName SVGPathSegList.replaceItem */
-  SVGPathSeg replaceItem(SVGPathSeg newItem, int index);
-}
-
-class _SVGPathSegListImpl implements SVGPathSegList, JavaScriptIndexingBehavior native "*SVGPathSegList" {
-
-  final int numberOfItems;
-
-  _SVGPathSegImpl operator[](int index) => JS("_SVGPathSegImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _SVGPathSegImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SVGPathSeg> mixins.
-  // SVGPathSeg is the element type.
-
-  // From Iterable<SVGPathSeg>:
-
-  Iterator<SVGPathSeg> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SVGPathSeg>(this);
-  }
-
-  // From Collection<SVGPathSeg>:
-
-  void add(SVGPathSeg value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SVGPathSeg value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SVGPathSeg> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SVGPathSeg element) => _Collections.contains(this, element);
-
-  void forEach(void f(SVGPathSeg element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SVGPathSeg element)) => _Collections.map(this, [], f);
-
-  Collection<SVGPathSeg> filter(bool f(SVGPathSeg element)) =>
-     _Collections.filter(this, <SVGPathSeg>[], f);
-
-  bool every(bool f(SVGPathSeg element)) => _Collections.every(this, f);
-
-  bool some(bool f(SVGPathSeg element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SVGPathSeg>:
-
-  void sort([Comparator<SVGPathSeg> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SVGPathSeg element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SVGPathSeg element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SVGPathSeg get last => this[length - 1];
-
-  SVGPathSeg removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SVGPathSeg> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SVGPathSeg initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SVGPathSeg> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGPathSeg>[]);
-
-  // -- end List<SVGPathSeg> mixins.
-
-  _SVGPathSegImpl appendItem(_SVGPathSegImpl newItem) native;
-
-  void clear() native;
-
-  _SVGPathSegImpl getItem(int index) native;
-
-  _SVGPathSegImpl initialize(_SVGPathSegImpl newItem) native;
-
-  _SVGPathSegImpl insertItemBefore(_SVGPathSegImpl newItem, int index) native;
-
-  _SVGPathSegImpl removeItem(int index) native;
-
-  _SVGPathSegImpl replaceItem(_SVGPathSegImpl newItem, int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegMovetoAbs
-abstract class SVGPathSegMovetoAbs implements SVGPathSeg {
-
-  /** @domName SVGPathSegMovetoAbs.x */
-  num x;
-
-  /** @domName SVGPathSegMovetoAbs.y */
-  num y;
-}
-
-class _SVGPathSegMovetoAbsImpl extends _SVGPathSegImpl implements SVGPathSegMovetoAbs native "*SVGPathSegMovetoAbs" {
-
-  num x;
-
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPathSegMovetoRel
-abstract class SVGPathSegMovetoRel implements SVGPathSeg {
-
-  /** @domName SVGPathSegMovetoRel.x */
-  num x;
-
-  /** @domName SVGPathSegMovetoRel.y */
-  num y;
-}
-
-class _SVGPathSegMovetoRelImpl extends _SVGPathSegImpl implements SVGPathSegMovetoRel native "*SVGPathSegMovetoRel" {
-
-  num x;
-
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPatternElement
-abstract class SVGPatternElement implements SVGElement, SVGURIReference, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGFitToViewBox {
-
-  /** @domName SVGPatternElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGPatternElement.patternContentUnits */
-  SVGAnimatedEnumeration get patternContentUnits;
-
-  /** @domName SVGPatternElement.patternTransform */
-  SVGAnimatedTransformList get patternTransform;
-
-  /** @domName SVGPatternElement.patternUnits */
-  SVGAnimatedEnumeration get patternUnits;
-
-  /** @domName SVGPatternElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGPatternElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGPatternElement.y */
-  SVGAnimatedLength get y;
-}
-
-class _SVGPatternElementImpl extends _SVGElementImpl implements SVGPatternElement native "*SVGPatternElement" {
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedEnumerationImpl patternContentUnits;
-
-  final _SVGAnimatedTransformListImpl patternTransform;
-
-  final _SVGAnimatedEnumerationImpl patternUnits;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGFitToViewBox
-
-  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
-
-  final _SVGAnimatedRectImpl viewBox;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPoint
-abstract class SVGPoint {
-
-  /** @domName SVGPoint.x */
-  num x;
-
-  /** @domName SVGPoint.y */
-  num y;
-
-  /** @domName SVGPoint.matrixTransform */
-  SVGPoint matrixTransform(SVGMatrix matrix);
-}
-
-class _SVGPointImpl implements SVGPoint native "*SVGPoint" {
-
-  num x;
-
-  num y;
-
-  _SVGPointImpl matrixTransform(_SVGMatrixImpl matrix) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPointList
-abstract class SVGPointList {
-
-  /** @domName SVGPointList.numberOfItems */
-  int get numberOfItems;
-
-  /** @domName SVGPointList.appendItem */
-  SVGPoint appendItem(SVGPoint item);
-
-  /** @domName SVGPointList.clear */
-  void clear();
-
-  /** @domName SVGPointList.getItem */
-  SVGPoint getItem(int index);
-
-  /** @domName SVGPointList.initialize */
-  SVGPoint initialize(SVGPoint item);
-
-  /** @domName SVGPointList.insertItemBefore */
-  SVGPoint insertItemBefore(SVGPoint item, int index);
-
-  /** @domName SVGPointList.removeItem */
-  SVGPoint removeItem(int index);
-
-  /** @domName SVGPointList.replaceItem */
-  SVGPoint replaceItem(SVGPoint item, int index);
-}
-
-class _SVGPointListImpl implements SVGPointList native "*SVGPointList" {
-
-  final int numberOfItems;
-
-  _SVGPointImpl appendItem(_SVGPointImpl item) native;
-
-  void clear() native;
-
-  _SVGPointImpl getItem(int index) native;
-
-  _SVGPointImpl initialize(_SVGPointImpl item) native;
-
-  _SVGPointImpl insertItemBefore(_SVGPointImpl item, int index) native;
-
-  _SVGPointImpl removeItem(int index) native;
-
-  _SVGPointImpl replaceItem(_SVGPointImpl item, int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPolygonElement
-abstract class SVGPolygonElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-
-  /** @domName SVGPolygonElement.animatedPoints */
-  SVGPointList get animatedPoints;
-
-  /** @domName SVGPolygonElement.points */
-  SVGPointList get points;
-}
-
-class _SVGPolygonElementImpl extends _SVGElementImpl implements SVGPolygonElement native "*SVGPolygonElement" {
-
-  final _SVGPointListImpl animatedPoints;
-
-  final _SVGPointListImpl points;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPolylineElement
-abstract class SVGPolylineElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-
-  /** @domName SVGPolylineElement.animatedPoints */
-  SVGPointList get animatedPoints;
-
-  /** @domName SVGPolylineElement.points */
-  SVGPointList get points;
-}
-
-class _SVGPolylineElementImpl extends _SVGElementImpl implements SVGPolylineElement native "*SVGPolylineElement" {
-
-  final _SVGPointListImpl animatedPoints;
-
-  final _SVGPointListImpl points;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGPreserveAspectRatio
-abstract class SVGPreserveAspectRatio {
-
-  static const int SVG_MEETORSLICE_MEET = 1;
-
-  static const int SVG_MEETORSLICE_SLICE = 2;
-
-  static const int SVG_MEETORSLICE_UNKNOWN = 0;
-
-  static const int SVG_PRESERVEASPECTRATIO_NONE = 1;
-
-  static const int SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;
-
-  static const int SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;
-
-  static const int SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;
-
-  static const int SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;
-
-  static const int SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;
-
-  static const int SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;
-
-  static const int SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;
-
-  static const int SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;
-
-  static const int SVG_PRESERVEASPECTRATIO_XMINYMID = 5;
-
-  static const int SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
-
-  /** @domName SVGPreserveAspectRatio.align */
-  int align;
-
-  /** @domName SVGPreserveAspectRatio.meetOrSlice */
-  int meetOrSlice;
-}
-
-class _SVGPreserveAspectRatioImpl implements SVGPreserveAspectRatio native "*SVGPreserveAspectRatio" {
-
-  int align;
-
-  int meetOrSlice;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGRadialGradientElement
-abstract class SVGRadialGradientElement implements SVGGradientElement {
-
-  /** @domName SVGRadialGradientElement.cx */
-  SVGAnimatedLength get cx;
-
-  /** @domName SVGRadialGradientElement.cy */
-  SVGAnimatedLength get cy;
-
-  /** @domName SVGRadialGradientElement.fr */
-  SVGAnimatedLength get fr;
-
-  /** @domName SVGRadialGradientElement.fx */
-  SVGAnimatedLength get fx;
-
-  /** @domName SVGRadialGradientElement.fy */
-  SVGAnimatedLength get fy;
-
-  /** @domName SVGRadialGradientElement.r */
-  SVGAnimatedLength get r;
-}
-
-class _SVGRadialGradientElementImpl extends _SVGGradientElementImpl implements SVGRadialGradientElement native "*SVGRadialGradientElement" {
-
-  final _SVGAnimatedLengthImpl cx;
-
-  final _SVGAnimatedLengthImpl cy;
-
-  final _SVGAnimatedLengthImpl fr;
-
-  final _SVGAnimatedLengthImpl fx;
-
-  final _SVGAnimatedLengthImpl fy;
-
-  final _SVGAnimatedLengthImpl r;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGRect
-abstract class SVGRect {
-
-  /** @domName SVGRect.height */
-  num height;
-
-  /** @domName SVGRect.width */
-  num width;
-
-  /** @domName SVGRect.x */
-  num x;
-
-  /** @domName SVGRect.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGRectElement
-abstract class SVGRectElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-
-  /** @domName SVGRectElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGRectElement.rx */
-  SVGAnimatedLength get rx;
-
-  /** @domName SVGRectElement.ry */
-  SVGAnimatedLength get ry;
-
-  /** @domName SVGRectElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGRectElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGRectElement.y */
-  SVGAnimatedLength get y;
-}
-
-class _SVGRectElementImpl extends _SVGElementImpl implements SVGRectElement native "*SVGRectElement" {
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGAnimatedLengthImpl rx;
-
-  final _SVGAnimatedLengthImpl ry;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-}
-
-class _SVGRectImpl implements SVGRect native "*SVGRect" {
-
-  num height;
-
-  num width;
-
-  num x;
-
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGRenderingIntent
-abstract class SVGRenderingIntent {
-
-  static const int RENDERING_INTENT_ABSOLUTE_COLORIMETRIC = 5;
-
-  static const int RENDERING_INTENT_AUTO = 1;
-
-  static const int RENDERING_INTENT_PERCEPTUAL = 2;
-
-  static const int RENDERING_INTENT_RELATIVE_COLORIMETRIC = 3;
-
-  static const int RENDERING_INTENT_SATURATION = 4;
-
-  static const int RENDERING_INTENT_UNKNOWN = 0;
-}
-
-class _SVGRenderingIntentImpl implements SVGRenderingIntent native "*SVGRenderingIntent" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName SVGSVGElement
-abstract class SVGSVGElement extends SVGElement implements SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGLocatable, SVGFitToViewBox, SVGZoomAndPan {
-  factory SVGSVGElement() => _SVGSVGElementFactoryProvider.createSVGSVGElement();
-
-
-  /** @domName SVGSVGElement.contentScriptType */
-  String contentScriptType;
-
-  /** @domName SVGSVGElement.contentStyleType */
-  String contentStyleType;
-
-  /** @domName SVGSVGElement.currentScale */
-  num currentScale;
-
-  /** @domName SVGSVGElement.currentTranslate */
-  SVGPoint get currentTranslate;
-
-  /** @domName SVGSVGElement.currentView */
-  SVGViewSpec get currentView;
-
-  /** @domName SVGSVGElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGSVGElement.pixelUnitToMillimeterX */
-  num get pixelUnitToMillimeterX;
-
-  /** @domName SVGSVGElement.pixelUnitToMillimeterY */
-  num get pixelUnitToMillimeterY;
-
-  /** @domName SVGSVGElement.screenPixelToMillimeterX */
-  num get screenPixelToMillimeterX;
-
-  /** @domName SVGSVGElement.screenPixelToMillimeterY */
-  num get screenPixelToMillimeterY;
-
-  /** @domName SVGSVGElement.useCurrentView */
-  bool get useCurrentView;
-
-  /** @domName SVGSVGElement.viewport */
-  SVGRect get viewport;
-
-  /** @domName SVGSVGElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGSVGElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGSVGElement.y */
-  SVGAnimatedLength get y;
-
-  /** @domName SVGSVGElement.animationsPaused */
-  bool animationsPaused();
-
-  /** @domName SVGSVGElement.checkEnclosure */
-  bool checkEnclosure(SVGElement element, SVGRect rect);
-
-  /** @domName SVGSVGElement.checkIntersection */
-  bool checkIntersection(SVGElement element, SVGRect rect);
-
-  /** @domName SVGSVGElement.createSVGAngle */
-  SVGAngle createSVGAngle();
-
-  /** @domName SVGSVGElement.createSVGLength */
-  SVGLength createSVGLength();
-
-  /** @domName SVGSVGElement.createSVGMatrix */
-  SVGMatrix createSVGMatrix();
-
-  /** @domName SVGSVGElement.createSVGNumber */
-  SVGNumber createSVGNumber();
-
-  /** @domName SVGSVGElement.createSVGPoint */
-  SVGPoint createSVGPoint();
-
-  /** @domName SVGSVGElement.createSVGRect */
-  SVGRect createSVGRect();
-
-  /** @domName SVGSVGElement.createSVGTransform */
-  SVGTransform createSVGTransform();
-
-  /** @domName SVGSVGElement.createSVGTransformFromMatrix */
-  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix);
-
-  /** @domName SVGSVGElement.deselectAll */
-  void deselectAll();
-
-  /** @domName SVGSVGElement.forceRedraw */
-  void forceRedraw();
-
-  /** @domName SVGSVGElement.getCurrentTime */
-  num getCurrentTime();
-
-  /** @domName SVGSVGElement.getElementById */
-  Element getElementById(String elementId);
-
-  /** @domName SVGSVGElement.getEnclosureList */
-  List<Node> getEnclosureList(SVGRect rect, SVGElement referenceElement);
-
-  /** @domName SVGSVGElement.getIntersectionList */
-  List<Node> getIntersectionList(SVGRect rect, SVGElement referenceElement);
-
-  /** @domName SVGSVGElement.pauseAnimations */
-  void pauseAnimations();
-
-  /** @domName SVGSVGElement.setCurrentTime */
-  void setCurrentTime(num seconds);
-
-  /** @domName SVGSVGElement.suspendRedraw */
-  int suspendRedraw(int maxWaitMilliseconds);
-
-  /** @domName SVGSVGElement.unpauseAnimations */
-  void unpauseAnimations();
-
-  /** @domName SVGSVGElement.unsuspendRedraw */
-  void unsuspendRedraw(int suspendHandleId);
-
-  /** @domName SVGSVGElement.unsuspendRedrawAll */
-  void unsuspendRedrawAll();
-
-}
-
-class _SVGSVGElementImpl extends _SVGElementImpl implements SVGSVGElement native "*SVGSVGElement" {
-
-  String contentScriptType;
-
-  String contentStyleType;
-
-  num currentScale;
-
-  final _SVGPointImpl currentTranslate;
-
-  final _SVGViewSpecImpl currentView;
-
-  final _SVGAnimatedLengthImpl height;
-
-  final num pixelUnitToMillimeterX;
-
-  final num pixelUnitToMillimeterY;
-
-  final num screenPixelToMillimeterX;
-
-  final num screenPixelToMillimeterY;
-
-  final bool useCurrentView;
-
-  final _SVGRectImpl viewport;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  bool animationsPaused() native;
-
-  bool checkEnclosure(_SVGElementImpl element, _SVGRectImpl rect) native;
-
-  bool checkIntersection(_SVGElementImpl element, _SVGRectImpl rect) native;
-
-  _SVGAngleImpl createSVGAngle() native;
-
-  _SVGLengthImpl createSVGLength() native;
-
-  _SVGMatrixImpl createSVGMatrix() native;
-
-  _SVGNumberImpl createSVGNumber() native;
-
-  _SVGPointImpl createSVGPoint() native;
-
-  _SVGRectImpl createSVGRect() native;
-
-  _SVGTransformImpl createSVGTransform() native;
-
-  _SVGTransformImpl createSVGTransformFromMatrix(_SVGMatrixImpl matrix) native;
-
-  void deselectAll() native;
-
-  void forceRedraw() native;
-
-  num getCurrentTime() native;
-
-  _ElementImpl getElementById(String elementId) native;
-
-  List<Node> getEnclosureList(_SVGRectImpl rect, _SVGElementImpl referenceElement) native;
-
-  List<Node> getIntersectionList(_SVGRectImpl rect, _SVGElementImpl referenceElement) native;
-
-  void pauseAnimations() native;
-
-  void setCurrentTime(num seconds) native;
-
-  int suspendRedraw(int maxWaitMilliseconds) native;
-
-  void unpauseAnimations() native;
-
-  void unsuspendRedraw(int suspendHandleId) native;
-
-  void unsuspendRedrawAll() native;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGFitToViewBox
-
-  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
-
-  final _SVGAnimatedRectImpl viewBox;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGZoomAndPan
-
-  int zoomAndPan;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGScriptElement
-abstract class SVGScriptElement implements SVGElement, SVGURIReference, SVGExternalResourcesRequired {
-
-  /** @domName SVGScriptElement.type */
-  String type;
-}
-
-class _SVGScriptElementImpl extends _SVGElementImpl implements SVGScriptElement native "*SVGScriptElement" {
-
-  String type;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGSetElement
-abstract class SVGSetElement implements SVGAnimationElement {
-}
-
-class _SVGSetElementImpl extends _SVGAnimationElementImpl implements SVGSetElement native "*SVGSetElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGStopElement
-abstract class SVGStopElement implements SVGElement, SVGStylable {
-
-  /** @domName SVGStopElement.offset */
-  SVGAnimatedNumber get offset;
-}
-
-class _SVGStopElementImpl extends _SVGElementImpl implements SVGStopElement native "*SVGStopElement" {
-
-  final _SVGAnimatedNumberImpl offset;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGStringList
-abstract class SVGStringList implements List<String> {
-
-  /** @domName SVGStringList.numberOfItems */
-  int get numberOfItems;
-
-  /** @domName SVGStringList.appendItem */
-  String appendItem(String item);
-
-  /** @domName SVGStringList.clear */
-  void clear();
-
-  /** @domName SVGStringList.getItem */
-  String getItem(int index);
-
-  /** @domName SVGStringList.initialize */
-  String initialize(String item);
-
-  /** @domName SVGStringList.insertItemBefore */
-  String insertItemBefore(String item, int index);
-
-  /** @domName SVGStringList.removeItem */
-  String removeItem(int index);
-
-  /** @domName SVGStringList.replaceItem */
-  String replaceItem(String item, int index);
-}
-
-class _SVGStringListImpl implements SVGStringList, JavaScriptIndexingBehavior native "*SVGStringList" {
-
-  final int numberOfItems;
-
-  String operator[](int index) => JS("String", "#[#]", this, index);
-
-  void operator[]=(int index, String value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<String> mixins.
-  // String is the element type.
-
-  // From Iterable<String>:
-
-  Iterator<String> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<String>(this);
-  }
-
-  // From Collection<String>:
-
-  void add(String value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(String value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<String> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(String element) => _Collections.contains(this, element);
-
-  void forEach(void f(String element)) => _Collections.forEach(this, f);
-
-  Collection map(f(String element)) => _Collections.map(this, [], f);
-
-  Collection<String> filter(bool f(String element)) =>
-     _Collections.filter(this, <String>[], f);
-
-  bool every(bool f(String element)) => _Collections.every(this, f);
-
-  bool some(bool f(String element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<String>:
-
-  void sort([Comparator<String> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(String element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(String element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  String get last => this[length - 1];
-
-  String removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [String initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<String> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <String>[]);
-
-  // -- end List<String> mixins.
-
-  String appendItem(String item) native;
-
-  void clear() native;
-
-  String getItem(int index) native;
-
-  String initialize(String item) native;
-
-  String insertItemBefore(String item, int index) native;
-
-  String removeItem(int index) native;
-
-  String replaceItem(String item, int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGStylable
-abstract class SVGStylable {
-
-  /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName;
-
-  /** @domName SVGStylable.style */
-  CSSStyleDeclaration get style;
-
-  /** @domName SVGStylable.getPresentationAttribute */
-  CSSValue getPresentationAttribute(String name);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGStyleElement
-abstract class SVGStyleElement implements SVGElement, SVGLangSpace {
-
-  /** @domName SVGStyleElement.disabled */
-  bool disabled;
-
-  /** @domName SVGStyleElement.media */
-  String media;
-
-  /** @domName SVGStyleElement.title */
-  String title;
-
-  /** @domName SVGStyleElement.type */
-  String type;
-}
-
-class _SVGStyleElementImpl extends _SVGElementImpl implements SVGStyleElement native "*SVGStyleElement" {
-
-  bool disabled;
-
-  String media;
-
-  // Shadowing definition.
-  String get title => JS("String", "#.title", this);
-
-  void set title(String value) {
-    JS("void", "#.title = #", this, value);
-  }
-
-  String type;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGSwitchElement
-abstract class SVGSwitchElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-}
-
-class _SVGSwitchElementImpl extends _SVGElementImpl implements SVGSwitchElement native "*SVGSwitchElement" {
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGSymbolElement
-abstract class SVGSymbolElement implements SVGElement, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGFitToViewBox {
-}
-
-class _SVGSymbolElementImpl extends _SVGElementImpl implements SVGSymbolElement native "*SVGSymbolElement" {
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGFitToViewBox
-
-  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
-
-  final _SVGAnimatedRectImpl viewBox;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGTRefElement
-abstract class SVGTRefElement implements SVGTextPositioningElement, SVGURIReference {
-}
-
-class _SVGTRefElementImpl extends _SVGTextPositioningElementImpl implements SVGTRefElement native "*SVGTRefElement" {
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGTSpanElement
-abstract class SVGTSpanElement implements SVGTextPositioningElement {
-}
-
-class _SVGTSpanElementImpl extends _SVGTextPositioningElementImpl implements SVGTSpanElement native "*SVGTSpanElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGTests
-abstract class SVGTests {
-
-  /** @domName SVGTests.requiredExtensions */
-  SVGStringList get requiredExtensions;
-
-  /** @domName SVGTests.requiredFeatures */
-  SVGStringList get requiredFeatures;
-
-  /** @domName SVGTests.systemLanguage */
-  SVGStringList get systemLanguage;
-
-  /** @domName SVGTests.hasExtension */
-  bool hasExtension(String extension);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGTextContentElement
-abstract class SVGTextContentElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable {
-
-  static const int LENGTHADJUST_SPACING = 1;
-
-  static const int LENGTHADJUST_SPACINGANDGLYPHS = 2;
-
-  static const int LENGTHADJUST_UNKNOWN = 0;
-
-  /** @domName SVGTextContentElement.lengthAdjust */
-  SVGAnimatedEnumeration get lengthAdjust;
-
-  /** @domName SVGTextContentElement.textLength */
-  SVGAnimatedLength get textLength;
-
-  /** @domName SVGTextContentElement.getCharNumAtPosition */
-  int getCharNumAtPosition(SVGPoint point);
-
-  /** @domName SVGTextContentElement.getComputedTextLength */
-  num getComputedTextLength();
-
-  /** @domName SVGTextContentElement.getEndPositionOfChar */
-  SVGPoint getEndPositionOfChar(int offset);
-
-  /** @domName SVGTextContentElement.getExtentOfChar */
-  SVGRect getExtentOfChar(int offset);
-
-  /** @domName SVGTextContentElement.getNumberOfChars */
-  int getNumberOfChars();
-
-  /** @domName SVGTextContentElement.getRotationOfChar */
-  num getRotationOfChar(int offset);
-
-  /** @domName SVGTextContentElement.getStartPositionOfChar */
-  SVGPoint getStartPositionOfChar(int offset);
-
-  /** @domName SVGTextContentElement.getSubStringLength */
-  num getSubStringLength(int offset, int length);
-
-  /** @domName SVGTextContentElement.selectSubString */
-  void selectSubString(int offset, int length);
-}
-
-class _SVGTextContentElementImpl extends _SVGElementImpl implements SVGTextContentElement native "*SVGTextContentElement" {
-
-  final _SVGAnimatedEnumerationImpl lengthAdjust;
-
-  final _SVGAnimatedLengthImpl textLength;
-
-  int getCharNumAtPosition(_SVGPointImpl point) native;
-
-  num getComputedTextLength() native;
-
-  _SVGPointImpl getEndPositionOfChar(int offset) native;
-
-  _SVGRectImpl getExtentOfChar(int offset) native;
-
-  int getNumberOfChars() native;
-
-  num getRotationOfChar(int offset) native;
-
-  _SVGPointImpl getStartPositionOfChar(int offset) native;
-
-  num getSubStringLength(int offset, int length) native;
-
-  void selectSubString(int offset, int length) native;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGTextElement
-abstract class SVGTextElement implements SVGTextPositioningElement, SVGTransformable {
-}
-
-class _SVGTextElementImpl extends _SVGTextPositioningElementImpl implements SVGTextElement native "*SVGTextElement" {
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGTextPathElement
-abstract class SVGTextPathElement implements SVGTextContentElement, SVGURIReference {
-
-  static const int TEXTPATH_METHODTYPE_ALIGN = 1;
-
-  static const int TEXTPATH_METHODTYPE_STRETCH = 2;
-
-  static const int TEXTPATH_METHODTYPE_UNKNOWN = 0;
-
-  static const int TEXTPATH_SPACINGTYPE_AUTO = 1;
-
-  static const int TEXTPATH_SPACINGTYPE_EXACT = 2;
-
-  static const int TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
-
-  /** @domName SVGTextPathElement.method */
-  SVGAnimatedEnumeration get method;
-
-  /** @domName SVGTextPathElement.spacing */
-  SVGAnimatedEnumeration get spacing;
-
-  /** @domName SVGTextPathElement.startOffset */
-  SVGAnimatedLength get startOffset;
-}
-
-class _SVGTextPathElementImpl extends _SVGTextContentElementImpl implements SVGTextPathElement native "*SVGTextPathElement" {
-
-  final _SVGAnimatedEnumerationImpl method;
-
-  final _SVGAnimatedEnumerationImpl spacing;
-
-  final _SVGAnimatedLengthImpl startOffset;
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGTextPositioningElement
-abstract class SVGTextPositioningElement implements SVGTextContentElement {
-
-  /** @domName SVGTextPositioningElement.dx */
-  SVGAnimatedLengthList get dx;
-
-  /** @domName SVGTextPositioningElement.dy */
-  SVGAnimatedLengthList get dy;
-
-  /** @domName SVGTextPositioningElement.rotate */
-  SVGAnimatedNumberList get rotate;
-
-  /** @domName SVGTextPositioningElement.x */
-  SVGAnimatedLengthList get x;
-
-  /** @domName SVGTextPositioningElement.y */
-  SVGAnimatedLengthList get y;
-}
-
-class _SVGTextPositioningElementImpl extends _SVGTextContentElementImpl implements SVGTextPositioningElement native "*SVGTextPositioningElement" {
-
-  final _SVGAnimatedLengthListImpl dx;
-
-  final _SVGAnimatedLengthListImpl dy;
-
-  final _SVGAnimatedNumberListImpl rotate;
-
-  final _SVGAnimatedLengthListImpl x;
-
-  final _SVGAnimatedLengthListImpl y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGTitleElement
-abstract class SVGTitleElement implements SVGElement, SVGLangSpace, SVGStylable {
-}
-
-class _SVGTitleElementImpl extends _SVGElementImpl implements SVGTitleElement native "*SVGTitleElement" {
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGTransform
-abstract class SVGTransform {
-
-  static const int SVG_TRANSFORM_MATRIX = 1;
-
-  static const int SVG_TRANSFORM_ROTATE = 4;
-
-  static const int SVG_TRANSFORM_SCALE = 3;
-
-  static const int SVG_TRANSFORM_SKEWX = 5;
-
-  static const int SVG_TRANSFORM_SKEWY = 6;
-
-  static const int SVG_TRANSFORM_TRANSLATE = 2;
-
-  static const int SVG_TRANSFORM_UNKNOWN = 0;
-
-  /** @domName SVGTransform.angle */
-  num get angle;
-
-  /** @domName SVGTransform.matrix */
-  SVGMatrix get matrix;
-
-  /** @domName SVGTransform.type */
-  int get type;
-
-  /** @domName SVGTransform.setMatrix */
-  void setMatrix(SVGMatrix matrix);
-
-  /** @domName SVGTransform.setRotate */
-  void setRotate(num angle, num cx, num cy);
-
-  /** @domName SVGTransform.setScale */
-  void setScale(num sx, num sy);
-
-  /** @domName SVGTransform.setSkewX */
-  void setSkewX(num angle);
-
-  /** @domName SVGTransform.setSkewY */
-  void setSkewY(num angle);
-
-  /** @domName SVGTransform.setTranslate */
-  void setTranslate(num tx, num ty);
-}
-
-class _SVGTransformImpl implements SVGTransform native "*SVGTransform" {
-
-  final num angle;
-
-  final _SVGMatrixImpl matrix;
-
-  final int type;
-
-  void setMatrix(_SVGMatrixImpl matrix) native;
-
-  void setRotate(num angle, num cx, num cy) native;
-
-  void setScale(num sx, num sy) native;
-
-  void setSkewX(num angle) native;
-
-  void setSkewY(num angle) native;
-
-  void setTranslate(num tx, num ty) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGTransformList
-abstract class SVGTransformList implements List<SVGTransform> {
-
-  /** @domName SVGTransformList.numberOfItems */
-  int get numberOfItems;
-
-  /** @domName SVGTransformList.appendItem */
-  SVGTransform appendItem(SVGTransform item);
-
-  /** @domName SVGTransformList.clear */
-  void clear();
-
-  /** @domName SVGTransformList.consolidate */
-  SVGTransform consolidate();
-
-  /** @domName SVGTransformList.createSVGTransformFromMatrix */
-  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix);
-
-  /** @domName SVGTransformList.getItem */
-  SVGTransform getItem(int index);
-
-  /** @domName SVGTransformList.initialize */
-  SVGTransform initialize(SVGTransform item);
-
-  /** @domName SVGTransformList.insertItemBefore */
-  SVGTransform insertItemBefore(SVGTransform item, int index);
-
-  /** @domName SVGTransformList.removeItem */
-  SVGTransform removeItem(int index);
-
-  /** @domName SVGTransformList.replaceItem */
-  SVGTransform replaceItem(SVGTransform item, int index);
-}
-
-class _SVGTransformListImpl implements SVGTransformList, JavaScriptIndexingBehavior native "*SVGTransformList" {
-
-  final int numberOfItems;
-
-  _SVGTransformImpl operator[](int index) => JS("_SVGTransformImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _SVGTransformImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SVGTransform> mixins.
-  // SVGTransform is the element type.
-
-  // From Iterable<SVGTransform>:
-
-  Iterator<SVGTransform> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SVGTransform>(this);
-  }
-
-  // From Collection<SVGTransform>:
-
-  void add(SVGTransform value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SVGTransform value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SVGTransform> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SVGTransform element) => _Collections.contains(this, element);
-
-  void forEach(void f(SVGTransform element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SVGTransform element)) => _Collections.map(this, [], f);
-
-  Collection<SVGTransform> filter(bool f(SVGTransform element)) =>
-     _Collections.filter(this, <SVGTransform>[], f);
-
-  bool every(bool f(SVGTransform element)) => _Collections.every(this, f);
-
-  bool some(bool f(SVGTransform element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SVGTransform>:
-
-  void sort([Comparator<SVGTransform> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SVGTransform element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SVGTransform element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SVGTransform get last => this[length - 1];
-
-  SVGTransform removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SVGTransform> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SVGTransform initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SVGTransform> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGTransform>[]);
-
-  // -- end List<SVGTransform> mixins.
-
-  _SVGTransformImpl appendItem(_SVGTransformImpl item) native;
-
-  void clear() native;
-
-  _SVGTransformImpl consolidate() native;
-
-  _SVGTransformImpl createSVGTransformFromMatrix(_SVGMatrixImpl matrix) native;
-
-  _SVGTransformImpl getItem(int index) native;
-
-  _SVGTransformImpl initialize(_SVGTransformImpl item) native;
-
-  _SVGTransformImpl insertItemBefore(_SVGTransformImpl item, int index) native;
-
-  _SVGTransformImpl removeItem(int index) native;
-
-  _SVGTransformImpl replaceItem(_SVGTransformImpl item, int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGTransformable
-abstract class SVGTransformable implements SVGLocatable {
-
-  /** @domName SVGTransformable.transform */
-  SVGAnimatedTransformList get transform;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGURIReference
-abstract class SVGURIReference {
-
-  /** @domName SVGURIReference.href */
-  SVGAnimatedString get href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGUnitTypes
-abstract class SVGUnitTypes {
-
-  static const int SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
-
-  static const int SVG_UNIT_TYPE_UNKNOWN = 0;
-
-  static const int SVG_UNIT_TYPE_USERSPACEONUSE = 1;
-}
-
-class _SVGUnitTypesImpl implements SVGUnitTypes native "*SVGUnitTypes" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGUseElement
-abstract class SVGUseElement implements SVGElement, SVGURIReference, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-
-  /** @domName SVGUseElement.animatedInstanceRoot */
-  SVGElementInstance get animatedInstanceRoot;
-
-  /** @domName SVGUseElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGUseElement.instanceRoot */
-  SVGElementInstance get instanceRoot;
-
-  /** @domName SVGUseElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGUseElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGUseElement.y */
-  SVGAnimatedLength get y;
-}
-
-class _SVGUseElementImpl extends _SVGElementImpl implements SVGUseElement native "*SVGUseElement" {
-
-  final _SVGElementInstanceImpl animatedInstanceRoot;
-
-  final _SVGAnimatedLengthImpl height;
-
-  final _SVGElementInstanceImpl instanceRoot;
-
-  final _SVGAnimatedLengthImpl width;
-
-  final _SVGAnimatedLengthImpl x;
-
-  final _SVGAnimatedLengthImpl y;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  String xmllang;
-
-  String xmlspace;
-
-  // From SVGLocatable
-
-  final _SVGElementImpl farthestViewportElement;
-
-  final _SVGElementImpl nearestViewportElement;
-
-  _SVGRectImpl getBBox() native;
-
-  _SVGMatrixImpl getCTM() native;
-
-  _SVGMatrixImpl getScreenCTM() native;
-
-  _SVGMatrixImpl getTransformToElement(_SVGElementImpl element) native;
-
-  // From SVGStylable
-
-  _SVGAnimatedStringImpl get $dom_svgClassName => JS("_SVGAnimatedStringImpl", "#.className", this);
-
-  // Use implementation from Element.
-  // final _CSSStyleDeclarationImpl style;
-
-  _CSSValueImpl getPresentationAttribute(String name) native;
-
-  // From SVGTests
-
-  final _SVGStringListImpl requiredExtensions;
-
-  final _SVGStringListImpl requiredFeatures;
-
-  final _SVGStringListImpl systemLanguage;
-
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  final _SVGAnimatedTransformListImpl transform;
-
-  // From SVGURIReference
-
-  final _SVGAnimatedStringImpl href;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGVKernElement
-abstract class SVGVKernElement implements SVGElement {
-}
-
-class _SVGVKernElementImpl extends _SVGElementImpl implements SVGVKernElement native "*SVGVKernElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGViewElement
-abstract class SVGViewElement implements SVGElement, SVGExternalResourcesRequired, SVGFitToViewBox, SVGZoomAndPan {
-
-  /** @domName SVGViewElement.viewTarget */
-  SVGStringList get viewTarget;
-}
-
-class _SVGViewElementImpl extends _SVGElementImpl implements SVGViewElement native "*SVGViewElement" {
-
-  final _SVGStringListImpl viewTarget;
-
-  // From SVGExternalResourcesRequired
-
-  final _SVGAnimatedBooleanImpl externalResourcesRequired;
-
-  // From SVGFitToViewBox
-
-  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
-
-  final _SVGAnimatedRectImpl viewBox;
-
-  // From SVGZoomAndPan
-
-  int zoomAndPan;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGViewSpec
-abstract class SVGViewSpec {
-
-  /** @domName SVGViewSpec.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio;
-
-  /** @domName SVGViewSpec.preserveAspectRatioString */
-  String get preserveAspectRatioString;
-
-  /** @domName SVGViewSpec.transform */
-  SVGTransformList get transform;
-
-  /** @domName SVGViewSpec.transformString */
-  String get transformString;
-
-  /** @domName SVGViewSpec.viewBox */
-  SVGAnimatedRect get viewBox;
-
-  /** @domName SVGViewSpec.viewBoxString */
-  String get viewBoxString;
-
-  /** @domName SVGViewSpec.viewTarget */
-  SVGElement get viewTarget;
-
-  /** @domName SVGViewSpec.viewTargetString */
-  String get viewTargetString;
-
-  /** @domName SVGViewSpec.zoomAndPan */
-  int zoomAndPan;
-}
-
-class _SVGViewSpecImpl implements SVGViewSpec native "*SVGViewSpec" {
-
-  final _SVGAnimatedPreserveAspectRatioImpl preserveAspectRatio;
-
-  final String preserveAspectRatioString;
-
-  final _SVGTransformListImpl transform;
-
-  final String transformString;
-
-  final _SVGAnimatedRectImpl viewBox;
-
-  final String viewBoxString;
-
-  final _SVGElementImpl viewTarget;
-
-  final String viewTargetString;
-
-  int zoomAndPan;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGZoomAndPan
-abstract class SVGZoomAndPan {
-
-  static const int SVG_ZOOMANDPAN_DISABLE = 1;
-
-  static const int SVG_ZOOMANDPAN_MAGNIFY = 2;
-
-  static const int SVG_ZOOMANDPAN_UNKNOWN = 0;
-
-  /** @domName SVGZoomAndPan.zoomAndPan */
-  int zoomAndPan;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGZoomEvent
-abstract class SVGZoomEvent implements UIEvent {
-
-  /** @domName SVGZoomEvent.newScale */
-  num get newScale;
-
-  /** @domName SVGZoomEvent.newTranslate */
-  SVGPoint get newTranslate;
-
-  /** @domName SVGZoomEvent.previousScale */
-  num get previousScale;
-
-  /** @domName SVGZoomEvent.previousTranslate */
-  SVGPoint get previousTranslate;
-
-  /** @domName SVGZoomEvent.zoomRectScreen */
-  SVGRect get zoomRectScreen;
-}
-
-class _SVGZoomEventImpl extends _UIEventImpl implements SVGZoomEvent native "*SVGZoomEvent" {
-
-  final num newScale;
-
-  final _SVGPointImpl newTranslate;
-
-  final num previousScale;
-
-  final _SVGPointImpl previousTranslate;
-
-  final _SVGRectImpl zoomRectScreen;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Screen
-abstract class Screen {
-
-  /** @domName Screen.availHeight */
-  int get availHeight;
-
-  /** @domName Screen.availLeft */
-  int get availLeft;
-
-  /** @domName Screen.availTop */
-  int get availTop;
-
-  /** @domName Screen.availWidth */
-  int get availWidth;
-
-  /** @domName Screen.colorDepth */
-  int get colorDepth;
-
-  /** @domName Screen.height */
-  int get height;
-
-  /** @domName Screen.pixelDepth */
-  int get pixelDepth;
-
-  /** @domName Screen.width */
-  int get width;
-}
-
-class _ScreenImpl implements Screen native "*Screen" {
-
-  final int availHeight;
-
-  final int availLeft;
-
-  final int availTop;
-
-  final int availWidth;
-
-  final int colorDepth;
-
-  final int height;
-
-  final int pixelDepth;
-
-  final int width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLScriptElement
-abstract class ScriptElement implements Element {
-
-  factory ScriptElement() => _Elements.createScriptElement();
-
-  /** @domName HTMLScriptElement.async */
-  bool async;
-
-  /** @domName HTMLScriptElement.charset */
-  String charset;
-
-  /** @domName HTMLScriptElement.crossOrigin */
-  String crossOrigin;
-
-  /** @domName HTMLScriptElement.defer */
-  bool defer;
-
-  /** @domName HTMLScriptElement.event */
-  String event;
-
-  /** @domName HTMLScriptElement.htmlFor */
-  String htmlFor;
-
-  /** @domName HTMLScriptElement.src */
-  String src;
-
-  /** @domName HTMLScriptElement.type */
-  String type;
-}
-
-class _ScriptElementImpl extends _ElementImpl implements ScriptElement native "*HTMLScriptElement" {
-
-  bool async;
-
-  String charset;
-
-  String crossOrigin;
-
-  bool defer;
-
-  String event;
-
-  String htmlFor;
-
-  String src;
-
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ScriptProcessorNode
-abstract class ScriptProcessorNode implements AudioNode, EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  ScriptProcessorNodeEvents get on;
-
-  /** @domName ScriptProcessorNode.bufferSize */
-  int get bufferSize;
-}
-
-abstract class ScriptProcessorNodeEvents implements Events {
-
-  EventListenerList get audioProcess;
-}
-
-class _ScriptProcessorNodeImpl extends _AudioNodeImpl implements ScriptProcessorNode native "*ScriptProcessorNode" {
-
-  _ScriptProcessorNodeEventsImpl get on =>
-    new _ScriptProcessorNodeEventsImpl(this);
-
-  final int bufferSize;
-}
-
-class _ScriptProcessorNodeEventsImpl extends _EventsImpl implements ScriptProcessorNodeEvents {
-  _ScriptProcessorNodeEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get audioProcess => this['audioprocess'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ScriptProfile
-abstract class ScriptProfile {
-
-  /** @domName ScriptProfile.head */
-  ScriptProfileNode get head;
-
-  /** @domName ScriptProfile.title */
-  String get title;
-
-  /** @domName ScriptProfile.uid */
-  int get uid;
-}
-
-class _ScriptProfileImpl implements ScriptProfile native "*ScriptProfile" {
-
-  final _ScriptProfileNodeImpl head;
-
-  final String title;
-
-  final int uid;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ScriptProfileNode
-abstract class ScriptProfileNode {
-
-  /** @domName ScriptProfileNode.callUID */
-  int get callUID;
-
-  /** @domName ScriptProfileNode.functionName */
-  String get functionName;
-
-  /** @domName ScriptProfileNode.lineNumber */
-  int get lineNumber;
-
-  /** @domName ScriptProfileNode.numberOfCalls */
-  int get numberOfCalls;
-
-  /** @domName ScriptProfileNode.selfTime */
-  num get selfTime;
-
-  /** @domName ScriptProfileNode.totalTime */
-  num get totalTime;
-
-  /** @domName ScriptProfileNode.url */
-  String get url;
-
-  /** @domName ScriptProfileNode.visible */
-  bool get visible;
-
-  /** @domName ScriptProfileNode.children */
-  List<ScriptProfileNode> children();
-}
-
-class _ScriptProfileNodeImpl implements ScriptProfileNode native "*ScriptProfileNode" {
-
-  final int callUID;
-
-  final String functionName;
-
-  final int lineNumber;
-
-  final int numberOfCalls;
-
-  final num selfTime;
-
-  final num totalTime;
-
-  final String url;
-
-  final bool visible;
-
-  List<ScriptProfileNode> children() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLSelectElement
-abstract class SelectElement implements Element {
-
-  factory SelectElement() => _Elements.createSelectElement();
-
-  /** @domName HTMLSelectElement.autofocus */
-  bool autofocus;
-
-  /** @domName HTMLSelectElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLSelectElement.form */
-  FormElement get form;
-
-  /** @domName HTMLSelectElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLSelectElement.length */
-  int length;
-
-  /** @domName HTMLSelectElement.multiple */
-  bool multiple;
-
-  /** @domName HTMLSelectElement.name */
-  String name;
-
-  /** @domName HTMLSelectElement.options */
-  HTMLOptionsCollection get options;
-
-  /** @domName HTMLSelectElement.required */
-  bool required;
-
-  /** @domName HTMLSelectElement.selectedIndex */
-  int selectedIndex;
-
-  /** @domName HTMLSelectElement.selectedOptions */
-  HTMLCollection get selectedOptions;
-
-  /** @domName HTMLSelectElement.size */
-  int size;
-
-  /** @domName HTMLSelectElement.type */
-  String get type;
-
-  /** @domName HTMLSelectElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLSelectElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLSelectElement.value */
-  String value;
-
-  /** @domName HTMLSelectElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLSelectElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLSelectElement.item */
-  Node item(int index);
-
-  /** @domName HTMLSelectElement.namedItem */
-  Node namedItem(String name);
-
-  /** @domName HTMLSelectElement.setCustomValidity */
-  void setCustomValidity(String error);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _SelectElementImpl extends _ElementImpl implements SelectElement native "*HTMLSelectElement" {
-
-  bool autofocus;
-
-  bool disabled;
-
-  final _FormElementImpl form;
-
-  final List<Node> labels;
-
-  int length;
-
-  bool multiple;
-
-  String name;
-
-  bool required;
-
-  int selectedIndex;
-
-  int size;
-
-  final String type;
-
-  final String validationMessage;
-
-  final _ValidityStateImpl validity;
-
-  String value;
-
-  final bool willValidate;
-
-  bool checkValidity() native;
-
-  _NodeImpl item(int index) native;
-
-  _NodeImpl namedItem(String name) native;
-
-  void setCustomValidity(String error) native;
-
-
-  // Override default options, since IE returns SelectElement itself and it
-  // does not operate as a List.
-  List<OptionElement> get options {
-    return this.elements.filter((e) => e is OptionElement);
-  }
-
-  List<OptionElement> get selectedOptions {
-    // IE does not change the selected flag for single-selection items.
-    if (this.multiple) {
-      return this.options.filter((o) => o.selected);
-    } else {
-      return [this.options[this.selectedIndex]];
-    }
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SessionDescription
-abstract class SessionDescription {
-
-  factory SessionDescription(String sdp) => _SessionDescriptionFactoryProvider.createSessionDescription(sdp);
-
-  /** @domName SessionDescription.addCandidate */
-  void addCandidate(IceCandidate candidate);
-
-  /** @domName SessionDescription.toSdp */
-  String toSdp();
-}
-
-class _SessionDescriptionImpl implements SessionDescription native "*SessionDescription" {
-
-  void addCandidate(_IceCandidateImpl candidate) native;
-
-  String toSdp() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLShadowElement
-abstract class ShadowElement implements Element {
-
-  /** @domName HTMLShadowElement.resetStyleInheritance */
-  bool resetStyleInheritance;
-}
-
-class _ShadowElementImpl extends _ElementImpl implements ShadowElement native "*HTMLShadowElement" {
-
-  bool resetStyleInheritance;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName ShadowRoot
-abstract class ShadowRoot implements DocumentFragment {
-
-  factory ShadowRoot(Element host) => _ShadowRootFactoryProvider.createShadowRoot(host);
-
-  /** @domName ShadowRoot.activeElement */
-  Element get activeElement;
-
-  /** @domName ShadowRoot.applyAuthorStyles */
-  bool applyAuthorStyles;
-
-  /** @domName ShadowRoot.innerHTML */
-  String innerHTML;
-
-  /** @domName ShadowRoot.resetStyleInheritance */
-  bool resetStyleInheritance;
-
-  /** @domName ShadowRoot.cloneNode */
-  Node clone(bool deep);
-
-  /** @domName ShadowRoot.getElementById */
-  Element $dom_getElementById(String elementId);
-
-  /** @domName ShadowRoot.getElementsByClassName */
-  List<Node> $dom_getElementsByClassName(String className);
-
-  /** @domName ShadowRoot.getElementsByTagName */
-  List<Node> $dom_getElementsByTagName(String tagName);
-
-  /** @domName ShadowRoot.getSelection */
-  DOMSelection getSelection();
-
-  static bool get supported => _ShadowRootImpl.supported;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ShadowRootImpl extends _DocumentFragmentImpl implements ShadowRoot native "*ShadowRoot" {
-
-  final _ElementImpl activeElement;
-
-  bool applyAuthorStyles;
-
-  String innerHTML;
-
-  bool resetStyleInheritance;
-
-  _NodeImpl clone(bool deep) native "cloneNode";
-
-  _ElementImpl $dom_getElementById(String elementId) native "getElementById";
-
-  List<Node> $dom_getElementsByClassName(String className) native "getElementsByClassName";
-
-  List<Node> $dom_getElementsByTagName(String tagName) native "getElementsByTagName";
-
-  _DOMSelectionImpl getSelection() native;
-
-  static bool get supported =>
-      JS('bool', '!!(window.ShadowRoot || window.WebKitShadowRoot)');
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SharedWorker
-abstract class SharedWorker implements AbstractWorker {
-
-  factory SharedWorker(String scriptURL, [String name]) {
-    if (!?name) {
-      return _SharedWorkerFactoryProvider.createSharedWorker(scriptURL);
-    }
-    return _SharedWorkerFactoryProvider.createSharedWorker(scriptURL, name);
-  }
-
-  /** @domName SharedWorker.port */
-  MessagePort get port;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SharedWorkerContext
-abstract class SharedWorkerContext implements WorkerContext {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  SharedWorkerContextEvents get on;
-
-  /** @domName SharedWorkerContext.name */
-  String get name;
-}
-
-abstract class SharedWorkerContextEvents implements WorkerContextEvents {
-
-  EventListenerList get connect;
-}
-
-class _SharedWorkerContextImpl extends _WorkerContextImpl implements SharedWorkerContext native "*SharedWorkerContext" {
-
-  _SharedWorkerContextEventsImpl get on =>
-    new _SharedWorkerContextEventsImpl(this);
-
-  final String name;
-}
-
-class _SharedWorkerContextEventsImpl extends _WorkerContextEventsImpl implements SharedWorkerContextEvents {
-  _SharedWorkerContextEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get connect => this['connect'];
-}
-
-class _SharedWorkerImpl extends _AbstractWorkerImpl implements SharedWorker native "*SharedWorker" {
-
-  final _MessagePortImpl port;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SourceBuffer
-abstract class SourceBuffer {
-
-  /** @domName SourceBuffer.buffered */
-  TimeRanges get buffered;
-
-  /** @domName SourceBuffer.timestampOffset */
-  num timestampOffset;
-
-  /** @domName SourceBuffer.abort */
-  void abort();
-
-  /** @domName SourceBuffer.append */
-  void append(Uint8Array data);
-}
-
-class _SourceBufferImpl implements SourceBuffer native "*SourceBuffer" {
-
-  final _TimeRangesImpl buffered;
-
-  num timestampOffset;
-
-  void abort() native;
-
-  void append(_Uint8ArrayImpl data) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SourceBufferList
-abstract class SourceBufferList implements EventTarget, List<SourceBuffer> {
-
-  /** @domName SourceBufferList.length */
-  int get length;
-
-  /** @domName SourceBufferList.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName SourceBufferList.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName SourceBufferList.item */
-  SourceBuffer item(int index);
-
-  /** @domName SourceBufferList.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-class _SourceBufferListImpl extends _EventTargetImpl implements SourceBufferList, JavaScriptIndexingBehavior native "*SourceBufferList" {
-
-  final int length;
-
-  _SourceBufferImpl operator[](int index) => JS("_SourceBufferImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _SourceBufferImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SourceBuffer> mixins.
-  // SourceBuffer is the element type.
-
-  // From Iterable<SourceBuffer>:
-
-  Iterator<SourceBuffer> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SourceBuffer>(this);
-  }
-
-  // From Collection<SourceBuffer>:
-
-  void add(SourceBuffer value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SourceBuffer value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SourceBuffer> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SourceBuffer element) => _Collections.contains(this, element);
-
-  void forEach(void f(SourceBuffer element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SourceBuffer element)) => _Collections.map(this, [], f);
-
-  Collection<SourceBuffer> filter(bool f(SourceBuffer element)) =>
-     _Collections.filter(this, <SourceBuffer>[], f);
-
-  bool every(bool f(SourceBuffer element)) => _Collections.every(this, f);
-
-  bool some(bool f(SourceBuffer element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SourceBuffer>:
-
-  void sort([Comparator<SourceBuffer> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SourceBuffer element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SourceBuffer element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SourceBuffer get last => this[length - 1];
-
-  SourceBuffer removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SourceBuffer> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SourceBuffer initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SourceBuffer> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SourceBuffer>[]);
-
-  // -- end List<SourceBuffer> mixins.
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  _SourceBufferImpl item(int index) native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLSourceElement
-abstract class SourceElement implements Element {
-
-  factory SourceElement() => _Elements.createSourceElement();
-
-  /** @domName HTMLSourceElement.media */
-  String media;
-
-  /** @domName HTMLSourceElement.src */
-  String src;
-
-  /** @domName HTMLSourceElement.type */
-  String type;
-}
-
-class _SourceElementImpl extends _ElementImpl implements SourceElement native "*HTMLSourceElement" {
-
-  String media;
-
-  String src;
-
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLSpanElement
-abstract class SpanElement implements Element {
-
-  factory SpanElement() => _Elements.createSpanElement();
-}
-
-class _SpanElementImpl extends _ElementImpl implements SpanElement native "*HTMLSpanElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SpeechGrammar
-abstract class SpeechGrammar {
-
-  factory SpeechGrammar() => _SpeechGrammarFactoryProvider.createSpeechGrammar();
-
-  /** @domName SpeechGrammar.src */
-  String src;
-
-  /** @domName SpeechGrammar.weight */
-  num weight;
-}
-
-class _SpeechGrammarImpl implements SpeechGrammar native "*SpeechGrammar" {
-
-  String src;
-
-  num weight;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SpeechGrammarList
-abstract class SpeechGrammarList implements List<SpeechGrammar> {
-
-  factory SpeechGrammarList() => _SpeechGrammarListFactoryProvider.createSpeechGrammarList();
-
-  /** @domName SpeechGrammarList.length */
-  int get length;
-
-  /** @domName SpeechGrammarList.addFromString */
-  void addFromString(String string, [num weight]);
-
-  /** @domName SpeechGrammarList.addFromUri */
-  void addFromUri(String src, [num weight]);
-
-  /** @domName SpeechGrammarList.item */
-  SpeechGrammar item(int index);
-}
-
-class _SpeechGrammarListImpl implements SpeechGrammarList, JavaScriptIndexingBehavior native "*SpeechGrammarList" {
-
-  final int length;
-
-  _SpeechGrammarImpl operator[](int index) => JS("_SpeechGrammarImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _SpeechGrammarImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SpeechGrammar> mixins.
-  // SpeechGrammar is the element type.
-
-  // From Iterable<SpeechGrammar>:
-
-  Iterator<SpeechGrammar> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SpeechGrammar>(this);
-  }
-
-  // From Collection<SpeechGrammar>:
-
-  void add(SpeechGrammar value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SpeechGrammar value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SpeechGrammar> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SpeechGrammar element) => _Collections.contains(this, element);
-
-  void forEach(void f(SpeechGrammar element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SpeechGrammar element)) => _Collections.map(this, [], f);
-
-  Collection<SpeechGrammar> filter(bool f(SpeechGrammar element)) =>
-     _Collections.filter(this, <SpeechGrammar>[], f);
-
-  bool every(bool f(SpeechGrammar element)) => _Collections.every(this, f);
-
-  bool some(bool f(SpeechGrammar element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SpeechGrammar>:
-
-  void sort([Comparator<SpeechGrammar> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SpeechGrammar element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SpeechGrammar element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SpeechGrammar get last => this[length - 1];
-
-  SpeechGrammar removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SpeechGrammar> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SpeechGrammar initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SpeechGrammar> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SpeechGrammar>[]);
-
-  // -- end List<SpeechGrammar> mixins.
-
-  void addFromString(String string, [num weight]) native;
-
-  void addFromUri(String src, [num weight]) native;
-
-  _SpeechGrammarImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SpeechInputEvent
-abstract class SpeechInputEvent implements Event {
-
-  /** @domName SpeechInputEvent.results */
-  List<SpeechInputResult> get results;
-}
-
-class _SpeechInputEventImpl extends _EventImpl implements SpeechInputEvent native "*SpeechInputEvent" {
-
-  final _SpeechInputResultListImpl results;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SpeechInputResult
-abstract class SpeechInputResult {
-
-  /** @domName SpeechInputResult.confidence */
-  num get confidence;
-
-  /** @domName SpeechInputResult.utterance */
-  String get utterance;
-}
-
-class _SpeechInputResultImpl implements SpeechInputResult native "*SpeechInputResult" {
-
-  final num confidence;
-
-  final String utterance;
-}
-
-class _SpeechInputResultListImpl implements List<SpeechInputResult>, JavaScriptIndexingBehavior native "*SpeechInputResultList" {
-
-  final int length;
-
-  _SpeechInputResultImpl operator[](int index) => JS("_SpeechInputResultImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _SpeechInputResultImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SpeechInputResult> mixins.
-  // SpeechInputResult is the element type.
-
-  // From Iterable<SpeechInputResult>:
-
-  Iterator<SpeechInputResult> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SpeechInputResult>(this);
-  }
-
-  // From Collection<SpeechInputResult>:
-
-  void add(SpeechInputResult value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SpeechInputResult value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SpeechInputResult> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SpeechInputResult element) => _Collections.contains(this, element);
-
-  void forEach(void f(SpeechInputResult element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SpeechInputResult element)) => _Collections.map(this, [], f);
-
-  Collection<SpeechInputResult> filter(bool f(SpeechInputResult element)) =>
-     _Collections.filter(this, <SpeechInputResult>[], f);
-
-  bool every(bool f(SpeechInputResult element)) => _Collections.every(this, f);
-
-  bool some(bool f(SpeechInputResult element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SpeechInputResult>:
-
-  void sort([Comparator<SpeechInputResult> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SpeechInputResult element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SpeechInputResult element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SpeechInputResult get last => this[length - 1];
-
-  SpeechInputResult removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SpeechInputResult> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SpeechInputResult initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SpeechInputResult> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SpeechInputResult>[]);
-
-  // -- end List<SpeechInputResult> mixins.
-
-  _SpeechInputResultImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SpeechRecognition
-abstract class SpeechRecognition implements EventTarget {
-
-  factory SpeechRecognition() => _SpeechRecognitionFactoryProvider.createSpeechRecognition();
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  SpeechRecognitionEvents get on;
-
-  /** @domName SpeechRecognition.continuous */
-  bool continuous;
-
-  /** @domName SpeechRecognition.grammars */
-  SpeechGrammarList grammars;
-
-  /** @domName SpeechRecognition.interimResults */
-  bool interimResults;
-
-  /** @domName SpeechRecognition.lang */
-  String lang;
-
-  /** @domName SpeechRecognition.maxAlternatives */
-  int maxAlternatives;
-
-  /** @domName SpeechRecognition.abort */
-  void abort();
-
-  /** @domName SpeechRecognition.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName SpeechRecognition.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName SpeechRecognition.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName SpeechRecognition.start */
-  void start();
-
-  /** @domName SpeechRecognition.stop */
-  void stop();
-}
-
-abstract class SpeechRecognitionEvents implements Events {
-
-  EventListenerList get audioEnd;
-
-  EventListenerList get audioStart;
-
-  EventListenerList get end;
-
-  EventListenerList get error;
-
-  EventListenerList get noMatch;
-
-  EventListenerList get result;
-
-  EventListenerList get soundEnd;
-
-  EventListenerList get soundStart;
-
-  EventListenerList get speechEnd;
-
-  EventListenerList get speechStart;
-
-  EventListenerList get start;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SpeechRecognitionAlternative
-abstract class SpeechRecognitionAlternative {
-
-  /** @domName SpeechRecognitionAlternative.confidence */
-  num get confidence;
-
-  /** @domName SpeechRecognitionAlternative.transcript */
-  String get transcript;
-}
-
-class _SpeechRecognitionAlternativeImpl implements SpeechRecognitionAlternative native "*SpeechRecognitionAlternative" {
-
-  final num confidence;
-
-  final String transcript;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SpeechRecognitionError
-abstract class SpeechRecognitionError implements Event {
-
-  static const int ABORTED = 2;
-
-  static const int AUDIO_CAPTURE = 3;
-
-  static const int BAD_GRAMMAR = 7;
-
-  static const int LANGUAGE_NOT_SUPPORTED = 8;
-
-  static const int NETWORK = 4;
-
-  static const int NOT_ALLOWED = 5;
-
-  static const int NO_SPEECH = 1;
-
-  static const int OTHER = 0;
-
-  static const int SERVICE_NOT_ALLOWED = 6;
-
-  /** @domName SpeechRecognitionError.code */
-  int get code;
-
-  /** @domName SpeechRecognitionError.message */
-  String get message;
-}
-
-class _SpeechRecognitionErrorImpl extends _EventImpl implements SpeechRecognitionError native "*SpeechRecognitionError" {
-
-  final int code;
-
-  final String message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SpeechRecognitionEvent
-abstract class SpeechRecognitionEvent implements Event {
-
-  /** @domName SpeechRecognitionEvent.result */
-  SpeechRecognitionResult get result;
-
-  /** @domName SpeechRecognitionEvent.resultHistory */
-  List<SpeechRecognitionResult> get resultHistory;
-
-  /** @domName SpeechRecognitionEvent.resultIndex */
-  int get resultIndex;
-}
-
-class _SpeechRecognitionEventImpl extends _EventImpl implements SpeechRecognitionEvent native "*SpeechRecognitionEvent" {
-
-  final _SpeechRecognitionResultImpl result;
-
-  final _SpeechRecognitionResultListImpl resultHistory;
-
-  final int resultIndex;
-}
-
-class _SpeechRecognitionImpl extends _EventTargetImpl implements SpeechRecognition native "*SpeechRecognition" {
-
-  _SpeechRecognitionEventsImpl get on =>
-    new _SpeechRecognitionEventsImpl(this);
-
-  bool continuous;
-
-  _SpeechGrammarListImpl grammars;
-
-  bool interimResults;
-
-  String lang;
-
-  int maxAlternatives;
-
-  void abort() native;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  void start() native;
-
-  void stop() native;
-}
-
-class _SpeechRecognitionEventsImpl extends _EventsImpl implements SpeechRecognitionEvents {
-  _SpeechRecognitionEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get audioEnd => this['audioend'];
-
-  EventListenerList get audioStart => this['audiostart'];
-
-  EventListenerList get end => this['end'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get noMatch => this['nomatch'];
-
-  EventListenerList get result => this['result'];
-
-  EventListenerList get soundEnd => this['soundend'];
-
-  EventListenerList get soundStart => this['soundstart'];
-
-  EventListenerList get speechEnd => this['speechend'];
-
-  EventListenerList get speechStart => this['speechstart'];
-
-  EventListenerList get start => this['start'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SpeechRecognitionResult
-abstract class SpeechRecognitionResult {
-
-  /** @domName SpeechRecognitionResult.emma */
-  Document get emma;
-
-  /** @domName SpeechRecognitionResult.finalValue */
-  bool get finalValue;
-
-  /** @domName SpeechRecognitionResult.length */
-  int get length;
-
-  /** @domName SpeechRecognitionResult.item */
-  SpeechRecognitionAlternative item(int index);
-}
-
-class _SpeechRecognitionResultImpl implements SpeechRecognitionResult native "*SpeechRecognitionResult" {
-
-  final _DocumentImpl emma;
-
-  bool get finalValue => JS("bool", "#.final", this);
-
-  final int length;
-
-  _SpeechRecognitionAlternativeImpl item(int index) native;
-}
-
-class _SpeechRecognitionResultListImpl implements List<SpeechRecognitionResult>, JavaScriptIndexingBehavior native "*SpeechRecognitionResultList" {
-
-  final int length;
-
-  _SpeechRecognitionResultImpl operator[](int index) => JS("_SpeechRecognitionResultImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _SpeechRecognitionResultImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SpeechRecognitionResult> mixins.
-  // SpeechRecognitionResult is the element type.
-
-  // From Iterable<SpeechRecognitionResult>:
-
-  Iterator<SpeechRecognitionResult> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SpeechRecognitionResult>(this);
-  }
-
-  // From Collection<SpeechRecognitionResult>:
-
-  void add(SpeechRecognitionResult value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SpeechRecognitionResult value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SpeechRecognitionResult> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SpeechRecognitionResult element) => _Collections.contains(this, element);
-
-  void forEach(void f(SpeechRecognitionResult element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SpeechRecognitionResult element)) => _Collections.map(this, [], f);
-
-  Collection<SpeechRecognitionResult> filter(bool f(SpeechRecognitionResult element)) =>
-     _Collections.filter(this, <SpeechRecognitionResult>[], f);
-
-  bool every(bool f(SpeechRecognitionResult element)) => _Collections.every(this, f);
-
-  bool some(bool f(SpeechRecognitionResult element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SpeechRecognitionResult>:
-
-  void sort([Comparator<SpeechRecognitionResult> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SpeechRecognitionResult element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SpeechRecognitionResult element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SpeechRecognitionResult get last => this[length - 1];
-
-  SpeechRecognitionResult removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SpeechRecognitionResult> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SpeechRecognitionResult initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SpeechRecognitionResult> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SpeechRecognitionResult>[]);
-
-  // -- end List<SpeechRecognitionResult> mixins.
-
-  _SpeechRecognitionResultImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName Storage
-abstract class Storage implements Map<String, String> {
-
-  /** @domName Storage.length */
-  int get $dom_length;
-
-  /** @domName Storage.clear */
-  void $dom_clear();
-
-  /** @domName Storage.getItem */
-  String $dom_getItem(String key);
-
-  /** @domName Storage.key */
-  String $dom_key(int index);
-
-  /** @domName Storage.removeItem */
-  void $dom_removeItem(String key);
-
-  /** @domName Storage.setItem */
-  void $dom_setItem(String key, String data);
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName StorageEvent
-abstract class StorageEvent implements Event {
-
-  /** @domName StorageEvent.key */
-  String get key;
-
-  /** @domName StorageEvent.newValue */
-  String get newValue;
-
-  /** @domName StorageEvent.oldValue */
-  String get oldValue;
-
-  /** @domName StorageEvent.storageArea */
-  Storage get storageArea;
-
-  /** @domName StorageEvent.url */
-  String get url;
-
-  /** @domName StorageEvent.initStorageEvent */
-  void initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg);
-}
-
-class _StorageEventImpl extends _EventImpl implements StorageEvent native "*StorageEvent" {
-
-  final String key;
-
-  final String newValue;
-
-  final String oldValue;
-
-  final _StorageImpl storageArea;
-
-  final String url;
-
-  void initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, _StorageImpl storageAreaArg) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _StorageImpl implements Storage native "*Storage" {
-
-  // TODO(nweiz): update this when maps support lazy iteration
-  bool containsValue(String value) => values.some((e) => e == value);
-
-  bool containsKey(String key) => $dom_getItem(key) != null;
-
-  String operator [](String key) => $dom_getItem(key);
-
-  void operator []=(String key, String value) => $dom_setItem(key, value);
-
-  String putIfAbsent(String key, String ifAbsent()) {
-    if (!containsKey(key)) this[key] = ifAbsent();
-    return this[key];
-  }
-
-  String remove(String key) {
-    final value = this[key];
-    $dom_removeItem(key);
-    return value;
-  }
-
-  void clear() => $dom_clear();
-
-  void forEach(void f(String key, String value)) {
-    for (var i = 0; true; i++) {
-      final key = $dom_key(i);
-      if (key == null) return;
-
-      f(key, this[key]);
-    }
-  }
-
-  Collection<String> get keys {
-    final keys = [];
-    forEach((k, v) => keys.add(k));
-    return keys;
-  }
-
-  Collection<String> get values {
-    final values = [];
-    forEach((k, v) => values.add(v));
-    return values;
-  }
-
-  int get length => $dom_length;
-
-  bool get isEmpty => $dom_key(0) == null;
-
-  int get $dom_length => JS("int", "#.length", this);
-
-  void $dom_clear() native "clear";
-
-  String $dom_getItem(String key) native "getItem";
-
-  String $dom_key(int index) native "key";
-
-  void $dom_removeItem(String key) native "removeItem";
-
-  void $dom_setItem(String key, String data) native "setItem";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName StorageInfo
-abstract class StorageInfo {
-
-  static const int PERSISTENT = 1;
-
-  static const int TEMPORARY = 0;
-
-  /** @domName StorageInfo.queryUsageAndQuota */
-  void queryUsageAndQuota(int storageType, [StorageInfoUsageCallback usageCallback, StorageInfoErrorCallback errorCallback]);
-
-  /** @domName StorageInfo.requestQuota */
-  void requestQuota(int storageType, int newQuotaInBytes, [StorageInfoQuotaCallback quotaCallback, StorageInfoErrorCallback errorCallback]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void StorageInfoErrorCallback(DOMException error);
-
-class _StorageInfoImpl implements StorageInfo native "*StorageInfo" {
-
-  void queryUsageAndQuota(int storageType, [StorageInfoUsageCallback usageCallback, StorageInfoErrorCallback errorCallback]) native;
-
-  void requestQuota(int storageType, int newQuotaInBytes, [StorageInfoQuotaCallback quotaCallback, StorageInfoErrorCallback errorCallback]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void StorageInfoQuotaCallback(int grantedQuotaInBytes);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void StorageInfoUsageCallback(int currentUsageInBytes, int currentQuotaInBytes);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void StringCallback(String data);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLStyleElement
-abstract class StyleElement implements Element {
-
-  factory StyleElement() => _Elements.createStyleElement();
-
-  /** @domName HTMLStyleElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLStyleElement.media */
-  String media;
-
-  /** @domName HTMLStyleElement.scoped */
-  bool scoped;
-
-  /** @domName HTMLStyleElement.sheet */
-  StyleSheet get sheet;
-
-  /** @domName HTMLStyleElement.type */
-  String type;
-}
-
-class _StyleElementImpl extends _ElementImpl implements StyleElement native "*HTMLStyleElement" {
-
-  bool disabled;
-
-  String media;
-
-  bool scoped;
-
-  final _StyleSheetImpl sheet;
-
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName StyleMedia
-abstract class StyleMedia {
-
-  /** @domName StyleMedia.type */
-  String get type;
-
-  /** @domName StyleMedia.matchMedium */
-  bool matchMedium(String mediaquery);
-}
-
-class _StyleMediaImpl implements StyleMedia native "*StyleMedia" {
-
-  final String type;
-
-  bool matchMedium(String mediaquery) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName StyleSheet
-abstract class StyleSheet {
-
-  /** @domName StyleSheet.disabled */
-  bool disabled;
-
-  /** @domName StyleSheet.href */
-  String get href;
-
-  /** @domName StyleSheet.media */
-  MediaList get media;
-
-  /** @domName StyleSheet.ownerNode */
-  Node get ownerNode;
-
-  /** @domName StyleSheet.parentStyleSheet */
-  StyleSheet get parentStyleSheet;
-
-  /** @domName StyleSheet.title */
-  String get title;
-
-  /** @domName StyleSheet.type */
-  String get type;
-}
-
-class _StyleSheetImpl implements StyleSheet native "*StyleSheet" {
-
-  bool disabled;
-
-  final String href;
-
-  final _MediaListImpl media;
-
-  final _NodeImpl ownerNode;
-
-  final _StyleSheetImpl parentStyleSheet;
-
-  final String title;
-
-  final String type;
-}
-
-class _StyleSheetListImpl implements List<StyleSheet>, JavaScriptIndexingBehavior native "*StyleSheetList" {
-
-  final int length;
-
-  _StyleSheetImpl operator[](int index) => JS("_StyleSheetImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _StyleSheetImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<StyleSheet> mixins.
-  // StyleSheet is the element type.
-
-  // From Iterable<StyleSheet>:
-
-  Iterator<StyleSheet> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<StyleSheet>(this);
-  }
-
-  // From Collection<StyleSheet>:
-
-  void add(StyleSheet value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(StyleSheet value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<StyleSheet> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(StyleSheet element) => _Collections.contains(this, element);
-
-  void forEach(void f(StyleSheet element)) => _Collections.forEach(this, f);
-
-  Collection map(f(StyleSheet element)) => _Collections.map(this, [], f);
-
-  Collection<StyleSheet> filter(bool f(StyleSheet element)) =>
-     _Collections.filter(this, <StyleSheet>[], f);
-
-  bool every(bool f(StyleSheet element)) => _Collections.every(this, f);
-
-  bool some(bool f(StyleSheet element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<StyleSheet>:
-
-  void sort([Comparator<StyleSheet> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(StyleSheet element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(StyleSheet element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  StyleSheet get last => this[length - 1];
-
-  StyleSheet removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<StyleSheet> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [StyleSheet initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<StyleSheet> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <StyleSheet>[]);
-
-  // -- end List<StyleSheet> mixins.
-
-  _StyleSheetImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLTableCaptionElement
-abstract class TableCaptionElement implements Element {
-
-  factory TableCaptionElement() => _Elements.createTableCaptionElement();
-
-  /** @domName HTMLTableCaptionElement.align */
-  String align;
-}
-
-class _TableCaptionElementImpl extends _ElementImpl implements TableCaptionElement native "*HTMLTableCaptionElement" {
-
-  String align;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLTableCellElement
-abstract class TableCellElement implements Element {
-
-  factory TableCellElement() => _Elements.createTableCellElement();
-
-  /** @domName HTMLTableCellElement.abbr */
-  String abbr;
-
-  /** @domName HTMLTableCellElement.align */
-  String align;
-
-  /** @domName HTMLTableCellElement.axis */
-  String axis;
-
-  /** @domName HTMLTableCellElement.bgColor */
-  String bgColor;
-
-  /** @domName HTMLTableCellElement.cellIndex */
-  int get cellIndex;
-
-  /** @domName HTMLTableCellElement.ch */
-  String ch;
-
-  /** @domName HTMLTableCellElement.chOff */
-  String chOff;
-
-  /** @domName HTMLTableCellElement.colSpan */
-  int colSpan;
-
-  /** @domName HTMLTableCellElement.headers */
-  String headers;
-
-  /** @domName HTMLTableCellElement.height */
-  String height;
-
-  /** @domName HTMLTableCellElement.noWrap */
-  bool noWrap;
-
-  /** @domName HTMLTableCellElement.rowSpan */
-  int rowSpan;
-
-  /** @domName HTMLTableCellElement.scope */
-  String scope;
-
-  /** @domName HTMLTableCellElement.vAlign */
-  String vAlign;
-
-  /** @domName HTMLTableCellElement.width */
-  String width;
-}
-
-class _TableCellElementImpl extends _ElementImpl implements TableCellElement native "*HTMLTableCellElement" {
-
-  String abbr;
-
-  String align;
-
-  String axis;
-
-  String bgColor;
-
-  final int cellIndex;
-
-  String ch;
-
-  String chOff;
-
-  int colSpan;
-
-  String headers;
-
-  String height;
-
-  bool noWrap;
-
-  int rowSpan;
-
-  String scope;
-
-  String vAlign;
-
-  String width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLTableColElement
-abstract class TableColElement implements Element {
-
-  factory TableColElement() => _Elements.createTableColElement();
-
-  /** @domName HTMLTableColElement.align */
-  String align;
-
-  /** @domName HTMLTableColElement.ch */
-  String ch;
-
-  /** @domName HTMLTableColElement.chOff */
-  String chOff;
-
-  /** @domName HTMLTableColElement.span */
-  int span;
-
-  /** @domName HTMLTableColElement.vAlign */
-  String vAlign;
-
-  /** @domName HTMLTableColElement.width */
-  String width;
-}
-
-class _TableColElementImpl extends _ElementImpl implements TableColElement native "*HTMLTableColElement" {
-
-  String align;
-
-  String ch;
-
-  String chOff;
-
-  int span;
-
-  String vAlign;
-
-  String width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLTableElement
-abstract class TableElement implements Element {
-
-  factory TableElement() => _Elements.createTableElement();
-
-  /** @domName HTMLTableElement.align */
-  String align;
-
-  /** @domName HTMLTableElement.bgColor */
-  String bgColor;
-
-  /** @domName HTMLTableElement.border */
-  String border;
-
-  /** @domName HTMLTableElement.caption */
-  TableCaptionElement caption;
-
-  /** @domName HTMLTableElement.cellPadding */
-  String cellPadding;
-
-  /** @domName HTMLTableElement.cellSpacing */
-  String cellSpacing;
-
-  /** @domName HTMLTableElement.frame */
-  String frame;
-
-  /** @domName HTMLTableElement.rows */
-  HTMLCollection get rows;
-
-  /** @domName HTMLTableElement.rules */
-  String rules;
-
-  /** @domName HTMLTableElement.summary */
-  String summary;
-
-  /** @domName HTMLTableElement.tBodies */
-  HTMLCollection get tBodies;
-
-  /** @domName HTMLTableElement.tFoot */
-  TableSectionElement tFoot;
-
-  /** @domName HTMLTableElement.tHead */
-  TableSectionElement tHead;
-
-  /** @domName HTMLTableElement.width */
-  String width;
-
-  /** @domName HTMLTableElement.createCaption */
-  Element createCaption();
-
-  /** @domName HTMLTableElement.createTBody */
-  Element createTBody();
-
-  /** @domName HTMLTableElement.createTFoot */
-  Element createTFoot();
-
-  /** @domName HTMLTableElement.createTHead */
-  Element createTHead();
-
-  /** @domName HTMLTableElement.deleteCaption */
-  void deleteCaption();
-
-  /** @domName HTMLTableElement.deleteRow */
-  void deleteRow(int index);
-
-  /** @domName HTMLTableElement.deleteTFoot */
-  void deleteTFoot();
-
-  /** @domName HTMLTableElement.deleteTHead */
-  void deleteTHead();
-
-  /** @domName HTMLTableElement.insertRow */
-  Element insertRow(int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _TableElementImpl extends _ElementImpl implements TableElement native "*HTMLTableElement" {
-
-  String align;
-
-  String bgColor;
-
-  String border;
-
-  _TableCaptionElementImpl caption;
-
-  String cellPadding;
-
-  String cellSpacing;
-
-  String frame;
-
-  final _HTMLCollectionImpl rows;
-
-  String rules;
-
-  String summary;
-
-  final _HTMLCollectionImpl tBodies;
-
-  _TableSectionElementImpl tFoot;
-
-  _TableSectionElementImpl tHead;
-
-  String width;
-
-  _ElementImpl createCaption() native;
-
-  _ElementImpl createTFoot() native;
-
-  _ElementImpl createTHead() native;
-
-  void deleteCaption() native;
-
-  void deleteRow(int index) native;
-
-  void deleteTFoot() native;
-
-  void deleteTHead() native;
-
-  _ElementImpl insertRow(int index) native;
-
-
-  _ElementImpl createTBody() {
-    if (JS('bool', '!!#.createTBody', this)) {
-      return this._createTBody();
-    }
-    var tbody = new Element.tag('tbody');
-    this.elements.add(tbody);
-    return tbody;
-  }
-
-  _ElementImpl _createTBody() native 'createTBody';
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLTableRowElement
-abstract class TableRowElement implements Element {
-
-  factory TableRowElement() => _Elements.createTableRowElement();
-
-  /** @domName HTMLTableRowElement.align */
-  String align;
-
-  /** @domName HTMLTableRowElement.bgColor */
-  String bgColor;
-
-  /** @domName HTMLTableRowElement.cells */
-  HTMLCollection get cells;
-
-  /** @domName HTMLTableRowElement.ch */
-  String ch;
-
-  /** @domName HTMLTableRowElement.chOff */
-  String chOff;
-
-  /** @domName HTMLTableRowElement.rowIndex */
-  int get rowIndex;
-
-  /** @domName HTMLTableRowElement.sectionRowIndex */
-  int get sectionRowIndex;
-
-  /** @domName HTMLTableRowElement.vAlign */
-  String vAlign;
-
-  /** @domName HTMLTableRowElement.deleteCell */
-  void deleteCell(int index);
-
-  /** @domName HTMLTableRowElement.insertCell */
-  Element insertCell(int index);
-}
-
-class _TableRowElementImpl extends _ElementImpl implements TableRowElement native "*HTMLTableRowElement" {
-
-  String align;
-
-  String bgColor;
-
-  final _HTMLCollectionImpl cells;
-
-  String ch;
-
-  String chOff;
-
-  final int rowIndex;
-
-  final int sectionRowIndex;
-
-  String vAlign;
-
-  void deleteCell(int index) native;
-
-  _ElementImpl insertCell(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLTableSectionElement
-abstract class TableSectionElement implements Element {
-
-  /** @domName HTMLTableSectionElement.align */
-  String align;
-
-  /** @domName HTMLTableSectionElement.ch */
-  String ch;
-
-  /** @domName HTMLTableSectionElement.chOff */
-  String chOff;
-
-  /** @domName HTMLTableSectionElement.rows */
-  HTMLCollection get rows;
-
-  /** @domName HTMLTableSectionElement.vAlign */
-  String vAlign;
-
-  /** @domName HTMLTableSectionElement.deleteRow */
-  void deleteRow(int index);
-
-  /** @domName HTMLTableSectionElement.insertRow */
-  Element insertRow(int index);
-}
-
-class _TableSectionElementImpl extends _ElementImpl implements TableSectionElement native "*HTMLTableSectionElement" {
-
-  String align;
-
-  String ch;
-
-  String chOff;
-
-  final _HTMLCollectionImpl rows;
-
-  String vAlign;
-
-  void deleteRow(int index) native;
-
-  _ElementImpl insertRow(int index) native;
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName Text
-abstract class Text implements CharacterData {
-
-  factory Text(String data) => _TextFactoryProvider.createText(data);
-
-  /** @domName Text.wholeText */
-  String get wholeText;
-
-  /** @domName Text.replaceWholeText */
-  Text replaceWholeText(String content);
-
-  /** @domName Text.splitText */
-  Text splitText(int offset);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLTextAreaElement
-abstract class TextAreaElement implements Element {
-
-  factory TextAreaElement() => _Elements.createTextAreaElement();
-
-  /** @domName HTMLTextAreaElement.autofocus */
-  bool autofocus;
-
-  /** @domName HTMLTextAreaElement.cols */
-  int cols;
-
-  /** @domName HTMLTextAreaElement.defaultValue */
-  String defaultValue;
-
-  /** @domName HTMLTextAreaElement.dirName */
-  String dirName;
-
-  /** @domName HTMLTextAreaElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLTextAreaElement.form */
-  FormElement get form;
-
-  /** @domName HTMLTextAreaElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLTextAreaElement.maxLength */
-  int maxLength;
-
-  /** @domName HTMLTextAreaElement.name */
-  String name;
-
-  /** @domName HTMLTextAreaElement.placeholder */
-  String placeholder;
-
-  /** @domName HTMLTextAreaElement.readOnly */
-  bool readOnly;
-
-  /** @domName HTMLTextAreaElement.required */
-  bool required;
-
-  /** @domName HTMLTextAreaElement.rows */
-  int rows;
-
-  /** @domName HTMLTextAreaElement.selectionDirection */
-  String selectionDirection;
-
-  /** @domName HTMLTextAreaElement.selectionEnd */
-  int selectionEnd;
-
-  /** @domName HTMLTextAreaElement.selectionStart */
-  int selectionStart;
-
-  /** @domName HTMLTextAreaElement.textLength */
-  int get textLength;
-
-  /** @domName HTMLTextAreaElement.type */
-  String get type;
-
-  /** @domName HTMLTextAreaElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLTextAreaElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLTextAreaElement.value */
-  String value;
-
-  /** @domName HTMLTextAreaElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLTextAreaElement.wrap */
-  String wrap;
-
-  /** @domName HTMLTextAreaElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLTextAreaElement.select */
-  void select();
-
-  /** @domName HTMLTextAreaElement.setCustomValidity */
-  void setCustomValidity(String error);
-
-  /** @domName HTMLTextAreaElement.setRangeText */
-  void setRangeText(String replacement, [int start, int end, String selectionMode]);
-
-  /** @domName HTMLTextAreaElement.setSelectionRange */
-  void setSelectionRange(int start, int end, [String direction]);
-}
-
-class _TextAreaElementImpl extends _ElementImpl implements TextAreaElement native "*HTMLTextAreaElement" {
-
-  bool autofocus;
-
-  int cols;
-
-  String defaultValue;
-
-  String dirName;
-
-  bool disabled;
-
-  final _FormElementImpl form;
-
-  final List<Node> labels;
-
-  int maxLength;
-
-  String name;
-
-  String placeholder;
-
-  bool readOnly;
-
-  bool required;
-
-  int rows;
-
-  String selectionDirection;
-
-  int selectionEnd;
-
-  int selectionStart;
-
-  final int textLength;
-
-  final String type;
-
-  final String validationMessage;
-
-  final _ValidityStateImpl validity;
-
-  String value;
-
-  final bool willValidate;
-
-  String wrap;
-
-  bool checkValidity() native;
-
-  void select() native;
-
-  void setCustomValidity(String error) native;
-
-  void setRangeText(String replacement, [int start, int end, String selectionMode]) native;
-
-  void setSelectionRange(int start, int end, [String direction]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName TextEvent
-abstract class TextEvent implements UIEvent {
-
-  /** @domName TextEvent.data */
-  String get data;
-
-  /** @domName TextEvent.initTextEvent */
-  void initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg);
-}
-
-class _TextEventImpl extends _UIEventImpl implements TextEvent native "*TextEvent" {
-
-  final String data;
-
-  void initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, _LocalWindowImpl viewArg, String dataArg) native;
-}
-
-class _TextImpl extends _CharacterDataImpl implements Text native "*Text" {
-
-  final String wholeText;
-
-  _TextImpl replaceWholeText(String content) native;
-
-  _TextImpl splitText(int offset) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName TextMetrics
-abstract class TextMetrics {
-
-  /** @domName TextMetrics.width */
-  num get width;
-}
-
-class _TextMetricsImpl implements TextMetrics native "*TextMetrics" {
-
-  final num width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName TextTrack
-abstract class TextTrack implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  TextTrackEvents get on;
-
-  /** @domName TextTrack.activeCues */
-  TextTrackCueList get activeCues;
-
-  /** @domName TextTrack.cues */
-  TextTrackCueList get cues;
-
-  /** @domName TextTrack.kind */
-  String get kind;
-
-  /** @domName TextTrack.label */
-  String get label;
-
-  /** @domName TextTrack.language */
-  String get language;
-
-  /** @domName TextTrack.mode */
-  String mode;
-
-  /** @domName TextTrack.addCue */
-  void addCue(TextTrackCue cue);
-
-  /** @domName TextTrack.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName TextTrack.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName TextTrack.removeCue */
-  void removeCue(TextTrackCue cue);
-
-  /** @domName TextTrack.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class TextTrackEvents implements Events {
-
-  EventListenerList get cueChange;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName TextTrackCue
-abstract class TextTrackCue implements EventTarget {
-
-  factory TextTrackCue(num startTime, num endTime, String text) => _TextTrackCueFactoryProvider.createTextTrackCue(startTime, endTime, text);
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  TextTrackCueEvents get on;
-
-  /** @domName TextTrackCue.align */
-  String align;
-
-  /** @domName TextTrackCue.endTime */
-  num endTime;
-
-  /** @domName TextTrackCue.id */
-  String id;
-
-  /** @domName TextTrackCue.line */
-  int line;
-
-  /** @domName TextTrackCue.pauseOnExit */
-  bool pauseOnExit;
-
-  /** @domName TextTrackCue.position */
-  int position;
-
-  /** @domName TextTrackCue.size */
-  int size;
-
-  /** @domName TextTrackCue.snapToLines */
-  bool snapToLines;
-
-  /** @domName TextTrackCue.startTime */
-  num startTime;
-
-  /** @domName TextTrackCue.text */
-  String text;
-
-  /** @domName TextTrackCue.track */
-  TextTrack get track;
-
-  /** @domName TextTrackCue.vertical */
-  String vertical;
-
-  /** @domName TextTrackCue.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName TextTrackCue.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName TextTrackCue.getCueAsHTML */
-  DocumentFragment getCueAsHTML();
-
-  /** @domName TextTrackCue.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class TextTrackCueEvents implements Events {
-
-  EventListenerList get enter;
-
-  EventListenerList get exit;
-}
-
-class _TextTrackCueImpl extends _EventTargetImpl implements TextTrackCue native "*TextTrackCue" {
-
-  _TextTrackCueEventsImpl get on =>
-    new _TextTrackCueEventsImpl(this);
-
-  String align;
-
-  num endTime;
-
-  String id;
-
-  int line;
-
-  bool pauseOnExit;
-
-  int position;
-
-  int size;
-
-  bool snapToLines;
-
-  num startTime;
-
-  String text;
-
-  final _TextTrackImpl track;
-
-  String vertical;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  _DocumentFragmentImpl getCueAsHTML() native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _TextTrackCueEventsImpl extends _EventsImpl implements TextTrackCueEvents {
-  _TextTrackCueEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get enter => this['enter'];
-
-  EventListenerList get exit => this['exit'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName TextTrackCueList
-abstract class TextTrackCueList implements List<TextTrackCue> {
-
-  /** @domName TextTrackCueList.length */
-  int get length;
-
-  /** @domName TextTrackCueList.getCueById */
-  TextTrackCue getCueById(String id);
-
-  /** @domName TextTrackCueList.item */
-  TextTrackCue item(int index);
-}
-
-class _TextTrackCueListImpl implements TextTrackCueList, JavaScriptIndexingBehavior native "*TextTrackCueList" {
-
-  final int length;
-
-  _TextTrackCueImpl operator[](int index) => JS("_TextTrackCueImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _TextTrackCueImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<TextTrackCue> mixins.
-  // TextTrackCue is the element type.
-
-  // From Iterable<TextTrackCue>:
-
-  Iterator<TextTrackCue> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<TextTrackCue>(this);
-  }
-
-  // From Collection<TextTrackCue>:
-
-  void add(TextTrackCue value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(TextTrackCue value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<TextTrackCue> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(TextTrackCue element) => _Collections.contains(this, element);
-
-  void forEach(void f(TextTrackCue element)) => _Collections.forEach(this, f);
-
-  Collection map(f(TextTrackCue element)) => _Collections.map(this, [], f);
-
-  Collection<TextTrackCue> filter(bool f(TextTrackCue element)) =>
-     _Collections.filter(this, <TextTrackCue>[], f);
-
-  bool every(bool f(TextTrackCue element)) => _Collections.every(this, f);
-
-  bool some(bool f(TextTrackCue element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<TextTrackCue>:
-
-  void sort([Comparator<TextTrackCue> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(TextTrackCue element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(TextTrackCue element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  TextTrackCue get last => this[length - 1];
-
-  TextTrackCue removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<TextTrackCue> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [TextTrackCue initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<TextTrackCue> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <TextTrackCue>[]);
-
-  // -- end List<TextTrackCue> mixins.
-
-  _TextTrackCueImpl getCueById(String id) native;
-
-  _TextTrackCueImpl item(int index) native;
-}
-
-class _TextTrackImpl extends _EventTargetImpl implements TextTrack native "*TextTrack" {
-
-  _TextTrackEventsImpl get on =>
-    new _TextTrackEventsImpl(this);
-
-  final _TextTrackCueListImpl activeCues;
-
-  final _TextTrackCueListImpl cues;
-
-  final String kind;
-
-  final String label;
-
-  final String language;
-
-  String mode;
-
-  void addCue(_TextTrackCueImpl cue) native;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void removeCue(_TextTrackCueImpl cue) native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _TextTrackEventsImpl extends _EventsImpl implements TextTrackEvents {
-  _TextTrackEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get cueChange => this['cuechange'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName TextTrackList
-abstract class TextTrackList implements EventTarget, List<TextTrack> {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  TextTrackListEvents get on;
-
-  /** @domName TextTrackList.length */
-  int get length;
-
-  /** @domName TextTrackList.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName TextTrackList.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName TextTrackList.item */
-  TextTrack item(int index);
-
-  /** @domName TextTrackList.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class TextTrackListEvents implements Events {
-
-  EventListenerList get addTrack;
-}
-
-class _TextTrackListImpl extends _EventTargetImpl implements TextTrackList, JavaScriptIndexingBehavior native "*TextTrackList" {
-
-  _TextTrackListEventsImpl get on =>
-    new _TextTrackListEventsImpl(this);
-
-  final int length;
-
-  _TextTrackImpl operator[](int index) => JS("_TextTrackImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _TextTrackImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<TextTrack> mixins.
-  // TextTrack is the element type.
-
-  // From Iterable<TextTrack>:
-
-  Iterator<TextTrack> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<TextTrack>(this);
-  }
-
-  // From Collection<TextTrack>:
-
-  void add(TextTrack value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(TextTrack value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<TextTrack> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(TextTrack element) => _Collections.contains(this, element);
-
-  void forEach(void f(TextTrack element)) => _Collections.forEach(this, f);
-
-  Collection map(f(TextTrack element)) => _Collections.map(this, [], f);
-
-  Collection<TextTrack> filter(bool f(TextTrack element)) =>
-     _Collections.filter(this, <TextTrack>[], f);
-
-  bool every(bool f(TextTrack element)) => _Collections.every(this, f);
-
-  bool some(bool f(TextTrack element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<TextTrack>:
-
-  void sort([Comparator<TextTrack> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(TextTrack element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(TextTrack element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  TextTrack get last => this[length - 1];
-
-  TextTrack removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<TextTrack> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [TextTrack initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<TextTrack> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <TextTrack>[]);
-
-  // -- end List<TextTrack> mixins.
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  _TextTrackImpl item(int index) native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-
-class _TextTrackListEventsImpl extends _EventsImpl implements TextTrackListEvents {
-  _TextTrackListEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get addTrack => this['addtrack'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName TimeRanges
-abstract class TimeRanges {
-
-  /** @domName TimeRanges.length */
-  int get length;
-
-  /** @domName TimeRanges.end */
-  num end(int index);
-
-  /** @domName TimeRanges.start */
-  num start(int index);
-}
-
-class _TimeRangesImpl implements TimeRanges native "*TimeRanges" {
-
-  final int length;
-
-  num end(int index) native;
-
-  num start(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void TimeoutHandler();
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLTitleElement
-abstract class TitleElement implements Element {
-
-  factory TitleElement() => _Elements.createTitleElement();
-}
-
-class _TitleElementImpl extends _ElementImpl implements TitleElement native "*HTMLTitleElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Touch
-abstract class Touch {
-
-  /** @domName Touch.clientX */
-  int get clientX;
-
-  /** @domName Touch.clientY */
-  int get clientY;
-
-  /** @domName Touch.identifier */
-  int get identifier;
-
-  /** @domName Touch.pageX */
-  int get pageX;
-
-  /** @domName Touch.pageY */
-  int get pageY;
-
-  /** @domName Touch.screenX */
-  int get screenX;
-
-  /** @domName Touch.screenY */
-  int get screenY;
-
-  /** @domName Touch.target */
-  EventTarget get target;
-
-  /** @domName Touch.webkitForce */
-  num get webkitForce;
-
-  /** @domName Touch.webkitRadiusX */
-  int get webkitRadiusX;
-
-  /** @domName Touch.webkitRadiusY */
-  int get webkitRadiusY;
-
-  /** @domName Touch.webkitRotationAngle */
-  num get webkitRotationAngle;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName TouchEvent
-abstract class TouchEvent implements UIEvent {
-
-  /** @domName TouchEvent.altKey */
-  bool get altKey;
-
-  /** @domName TouchEvent.changedTouches */
-  TouchList get changedTouches;
-
-  /** @domName TouchEvent.ctrlKey */
-  bool get ctrlKey;
-
-  /** @domName TouchEvent.metaKey */
-  bool get metaKey;
-
-  /** @domName TouchEvent.shiftKey */
-  bool get shiftKey;
-
-  /** @domName TouchEvent.targetTouches */
-  TouchList get targetTouches;
-
-  /** @domName TouchEvent.touches */
-  TouchList get touches;
-
-  /** @domName TouchEvent.initTouchEvent */
-  void initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey);
-}
-
-class _TouchEventImpl extends _UIEventImpl implements TouchEvent native "*TouchEvent" {
-
-  final bool altKey;
-
-  final _TouchListImpl changedTouches;
-
-  final bool ctrlKey;
-
-  final bool metaKey;
-
-  final bool shiftKey;
-
-  final _TouchListImpl targetTouches;
-
-  final _TouchListImpl touches;
-
-  void initTouchEvent(_TouchListImpl touches, _TouchListImpl targetTouches, _TouchListImpl changedTouches, String type, _LocalWindowImpl view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native;
-}
-
-class _TouchImpl implements Touch native "*Touch" {
-
-  final int clientX;
-
-  final int clientY;
-
-  final int identifier;
-
-  final int pageX;
-
-  final int pageY;
-
-  final int screenX;
-
-  final int screenY;
-
-  EventTarget get target => _convertNativeToDart_EventTarget(this._target);
-  EventTarget get _target => JS("EventTarget", "#.target", this);
-
-  final num webkitForce;
-
-  final int webkitRadiusX;
-
-  final int webkitRadiusY;
-
-  final num webkitRotationAngle;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName TouchList
-abstract class TouchList implements List<Touch> {
-
-  /** @domName TouchList.length */
-  int get length;
-
-  /** @domName TouchList.item */
-  Touch item(int index);
-}
-
-class _TouchListImpl implements TouchList, JavaScriptIndexingBehavior native "*TouchList" {
-
-  final int length;
-
-  _TouchImpl operator[](int index) => JS("_TouchImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _TouchImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<Touch> mixins.
-  // Touch is the element type.
-
-  // From Iterable<Touch>:
-
-  Iterator<Touch> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<Touch>(this);
-  }
-
-  // From Collection<Touch>:
-
-  void add(Touch value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(Touch value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<Touch> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(Touch element) => _Collections.contains(this, element);
-
-  void forEach(void f(Touch element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Touch element)) => _Collections.map(this, [], f);
-
-  Collection<Touch> filter(bool f(Touch element)) =>
-     _Collections.filter(this, <Touch>[], f);
-
-  bool every(bool f(Touch element)) => _Collections.every(this, f);
-
-  bool some(bool f(Touch element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Touch>:
-
-  void sort([Comparator<Touch> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Touch element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Touch element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  Touch get last => this[length - 1];
-
-  Touch removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<Touch> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [Touch initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<Touch> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <Touch>[]);
-
-  // -- end List<Touch> mixins.
-
-  _TouchImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLTrackElement
-abstract class TrackElement implements Element {
-
-  factory TrackElement() => _Elements.createTrackElement();
-
-  static const int ERROR = 3;
-
-  static const int LOADED = 2;
-
-  static const int LOADING = 1;
-
-  static const int NONE = 0;
-
-  /** @domName HTMLTrackElement.defaultValue */
-  bool defaultValue;
-
-  /** @domName HTMLTrackElement.kind */
-  String kind;
-
-  /** @domName HTMLTrackElement.label */
-  String label;
-
-  /** @domName HTMLTrackElement.readyState */
-  int get readyState;
-
-  /** @domName HTMLTrackElement.src */
-  String src;
-
-  /** @domName HTMLTrackElement.srclang */
-  String srclang;
-
-  /** @domName HTMLTrackElement.track */
-  TextTrack get track;
-}
-
-class _TrackElementImpl extends _ElementImpl implements TrackElement native "*HTMLTrackElement" {
-
-  bool get defaultValue => JS("bool", "#.default", this);
-
-  void set defaultValue(bool value) {
-    JS("void", "#.default = #", this, value);
-  }
-
-  String kind;
-
-  String label;
-
-  final int readyState;
-
-  String src;
-
-  String srclang;
-
-  final _TextTrackImpl track;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName TrackEvent
-abstract class TrackEvent implements Event {
-
-  /** @domName TrackEvent.track */
-  Object get track;
-}
-
-class _TrackEventImpl extends _EventImpl implements TrackEvent native "*TrackEvent" {
-
-  final Object track;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebKitTransitionEvent
-abstract class TransitionEvent implements Event {
-
-  /** @domName WebKitTransitionEvent.elapsedTime */
-  num get elapsedTime;
-
-  /** @domName WebKitTransitionEvent.propertyName */
-  String get propertyName;
-}
-
-class _TransitionEventImpl extends _EventImpl implements TransitionEvent native "*WebKitTransitionEvent" {
-
-  final num elapsedTime;
-
-  final String propertyName;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName TreeWalker
-abstract class TreeWalker {
-
-  /** @domName TreeWalker.currentNode */
-  Node currentNode;
-
-  /** @domName TreeWalker.expandEntityReferences */
-  bool get expandEntityReferences;
-
-  /** @domName TreeWalker.filter */
-  NodeFilter get filter;
-
-  /** @domName TreeWalker.root */
-  Node get root;
-
-  /** @domName TreeWalker.whatToShow */
-  int get whatToShow;
-
-  /** @domName TreeWalker.firstChild */
-  Node firstChild();
-
-  /** @domName TreeWalker.lastChild */
-  Node lastChild();
-
-  /** @domName TreeWalker.nextNode */
-  Node nextNode();
-
-  /** @domName TreeWalker.nextSibling */
-  Node nextSibling();
-
-  /** @domName TreeWalker.parentNode */
-  Node parentNode();
-
-  /** @domName TreeWalker.previousNode */
-  Node previousNode();
-
-  /** @domName TreeWalker.previousSibling */
-  Node previousSibling();
-}
-
-class _TreeWalkerImpl implements TreeWalker native "*TreeWalker" {
-
-  _NodeImpl currentNode;
-
-  final bool expandEntityReferences;
-
-  final _NodeFilterImpl filter;
-
-  final _NodeImpl root;
-
-  final int whatToShow;
-
-  _NodeImpl firstChild() native;
-
-  _NodeImpl lastChild() native;
-
-  _NodeImpl nextNode() native;
-
-  _NodeImpl nextSibling() native;
-
-  _NodeImpl parentNode() native;
-
-  _NodeImpl previousNode() native;
-
-  _NodeImpl previousSibling() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName UIEvent
-abstract class UIEvent implements Event {
-
-  /** @domName UIEvent.charCode */
-  int get charCode;
-
-  /** @domName UIEvent.detail */
-  int get detail;
-
-  /** @domName UIEvent.keyCode */
-  int get keyCode;
-
-  /** @domName UIEvent.layerX */
-  int get layerX;
-
-  /** @domName UIEvent.layerY */
-  int get layerY;
-
-  /** @domName UIEvent.pageX */
-  int get pageX;
-
-  /** @domName UIEvent.pageY */
-  int get pageY;
-
-  /** @domName UIEvent.view */
-  Window get view;
-
-  /** @domName UIEvent.which */
-  int get which;
-
-  /** @domName UIEvent.initUIEvent */
-  void initUIEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail);
-}
-
-class _UIEventImpl extends _EventImpl implements UIEvent native "*UIEvent" {
-
-  final int charCode;
-
-  final int detail;
-
-  final int keyCode;
-
-  final int layerX;
-
-  final int layerY;
-
-  final int pageX;
-
-  final int pageY;
-
-  Window get view => _convertNativeToDart_Window(this._view);
-  Window get _view => JS("Window", "#.view", this);
-
-  final int which;
-
-  void initUIEvent(String type, bool canBubble, bool cancelable, _LocalWindowImpl view, int detail) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLUListElement
-abstract class UListElement implements Element {
-
-  factory UListElement() => _Elements.createUListElement();
-
-  /** @domName HTMLUListElement.compact */
-  bool compact;
-
-  /** @domName HTMLUListElement.type */
-  String type;
-}
-
-class _UListElementImpl extends _ElementImpl implements UListElement native "*HTMLUListElement" {
-
-  bool compact;
-
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Uint16Array
-abstract class Uint16Array implements ArrayBufferView, List<int> {
-
-  factory Uint16Array(int length) =>
-    _TypedArrayFactoryProvider.createUint16Array(length);
-
-  factory Uint16Array.fromList(List<int> list) =>
-    _TypedArrayFactoryProvider.createUint16Array_fromList(list);
-
-  factory Uint16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
-    _TypedArrayFactoryProvider.createUint16Array_fromBuffer(buffer, byteOffset, length);
-
-  static const int BYTES_PER_ELEMENT = 2;
-
-  /** @domName Uint16Array.length */
-  int get length;
-
-  /** @domName Uint16Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Uint16Array.subarray */
-  Uint16Array subarray(int start, [int end]);
-}
-
-class _Uint16ArrayImpl extends _ArrayBufferViewImpl implements Uint16Array, List<int>, JavaScriptIndexingBehavior native "*Uint16Array" {
-
-  final int length;
-
-  int operator[](int index) => JS("int", "#[#]", this, index);
-
-  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<int> mixins.
-  // int is the element type.
-
-  // From Iterable<int>:
-
-  Iterator<int> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<int>(this);
-  }
-
-  // From Collection<int>:
-
-  void add(int value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(int value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<int> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(int element) => _Collections.contains(this, element);
-
-  void forEach(void f(int element)) => _Collections.forEach(this, f);
-
-  Collection map(f(int element)) => _Collections.map(this, [], f);
-
-  Collection<int> filter(bool f(int element)) =>
-     _Collections.filter(this, <int>[], f);
-
-  bool every(bool f(int element)) => _Collections.every(this, f);
-
-  bool some(bool f(int element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<int>:
-
-  void sort([Comparator<int> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(int element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(int element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  int get last => this[length - 1];
-
-  int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [int initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<int> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <int>[]);
-
-  // -- end List<int> mixins.
-
-  void setElements(Object array, [int offset]) native "set";
-
-  _Uint16ArrayImpl subarray(int start, [int end]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Uint32Array
-abstract class Uint32Array implements ArrayBufferView, List<int> {
-
-  factory Uint32Array(int length) =>
-    _TypedArrayFactoryProvider.createUint32Array(length);
-
-  factory Uint32Array.fromList(List<int> list) =>
-    _TypedArrayFactoryProvider.createUint32Array_fromList(list);
-
-  factory Uint32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
-    _TypedArrayFactoryProvider.createUint32Array_fromBuffer(buffer, byteOffset, length);
-
-  static const int BYTES_PER_ELEMENT = 4;
-
-  /** @domName Uint32Array.length */
-  int get length;
-
-  /** @domName Uint32Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Uint32Array.subarray */
-  Uint32Array subarray(int start, [int end]);
-}
-
-class _Uint32ArrayImpl extends _ArrayBufferViewImpl implements Uint32Array, List<int>, JavaScriptIndexingBehavior native "*Uint32Array" {
-
-  final int length;
-
-  int operator[](int index) => JS("int", "#[#]", this, index);
-
-  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<int> mixins.
-  // int is the element type.
-
-  // From Iterable<int>:
-
-  Iterator<int> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<int>(this);
-  }
-
-  // From Collection<int>:
-
-  void add(int value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(int value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<int> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(int element) => _Collections.contains(this, element);
-
-  void forEach(void f(int element)) => _Collections.forEach(this, f);
-
-  Collection map(f(int element)) => _Collections.map(this, [], f);
-
-  Collection<int> filter(bool f(int element)) =>
-     _Collections.filter(this, <int>[], f);
-
-  bool every(bool f(int element)) => _Collections.every(this, f);
-
-  bool some(bool f(int element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<int>:
-
-  void sort([Comparator<int> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(int element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(int element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  int get last => this[length - 1];
-
-  int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [int initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<int> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <int>[]);
-
-  // -- end List<int> mixins.
-
-  void setElements(Object array, [int offset]) native "set";
-
-  _Uint32ArrayImpl subarray(int start, [int end]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Uint8Array
-abstract class Uint8Array implements ArrayBufferView, List<int> {
-
-  factory Uint8Array(int length) =>
-    _TypedArrayFactoryProvider.createUint8Array(length);
-
-  factory Uint8Array.fromList(List<int> list) =>
-    _TypedArrayFactoryProvider.createUint8Array_fromList(list);
-
-  factory Uint8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
-    _TypedArrayFactoryProvider.createUint8Array_fromBuffer(buffer, byteOffset, length);
-
-  static const int BYTES_PER_ELEMENT = 1;
-
-  /** @domName Uint8Array.length */
-  int get length;
-
-  /** @domName Uint8Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Uint8Array.subarray */
-  Uint8Array subarray(int start, [int end]);
-}
-
-class _Uint8ArrayImpl extends _ArrayBufferViewImpl implements Uint8Array, List<int>, JavaScriptIndexingBehavior native "*Uint8Array" {
-
-  final int length;
-
-  int operator[](int index) => JS("int", "#[#]", this, index);
-
-  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
-  // -- start List<int> mixins.
-  // int is the element type.
-
-  // From Iterable<int>:
-
-  Iterator<int> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<int>(this);
-  }
-
-  // From Collection<int>:
-
-  void add(int value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(int value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<int> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(int element) => _Collections.contains(this, element);
-
-  void forEach(void f(int element)) => _Collections.forEach(this, f);
-
-  Collection map(f(int element)) => _Collections.map(this, [], f);
-
-  Collection<int> filter(bool f(int element)) =>
-     _Collections.filter(this, <int>[], f);
-
-  bool every(bool f(int element)) => _Collections.every(this, f);
-
-  bool some(bool f(int element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<int>:
-
-  void sort([Comparator<int> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(int element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(int element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  int get last => this[length - 1];
-
-  int removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [int initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<int> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <int>[]);
-
-  // -- end List<int> mixins.
-
-  void setElements(Object array, [int offset]) native "set";
-
-  _Uint8ArrayImpl subarray(int start, [int end]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Uint8ClampedArray
-abstract class Uint8ClampedArray implements Uint8Array {
-
-  factory Uint8ClampedArray(int length) =>
-    _TypedArrayFactoryProvider.createUint8ClampedArray(length);
-
-  factory Uint8ClampedArray.fromList(List<int> list) =>
-    _TypedArrayFactoryProvider.createUint8ClampedArray_fromList(list);
-
-  factory Uint8ClampedArray.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
-    _TypedArrayFactoryProvider.createUint8ClampedArray_fromBuffer(buffer, byteOffset, length);
-
-  /** @domName Uint8ClampedArray.length */
-  int get length;
-
-  /** @domName Uint8ClampedArray.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Uint8ClampedArray.subarray */
-  Uint8ClampedArray subarray(int start, [int end]);
-}
-
-class _Uint8ClampedArrayImpl extends _Uint8ArrayImpl implements Uint8ClampedArray native "*Uint8ClampedArray" {
-
-  // Use implementation from Uint8Array.
-  // final int length;
-
-  void setElements(Object array, [int offset]) native "set";
-
-  _Uint8ClampedArrayImpl subarray(int start, [int end]) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLUnknownElement
-abstract class UnknownElement implements Element {
-}
-
-class _UnknownElementImpl extends _ElementImpl implements UnknownElement native "*HTMLUnknownElement" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName ValidityState
-abstract class ValidityState {
-
-  /** @domName ValidityState.customError */
-  bool get customError;
-
-  /** @domName ValidityState.patternMismatch */
-  bool get patternMismatch;
-
-  /** @domName ValidityState.rangeOverflow */
-  bool get rangeOverflow;
-
-  /** @domName ValidityState.rangeUnderflow */
-  bool get rangeUnderflow;
-
-  /** @domName ValidityState.stepMismatch */
-  bool get stepMismatch;
-
-  /** @domName ValidityState.tooLong */
-  bool get tooLong;
-
-  /** @domName ValidityState.typeMismatch */
-  bool get typeMismatch;
-
-  /** @domName ValidityState.valid */
-  bool get valid;
-
-  /** @domName ValidityState.valueMissing */
-  bool get valueMissing;
-}
-
-class _ValidityStateImpl implements ValidityState native "*ValidityState" {
-
-  final bool customError;
-
-  final bool patternMismatch;
-
-  final bool rangeOverflow;
-
-  final bool rangeUnderflow;
-
-  final bool stepMismatch;
-
-  final bool tooLong;
-
-  final bool typeMismatch;
-
-  final bool valid;
-
-  final bool valueMissing;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName HTMLVideoElement
-abstract class VideoElement implements MediaElement {
-
-  factory VideoElement() => _Elements.createVideoElement();
-
-  /** @domName HTMLVideoElement.height */
-  int height;
-
-  /** @domName HTMLVideoElement.poster */
-  String poster;
-
-  /** @domName HTMLVideoElement.videoHeight */
-  int get videoHeight;
-
-  /** @domName HTMLVideoElement.videoWidth */
-  int get videoWidth;
-
-  /** @domName HTMLVideoElement.webkitDecodedFrameCount */
-  int get webkitDecodedFrameCount;
-
-  /** @domName HTMLVideoElement.webkitDisplayingFullscreen */
-  bool get webkitDisplayingFullscreen;
-
-  /** @domName HTMLVideoElement.webkitDroppedFrameCount */
-  int get webkitDroppedFrameCount;
-
-  /** @domName HTMLVideoElement.webkitSupportsFullscreen */
-  bool get webkitSupportsFullscreen;
-
-  /** @domName HTMLVideoElement.width */
-  int width;
-
-  /** @domName HTMLVideoElement.webkitEnterFullScreen */
-  void webkitEnterFullScreen();
-
-  /** @domName HTMLVideoElement.webkitEnterFullscreen */
-  void webkitEnterFullscreen();
-
-  /** @domName HTMLVideoElement.webkitExitFullScreen */
-  void webkitExitFullScreen();
-
-  /** @domName HTMLVideoElement.webkitExitFullscreen */
-  void webkitExitFullscreen();
-}
-
-class _VideoElementImpl extends _MediaElementImpl implements VideoElement native "*HTMLVideoElement" {
-
-  int height;
-
-  String poster;
-
-  final int videoHeight;
-
-  final int videoWidth;
-
-  final int webkitDecodedFrameCount;
-
-  final bool webkitDisplayingFullscreen;
-
-  final int webkitDroppedFrameCount;
-
-  final bool webkitSupportsFullscreen;
-
-  int width;
-
-  void webkitEnterFullScreen() native;
-
-  void webkitEnterFullscreen() native;
-
-  void webkitExitFullScreen() native;
-
-  void webkitExitFullscreen() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void VoidCallback();
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WaveShaperNode
-abstract class WaveShaperNode implements AudioNode {
-
-  /** @domName WaveShaperNode.curve */
-  Float32Array curve;
-}
-
-class _WaveShaperNodeImpl extends _AudioNodeImpl implements WaveShaperNode native "*WaveShaperNode" {
-
-  _Float32ArrayImpl curve;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WaveTable
-abstract class WaveTable {
-}
-
-class _WaveTableImpl implements WaveTable native "*WaveTable" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLActiveInfo
-abstract class WebGLActiveInfo {
-
-  /** @domName WebGLActiveInfo.name */
-  String get name;
-
-  /** @domName WebGLActiveInfo.size */
-  int get size;
-
-  /** @domName WebGLActiveInfo.type */
-  int get type;
-}
-
-class _WebGLActiveInfoImpl implements WebGLActiveInfo native "*WebGLActiveInfo" {
-
-  final String name;
-
-  final int size;
-
-  final int type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLBuffer
-abstract class WebGLBuffer {
-}
-
-class _WebGLBufferImpl implements WebGLBuffer native "*WebGLBuffer" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLCompressedTextureS3TC
-abstract class WebGLCompressedTextureS3TC {
-
-  static const int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;
-
-  static const int COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2;
-
-  static const int COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;
-
-  static const int COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;
-}
-
-class _WebGLCompressedTextureS3TCImpl implements WebGLCompressedTextureS3TC native "*WebGLCompressedTextureS3TC" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLContextAttributes
-abstract class WebGLContextAttributes {
-
-  /** @domName WebGLContextAttributes.alpha */
-  bool alpha;
-
-  /** @domName WebGLContextAttributes.antialias */
-  bool antialias;
-
-  /** @domName WebGLContextAttributes.depth */
-  bool depth;
-
-  /** @domName WebGLContextAttributes.premultipliedAlpha */
-  bool premultipliedAlpha;
-
-  /** @domName WebGLContextAttributes.preserveDrawingBuffer */
-  bool preserveDrawingBuffer;
-
-  /** @domName WebGLContextAttributes.stencil */
-  bool stencil;
-}
-
-class _WebGLContextAttributesImpl implements WebGLContextAttributes native "*WebGLContextAttributes" {
-
-  bool alpha;
-
-  bool antialias;
-
-  bool depth;
-
-  bool premultipliedAlpha;
-
-  bool preserveDrawingBuffer;
-
-  bool stencil;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLContextEvent
-abstract class WebGLContextEvent implements Event {
-
-  /** @domName WebGLContextEvent.statusMessage */
-  String get statusMessage;
-}
-
-class _WebGLContextEventImpl extends _EventImpl implements WebGLContextEvent native "*WebGLContextEvent" {
-
-  final String statusMessage;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLDebugRendererInfo
-abstract class WebGLDebugRendererInfo {
-
-  static const int UNMASKED_RENDERER_WEBGL = 0x9246;
-
-  static const int UNMASKED_VENDOR_WEBGL = 0x9245;
-}
-
-class _WebGLDebugRendererInfoImpl implements WebGLDebugRendererInfo native "*WebGLDebugRendererInfo" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLDebugShaders
-abstract class WebGLDebugShaders {
-
-  /** @domName WebGLDebugShaders.getTranslatedShaderSource */
-  String getTranslatedShaderSource(WebGLShader shader);
-}
-
-class _WebGLDebugShadersImpl implements WebGLDebugShaders native "*WebGLDebugShaders" {
-
-  String getTranslatedShaderSource(_WebGLShaderImpl shader) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLDepthTexture
-abstract class WebGLDepthTexture {
-
-  static const int UNSIGNED_INT_24_8_WEBGL = 0x84FA;
-}
-
-class _WebGLDepthTextureImpl implements WebGLDepthTexture native "*WebGLDepthTexture" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLFramebuffer
-abstract class WebGLFramebuffer {
-}
-
-class _WebGLFramebufferImpl implements WebGLFramebuffer native "*WebGLFramebuffer" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLLoseContext
-abstract class WebGLLoseContext {
-
-  /** @domName WebGLLoseContext.loseContext */
-  void loseContext();
-
-  /** @domName WebGLLoseContext.restoreContext */
-  void restoreContext();
-}
-
-class _WebGLLoseContextImpl implements WebGLLoseContext native "*WebGLLoseContext" {
-
-  void loseContext() native;
-
-  void restoreContext() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLProgram
-abstract class WebGLProgram {
-}
-
-class _WebGLProgramImpl implements WebGLProgram native "*WebGLProgram" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLRenderbuffer
-abstract class WebGLRenderbuffer {
-}
-
-class _WebGLRenderbufferImpl implements WebGLRenderbuffer native "*WebGLRenderbuffer" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLRenderingContext
-abstract class WebGLRenderingContext implements CanvasRenderingContext {
-
-  static const int ACTIVE_ATTRIBUTES = 0x8B89;
-
-  static const int ACTIVE_TEXTURE = 0x84E0;
-
-  static const int ACTIVE_UNIFORMS = 0x8B86;
-
-  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;
-
-  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;
-
-  static const int ALPHA = 0x1906;
-
-  static const int ALPHA_BITS = 0x0D55;
-
-  static const int ALWAYS = 0x0207;
-
-  static const int ARRAY_BUFFER = 0x8892;
-
-  static const int ARRAY_BUFFER_BINDING = 0x8894;
-
-  static const int ATTACHED_SHADERS = 0x8B85;
-
-  static const int BACK = 0x0405;
-
-  static const int BLEND = 0x0BE2;
-
-  static const int BLEND_COLOR = 0x8005;
-
-  static const int BLEND_DST_ALPHA = 0x80CA;
-
-  static const int BLEND_DST_RGB = 0x80C8;
-
-  static const int BLEND_EQUATION = 0x8009;
-
-  static const int BLEND_EQUATION_ALPHA = 0x883D;
-
-  static const int BLEND_EQUATION_RGB = 0x8009;
-
-  static const int BLEND_SRC_ALPHA = 0x80CB;
-
-  static const int BLEND_SRC_RGB = 0x80C9;
-
-  static const int BLUE_BITS = 0x0D54;
-
-  static const int BOOL = 0x8B56;
-
-  static const int BOOL_VEC2 = 0x8B57;
-
-  static const int BOOL_VEC3 = 0x8B58;
-
-  static const int BOOL_VEC4 = 0x8B59;
-
-  static const int BROWSER_DEFAULT_WEBGL = 0x9244;
-
-  static const int BUFFER_SIZE = 0x8764;
-
-  static const int BUFFER_USAGE = 0x8765;
-
-  static const int BYTE = 0x1400;
-
-  static const int CCW = 0x0901;
-
-  static const int CLAMP_TO_EDGE = 0x812F;
-
-  static const int COLOR_ATTACHMENT0 = 0x8CE0;
-
-  static const int COLOR_BUFFER_BIT = 0x00004000;
-
-  static const int COLOR_CLEAR_VALUE = 0x0C22;
-
-  static const int COLOR_WRITEMASK = 0x0C23;
-
-  static const int COMPILE_STATUS = 0x8B81;
-
-  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;
-
-  static const int CONSTANT_ALPHA = 0x8003;
-
-  static const int CONSTANT_COLOR = 0x8001;
-
-  static const int CONTEXT_LOST_WEBGL = 0x9242;
-
-  static const int CULL_FACE = 0x0B44;
-
-  static const int CULL_FACE_MODE = 0x0B45;
-
-  static const int CURRENT_PROGRAM = 0x8B8D;
-
-  static const int CURRENT_VERTEX_ATTRIB = 0x8626;
-
-  static const int CW = 0x0900;
-
-  static const int DECR = 0x1E03;
-
-  static const int DECR_WRAP = 0x8508;
-
-  static const int DELETE_STATUS = 0x8B80;
-
-  static const int DEPTH_ATTACHMENT = 0x8D00;
-
-  static const int DEPTH_BITS = 0x0D56;
-
-  static const int DEPTH_BUFFER_BIT = 0x00000100;
-
-  static const int DEPTH_CLEAR_VALUE = 0x0B73;
-
-  static const int DEPTH_COMPONENT = 0x1902;
-
-  static const int DEPTH_COMPONENT16 = 0x81A5;
-
-  static const int DEPTH_FUNC = 0x0B74;
-
-  static const int DEPTH_RANGE = 0x0B70;
-
-  static const int DEPTH_STENCIL = 0x84F9;
-
-  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;
-
-  static const int DEPTH_TEST = 0x0B71;
-
-  static const int DEPTH_WRITEMASK = 0x0B72;
-
-  static const int DITHER = 0x0BD0;
-
-  static const int DONT_CARE = 0x1100;
-
-  static const int DST_ALPHA = 0x0304;
-
-  static const int DST_COLOR = 0x0306;
-
-  static const int DYNAMIC_DRAW = 0x88E8;
-
-  static const int ELEMENT_ARRAY_BUFFER = 0x8893;
-
-  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;
-
-  static const int EQUAL = 0x0202;
-
-  static const int FASTEST = 0x1101;
-
-  static const int FLOAT = 0x1406;
-
-  static const int FLOAT_MAT2 = 0x8B5A;
-
-  static const int FLOAT_MAT3 = 0x8B5B;
-
-  static const int FLOAT_MAT4 = 0x8B5C;
-
-  static const int FLOAT_VEC2 = 0x8B50;
-
-  static const int FLOAT_VEC3 = 0x8B51;
-
-  static const int FLOAT_VEC4 = 0x8B52;
-
-  static const int FRAGMENT_SHADER = 0x8B30;
-
-  static const int FRAMEBUFFER = 0x8D40;
-
-  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
-
-  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
-
-  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
-
-  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
-
-  static const int FRAMEBUFFER_BINDING = 0x8CA6;
-
-  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;
-
-  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
-
-  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;
-
-  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
-
-  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;
-
-  static const int FRONT = 0x0404;
-
-  static const int FRONT_AND_BACK = 0x0408;
-
-  static const int FRONT_FACE = 0x0B46;
-
-  static const int FUNC_ADD = 0x8006;
-
-  static const int FUNC_REVERSE_SUBTRACT = 0x800B;
-
-  static const int FUNC_SUBTRACT = 0x800A;
-
-  static const int GENERATE_MIPMAP_HINT = 0x8192;
-
-  static const int GEQUAL = 0x0206;
-
-  static const int GREATER = 0x0204;
-
-  static const int GREEN_BITS = 0x0D53;
-
-  static const int HIGH_FLOAT = 0x8DF2;
-
-  static const int HIGH_INT = 0x8DF5;
-
-  static const int INCR = 0x1E02;
-
-  static const int INCR_WRAP = 0x8507;
-
-  static const int INT = 0x1404;
-
-  static const int INT_VEC2 = 0x8B53;
-
-  static const int INT_VEC3 = 0x8B54;
-
-  static const int INT_VEC4 = 0x8B55;
-
-  static const int INVALID_ENUM = 0x0500;
-
-  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;
-
-  static const int INVALID_OPERATION = 0x0502;
-
-  static const int INVALID_VALUE = 0x0501;
-
-  static const int INVERT = 0x150A;
-
-  static const int KEEP = 0x1E00;
-
-  static const int LEQUAL = 0x0203;
-
-  static const int LESS = 0x0201;
-
-  static const int LINEAR = 0x2601;
-
-  static const int LINEAR_MIPMAP_LINEAR = 0x2703;
-
-  static const int LINEAR_MIPMAP_NEAREST = 0x2701;
-
-  static const int LINES = 0x0001;
-
-  static const int LINE_LOOP = 0x0002;
-
-  static const int LINE_STRIP = 0x0003;
-
-  static const int LINE_WIDTH = 0x0B21;
-
-  static const int LINK_STATUS = 0x8B82;
-
-  static const int LOW_FLOAT = 0x8DF0;
-
-  static const int LOW_INT = 0x8DF3;
-
-  static const int LUMINANCE = 0x1909;
-
-  static const int LUMINANCE_ALPHA = 0x190A;
-
-  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
-
-  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;
-
-  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;
-
-  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;
-
-  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;
-
-  static const int MAX_TEXTURE_SIZE = 0x0D33;
-
-  static const int MAX_VARYING_VECTORS = 0x8DFC;
-
-  static const int MAX_VERTEX_ATTRIBS = 0x8869;
-
-  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
-
-  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;
-
-  static const int MAX_VIEWPORT_DIMS = 0x0D3A;
-
-  static const int MEDIUM_FLOAT = 0x8DF1;
-
-  static const int MEDIUM_INT = 0x8DF4;
-
-  static const int MIRRORED_REPEAT = 0x8370;
-
-  static const int NEAREST = 0x2600;
-
-  static const int NEAREST_MIPMAP_LINEAR = 0x2702;
-
-  static const int NEAREST_MIPMAP_NEAREST = 0x2700;
-
-  static const int NEVER = 0x0200;
-
-  static const int NICEST = 0x1102;
-
-  static const int NONE = 0;
-
-  static const int NOTEQUAL = 0x0205;
-
-  static const int NO_ERROR = 0;
-
-  static const int ONE = 1;
-
-  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;
-
-  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;
-
-  static const int ONE_MINUS_DST_ALPHA = 0x0305;
-
-  static const int ONE_MINUS_DST_COLOR = 0x0307;
-
-  static const int ONE_MINUS_SRC_ALPHA = 0x0303;
-
-  static const int ONE_MINUS_SRC_COLOR = 0x0301;
-
-  static const int OUT_OF_MEMORY = 0x0505;
-
-  static const int PACK_ALIGNMENT = 0x0D05;
-
-  static const int POINTS = 0x0000;
-
-  static const int POLYGON_OFFSET_FACTOR = 0x8038;
-
-  static const int POLYGON_OFFSET_FILL = 0x8037;
-
-  static const int POLYGON_OFFSET_UNITS = 0x2A00;
-
-  static const int RED_BITS = 0x0D52;
-
-  static const int RENDERBUFFER = 0x8D41;
-
-  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;
-
-  static const int RENDERBUFFER_BINDING = 0x8CA7;
-
-  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;
-
-  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;
-
-  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;
-
-  static const int RENDERBUFFER_HEIGHT = 0x8D43;
-
-  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;
-
-  static const int RENDERBUFFER_RED_SIZE = 0x8D50;
-
-  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;
-
-  static const int RENDERBUFFER_WIDTH = 0x8D42;
-
-  static const int RENDERER = 0x1F01;
-
-  static const int REPEAT = 0x2901;
-
-  static const int REPLACE = 0x1E01;
-
-  static const int RGB = 0x1907;
-
-  static const int RGB565 = 0x8D62;
-
-  static const int RGB5_A1 = 0x8057;
-
-  static const int RGBA = 0x1908;
-
-  static const int RGBA4 = 0x8056;
-
-  static const int SAMPLER_2D = 0x8B5E;
-
-  static const int SAMPLER_CUBE = 0x8B60;
-
-  static const int SAMPLES = 0x80A9;
-
-  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
-
-  static const int SAMPLE_BUFFERS = 0x80A8;
-
-  static const int SAMPLE_COVERAGE = 0x80A0;
-
-  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;
-
-  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;
-
-  static const int SCISSOR_BOX = 0x0C10;
-
-  static const int SCISSOR_TEST = 0x0C11;
-
-  static const int SHADER_TYPE = 0x8B4F;
-
-  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;
-
-  static const int SHORT = 0x1402;
-
-  static const int SRC_ALPHA = 0x0302;
-
-  static const int SRC_ALPHA_SATURATE = 0x0308;
-
-  static const int SRC_COLOR = 0x0300;
-
-  static const int STATIC_DRAW = 0x88E4;
-
-  static const int STENCIL_ATTACHMENT = 0x8D20;
-
-  static const int STENCIL_BACK_FAIL = 0x8801;
-
-  static const int STENCIL_BACK_FUNC = 0x8800;
-
-  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;
-
-  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;
-
-  static const int STENCIL_BACK_REF = 0x8CA3;
-
-  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;
-
-  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;
-
-  static const int STENCIL_BITS = 0x0D57;
-
-  static const int STENCIL_BUFFER_BIT = 0x00000400;
-
-  static const int STENCIL_CLEAR_VALUE = 0x0B91;
-
-  static const int STENCIL_FAIL = 0x0B94;
-
-  static const int STENCIL_FUNC = 0x0B92;
-
-  static const int STENCIL_INDEX = 0x1901;
-
-  static const int STENCIL_INDEX8 = 0x8D48;
-
-  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;
-
-  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;
-
-  static const int STENCIL_REF = 0x0B97;
-
-  static const int STENCIL_TEST = 0x0B90;
-
-  static const int STENCIL_VALUE_MASK = 0x0B93;
-
-  static const int STENCIL_WRITEMASK = 0x0B98;
-
-  static const int STREAM_DRAW = 0x88E0;
-
-  static const int SUBPIXEL_BITS = 0x0D50;
-
-  static const int TEXTURE = 0x1702;
-
-  static const int TEXTURE0 = 0x84C0;
-
-  static const int TEXTURE1 = 0x84C1;
-
-  static const int TEXTURE10 = 0x84CA;
-
-  static const int TEXTURE11 = 0x84CB;
-
-  static const int TEXTURE12 = 0x84CC;
-
-  static const int TEXTURE13 = 0x84CD;
-
-  static const int TEXTURE14 = 0x84CE;
-
-  static const int TEXTURE15 = 0x84CF;
-
-  static const int TEXTURE16 = 0x84D0;
-
-  static const int TEXTURE17 = 0x84D1;
-
-  static const int TEXTURE18 = 0x84D2;
-
-  static const int TEXTURE19 = 0x84D3;
-
-  static const int TEXTURE2 = 0x84C2;
-
-  static const int TEXTURE20 = 0x84D4;
-
-  static const int TEXTURE21 = 0x84D5;
-
-  static const int TEXTURE22 = 0x84D6;
-
-  static const int TEXTURE23 = 0x84D7;
-
-  static const int TEXTURE24 = 0x84D8;
-
-  static const int TEXTURE25 = 0x84D9;
-
-  static const int TEXTURE26 = 0x84DA;
-
-  static const int TEXTURE27 = 0x84DB;
-
-  static const int TEXTURE28 = 0x84DC;
-
-  static const int TEXTURE29 = 0x84DD;
-
-  static const int TEXTURE3 = 0x84C3;
-
-  static const int TEXTURE30 = 0x84DE;
-
-  static const int TEXTURE31 = 0x84DF;
-
-  static const int TEXTURE4 = 0x84C4;
-
-  static const int TEXTURE5 = 0x84C5;
-
-  static const int TEXTURE6 = 0x84C6;
-
-  static const int TEXTURE7 = 0x84C7;
-
-  static const int TEXTURE8 = 0x84C8;
-
-  static const int TEXTURE9 = 0x84C9;
-
-  static const int TEXTURE_2D = 0x0DE1;
-
-  static const int TEXTURE_BINDING_2D = 0x8069;
-
-  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;
-
-  static const int TEXTURE_CUBE_MAP = 0x8513;
-
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
-
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
-
-  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
-
-  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
-
-  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
-
-  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
-
-  static const int TEXTURE_MAG_FILTER = 0x2800;
-
-  static const int TEXTURE_MIN_FILTER = 0x2801;
-
-  static const int TEXTURE_WRAP_S = 0x2802;
-
-  static const int TEXTURE_WRAP_T = 0x2803;
-
-  static const int TRIANGLES = 0x0004;
-
-  static const int TRIANGLE_FAN = 0x0006;
-
-  static const int TRIANGLE_STRIP = 0x0005;
-
-  static const int UNPACK_ALIGNMENT = 0x0CF5;
-
-  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
-
-  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;
-
-  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;
-
-  static const int UNSIGNED_BYTE = 0x1401;
-
-  static const int UNSIGNED_INT = 0x1405;
-
-  static const int UNSIGNED_SHORT = 0x1403;
-
-  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;
-
-  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;
-
-  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;
-
-  static const int VALIDATE_STATUS = 0x8B83;
-
-  static const int VENDOR = 0x1F00;
-
-  static const int VERSION = 0x1F02;
-
-  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
-
-  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;
-
-  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
-
-  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;
-
-  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;
-
-  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;
-
-  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;
-
-  static const int VERTEX_SHADER = 0x8B31;
-
-  static const int VIEWPORT = 0x0BA2;
-
-  static const int ZERO = 0;
-
-  /** @domName WebGLRenderingContext.drawingBufferHeight */
-  int get drawingBufferHeight;
-
-  /** @domName WebGLRenderingContext.drawingBufferWidth */
-  int get drawingBufferWidth;
-
-  /** @domName WebGLRenderingContext.activeTexture */
-  void activeTexture(int texture);
-
-  /** @domName WebGLRenderingContext.attachShader */
-  void attachShader(WebGLProgram program, WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.bindAttribLocation */
-  void bindAttribLocation(WebGLProgram program, int index, String name);
-
-  /** @domName WebGLRenderingContext.bindBuffer */
-  void bindBuffer(int target, WebGLBuffer buffer);
-
-  /** @domName WebGLRenderingContext.bindFramebuffer */
-  void bindFramebuffer(int target, WebGLFramebuffer framebuffer);
-
-  /** @domName WebGLRenderingContext.bindRenderbuffer */
-  void bindRenderbuffer(int target, WebGLRenderbuffer renderbuffer);
-
-  /** @domName WebGLRenderingContext.bindTexture */
-  void bindTexture(int target, WebGLTexture texture);
-
-  /** @domName WebGLRenderingContext.blendColor */
-  void blendColor(num red, num green, num blue, num alpha);
-
-  /** @domName WebGLRenderingContext.blendEquation */
-  void blendEquation(int mode);
-
-  /** @domName WebGLRenderingContext.blendEquationSeparate */
-  void blendEquationSeparate(int modeRGB, int modeAlpha);
-
-  /** @domName WebGLRenderingContext.blendFunc */
-  void blendFunc(int sfactor, int dfactor);
-
-  /** @domName WebGLRenderingContext.blendFuncSeparate */
-  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha);
-
-  /** @domName WebGLRenderingContext.bufferData */
-  void bufferData(int target, data_OR_size, int usage);
-
-  /** @domName WebGLRenderingContext.bufferSubData */
-  void bufferSubData(int target, int offset, data);
-
-  /** @domName WebGLRenderingContext.checkFramebufferStatus */
-  int checkFramebufferStatus(int target);
-
-  /** @domName WebGLRenderingContext.clear */
-  void clear(int mask);
-
-  /** @domName WebGLRenderingContext.clearColor */
-  void clearColor(num red, num green, num blue, num alpha);
-
-  /** @domName WebGLRenderingContext.clearDepth */
-  void clearDepth(num depth);
-
-  /** @domName WebGLRenderingContext.clearStencil */
-  void clearStencil(int s);
-
-  /** @domName WebGLRenderingContext.colorMask */
-  void colorMask(bool red, bool green, bool blue, bool alpha);
-
-  /** @domName WebGLRenderingContext.compileShader */
-  void compileShader(WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.compressedTexImage2D */
-  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ArrayBufferView data);
-
-  /** @domName WebGLRenderingContext.compressedTexSubImage2D */
-  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ArrayBufferView data);
-
-  /** @domName WebGLRenderingContext.copyTexImage2D */
-  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border);
-
-  /** @domName WebGLRenderingContext.copyTexSubImage2D */
-  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height);
-
-  /** @domName WebGLRenderingContext.createBuffer */
-  WebGLBuffer createBuffer();
-
-  /** @domName WebGLRenderingContext.createFramebuffer */
-  WebGLFramebuffer createFramebuffer();
-
-  /** @domName WebGLRenderingContext.createProgram */
-  WebGLProgram createProgram();
-
-  /** @domName WebGLRenderingContext.createRenderbuffer */
-  WebGLRenderbuffer createRenderbuffer();
-
-  /** @domName WebGLRenderingContext.createShader */
-  WebGLShader createShader(int type);
-
-  /** @domName WebGLRenderingContext.createTexture */
-  WebGLTexture createTexture();
-
-  /** @domName WebGLRenderingContext.cullFace */
-  void cullFace(int mode);
-
-  /** @domName WebGLRenderingContext.deleteBuffer */
-  void deleteBuffer(WebGLBuffer buffer);
-
-  /** @domName WebGLRenderingContext.deleteFramebuffer */
-  void deleteFramebuffer(WebGLFramebuffer framebuffer);
-
-  /** @domName WebGLRenderingContext.deleteProgram */
-  void deleteProgram(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.deleteRenderbuffer */
-  void deleteRenderbuffer(WebGLRenderbuffer renderbuffer);
-
-  /** @domName WebGLRenderingContext.deleteShader */
-  void deleteShader(WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.deleteTexture */
-  void deleteTexture(WebGLTexture texture);
-
-  /** @domName WebGLRenderingContext.depthFunc */
-  void depthFunc(int func);
-
-  /** @domName WebGLRenderingContext.depthMask */
-  void depthMask(bool flag);
-
-  /** @domName WebGLRenderingContext.depthRange */
-  void depthRange(num zNear, num zFar);
-
-  /** @domName WebGLRenderingContext.detachShader */
-  void detachShader(WebGLProgram program, WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.disable */
-  void disable(int cap);
-
-  /** @domName WebGLRenderingContext.disableVertexAttribArray */
-  void disableVertexAttribArray(int index);
-
-  /** @domName WebGLRenderingContext.drawArrays */
-  void drawArrays(int mode, int first, int count);
-
-  /** @domName WebGLRenderingContext.drawElements */
-  void drawElements(int mode, int count, int type, int offset);
-
-  /** @domName WebGLRenderingContext.enable */
-  void enable(int cap);
-
-  /** @domName WebGLRenderingContext.enableVertexAttribArray */
-  void enableVertexAttribArray(int index);
-
-  /** @domName WebGLRenderingContext.finish */
-  void finish();
-
-  /** @domName WebGLRenderingContext.flush */
-  void flush();
-
-  /** @domName WebGLRenderingContext.framebufferRenderbuffer */
-  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, WebGLRenderbuffer renderbuffer);
-
-  /** @domName WebGLRenderingContext.framebufferTexture2D */
-  void framebufferTexture2D(int target, int attachment, int textarget, WebGLTexture texture, int level);
-
-  /** @domName WebGLRenderingContext.frontFace */
-  void frontFace(int mode);
-
-  /** @domName WebGLRenderingContext.generateMipmap */
-  void generateMipmap(int target);
-
-  /** @domName WebGLRenderingContext.getActiveAttrib */
-  WebGLActiveInfo getActiveAttrib(WebGLProgram program, int index);
-
-  /** @domName WebGLRenderingContext.getActiveUniform */
-  WebGLActiveInfo getActiveUniform(WebGLProgram program, int index);
-
-  /** @domName WebGLRenderingContext.getAttachedShaders */
-  void getAttachedShaders(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.getAttribLocation */
-  int getAttribLocation(WebGLProgram program, String name);
-
-  /** @domName WebGLRenderingContext.getBufferParameter */
-  Object getBufferParameter(int target, int pname);
-
-  /** @domName WebGLRenderingContext.getContextAttributes */
-  WebGLContextAttributes getContextAttributes();
-
-  /** @domName WebGLRenderingContext.getError */
-  int getError();
-
-  /** @domName WebGLRenderingContext.getExtension */
-  Object getExtension(String name);
-
-  /** @domName WebGLRenderingContext.getFramebufferAttachmentParameter */
-  Object getFramebufferAttachmentParameter(int target, int attachment, int pname);
-
-  /** @domName WebGLRenderingContext.getParameter */
-  Object getParameter(int pname);
-
-  /** @domName WebGLRenderingContext.getProgramInfoLog */
-  String getProgramInfoLog(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.getProgramParameter */
-  Object getProgramParameter(WebGLProgram program, int pname);
-
-  /** @domName WebGLRenderingContext.getRenderbufferParameter */
-  Object getRenderbufferParameter(int target, int pname);
-
-  /** @domName WebGLRenderingContext.getShaderInfoLog */
-  String getShaderInfoLog(WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.getShaderParameter */
-  Object getShaderParameter(WebGLShader shader, int pname);
-
-  /** @domName WebGLRenderingContext.getShaderPrecisionFormat */
-  WebGLShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype);
-
-  /** @domName WebGLRenderingContext.getShaderSource */
-  String getShaderSource(WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.getSupportedExtensions */
-  List<String> getSupportedExtensions();
-
-  /** @domName WebGLRenderingContext.getTexParameter */
-  Object getTexParameter(int target, int pname);
-
-  /** @domName WebGLRenderingContext.getUniform */
-  Object getUniform(WebGLProgram program, WebGLUniformLocation location);
-
-  /** @domName WebGLRenderingContext.getUniformLocation */
-  WebGLUniformLocation getUniformLocation(WebGLProgram program, String name);
-
-  /** @domName WebGLRenderingContext.getVertexAttrib */
-  Object getVertexAttrib(int index, int pname);
-
-  /** @domName WebGLRenderingContext.getVertexAttribOffset */
-  int getVertexAttribOffset(int index, int pname);
-
-  /** @domName WebGLRenderingContext.hint */
-  void hint(int target, int mode);
-
-  /** @domName WebGLRenderingContext.isBuffer */
-  bool isBuffer(WebGLBuffer buffer);
-
-  /** @domName WebGLRenderingContext.isContextLost */
-  bool isContextLost();
-
-  /** @domName WebGLRenderingContext.isEnabled */
-  bool isEnabled(int cap);
-
-  /** @domName WebGLRenderingContext.isFramebuffer */
-  bool isFramebuffer(WebGLFramebuffer framebuffer);
-
-  /** @domName WebGLRenderingContext.isProgram */
-  bool isProgram(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.isRenderbuffer */
-  bool isRenderbuffer(WebGLRenderbuffer renderbuffer);
-
-  /** @domName WebGLRenderingContext.isShader */
-  bool isShader(WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.isTexture */
-  bool isTexture(WebGLTexture texture);
-
-  /** @domName WebGLRenderingContext.lineWidth */
-  void lineWidth(num width);
-
-  /** @domName WebGLRenderingContext.linkProgram */
-  void linkProgram(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.pixelStorei */
-  void pixelStorei(int pname, int param);
-
-  /** @domName WebGLRenderingContext.polygonOffset */
-  void polygonOffset(num factor, num units);
-
-  /** @domName WebGLRenderingContext.readPixels */
-  void readPixels(int x, int y, int width, int height, int format, int type, ArrayBufferView pixels);
-
-  /** @domName WebGLRenderingContext.releaseShaderCompiler */
-  void releaseShaderCompiler();
-
-  /** @domName WebGLRenderingContext.renderbufferStorage */
-  void renderbufferStorage(int target, int internalformat, int width, int height);
-
-  /** @domName WebGLRenderingContext.sampleCoverage */
-  void sampleCoverage(num value, bool invert);
-
-  /** @domName WebGLRenderingContext.scissor */
-  void scissor(int x, int y, int width, int height);
-
-  /** @domName WebGLRenderingContext.shaderSource */
-  void shaderSource(WebGLShader shader, String string);
-
-  /** @domName WebGLRenderingContext.stencilFunc */
-  void stencilFunc(int func, int ref, int mask);
-
-  /** @domName WebGLRenderingContext.stencilFuncSeparate */
-  void stencilFuncSeparate(int face, int func, int ref, int mask);
-
-  /** @domName WebGLRenderingContext.stencilMask */
-  void stencilMask(int mask);
-
-  /** @domName WebGLRenderingContext.stencilMaskSeparate */
-  void stencilMaskSeparate(int face, int mask);
-
-  /** @domName WebGLRenderingContext.stencilOp */
-  void stencilOp(int fail, int zfail, int zpass);
-
-  /** @domName WebGLRenderingContext.stencilOpSeparate */
-  void stencilOpSeparate(int face, int fail, int zfail, int zpass);
-
-  /** @domName WebGLRenderingContext.texImage2D */
-  void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, ArrayBufferView pixels]);
-
-  /** @domName WebGLRenderingContext.texParameterf */
-  void texParameterf(int target, int pname, num param);
-
-  /** @domName WebGLRenderingContext.texParameteri */
-  void texParameteri(int target, int pname, int param);
-
-  /** @domName WebGLRenderingContext.texSubImage2D */
-  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, ArrayBufferView pixels]);
-
-  /** @domName WebGLRenderingContext.uniform1f */
-  void uniform1f(WebGLUniformLocation location, num x);
-
-  /** @domName WebGLRenderingContext.uniform1fv */
-  void uniform1fv(WebGLUniformLocation location, Float32Array v);
-
-  /** @domName WebGLRenderingContext.uniform1i */
-  void uniform1i(WebGLUniformLocation location, int x);
-
-  /** @domName WebGLRenderingContext.uniform1iv */
-  void uniform1iv(WebGLUniformLocation location, Int32Array v);
-
-  /** @domName WebGLRenderingContext.uniform2f */
-  void uniform2f(WebGLUniformLocation location, num x, num y);
-
-  /** @domName WebGLRenderingContext.uniform2fv */
-  void uniform2fv(WebGLUniformLocation location, Float32Array v);
-
-  /** @domName WebGLRenderingContext.uniform2i */
-  void uniform2i(WebGLUniformLocation location, int x, int y);
-
-  /** @domName WebGLRenderingContext.uniform2iv */
-  void uniform2iv(WebGLUniformLocation location, Int32Array v);
-
-  /** @domName WebGLRenderingContext.uniform3f */
-  void uniform3f(WebGLUniformLocation location, num x, num y, num z);
-
-  /** @domName WebGLRenderingContext.uniform3fv */
-  void uniform3fv(WebGLUniformLocation location, Float32Array v);
-
-  /** @domName WebGLRenderingContext.uniform3i */
-  void uniform3i(WebGLUniformLocation location, int x, int y, int z);
-
-  /** @domName WebGLRenderingContext.uniform3iv */
-  void uniform3iv(WebGLUniformLocation location, Int32Array v);
-
-  /** @domName WebGLRenderingContext.uniform4f */
-  void uniform4f(WebGLUniformLocation location, num x, num y, num z, num w);
-
-  /** @domName WebGLRenderingContext.uniform4fv */
-  void uniform4fv(WebGLUniformLocation location, Float32Array v);
-
-  /** @domName WebGLRenderingContext.uniform4i */
-  void uniform4i(WebGLUniformLocation location, int x, int y, int z, int w);
-
-  /** @domName WebGLRenderingContext.uniform4iv */
-  void uniform4iv(WebGLUniformLocation location, Int32Array v);
-
-  /** @domName WebGLRenderingContext.uniformMatrix2fv */
-  void uniformMatrix2fv(WebGLUniformLocation location, bool transpose, Float32Array array);
-
-  /** @domName WebGLRenderingContext.uniformMatrix3fv */
-  void uniformMatrix3fv(WebGLUniformLocation location, bool transpose, Float32Array array);
-
-  /** @domName WebGLRenderingContext.uniformMatrix4fv */
-  void uniformMatrix4fv(WebGLUniformLocation location, bool transpose, Float32Array array);
-
-  /** @domName WebGLRenderingContext.useProgram */
-  void useProgram(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.validateProgram */
-  void validateProgram(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.vertexAttrib1f */
-  void vertexAttrib1f(int indx, num x);
-
-  /** @domName WebGLRenderingContext.vertexAttrib1fv */
-  void vertexAttrib1fv(int indx, Float32Array values);
-
-  /** @domName WebGLRenderingContext.vertexAttrib2f */
-  void vertexAttrib2f(int indx, num x, num y);
-
-  /** @domName WebGLRenderingContext.vertexAttrib2fv */
-  void vertexAttrib2fv(int indx, Float32Array values);
-
-  /** @domName WebGLRenderingContext.vertexAttrib3f */
-  void vertexAttrib3f(int indx, num x, num y, num z);
-
-  /** @domName WebGLRenderingContext.vertexAttrib3fv */
-  void vertexAttrib3fv(int indx, Float32Array values);
-
-  /** @domName WebGLRenderingContext.vertexAttrib4f */
-  void vertexAttrib4f(int indx, num x, num y, num z, num w);
-
-  /** @domName WebGLRenderingContext.vertexAttrib4fv */
-  void vertexAttrib4fv(int indx, Float32Array values);
-
-  /** @domName WebGLRenderingContext.vertexAttribPointer */
-  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset);
-
-  /** @domName WebGLRenderingContext.viewport */
-  void viewport(int x, int y, int width, int height);
-}
-
-class _WebGLRenderingContextImpl extends _CanvasRenderingContextImpl implements WebGLRenderingContext native "*WebGLRenderingContext" {
-
-  final int drawingBufferHeight;
-
-  final int drawingBufferWidth;
-
-  void activeTexture(int texture) native;
-
-  void attachShader(_WebGLProgramImpl program, _WebGLShaderImpl shader) native;
-
-  void bindAttribLocation(_WebGLProgramImpl program, int index, String name) native;
-
-  void bindBuffer(int target, _WebGLBufferImpl buffer) native;
-
-  void bindFramebuffer(int target, _WebGLFramebufferImpl framebuffer) native;
-
-  void bindRenderbuffer(int target, _WebGLRenderbufferImpl renderbuffer) native;
-
-  void bindTexture(int target, _WebGLTextureImpl texture) native;
-
-  void blendColor(num red, num green, num blue, num alpha) native;
-
-  void blendEquation(int mode) native;
-
-  void blendEquationSeparate(int modeRGB, int modeAlpha) native;
-
-  void blendFunc(int sfactor, int dfactor) native;
-
-  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native;
-
-  void bufferData(int target, data_OR_size, int usage) native;
-
-  void bufferSubData(int target, int offset, data) native;
-
-  int checkFramebufferStatus(int target) native;
-
-  void clear(int mask) native;
-
-  void clearColor(num red, num green, num blue, num alpha) native;
-
-  void clearDepth(num depth) native;
-
-  void clearStencil(int s) native;
-
-  void colorMask(bool red, bool green, bool blue, bool alpha) native;
-
-  void compileShader(_WebGLShaderImpl shader) native;
-
-  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, _ArrayBufferViewImpl data) native;
-
-  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, _ArrayBufferViewImpl data) native;
-
-  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) native;
-
-  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) native;
-
-  _WebGLBufferImpl createBuffer() native;
-
-  _WebGLFramebufferImpl createFramebuffer() native;
-
-  _WebGLProgramImpl createProgram() native;
-
-  _WebGLRenderbufferImpl createRenderbuffer() native;
-
-  _WebGLShaderImpl createShader(int type) native;
-
-  _WebGLTextureImpl createTexture() native;
-
-  void cullFace(int mode) native;
-
-  void deleteBuffer(_WebGLBufferImpl buffer) native;
-
-  void deleteFramebuffer(_WebGLFramebufferImpl framebuffer) native;
-
-  void deleteProgram(_WebGLProgramImpl program) native;
-
-  void deleteRenderbuffer(_WebGLRenderbufferImpl renderbuffer) native;
-
-  void deleteShader(_WebGLShaderImpl shader) native;
-
-  void deleteTexture(_WebGLTextureImpl texture) native;
-
-  void depthFunc(int func) native;
-
-  void depthMask(bool flag) native;
-
-  void depthRange(num zNear, num zFar) native;
-
-  void detachShader(_WebGLProgramImpl program, _WebGLShaderImpl shader) native;
-
-  void disable(int cap) native;
-
-  void disableVertexAttribArray(int index) native;
-
-  void drawArrays(int mode, int first, int count) native;
-
-  void drawElements(int mode, int count, int type, int offset) native;
-
-  void enable(int cap) native;
-
-  void enableVertexAttribArray(int index) native;
-
-  void finish() native;
-
-  void flush() native;
-
-  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, _WebGLRenderbufferImpl renderbuffer) native;
-
-  void framebufferTexture2D(int target, int attachment, int textarget, _WebGLTextureImpl texture, int level) native;
-
-  void frontFace(int mode) native;
-
-  void generateMipmap(int target) native;
-
-  _WebGLActiveInfoImpl getActiveAttrib(_WebGLProgramImpl program, int index) native;
-
-  _WebGLActiveInfoImpl getActiveUniform(_WebGLProgramImpl program, int index) native;
-
-  void getAttachedShaders(_WebGLProgramImpl program) native;
-
-  int getAttribLocation(_WebGLProgramImpl program, String name) native;
-
-  Object getBufferParameter(int target, int pname) native;
-
-  _WebGLContextAttributesImpl getContextAttributes() native;
-
-  int getError() native;
-
-  Object getExtension(String name) native;
-
-  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native;
-
-  Object getParameter(int pname) native;
-
-  String getProgramInfoLog(_WebGLProgramImpl program) native;
-
-  Object getProgramParameter(_WebGLProgramImpl program, int pname) native;
-
-  Object getRenderbufferParameter(int target, int pname) native;
-
-  String getShaderInfoLog(_WebGLShaderImpl shader) native;
-
-  Object getShaderParameter(_WebGLShaderImpl shader, int pname) native;
-
-  _WebGLShaderPrecisionFormatImpl getShaderPrecisionFormat(int shadertype, int precisiontype) native;
-
-  String getShaderSource(_WebGLShaderImpl shader) native;
-
-  List<String> getSupportedExtensions() native;
-
-  Object getTexParameter(int target, int pname) native;
-
-  Object getUniform(_WebGLProgramImpl program, _WebGLUniformLocationImpl location) native;
-
-  _WebGLUniformLocationImpl getUniformLocation(_WebGLProgramImpl program, String name) native;
-
-  Object getVertexAttrib(int index, int pname) native;
-
-  int getVertexAttribOffset(int index, int pname) native;
-
-  void hint(int target, int mode) native;
-
-  bool isBuffer(_WebGLBufferImpl buffer) native;
-
-  bool isContextLost() native;
-
-  bool isEnabled(int cap) native;
-
-  bool isFramebuffer(_WebGLFramebufferImpl framebuffer) native;
-
-  bool isProgram(_WebGLProgramImpl program) native;
-
-  bool isRenderbuffer(_WebGLRenderbufferImpl renderbuffer) native;
-
-  bool isShader(_WebGLShaderImpl shader) native;
-
-  bool isTexture(_WebGLTextureImpl texture) native;
-
-  void lineWidth(num width) native;
-
-  void linkProgram(_WebGLProgramImpl program) native;
-
-  void pixelStorei(int pname, int param) native;
-
-  void polygonOffset(num factor, num units) native;
-
-  void readPixels(int x, int y, int width, int height, int format, int type, _ArrayBufferViewImpl pixels) native;
-
-  void releaseShaderCompiler() native;
-
-  void renderbufferStorage(int target, int internalformat, int width, int height) native;
-
-  void sampleCoverage(num value, bool invert) native;
-
-  void scissor(int x, int y, int width, int height) native;
-
-  void shaderSource(_WebGLShaderImpl shader, String string) native;
-
-  void stencilFunc(int func, int ref, int mask) native;
-
-  void stencilFuncSeparate(int face, int func, int ref, int mask) native;
-
-  void stencilMask(int mask) native;
-
-  void stencilMaskSeparate(int face, int mask) native;
-
-  void stencilOp(int fail, int zfail, int zpass) native;
-
-  void stencilOpSeparate(int face, int fail, int zfail, int zpass) native;
-
-  void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [format, type, pixels]) {
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) &&
-        (format is int || format == null) &&
-        (type is int || type == null) &&
-        (pixels is ArrayBufferView || pixels == null)) {
-      _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
-      return;
-    }
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) &&
-        !?format &&
-        !?type &&
-        !?pixels) {
-      var pixels_1 = _convertDartToNative_ImageData(border_OR_canvas_OR_image_OR_pixels_OR_video);
-      _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, pixels_1);
-      return;
-    }
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) &&
-        !?format &&
-        !?type &&
-        !?pixels) {
-      _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) &&
-        !?format &&
-        !?type &&
-        !?pixels) {
-      _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) &&
-        !?format &&
-        !?type &&
-        !?pixels) {
-      _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  void _texImage2D_1(target, level, internalformat, width, height, int border, int format, int type, _ArrayBufferViewImpl pixels) native "texImage2D";
-  void _texImage2D_2(target, level, internalformat, format, type, pixels) native "texImage2D";
-  void _texImage2D_3(target, level, internalformat, format, type, _ImageElementImpl image) native "texImage2D";
-  void _texImage2D_4(target, level, internalformat, format, type, _CanvasElementImpl canvas) native "texImage2D";
-  void _texImage2D_5(target, level, internalformat, format, type, _VideoElementImpl video) native "texImage2D";
-
-  void texParameterf(int target, int pname, num param) native;
-
-  void texParameteri(int target, int pname, int param) native;
-
-  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [type, pixels]) {
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) &&
-        (type is int || type == null) &&
-        (pixels is ArrayBufferView || pixels == null)) {
-      _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
-      return;
-    }
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) &&
-        !?type &&
-        !?pixels) {
-      var pixels_1 = _convertDartToNative_ImageData(canvas_OR_format_OR_image_OR_pixels_OR_video);
-      _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, pixels_1);
-      return;
-    }
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) &&
-        !?type &&
-        !?pixels) {
-      _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) &&
-        !?type &&
-        !?pixels) {
-      _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) &&
-        !?type &&
-        !?pixels) {
-      _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-      return;
-    }
-    throw const Exception("Incorrect number or type of arguments");
-  }
-  void _texSubImage2D_1(target, level, xoffset, yoffset, width, height, int format, int type, _ArrayBufferViewImpl pixels) native "texSubImage2D";
-  void _texSubImage2D_2(target, level, xoffset, yoffset, format, type, pixels) native "texSubImage2D";
-  void _texSubImage2D_3(target, level, xoffset, yoffset, format, type, _ImageElementImpl image) native "texSubImage2D";
-  void _texSubImage2D_4(target, level, xoffset, yoffset, format, type, _CanvasElementImpl canvas) native "texSubImage2D";
-  void _texSubImage2D_5(target, level, xoffset, yoffset, format, type, _VideoElementImpl video) native "texSubImage2D";
-
-  void uniform1f(_WebGLUniformLocationImpl location, num x) native;
-
-  void uniform1fv(_WebGLUniformLocationImpl location, _Float32ArrayImpl v) native;
-
-  void uniform1i(_WebGLUniformLocationImpl location, int x) native;
-
-  void uniform1iv(_WebGLUniformLocationImpl location, _Int32ArrayImpl v) native;
-
-  void uniform2f(_WebGLUniformLocationImpl location, num x, num y) native;
-
-  void uniform2fv(_WebGLUniformLocationImpl location, _Float32ArrayImpl v) native;
-
-  void uniform2i(_WebGLUniformLocationImpl location, int x, int y) native;
-
-  void uniform2iv(_WebGLUniformLocationImpl location, _Int32ArrayImpl v) native;
-
-  void uniform3f(_WebGLUniformLocationImpl location, num x, num y, num z) native;
-
-  void uniform3fv(_WebGLUniformLocationImpl location, _Float32ArrayImpl v) native;
-
-  void uniform3i(_WebGLUniformLocationImpl location, int x, int y, int z) native;
-
-  void uniform3iv(_WebGLUniformLocationImpl location, _Int32ArrayImpl v) native;
-
-  void uniform4f(_WebGLUniformLocationImpl location, num x, num y, num z, num w) native;
-
-  void uniform4fv(_WebGLUniformLocationImpl location, _Float32ArrayImpl v) native;
-
-  void uniform4i(_WebGLUniformLocationImpl location, int x, int y, int z, int w) native;
-
-  void uniform4iv(_WebGLUniformLocationImpl location, _Int32ArrayImpl v) native;
-
-  void uniformMatrix2fv(_WebGLUniformLocationImpl location, bool transpose, _Float32ArrayImpl array) native;
-
-  void uniformMatrix3fv(_WebGLUniformLocationImpl location, bool transpose, _Float32ArrayImpl array) native;
-
-  void uniformMatrix4fv(_WebGLUniformLocationImpl location, bool transpose, _Float32ArrayImpl array) native;
-
-  void useProgram(_WebGLProgramImpl program) native;
-
-  void validateProgram(_WebGLProgramImpl program) native;
-
-  void vertexAttrib1f(int indx, num x) native;
-
-  void vertexAttrib1fv(int indx, _Float32ArrayImpl values) native;
-
-  void vertexAttrib2f(int indx, num x, num y) native;
-
-  void vertexAttrib2fv(int indx, _Float32ArrayImpl values) native;
-
-  void vertexAttrib3f(int indx, num x, num y, num z) native;
-
-  void vertexAttrib3fv(int indx, _Float32ArrayImpl values) native;
-
-  void vertexAttrib4f(int indx, num x, num y, num z, num w) native;
-
-  void vertexAttrib4fv(int indx, _Float32ArrayImpl values) native;
-
-  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) native;
-
-  void viewport(int x, int y, int width, int height) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLShader
-abstract class WebGLShader {
-}
-
-class _WebGLShaderImpl implements WebGLShader native "*WebGLShader" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLShaderPrecisionFormat
-abstract class WebGLShaderPrecisionFormat {
-
-  /** @domName WebGLShaderPrecisionFormat.precision */
-  int get precision;
-
-  /** @domName WebGLShaderPrecisionFormat.rangeMax */
-  int get rangeMax;
-
-  /** @domName WebGLShaderPrecisionFormat.rangeMin */
-  int get rangeMin;
-}
-
-class _WebGLShaderPrecisionFormatImpl implements WebGLShaderPrecisionFormat native "*WebGLShaderPrecisionFormat" {
-
-  final int precision;
-
-  final int rangeMax;
-
-  final int rangeMin;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLTexture
-abstract class WebGLTexture {
-}
-
-class _WebGLTextureImpl implements WebGLTexture native "*WebGLTexture" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLUniformLocation
-abstract class WebGLUniformLocation {
-}
-
-class _WebGLUniformLocationImpl implements WebGLUniformLocation native "*WebGLUniformLocation" {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebGLVertexArrayObjectOES
-abstract class WebGLVertexArrayObjectOES {
-}
-
-class _WebGLVertexArrayObjectOESImpl implements WebGLVertexArrayObjectOES native "*WebGLVertexArrayObjectOES" {
-}
-
-class _WebKitAnimationListImpl implements List<Animation>, JavaScriptIndexingBehavior native "*WebKitAnimationList" {
-
-  final int length;
-
-  _AnimationImpl operator[](int index) => JS("_AnimationImpl", "#[#]", this, index);
-
-  void operator[]=(int index, _AnimationImpl value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<Animation> mixins.
-  // Animation is the element type.
-
-  // From Iterable<Animation>:
-
-  Iterator<Animation> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<Animation>(this);
-  }
-
-  // From Collection<Animation>:
-
-  void add(Animation value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(Animation value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<Animation> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(Animation element) => _Collections.contains(this, element);
-
-  void forEach(void f(Animation element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Animation element)) => _Collections.map(this, [], f);
-
-  Collection<Animation> filter(bool f(Animation element)) =>
-     _Collections.filter(this, <Animation>[], f);
-
-  bool every(bool f(Animation element)) => _Collections.every(this, f);
-
-  bool some(bool f(Animation element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Animation>:
-
-  void sort([Comparator<Animation> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Animation element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Animation element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  Animation get last => this[length - 1];
-
-  Animation removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<Animation> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [Animation initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<Animation> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <Animation>[]);
-
-  // -- end List<Animation> mixins.
-
-  _AnimationImpl item(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebKitCSSFilterValue
-abstract class WebKitCSSFilterValue implements List<CSSValue> {
-
-  static const int CSS_FILTER_BLUR = 10;
-
-  static const int CSS_FILTER_BRIGHTNESS = 8;
-
-  static const int CSS_FILTER_CONTRAST = 9;
-
-  static const int CSS_FILTER_CUSTOM = 12;
-
-  static const int CSS_FILTER_DROP_SHADOW = 11;
-
-  static const int CSS_FILTER_GRAYSCALE = 2;
-
-  static const int CSS_FILTER_HUE_ROTATE = 5;
-
-  static const int CSS_FILTER_INVERT = 6;
-
-  static const int CSS_FILTER_OPACITY = 7;
-
-  static const int CSS_FILTER_REFERENCE = 1;
-
-  static const int CSS_FILTER_SATURATE = 4;
-
-  static const int CSS_FILTER_SEPIA = 3;
-
-  /** @domName WebKitCSSFilterValue.operationType */
-  int get operationType;
-}
-
-class _WebKitCSSFilterValueImpl extends _CSSValueListImpl implements WebKitCSSFilterValue native "*WebKitCSSFilterValue" {
-
-  final int operationType;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebKitNamedFlow
-abstract class WebKitNamedFlow implements EventTarget {
-
-  /** @domName WebKitNamedFlow.firstEmptyRegionIndex */
-  int get firstEmptyRegionIndex;
-
-  /** @domName WebKitNamedFlow.name */
-  String get name;
-
-  /** @domName WebKitNamedFlow.overset */
-  bool get overset;
-
-  /** @domName WebKitNamedFlow.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName WebKitNamedFlow.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName WebKitNamedFlow.getContent */
-  List<Node> getContent();
-
-  /** @domName WebKitNamedFlow.getRegions */
-  List<Node> getRegions();
-
-  /** @domName WebKitNamedFlow.getRegionsByContent */
-  List<Node> getRegionsByContent(Node contentNode);
-
-  /** @domName WebKitNamedFlow.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-class _WebKitNamedFlowImpl extends _EventTargetImpl implements WebKitNamedFlow native "*WebKitNamedFlow" {
-
-  final int firstEmptyRegionIndex;
-
-  final String name;
-
-  final bool overset;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  bool $dom_dispatchEvent(_EventImpl event) native "dispatchEvent";
-
-  List<Node> getContent() native;
-
-  List<Node> getRegions() native;
-
-  List<Node> getRegionsByContent(_NodeImpl contentNode) native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName WebSocket
-abstract class WebSocket implements EventTarget {
-
-  factory WebSocket(String url) => _WebSocketFactoryProvider.createWebSocket(url);
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  WebSocketEvents get on;
-
-  static const int CLOSED = 3;
-
-  static const int CLOSING = 2;
-
-  static const int CONNECTING = 0;
-
-  static const int OPEN = 1;
-
-  /** @domName WebSocket.URL */
-  String get URL;
-
-  /** @domName WebSocket.binaryType */
-  String binaryType;
-
-  /** @domName WebSocket.bufferedAmount */
-  int get bufferedAmount;
-
-  /** @domName WebSocket.extensions */
-  String get extensions;
-
-  /** @domName WebSocket.protocol */
-  String get protocol;
-
-  /** @domName WebSocket.readyState */
-  int get readyState;
-
-  /** @domName WebSocket.url */
-  String get url;
-
-  /** @domName WebSocket.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName WebSocket.close */
-  void close([int code, String reason]);
-
-  /** @domName WebSocket.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName WebSocket.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName WebSocket.send */
-  void send(data);
-}
-
-abstract class WebSocketEvents implements Events {
-
-  EventListenerList get close;
-
-  EventListenerList get error;
-
-  EventListenerList get message;
-
-  EventListenerList get open;
-}
-
-class _WebSocketImpl extends _EventTargetImpl implements WebSocket native "*WebSocket" {
-
-  _WebSocketEventsImpl get on =>
-    new _WebSocketEventsImpl(this);
-
-  final String URL;
-
-  String binaryType;
-
-  final int bufferedAmount;
-
-  final String extensions;
-
-  final String protocol;
-
-  final int readyState;
-
-  final String url;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  void close([int code, String reason]) native;
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  void send(data) native;
-}
-
-class _WebSocketEventsImpl extends _EventsImpl implements WebSocketEvents {
-  _WebSocketEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get close => this['close'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get message => this['message'];
-
-  EventListenerList get open => this['open'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName WheelEvent
-abstract class WheelEvent implements MouseEvent {
-
-  /** @domName WheelEvent.webkitDirectionInvertedFromDevice */
-  bool get webkitDirectionInvertedFromDevice;
-
-  /** @domName WheelEvent.wheelDeltaX */
-  int get $dom_wheelDeltaX;
-
-  /** @domName WheelEvent.wheelDeltaY */
-  int get $dom_wheelDeltaY;
-
-  /** @domName WheelEvent.initWebKitWheelEvent */
-  void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey);
-
-
-  /** @domName WheelEvent.deltaX */
-  abstract num get deltaX;
-
-  /** @domName WheelEvent.deltaY */
-  abstract num get deltaY;
-
-  /** @domName WheelEvent.deltaMode */
-  abstract int get deltaMode;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _WheelEventImpl extends _MouseEventImpl implements WheelEvent native "*WheelEvent" {
-
-  final bool webkitDirectionInvertedFromDevice;
-
-  void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, _LocalWindowImpl view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native;
-
-
-  num get deltaY {
-    if (JS('bool', '#.deltaY !== undefined', this)) {
-      // W3C WheelEvent
-      return this._deltaY;
-    } else if (JS('bool', '#.wheelDelta !== undefined', this)) {
-      // Chrome and IE
-      return this._wheelDelta;
-    } else if (JS('bool', '#.detail !== undefined', this)) {
-      // Firefox
-
-      // Handle DOMMouseScroll case where it uses detail and the axis to
-      // differentiate.
-      if (JS('bool', '#.axis == MouseScrollEvent.VERTICAL_AXIS', this)) {
-        var detail = this._detail;
-        // Firefox is normally the number of lines to scale (normally 3)
-        // so multiply it by 40 to get pixels to move, matching IE & WebKit.
-        if (detail < 100) {
-          return detail * 40;
-        }
-        return detail;
-      }
-      return 0;
-    }
-    throw new UnsupportedError(
-        'deltaY is not supported');
-  }
-
-  num get deltaX {
-    if (JS('bool', '#.deltaX !== undefined', this)) {
-      // W3C WheelEvent
-      return this._deltaX;
-    } else if (JS('bool', '#.wheelDeltaX !== undefined', this)) {
-      // Chrome
-      return this._wheelDeltaX;
-    } else if (JS('bool', '#.detail !== undefined', this)) {
-      // Firefox and IE.
-      // IE will have detail set but will not set axis.
-
-      // Handle DOMMouseScroll case where it uses detail and the axis to
-      // differentiate.
-      if (JS('bool', '#.axis !== undefined && #.axis == MouseScrollEvent.HORIZONTAL_AXIS', this, this)) {
-        var detail = this._detail;
-        // Firefox is normally the number of lines to scale (normally 3)
-        // so multiply it by 40 to get pixels to move, matching IE & WebKit.
-        if (detail < 100) {
-          return detail * 40;
-        }
-        return detail;
-      }
-      return 0;
-    }
-    throw new UnsupportedError(
-        'deltaX is not supported');
-  }
-
-  int get deltaMode {
-    if (JS('bool', '!!#.deltaMode', this)) {
-      // If not available then we're poly-filling and doing pixel scroll.
-      return 0;
-    }
-    return this._deltaMode;
-  }
-
-  num get _deltaY => JS('num', '#.deltaY', this);
-  num get _deltaX => JS('num', '#.deltaX', this);
-  num get _wheelDelta => JS('num', '#.wheelDelta', this);
-  num get _wheelDeltaX => JS('num', '#.wheelDeltaX', this);
-  num get _detail => JS('num', '#.detail', this);
-  int get _deltaMode => JS('int', '#.deltaMode', this);
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Worker
-abstract class Worker implements AbstractWorker {
-
-  factory Worker(String scriptUrl) => _WorkerFactoryProvider.createWorker(scriptUrl);
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  WorkerEvents get on;
-
-  /** @domName Worker.postMessage */
-  void postMessage(/*SerializedScriptValue*/ message, [List messagePorts]);
-
-  /** @domName Worker.terminate */
-  void terminate();
-}
-
-abstract class WorkerEvents implements AbstractWorkerEvents {
-
-  EventListenerList get message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WorkerContext
-abstract class WorkerContext implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  WorkerContextEvents get on;
-
-  static const int PERSISTENT = 1;
-
-  static const int TEMPORARY = 0;
-
-  /** @domName WorkerContext.indexedDB */
-  IDBFactory get indexedDB;
-
-  /** @domName WorkerContext.location */
-  WorkerLocation get location;
-
-  /** @domName WorkerContext.navigator */
-  WorkerNavigator get navigator;
-
-  /** @domName WorkerContext.self */
-  WorkerContext get self;
-
-  /** @domName WorkerContext.webkitIndexedDB */
-  IDBFactory get webkitIndexedDB;
-
-  /** @domName WorkerContext.webkitNotifications */
-  NotificationCenter get webkitNotifications;
-
-  /** @domName WorkerContext.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName WorkerContext.clearInterval */
-  void clearInterval(int handle);
-
-  /** @domName WorkerContext.clearTimeout */
-  void clearTimeout(int handle);
-
-  /** @domName WorkerContext.close */
-  void close();
-
-  /** @domName WorkerContext.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName WorkerContext.importScripts */
-  void importScripts();
-
-  /** @domName WorkerContext.openDatabase */
-  Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]);
-
-  /** @domName WorkerContext.openDatabaseSync */
-  DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]);
-
-  /** @domName WorkerContext.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName WorkerContext.setInterval */
-  int setInterval(TimeoutHandler handler, int timeout);
-
-  /** @domName WorkerContext.setTimeout */
-  int setTimeout(TimeoutHandler handler, int timeout);
-
-  /** @domName WorkerContext.webkitRequestFileSystem */
-  void webkitRequestFileSystem(int type, int size, [FileSystemCallback successCallback, ErrorCallback errorCallback]);
-
-  /** @domName WorkerContext.webkitRequestFileSystemSync */
-  DOMFileSystemSync webkitRequestFileSystemSync(int type, int size);
-
-  /** @domName WorkerContext.webkitResolveLocalFileSystemSyncURL */
-  EntrySync webkitResolveLocalFileSystemSyncURL(String url);
-
-  /** @domName WorkerContext.webkitResolveLocalFileSystemURL */
-  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]);
-}
-
-abstract class WorkerContextEvents implements Events {
-
-  EventListenerList get error;
-}
-
-class _WorkerContextImpl extends _EventTargetImpl implements WorkerContext native "*WorkerContext" {
-
-  _WorkerContextEventsImpl get on =>
-    new _WorkerContextEventsImpl(this);
-
-  final _IDBFactoryImpl indexedDB;
-
-  final _WorkerLocationImpl location;
-
-  final _WorkerNavigatorImpl navigator;
-
-  final _WorkerContextImpl self;
-
-  final _IDBFactoryImpl webkitIndexedDB;
-
-  final _NotificationCenterImpl webkitNotifications;
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
-
-  void clearInterval(int handle) native;
-
-  void clearTimeout(int handle) native;
-
-  void close() native;
-
-  bool $dom_dispatchEvent(_EventImpl evt) native "dispatchEvent";
-
-  void importScripts() native;
-
-  _DatabaseImpl openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
-
-  _DatabaseSyncImpl openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
-
-  int setInterval(TimeoutHandler handler, int timeout) native;
-
-  int setTimeout(TimeoutHandler handler, int timeout) native;
-
-  void webkitRequestFileSystem(int type, int size, [FileSystemCallback successCallback, ErrorCallback errorCallback]) native;
-
-  _DOMFileSystemSyncImpl webkitRequestFileSystemSync(int type, int size) native;
-
-  _EntrySyncImpl webkitResolveLocalFileSystemSyncURL(String url) native;
-
-  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native;
-}
-
-class _WorkerContextEventsImpl extends _EventsImpl implements WorkerContextEvents {
-  _WorkerContextEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get error => this['error'];
-}
-
-class _WorkerImpl extends _AbstractWorkerImpl implements Worker native "*Worker" {
-
-  _WorkerEventsImpl get on =>
-    new _WorkerEventsImpl(this);
-
-  void postMessage(/*SerializedScriptValue*/ message, [messagePorts]) {
-    if (?messagePorts) {
-      var message_1 = _convertDartToNative_SerializedScriptValue(message);
-      _postMessage_1(message_1, messagePorts);
-      return;
-    }
-    var message_2 = _convertDartToNative_SerializedScriptValue(message);
-    _postMessage_2(message_2);
-    return;
-  }
-  void _postMessage_1(message, List messagePorts) native "postMessage";
-  void _postMessage_2(message) native "postMessage";
-
-  void terminate() native;
-}
-
-class _WorkerEventsImpl extends _AbstractWorkerEventsImpl implements WorkerEvents {
-  _WorkerEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get message => this['message'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WorkerLocation
-abstract class WorkerLocation {
-
-  /** @domName WorkerLocation.hash */
-  String get hash;
-
-  /** @domName WorkerLocation.host */
-  String get host;
-
-  /** @domName WorkerLocation.hostname */
-  String get hostname;
-
-  /** @domName WorkerLocation.href */
-  String get href;
-
-  /** @domName WorkerLocation.pathname */
-  String get pathname;
-
-  /** @domName WorkerLocation.port */
-  String get port;
-
-  /** @domName WorkerLocation.protocol */
-  String get protocol;
-
-  /** @domName WorkerLocation.search */
-  String get search;
-
-  /** @domName WorkerLocation.toString */
-  String toString();
-}
-
-class _WorkerLocationImpl implements WorkerLocation native "*WorkerLocation" {
-
-  final String hash;
-
-  final String host;
-
-  final String hostname;
-
-  final String href;
-
-  final String pathname;
-
-  final String port;
-
-  final String protocol;
-
-  final String search;
-
-  String toString() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WorkerNavigator
-abstract class WorkerNavigator {
-
-  /** @domName WorkerNavigator.appName */
-  String get appName;
-
-  /** @domName WorkerNavigator.appVersion */
-  String get appVersion;
-
-  /** @domName WorkerNavigator.onLine */
-  bool get onLine;
-
-  /** @domName WorkerNavigator.platform */
-  String get platform;
-
-  /** @domName WorkerNavigator.userAgent */
-  String get userAgent;
-}
-
-class _WorkerNavigatorImpl implements WorkerNavigator native "*WorkerNavigator" {
-
-  final String appName;
-
-  final String appVersion;
-
-  final bool onLine;
-
-  final String platform;
-
-  final String userAgent;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XMLSerializer
-abstract class XMLSerializer {
-
-  factory XMLSerializer() => _XMLSerializerFactoryProvider.createXMLSerializer();
-
-  /** @domName XMLSerializer.serializeToString */
-  String serializeToString(Node node);
-}
-
-class _XMLSerializerImpl implements XMLSerializer native "*XMLSerializer" {
-
-  String serializeToString(_NodeImpl node) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XPathEvaluator
-abstract class XPathEvaluator {
-
-  factory XPathEvaluator() => _XPathEvaluatorFactoryProvider.createXPathEvaluator();
-
-  /** @domName XPathEvaluator.createExpression */
-  XPathExpression createExpression(String expression, XPathNSResolver resolver);
-
-  /** @domName XPathEvaluator.createNSResolver */
-  XPathNSResolver createNSResolver(Node nodeResolver);
-
-  /** @domName XPathEvaluator.evaluate */
-  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult);
-}
-
-class _XPathEvaluatorImpl implements XPathEvaluator native "*XPathEvaluator" {
-
-  _XPathExpressionImpl createExpression(String expression, _XPathNSResolverImpl resolver) native;
-
-  _XPathNSResolverImpl createNSResolver(_NodeImpl nodeResolver) native;
-
-  _XPathResultImpl evaluate(String expression, _NodeImpl contextNode, _XPathNSResolverImpl resolver, int type, _XPathResultImpl inResult) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XPathException
-abstract class XPathException {
-
-  static const int INVALID_EXPRESSION_ERR = 51;
-
-  static const int TYPE_ERR = 52;
-
-  /** @domName XPathException.code */
-  int get code;
-
-  /** @domName XPathException.message */
-  String get message;
-
-  /** @domName XPathException.name */
-  String get name;
-
-  /** @domName XPathException.toString */
-  String toString();
-}
-
-class _XPathExceptionImpl implements XPathException native "*XPathException" {
-
-  final int code;
-
-  final String message;
-
-  final String name;
-
-  String toString() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XPathExpression
-abstract class XPathExpression {
-
-  /** @domName XPathExpression.evaluate */
-  XPathResult evaluate(Node contextNode, int type, XPathResult inResult);
-}
-
-class _XPathExpressionImpl implements XPathExpression native "*XPathExpression" {
-
-  _XPathResultImpl evaluate(_NodeImpl contextNode, int type, _XPathResultImpl inResult) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XPathNSResolver
-abstract class XPathNSResolver {
-
-  /** @domName XPathNSResolver.lookupNamespaceURI */
-  String lookupNamespaceURI(String prefix);
-}
-
-class _XPathNSResolverImpl implements XPathNSResolver native "*XPathNSResolver" {
-
-  String lookupNamespaceURI(String prefix) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XPathResult
-abstract class XPathResult {
-
-  static const int ANY_TYPE = 0;
-
-  static const int ANY_UNORDERED_NODE_TYPE = 8;
-
-  static const int BOOLEAN_TYPE = 3;
-
-  static const int FIRST_ORDERED_NODE_TYPE = 9;
-
-  static const int NUMBER_TYPE = 1;
-
-  static const int ORDERED_NODE_ITERATOR_TYPE = 5;
-
-  static const int ORDERED_NODE_SNAPSHOT_TYPE = 7;
-
-  static const int STRING_TYPE = 2;
-
-  static const int UNORDERED_NODE_ITERATOR_TYPE = 4;
-
-  static const int UNORDERED_NODE_SNAPSHOT_TYPE = 6;
-
-  /** @domName XPathResult.booleanValue */
-  bool get booleanValue;
-
-  /** @domName XPathResult.invalidIteratorState */
-  bool get invalidIteratorState;
-
-  /** @domName XPathResult.numberValue */
-  num get numberValue;
-
-  /** @domName XPathResult.resultType */
-  int get resultType;
-
-  /** @domName XPathResult.singleNodeValue */
-  Node get singleNodeValue;
-
-  /** @domName XPathResult.snapshotLength */
-  int get snapshotLength;
-
-  /** @domName XPathResult.stringValue */
-  String get stringValue;
-
-  /** @domName XPathResult.iterateNext */
-  Node iterateNext();
-
-  /** @domName XPathResult.snapshotItem */
-  Node snapshotItem(int index);
-}
-
-class _XPathResultImpl implements XPathResult native "*XPathResult" {
-
-  final bool booleanValue;
-
-  final bool invalidIteratorState;
-
-  final num numberValue;
-
-  final int resultType;
-
-  final _NodeImpl singleNodeValue;
-
-  final int snapshotLength;
-
-  final String stringValue;
-
-  _NodeImpl iterateNext() native;
-
-  _NodeImpl snapshotItem(int index) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XSLTProcessor
-abstract class XSLTProcessor {
-
-  factory XSLTProcessor() => _XSLTProcessorFactoryProvider.createXSLTProcessor();
-
-  /** @domName XSLTProcessor.clearParameters */
-  void clearParameters();
-
-  /** @domName XSLTProcessor.getParameter */
-  String getParameter(String namespaceURI, String localName);
-
-  /** @domName XSLTProcessor.importStylesheet */
-  void importStylesheet(Node stylesheet);
-
-  /** @domName XSLTProcessor.removeParameter */
-  void removeParameter(String namespaceURI, String localName);
-
-  /** @domName XSLTProcessor.reset */
-  void reset();
-
-  /** @domName XSLTProcessor.setParameter */
-  void setParameter(String namespaceURI, String localName, String value);
-
-  /** @domName XSLTProcessor.transformToDocument */
-  Document transformToDocument(Node source);
-
-  /** @domName XSLTProcessor.transformToFragment */
-  DocumentFragment transformToFragment(Node source, Document docVal);
-}
-
-class _XSLTProcessorImpl implements XSLTProcessor native "*XSLTProcessor" {
-
-  void clearParameters() native;
-
-  String getParameter(String namespaceURI, String localName) native;
-
-  void importStylesheet(_NodeImpl stylesheet) native;
-
-  void removeParameter(String namespaceURI, String localName) native;
-
-  void reset() native;
-
-  void setParameter(String namespaceURI, String localName, String value) native;
-
-  _DocumentImpl transformToDocument(_NodeImpl source) native;
-
-  _DocumentFragmentImpl transformToFragment(_NodeImpl source, _DocumentImpl docVal) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _ArrayBufferFactoryProvider {
-  static ArrayBuffer createArrayBuffer(int length) =>
-      JS('ArrayBuffer', 'new ArrayBuffer(#)', length);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _AudioElementFactoryProvider {
-  static AudioElement createAudioElement([String src = null]) {
-    if (src == null) return JS('AudioElement', 'new Audio()');
-    return JS('AudioElement', 'new Audio(#)', src);
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _BlobFactoryProvider {
-  static Blob createBlob([List blobParts = null, String type, String endings]) {
-    // TODO: validate that blobParts is a JS Array and convert if not.
-    // TODO: any coercions on the elements of blobParts, e.g. coerce a typed
-    // array to ArrayBuffer if it is a total view.
-    if (type == null && endings == null) {
-      return _create_1(blobParts);
-    }
-    var bag = _create_bag();
-    if (type != null) _bag_set(bag, 'type', type);
-    if (endings != null) _bag_set(bag, 'endings', endings);
-    return _create_2(blobParts, bag);
-  }
-
-  static _create_1(parts) => JS('Blob', 'new Blob(#)', parts);
-  static _create_2(parts, bag) => JS('Blob', 'new Blob(#, #)', parts, bag);
-
-  static _create_bag() => JS('var', '{}');
-  static _bag_set(bag, key, value) { JS('void', '#[#] = #', bag, key, value); }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _CSSMatrixFactoryProvider {
-  static CSSMatrix createCSSMatrix([String cssValue = '']) =>
-      JS('CSSMatrix', 'new WebKitCSSMatrix(#)', cssValue);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _DOMParserFactoryProvider {
-  static DOMParser createDOMParser() =>
-      JS('DOMParser', 'new DOMParser()' );
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _DOMURLFactoryProvider {
-  static DOMURL createDOMURL() =>
-      JS('DOMURL', 'new DOMURL()' );
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _DataViewFactoryProvider {
-  static DataView createDataView(
-      ArrayBuffer buffer, [int byteOffset = null, int byteLength = null]) {
-    if (byteOffset == null) {
-      return JS('DataView', 'new DataView(#)', buffer);
-    }
-    if (byteLength == null) {
-      return JS('DataView', 'new DataView(#,#)', buffer, byteOffset);
-    }
-    return JS('DataView', 'new DataView(#,#,#)', buffer, byteOffset, byteLength);
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-class _Elements {
-
-
-  static AnchorElement createAnchorElement([String href]) {
-    _AnchorElementImpl _e = _document.$dom_createElement("a");
-    if (href != null) _e.href = href;
-    return _e;
-  }
-
-  static AreaElement createAreaElement() {
-    _AreaElementImpl _e = _document.$dom_createElement("area");
-    return _e;
-  }
-
-  static BRElement createBRElement() {
-    _BRElementImpl _e = _document.$dom_createElement("br");
-    return _e;
-  }
-
-  static BaseElement createBaseElement() {
-    _BaseElementImpl _e = _document.$dom_createElement("base");
-    return _e;
-  }
-
-  static BodyElement createBodyElement() {
-    _BodyElementImpl _e = _document.$dom_createElement("body");
-    return _e;
-  }
-
-  static ButtonElement createButtonElement() {
-    _ButtonElementImpl _e = _document.$dom_createElement("button");
-    return _e;
-  }
-
-  static CanvasElement createCanvasElement([int width, int height]) {
-    _CanvasElementImpl _e = _document.$dom_createElement("canvas");
-    if (width != null) _e.width = width;
-    if (height != null) _e.height = height;
-    return _e;
-  }
-
-  static ContentElement createContentElement() {
-    _ContentElementImpl _e = _document.$dom_createElement("content");
-    return _e;
-  }
-
-  static DListElement createDListElement() {
-    _DListElementImpl _e = _document.$dom_createElement("dl");
-    return _e;
-  }
-
-  static DataListElement createDataListElement() {
-    _DataListElementImpl _e = _document.$dom_createElement("datalist");
-    return _e;
-  }
-
-  static DetailsElement createDetailsElement() {
-    _DetailsElementImpl _e = _document.$dom_createElement("details");
-    return _e;
-  }
-
-  static DivElement createDivElement() {
-    _DivElementImpl _e = _document.$dom_createElement("div");
-    return _e;
-  }
-
-  static EmbedElement createEmbedElement() {
-    _EmbedElementImpl _e = _document.$dom_createElement("embed");
-    return _e;
-  }
-
-  static FieldSetElement createFieldSetElement() {
-    _FieldSetElementImpl _e = _document.$dom_createElement("fieldset");
-    return _e;
-  }
-
-  static FormElement createFormElement() {
-    _FormElementImpl _e = _document.$dom_createElement("form");
-    return _e;
-  }
-
-  static HRElement createHRElement() {
-    _HRElementImpl _e = _document.$dom_createElement("hr");
-    return _e;
-  }
-
-  static HeadElement createHeadElement() {
-    _HeadElementImpl _e = _document.$dom_createElement("head");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h1() {
-    _HeadingElementImpl _e = _document.$dom_createElement("h1");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h2() {
-    _HeadingElementImpl _e = _document.$dom_createElement("h2");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h3() {
-    _HeadingElementImpl _e = _document.$dom_createElement("h3");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h4() {
-    _HeadingElementImpl _e = _document.$dom_createElement("h4");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h5() {
-    _HeadingElementImpl _e = _document.$dom_createElement("h5");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h6() {
-    _HeadingElementImpl _e = _document.$dom_createElement("h6");
-    return _e;
-  }
-
-  static HtmlElement createHtmlElement() {
-    _HtmlElementImpl _e = _document.$dom_createElement("html");
-    return _e;
-  }
-
-  static IFrameElement createIFrameElement() {
-    _IFrameElementImpl _e = _document.$dom_createElement("iframe");
-    return _e;
-  }
-
-  static ImageElement createImageElement([String src, int width, int height]) {
-    _ImageElementImpl _e = _document.$dom_createElement("img");
-    if (src != null) _e.src = src;
-    if (width != null) _e.width = width;
-    if (height != null) _e.height = height;
-    return _e;
-  }
-
-  static InputElement createInputElement([String type]) {
-    _InputElementImpl _e = _document.$dom_createElement("input");
-    if (type != null) _e.type = type;
-    return _e;
-  }
-
-  static KeygenElement createKeygenElement() {
-    _KeygenElementImpl _e = _document.$dom_createElement("keygen");
-    return _e;
-  }
-
-  static LIElement createLIElement() {
-    _LIElementImpl _e = _document.$dom_createElement("li");
-    return _e;
-  }
-
-  static LabelElement createLabelElement() {
-    _LabelElementImpl _e = _document.$dom_createElement("label");
-    return _e;
-  }
-
-  static LegendElement createLegendElement() {
-    _LegendElementImpl _e = _document.$dom_createElement("legend");
-    return _e;
-  }
-
-  static LinkElement createLinkElement() {
-    _LinkElementImpl _e = _document.$dom_createElement("link");
-    return _e;
-  }
-
-  static MapElement createMapElement() {
-    _MapElementImpl _e = _document.$dom_createElement("map");
-    return _e;
-  }
-
-  static MenuElement createMenuElement() {
-    _MenuElementImpl _e = _document.$dom_createElement("menu");
-    return _e;
-  }
-
-  static MeterElement createMeterElement() {
-    _MeterElementImpl _e = _document.$dom_createElement("meter");
-    return _e;
-  }
-
-  static OListElement createOListElement() {
-    _OListElementImpl _e = _document.$dom_createElement("ol");
-    return _e;
-  }
-
-  static ObjectElement createObjectElement() {
-    _ObjectElementImpl _e = _document.$dom_createElement("object");
-    return _e;
-  }
-
-  static OptGroupElement createOptGroupElement() {
-    _OptGroupElementImpl _e = _document.$dom_createElement("optgroup");
-    return _e;
-  }
-
-  static OutputElement createOutputElement() {
-    _OutputElementImpl _e = _document.$dom_createElement("output");
-    return _e;
-  }
-
-  static ParagraphElement createParagraphElement() {
-    _ParagraphElementImpl _e = _document.$dom_createElement("p");
-    return _e;
-  }
-
-  static ParamElement createParamElement() {
-    _ParamElementImpl _e = _document.$dom_createElement("param");
-    return _e;
-  }
-
-  static PreElement createPreElement() {
-    _PreElementImpl _e = _document.$dom_createElement("pre");
-    return _e;
-  }
-
-  static ProgressElement createProgressElement() {
-    _ProgressElementImpl _e = _document.$dom_createElement("progress");
-    return _e;
-  }
-
-  static ScriptElement createScriptElement() {
-    _ScriptElementImpl _e = _document.$dom_createElement("script");
-    return _e;
-  }
-
-  static SelectElement createSelectElement() {
-    _SelectElementImpl _e = _document.$dom_createElement("select");
-    return _e;
-  }
-
-  static SourceElement createSourceElement() {
-    _SourceElementImpl _e = _document.$dom_createElement("source");
-    return _e;
-  }
-
-  static SpanElement createSpanElement() {
-    _SpanElementImpl _e = _document.$dom_createElement("span");
-    return _e;
-  }
-
-  static StyleElement createStyleElement() {
-    _StyleElementImpl _e = _document.$dom_createElement("style");
-    return _e;
-  }
-
-  static TableCaptionElement createTableCaptionElement() {
-    _TableCaptionElementImpl _e = _document.$dom_createElement("caption");
-    return _e;
-  }
-
-  static TableCellElement createTableCellElement() {
-    _TableCellElementImpl _e = _document.$dom_createElement("td");
-    return _e;
-  }
-
-  static TableColElement createTableColElement() {
-    _TableColElementImpl _e = _document.$dom_createElement("col");
-    return _e;
-  }
-
-  static TableElement createTableElement() {
-    _TableElementImpl _e = _document.$dom_createElement("table");
-    return _e;
-  }
-
-  static TableRowElement createTableRowElement() {
-    _TableRowElementImpl _e = _document.$dom_createElement("tr");
-    return _e;
-  }
-
-  static TextAreaElement createTextAreaElement() {
-    _TextAreaElementImpl _e = _document.$dom_createElement("textarea");
-    return _e;
-  }
-
-  static TitleElement createTitleElement() {
-    _TitleElementImpl _e = _document.$dom_createElement("title");
-    return _e;
-  }
-
-  static TrackElement createTrackElement() {
-    _TrackElementImpl _e = _document.$dom_createElement("track");
-    return _e;
-  }
-
-  static UListElement createUListElement() {
-    _UListElementImpl _e = _document.$dom_createElement("ul");
-    return _e;
-  }
-
-  static VideoElement createVideoElement() {
-    _VideoElementImpl _e = _document.$dom_createElement("video");
-    return _e;
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _EventSourceFactoryProvider {
-  static EventSource createEventSource(String scriptUrl) =>
-      JS('EventSource', 'new EventSource(#)', scriptUrl);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _FileReaderFactoryProvider {
-  static FileReader createFileReader() =>
-      JS('FileReader', 'new FileReader()' );
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _FileReaderSyncFactoryProvider {
-  static FileReaderSync createFileReaderSync() =>
-      JS('FileReaderSync', 'new FileReaderSync()' );
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _FormDataFactoryProvider {
-  static FormData createFormData([FormElement form = null]) {
-    if (form == null) return JS('FormData', 'new FormData()');
-    return JS('FormData', 'new FormData(#)', form);
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _HttpRequestFactoryProvider {
-  static HttpRequest createHttpRequest() =>
-      JS('HttpRequest', 'new XMLHttpRequest();');
-
-  static HttpRequest createHttpRequest_get(String url,
-      onSuccess(HttpRequest request)) =>
-      _HttpRequestUtils.get(url, onSuccess, false);
-
-  static HttpRequest createHttpRequest_getWithCredentials(String url,
-      onSuccess(HttpRequest request)) =>
-      _HttpRequestUtils.get(url, onSuccess, true);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _IceCandidateFactoryProvider {
-  static IceCandidate createIceCandidate(String label, String candidateLine) =>
-      JS('IceCandidate', 'new IceCandidate(#,#)', label, candidateLine);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _MediaControllerFactoryProvider {
-  static MediaController createMediaController() =>
-      JS('MediaController', 'new MediaController()' );
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _MediaSourceFactoryProvider {
-  static MediaSource createMediaSource() =>
-      JS('MediaSource', 'new MediaSource()' );
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _MediaStreamFactoryProvider {
-  static MediaStream createMediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) =>
-      JS('MediaStream', 'new MediaStream(#,#)', audioTracks, videoTracks);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _MessageChannelFactoryProvider {
-  static MessageChannel createMessageChannel() =>
-      JS('MessageChannel', 'new MessageChannel()' );
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _MutationObserverFactoryProvider {
-  static MutationObserver createMutationObserver(MutationCallback callback) native '''
-    var constructor =
-        window.MutationObserver || window.WebKitMutationObserver ||
-        window.MozMutationObserver;
-    return new constructor(callback);
-  ''';
-
-  // TODO(sra): Dart2js inserts a conversion when a Dart function (i.e. an
-  // object with a call method) is passed to a native method.  This is so the
-  // native code sees a JavaScript function.
-  //
-  // This does not happen when a function is 'passed' to a JS-form so it is not
-  // possible to rewrite the above code to, e.g. (simplified):
-  //
-  // static createMutationObserver(MutationCallback callback) =>
-  //    JS('var', 'new (window.MutationObserver)(#)', callback);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _NotificationFactoryProvider {
-  static Notification createNotification(String title, [Map options]) =>
-      JS('Notification', 'new Notification(#,#)', title, options);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _OptionElementFactoryProvider {
-  static OptionElement createOptionElement(
-      [String data, String value, bool defaultSelected, bool selected]) {
-    if (data == null) {
-      return JS('OptionElement', 'new Option()');
-    }
-    if (value == null) {
-      return JS('OptionElement', 'new Option(#)', data);
-    }
-    if (defaultSelected == null) {
-      return JS('OptionElement', 'new Option(#,#)', data, value);
-    }
-    if (selected == null) {
-      return JS('OptionElement', 'new Option(#,#,#)',
-                data, value, defaultSelected);
-    }
-    return JS('OptionElement', 'new Option(#,#,#,#)',
-              data, value, defaultSelected, selected);
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _PeerConnection00FactoryProvider {
-  static PeerConnection00 createPeerConnection00(String serverConfiguration, IceCallback iceCallback) =>
-      JS('PeerConnection00', 'new PeerConnection00(#,#)', serverConfiguration, iceCallback);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _RTCIceCandidateFactoryProvider {
-  static RTCIceCandidate createRTCIceCandidate(Map dictionary) =>
-      JS('RTCIceCandidate', 'new RTCIceCandidate(#)', dictionary);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _RTCPeerConnectionFactoryProvider {
-  static RTCPeerConnection createRTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) =>
-      JS('RTCPeerConnection', 'new RTCPeerConnection(#,#)', rtcIceServers, mediaConstraints);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _RTCSessionDescriptionFactoryProvider {
-  static RTCSessionDescription createRTCSessionDescription(Map dictionary) =>
-      JS('RTCSessionDescription', 'new RTCSessionDescription(#)', dictionary);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _SessionDescriptionFactoryProvider {
-  static SessionDescription createSessionDescription(String sdp) =>
-      JS('SessionDescription', 'new SessionDescription(#)', sdp);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _ShadowRootFactoryProvider {
-  static ShadowRoot createShadowRoot(Element host) =>
-      JS('ShadowRoot',
-         'new (window.ShadowRoot || window.WebKitShadowRoot)(#)', host);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _SharedWorkerFactoryProvider {
-  static SharedWorker createSharedWorker(String scriptURL, [String name]) {
-    if (name == null) return JS('SharedWorker', 'new SharedWorker(#)', scriptURL);
-    return JS('SharedWorker', 'new SharedWorker(#,#)', scriptURL, name);
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _SpeechGrammarFactoryProvider {
-  static SpeechGrammar createSpeechGrammar() =>
-      JS('SpeechGrammar', 'new SpeechGrammar()' );
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _SpeechGrammarListFactoryProvider {
-  static SpeechGrammarList createSpeechGrammarList() =>
-      JS('SpeechGrammarList', 'new SpeechGrammarList()' );
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _SpeechRecognitionFactoryProvider {
-  static SpeechRecognition createSpeechRecognition() =>
-      JS('SpeechRecognition', 'new SpeechRecognition()' );
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _TextTrackCueFactoryProvider {
-  static TextTrackCue createTextTrackCue(
-      String id, num startTime, num endTime, String text,
-      [String settings, bool pauseOnExit]) {
-        if (settings == null) {
-          return JS('TextTrackCue',
-                    'new TextTrackCue(#,#,#,#)',
-                    id, startTime, endTime, text);
-        }
-        if (pauseOnExit == null) {
-          return JS('TextTrackCue',
-                    'new TextTrackCue(#,#,#,#,#)',
-                    id, startTime, endTime, text, settings);
-        }
-        return JS('TextTrackCue',
-                  'new TextTrackCue(#,#,#,#,#,#)',
-                  id, startTime, endTime, text, settings, pauseOnExit);
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _WorkerFactoryProvider {
-  static Worker createWorker(String scriptUrl) =>
-      JS('Worker', 'new Worker(#)', scriptUrl);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _XMLSerializerFactoryProvider {
-  static XMLSerializer createXMLSerializer() =>
-      JS('XMLSerializer', 'new XMLSerializer()' );
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _XPathEvaluatorFactoryProvider {
-  static XPathEvaluator createXPathEvaluator() =>
-      JS('XPathEvaluator', 'new XPathEvaluator()' );
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _XSLTProcessorFactoryProvider {
-  static XSLTProcessor createXSLTProcessor() =>
-      JS('XSLTProcessor', 'new XSLTProcessor()' );
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-abstract class Window {
-  // Fields.
-  Location get location;
-  History get history;
-
-  bool get closed;
-  Window get opener;
-  Window get parent;
-  Window get top;
-
-  // Methods.
-  void focus();
-  void blur();
-  void close();
-  void postMessage(var message, String targetOrigin, [List messagePorts = null]);
-}
-
-abstract class Location {
-  void set href(String val);
-}
-
-abstract class History {
-  void back();
-  void forward();
-  void go(int distance);
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-typedef void EventListener(Event event);
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Defines the standard key locations returned by
- * KeyboardEvent.getKeyLocation.
- */
-abstract class KeyLocation {
-
-  /**
-   * The event key is not distinguished as the left or right version
-   * of the key, and did not originate from the numeric keypad (or did not
-   * originate with a virtual key corresponding to the numeric keypad).
-   */
-  static const int STANDARD = 0;
-
-  /**
-   * The event key is in the left key location.
-   */
-  static const int LEFT = 1;
-
-  /**
-   * The event key is in the right key location.
-   */
-  static const int RIGHT = 2;
-
-  /**
-   * The event key originated on the numeric keypad or with a virtual key
-   * corresponding to the numeric keypad.
-   */
-  static const int NUMPAD = 3;
-
-  /**
-   * The event key originated on a mobile device, either on a physical
-   * keypad or a virtual keyboard.
-   */
-  static const int MOBILE = 4;
-
-  /**
-   * The event key originated on a game controller or a joystick on a mobile
-   * device.
-   */
-  static const int JOYSTICK = 5;
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Defines the standard keyboard identifier names for keys that are returned
- * by KeyEvent.getKeyboardIdentifier when the key does not have a direct
- * unicode mapping.
- */
-abstract class KeyName {
-
-  /** The Accept (Commit, OK) key */
-  static const String ACCEPT = "Accept";
-
-  /** The Add key */
-  static const String ADD = "Add";
-
-  /** The Again key */
-  static const String AGAIN = "Again";
-
-  /** The All Candidates key */
-  static const String ALL_CANDIDATES = "AllCandidates";
-
-  /** The Alphanumeric key */
-  static const String ALPHANUMERIC = "Alphanumeric";
-
-  /** The Alt (Menu) key */
-  static const String ALT = "Alt";
-
-  /** The Alt-Graph key */
-  static const String ALT_GRAPH = "AltGraph";
-
-  /** The Application key */
-  static const String APPS = "Apps";
-
-  /** The ATTN key */
-  static const String ATTN = "Attn";
-
-  /** The Browser Back key */
-  static const String BROWSER_BACK = "BrowserBack";
-
-  /** The Browser Favorites key */
-  static const String BROWSER_FAVORTIES = "BrowserFavorites";
-
-  /** The Browser Forward key */
-  static const String BROWSER_FORWARD = "BrowserForward";
-
-  /** The Browser Home key */
-  static const String BROWSER_NAME = "BrowserHome";
-
-  /** The Browser Refresh key */
-  static const String BROWSER_REFRESH = "BrowserRefresh";
-
-  /** The Browser Search key */
-  static const String BROWSER_SEARCH = "BrowserSearch";
-
-  /** The Browser Stop key */
-  static const String BROWSER_STOP = "BrowserStop";
-
-  /** The Camera key */
-  static const String CAMERA = "Camera";
-
-  /** The Caps Lock (Capital) key */
-  static const String CAPS_LOCK = "CapsLock";
-
-  /** The Clear key */
-  static const String CLEAR = "Clear";
-
-  /** The Code Input key */
-  static const String CODE_INPUT = "CodeInput";
-
-  /** The Compose key */
-  static const String COMPOSE = "Compose";
-
-  /** The Control (Ctrl) key */
-  static const String CONTROL = "Control";
-
-  /** The Crsel key */
-  static const String CRSEL = "Crsel";
-
-  /** The Convert key */
-  static const String CONVERT = "Convert";
-
-  /** The Copy key */
-  static const String COPY = "Copy";
-
-  /** The Cut key */
-  static const String CUT = "Cut";
-
-  /** The Decimal key */
-  static const String DECIMAL = "Decimal";
-
-  /** The Divide key */
-  static const String DIVIDE = "Divide";
-
-  /** The Down Arrow key */
-  static const String DOWN = "Down";
-
-  /** The diagonal Down-Left Arrow key */
-  static const String DOWN_LEFT = "DownLeft";
-
-  /** The diagonal Down-Right Arrow key */
-  static const String DOWN_RIGHT = "DownRight";
-
-  /** The Eject key */
-  static const String EJECT = "Eject";
-
-  /** The End key */
-  static const String END = "End";
-
-  /**
-   * The Enter key. Note: This key value must also be used for the Return
-   *  (Macintosh numpad) key
-   */
-  static const String ENTER = "Enter";
-
-  /** The Erase EOF key */
-  static const String ERASE_EOF= "EraseEof";
-
-  /** The Execute key */
-  static const String EXECUTE = "Execute";
-
-  /** The Exsel key */
-  static const String EXSEL = "Exsel";
-
-  /** The Function switch key */
-  static const String FN = "Fn";
-
-  /** The F1 key */
-  static const String F1 = "F1";
-
-  /** The F2 key */
-  static const String F2 = "F2";
-
-  /** The F3 key */
-  static const String F3 = "F3";
-
-  /** The F4 key */
-  static const String F4 = "F4";
-
-  /** The F5 key */
-  static const String F5 = "F5";
-
-  /** The F6 key */
-  static const String F6 = "F6";
-
-  /** The F7 key */
-  static const String F7 = "F7";
-
-  /** The F8 key */
-  static const String F8 = "F8";
-
-  /** The F9 key */
-  static const String F9 = "F9";
-
-  /** The F10 key */
-  static const String F10 = "F10";
-
-  /** The F11 key */
-  static const String F11 = "F11";
-
-  /** The F12 key */
-  static const String F12 = "F12";
-
-  /** The F13 key */
-  static const String F13 = "F13";
-
-  /** The F14 key */
-  static const String F14 = "F14";
-
-  /** The F15 key */
-  static const String F15 = "F15";
-
-  /** The F16 key */
-  static const String F16 = "F16";
-
-  /** The F17 key */
-  static const String F17 = "F17";
-
-  /** The F18 key */
-  static const String F18 = "F18";
-
-  /** The F19 key */
-  static const String F19 = "F19";
-
-  /** The F20 key */
-  static const String F20 = "F20";
-
-  /** The F21 key */
-  static const String F21 = "F21";
-
-  /** The F22 key */
-  static const String F22 = "F22";
-
-  /** The F23 key */
-  static const String F23 = "F23";
-
-  /** The F24 key */
-  static const String F24 = "F24";
-
-  /** The Final Mode (Final) key used on some asian keyboards */
-  static const String FINAL_MODE = "FinalMode";
-
-  /** The Find key */
-  static const String FIND = "Find";
-
-  /** The Full-Width Characters key */
-  static const String FULL_WIDTH = "FullWidth";
-
-  /** The Half-Width Characters key */
-  static const String HALF_WIDTH = "HalfWidth";
-
-  /** The Hangul (Korean characters) Mode key */
-  static const String HANGUL_MODE = "HangulMode";
-
-  /** The Hanja (Korean characters) Mode key */
-  static const String HANJA_MODE = "HanjaMode";
-
-  /** The Help key */
-  static const String HELP = "Help";
-
-  /** The Hiragana (Japanese Kana characters) key */
-  static const String HIRAGANA = "Hiragana";
-
-  /** The Home key */
-  static const String HOME = "Home";
-
-  /** The Insert (Ins) key */
-  static const String INSERT = "Insert";
-
-  /** The Japanese-Hiragana key */
-  static const String JAPANESE_HIRAGANA = "JapaneseHiragana";
-
-  /** The Japanese-Katakana key */
-  static const String JAPANESE_KATAKANA = "JapaneseKatakana";
-
-  /** The Japanese-Romaji key */
-  static const String JAPANESE_ROMAJI = "JapaneseRomaji";
-
-  /** The Junja Mode key */
-  static const String JUNJA_MODE = "JunjaMode";
-
-  /** The Kana Mode (Kana Lock) key */
-  static const String KANA_MODE = "KanaMode";
-
-  /**
-   * The Kanji (Japanese name for ideographic characters of Chinese origin)
-   * Mode key
-   */
-  static const String KANJI_MODE = "KanjiMode";
-
-  /** The Katakana (Japanese Kana characters) key */
-  static const String KATAKANA = "Katakana";
-
-  /** The Start Application One key */
-  static const String LAUNCH_APPLICATION_1 = "LaunchApplication1";
-
-  /** The Start Application Two key */
-  static const String LAUNCH_APPLICATION_2 = "LaunchApplication2";
-
-  /** The Start Mail key */
-  static const String LAUNCH_MAIL = "LaunchMail";
-
-  /** The Left Arrow key */
-  static const String LEFT = "Left";
-
-  /** The Menu key */
-  static const String MENU = "Menu";
-
-  /**
-   * The Meta key. Note: This key value shall be also used for the Apple
-   * Command key
-   */
-  static const String META = "Meta";
-
-  /** The Media Next Track key */
-  static const String MEDIA_NEXT_TRACK = "MediaNextTrack";
-
-  /** The Media Play Pause key */
-  static const String MEDIA_PAUSE_PLAY = "MediaPlayPause";
-
-  /** The Media Previous Track key */
-  static const String MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";
-
-  /** The Media Stop key */
-  static const String MEDIA_STOP = "MediaStop";
-
-  /** The Mode Change key */
-  static const String MODE_CHANGE = "ModeChange";
-
-  /** The Next Candidate function key */
-  static const String NEXT_CANDIDATE = "NextCandidate";
-
-  /** The Nonconvert (Don't Convert) key */
-  static const String NON_CONVERT = "Nonconvert";
-
-  /** The Number Lock key */
-  static const String NUM_LOCK = "NumLock";
-
-  /** The Page Down (Next) key */
-  static const String PAGE_DOWN = "PageDown";
-
-  /** The Page Up key */
-  static const String PAGE_UP = "PageUp";
-
-  /** The Paste key */
-  static const String PASTE = "Paste";
-
-  /** The Pause key */
-  static const String PAUSE = "Pause";
-
-  /** The Play key */
-  static const String PLAY = "Play";
-
-  /**
-   * The Power key. Note: Some devices may not expose this key to the
-   * operating environment
-   */
-  static const String POWER = "Power";
-
-  /** The Previous Candidate function key */
-  static const String PREVIOUS_CANDIDATE = "PreviousCandidate";
-
-  /** The Print Screen (PrintScrn, SnapShot) key */
-  static const String PRINT_SCREEN = "PrintScreen";
-
-  /** The Process key */
-  static const String PROCESS = "Process";
-
-  /** The Props key */
-  static const String PROPS = "Props";
-
-  /** The Right Arrow key */
-  static const String RIGHT = "Right";
-
-  /** The Roman Characters function key */
-  static const String ROMAN_CHARACTERS = "RomanCharacters";
-
-  /** The Scroll Lock key */
-  static const String SCROLL = "Scroll";
-
-  /** The Select key */
-  static const String SELECT = "Select";
-
-  /** The Select Media key */
-  static const String SELECT_MEDIA = "SelectMedia";
-
-  /** The Separator key */
-  static const String SEPARATOR = "Separator";
-
-  /** The Shift key */
-  static const String SHIFT = "Shift";
-
-  /** The Soft1 key */
-  static const String SOFT_1 = "Soft1";
-
-  /** The Soft2 key */
-  static const String SOFT_2 = "Soft2";
-
-  /** The Soft3 key */
-  static const String SOFT_3 = "Soft3";
-
-  /** The Soft4 key */
-  static const String SOFT_4 = "Soft4";
-
-  /** The Stop key */
-  static const String STOP = "Stop";
-
-  /** The Subtract key */
-  static const String SUBTRACT = "Subtract";
-
-  /** The Symbol Lock key */
-  static const String SYMBOL_LOCK = "SymbolLock";
-
-  /** The Up Arrow key */
-  static const String UP = "Up";
-
-  /** The diagonal Up-Left Arrow key */
-  static const String UP_LEFT = "UpLeft";
-
-  /** The diagonal Up-Right Arrow key */
-  static const String UP_RIGHT = "UpRight";
-
-  /** The Undo key */
-  static const String UNDO = "Undo";
-
-  /** The Volume Down key */
-  static const String VOLUME_DOWN = "VolumeDown";
-
-  /** The Volume Mute key */
-  static const String VOLUMN_MUTE = "VolumeMute";
-
-  /** The Volume Up key */
-  static const String VOLUMN_UP = "VolumeUp";
-
-  /** The Windows Logo key */
-  static const String WIN = "Win";
-
-  /** The Zoom key */
-  static const String ZOOM = "Zoom";
-
-  /**
-   * The Backspace (Back) key. Note: This key value shall be also used for the
-   * key labeled 'delete' MacOS keyboards when not modified by the 'Fn' key
-   */
-  static const String BACKSPACE = "Backspace";
-
-  /** The Horizontal Tabulation (Tab) key */
-  static const String TAB = "Tab";
-
-  /** The Cancel key */
-  static const String CANCEL = "Cancel";
-
-  /** The Escape (Esc) key */
-  static const String ESC = "Esc";
-
-  /** The Space (Spacebar) key:   */
-  static const String SPACEBAR = "Spacebar";
-
-  /**
-   * The Delete (Del) Key. Note: This key value shall be also used for the key
-   * labeled 'delete' MacOS keyboards when modified by the 'Fn' key
-   */
-  static const String DEL = "Del";
-
-  /** The Combining Grave Accent (Greek Varia, Dead Grave) key */
-  static const String DEAD_GRAVE = "DeadGrave";
-
-  /**
-   * The Combining Acute Accent (Stress Mark, Greek Oxia, Tonos, Dead Eacute)
-   * key
-   */
-  static const String DEAD_EACUTE = "DeadEacute";
-
-  /** The Combining Circumflex Accent (Hat, Dead Circumflex) key */
-  static const String DEAD_CIRCUMFLEX = "DeadCircumflex";
-
-  /** The Combining Tilde (Dead Tilde) key */
-  static const String DEAD_TILDE = "DeadTilde";
-
-  /** The Combining Macron (Long, Dead Macron) key */
-  static const String DEAD_MACRON = "DeadMacron";
-
-  /** The Combining Breve (Short, Dead Breve) key */
-  static const String DEAD_BREVE = "DeadBreve";
-
-  /** The Combining Dot Above (Derivative, Dead Above Dot) key */
-  static const String DEAD_ABOVE_DOT = "DeadAboveDot";
-
-  /**
-   * The Combining Diaeresis (Double Dot Abode, Umlaut, Greek Dialytika,
-   * Double Derivative, Dead Diaeresis) key
-   */
-  static const String DEAD_UMLAUT = "DeadUmlaut";
-
-  /** The Combining Ring Above (Dead Above Ring) key */
-  static const String DEAD_ABOVE_RING = "DeadAboveRing";
-
-  /** The Combining Double Acute Accent (Dead Doubleacute) key */
-  static const String DEAD_DOUBLEACUTE = "DeadDoubleacute";
-
-  /** The Combining Caron (Hacek, V Above, Dead Caron) key */
-  static const String DEAD_CARON = "DeadCaron";
-
-  /** The Combining Cedilla (Dead Cedilla) key */
-  static const String DEAD_CEDILLA = "DeadCedilla";
-
-  /** The Combining Ogonek (Nasal Hook, Dead Ogonek) key */
-  static const String DEAD_OGONEK = "DeadOgonek";
-
-  /**
-   * The Combining Greek Ypogegrammeni (Greek Non-Spacing Iota Below, Iota
-   * Subscript, Dead Iota) key
-   */
-  static const String DEAD_IOTA = "DeadIota";
-
-  /**
-   * The Combining Katakana-Hiragana Voiced Sound Mark (Dead Voiced Sound) key
-   */
-  static const String DEAD_VOICED_SOUND = "DeadVoicedSound";
-
-  /**
-   * The Combining Katakana-Hiragana Semi-Voiced Sound Mark (Dead Semivoiced
-   * Sound) key
-   */
-  static const String DEC_SEMIVOICED_SOUND= "DeadSemivoicedSound";
-
-  /**
-   * Key value used when an implementation is unable to identify another key
-   * value, due to either hardware, platform, or software constraints
-   */
-  static const String UNIDENTIFIED = "Unidentified";
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Contains the set of standard values returned by HTMLDocument.getReadyState.
- */
-abstract class ReadyState {
-  /**
-   * Indicates the document is still loading and parsing.
-   */
-  static const String LOADING = "loading";
-
-  /**
-   * Indicates the document is finished parsing but is still loading
-   * subresources.
-   */
-  static const String INTERACTIVE = "interactive";
-
-  /**
-   * Indicates the document and all subresources have been loaded.
-   */
-  static const String COMPLETE = "complete";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// TODO(antonm): support not DOM isolates too.
-class _Timer implements Timer {
-  final canceller;
-
-  _Timer(this.canceller);
-
-  void cancel() { canceller(); }
-}
-
-get _timerFactoryClosure => (int milliSeconds, void callback(Timer timer), bool repeating) {
-  var maker;
-  var canceller;
-  if (repeating) {
-    maker = window.setInterval;
-    canceller = window.clearInterval;
-  } else {
-    maker = window.setTimeout;
-    canceller = window.clearTimeout;
-  }
-  Timer timer;
-  final int id = maker(() { callback(timer); }, milliSeconds);
-  timer = new _Timer(() { canceller(id); });
-  return timer;
-};
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * The [Collections] class implements static methods useful when
- * writing a class that implements [Collection] and the [iterator]
- * method.
- */
-class _Collections {
-  static bool contains(Iterable<Object> iterable, Object element) {
-    for (final e in iterable) {
-      if (e == element) return true;
-    }
-    return false;
-  }
-
-  static void forEach(Iterable<Object> iterable, void f(Object o)) {
-    for (final e in iterable) {
-      f(e);
-    }
-  }
-
-  static List map(Iterable<Object> source,
-                  List<Object> destination,
-                  f(o)) {
-    for (final e in source) {
-      destination.add(f(e));
-    }
-    return destination;
-  }
-
-  static bool some(Iterable<Object> iterable, bool f(Object o)) {
-    for (final e in iterable) {
-      if (f(e)) return true;
-    }
-    return false;
-  }
-
-  static bool every(Iterable<Object> iterable, bool f(Object o)) {
-    for (final e in iterable) {
-      if (!f(e)) return false;
-    }
-    return true;
-  }
-
-  static List filter(Iterable<Object> source,
-                     List<Object> destination,
-                     bool f(o)) {
-    for (final e in source) {
-      if (f(e)) destination.add(e);
-    }
-    return destination;
-  }
-
-  static bool isEmpty(Iterable<Object> iterable) {
-    return !iterable.iterator().hasNext;
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _HttpRequestUtils {
-
-  // Helper for factory HttpRequest.get
-  static HttpRequest get(String url,
-                            onSuccess(HttpRequest request),
-                            bool withCredentials) {
-    final request = new HttpRequest();
-    request.open('GET', url, true);
-
-    request.withCredentials = withCredentials;
-
-    // Status 0 is for local XHR request.
-    request.on.readyStateChange.add((e) {
-      if (request.readyState == HttpRequest.DONE &&
-          (request.status == 200 || request.status == 0)) {
-        onSuccess(request);
-      }
-    });
-
-    request.send();
-
-    return request;
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-_serialize(var message) {
-  return new _JsSerializer().traverse(message);
-}
-
-class _JsSerializer extends _Serializer {
-
-  visitSendPortSync(SendPortSync x) {
-    if (x is _JsSendPortSync) return visitJsSendPortSync(x);
-    if (x is _LocalSendPortSync) return visitLocalSendPortSync(x);
-    if (x is _RemoteSendPortSync) return visitRemoteSendPortSync(x);
-    throw "Unknown port type $x";
-  }
-
-  visitJsSendPortSync(_JsSendPortSync x) {
-    return [ 'sendport', 'nativejs', x._id ];
-  }
-
-  visitLocalSendPortSync(_LocalSendPortSync x) {
-    return [ 'sendport', 'dart',
-             ReceivePortSync._isolateId, x._receivePort._portId ];
-  }
-
-  visitRemoteSendPortSync(_RemoteSendPortSync x) {
-    return [ 'sendport', 'dart',
-             x._receivePort._isolateId, x._receivePort._portId ];
-  }
-}
-
-_deserialize(var message) {
-  return new _JsDeserializer().deserialize(message);
-}
-
-
-class _JsDeserializer extends _Deserializer {
-
-  static const _UNSPECIFIED = const Object();
-
-  deserializeSendPort(List x) {
-    String tag = x[1];
-    switch (tag) {
-      case 'nativejs':
-        num id = x[2];
-        return new _JsSendPortSync(id);
-      case 'dart':
-        num isolateId = x[2];
-        num portId = x[3];
-        return ReceivePortSync._lookup(isolateId, portId);
-      default:
-        throw 'Illegal SendPortSync type: $tag';
-    }
-  }
-}
-
-// The receiver is JS.
-class _JsSendPortSync implements SendPortSync {
-
-  num _id;
-  _JsSendPortSync(this._id);
-
-  callSync(var message) {
-    var serialized = _serialize(message);
-    var result = _callPortSync(_id, serialized);
-    return _deserialize(result);
-  }
-
-}
-
-// TODO(vsm): Differentiate between Dart2Js and Dartium isolates.
-// The receiver is a different Dart isolate, compiled to JS.
-class _RemoteSendPortSync implements SendPortSync {
-
-  int _isolateId;
-  int _portId;
-  _RemoteSendPortSync(this._isolateId, this._portId);
-
-  callSync(var message) {
-    var serialized = _serialize(message);
-    var result = _call(_isolateId, _portId, serialized);
-    return _deserialize(result);
-  }
-
-  static _call(int isolateId, int portId, var message) {
-    var target = 'dart-port-$isolateId-$portId'; 
-    // TODO(vsm): Make this re-entrant.
-    // TODO(vsm): Set this up set once, on the first call.
-    var source = '$target-result';
-    var result = null;
-    var listener = (Event e) {
-      result = JSON.parse(_getPortSyncEventData(e));
-    };
-    window.on[source].add(listener);
-    _dispatchEvent(target, [source, message]);
-    window.on[source].remove(listener);
-    return result;
-  }
-}
-
-// The receiver is in the same Dart isolate, compiled to JS.
-class _LocalSendPortSync implements SendPortSync {
-
-  ReceivePortSync _receivePort;
-
-  _LocalSendPortSync._internal(this._receivePort);
-
-  callSync(var message) {
-    // TODO(vsm): Do a more efficient deep copy.
-    var copy = _deserialize(_serialize(message));
-    var result = _receivePort._callback(copy);
-    return _deserialize(_serialize(result));
-  }
-}
-
-// TODO(vsm): Move this to dart:isolate.  This will take some
-// refactoring as there are dependences here on the DOM.  Users
-// interact with this class (or interface if we change it) directly -
-// new ReceivePortSync.  I think most of the DOM logic could be
-// delayed until the corresponding SendPort is registered on the
-// window.
-
-// A Dart ReceivePortSync (tagged 'dart' when serialized) is
-// identifiable / resolvable by the combination of its isolateid and
-// portid.  When a corresponding SendPort is used within the same
-// isolate, the _portMap below can be used to obtain the
-// ReceivePortSync directly.  Across isolates (or from JS), an
-// EventListener can be used to communicate with the port indirectly.
-class ReceivePortSync {
-
-  static Map<int, ReceivePortSync> _portMap;
-  static int _portIdCount;
-  static int _cachedIsolateId;
-
-  num _portId;
-  Function _callback;
-  EventListener _listener;
-
-  ReceivePortSync() {
-    if (_portIdCount == null) {
-      _portIdCount = 0;
-      _portMap = new Map<int, ReceivePortSync>();
-    }
-    _portId = _portIdCount++;
-    _portMap[_portId] = this;
-  }
-
-  static int get _isolateId {
-    // TODO(vsm): Make this coherent with existing isolate code.
-    if (_cachedIsolateId == null) {
-      _cachedIsolateId = _getNewIsolateId();      
-    }
-    return _cachedIsolateId;
-  }
-
-  static String _getListenerName(isolateId, portId) =>
-      'dart-port-$isolateId-$portId'; 
-  String get _listenerName => _getListenerName(_isolateId, _portId);
-
-  void receive(callback(var message)) {
-    _callback = callback;
-    if (_listener == null) {
-      _listener = (Event e) {
-        var data = JSON.parse(_getPortSyncEventData(e));
-        var replyTo = data[0];
-        var message = _deserialize(data[1]);
-        var result = _callback(message);
-        _dispatchEvent(replyTo, _serialize(result));
-      };
-      window.on[_listenerName].add(_listener);
-    }
-  }
-
-  void close() {
-    _portMap.remove(_portId);
-    if (_listener != null) window.on[_listenerName].remove(_listener);
-  }
-
-  SendPortSync toSendPort() {
-    return new _LocalSendPortSync._internal(this);
-  }
-
-  static SendPortSync _lookup(int isolateId, int portId) {
-    if (isolateId == _isolateId) {
-      return _portMap[portId].toSendPort();
-    } else {
-      return new _RemoteSendPortSync(isolateId, portId);
-    }
-  }
-}
-
-get _isolateId => ReceivePortSync._isolateId;
-
-void _dispatchEvent(String receiver, var message) {
-  var event = new CustomEvent(receiver, false, false, JSON.stringify(message));
-  window.$dom_dispatchEvent(event);
-}
-
-String _getPortSyncEventData(CustomEvent event) => event.detail;
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-typedef Object ComputeValue();
-
-class _MeasurementRequest<T> {
-  final ComputeValue computeValue;
-  final Completer<T> completer;
-  Object value;
-  bool exception = false;
-  _MeasurementRequest(this.computeValue, this.completer);
-}
-
-typedef void _MeasurementCallback();
-
-
-/**
- * This class attempts to invoke a callback as soon as the current event stack
- * unwinds, but before the browser repaints.
- */
-abstract class _MeasurementScheduler {
-  bool _nextMeasurementFrameScheduled = false;
-  _MeasurementCallback _callback;
-
-  _MeasurementScheduler(this._callback);
-
-  /**
-   * Creates the best possible measurement scheduler for the current platform.
-   */
-  factory _MeasurementScheduler.best(_MeasurementCallback callback) {
-    if (_isMutationObserverSupported()) {
-      return new _MutationObserverScheduler(callback);
-    }
-    return new _PostMessageScheduler(callback);
-  }
-
-  /**
-   * Schedules a measurement callback if one has not been scheduled already.
-   */
-  void maybeSchedule() {
-    if (this._nextMeasurementFrameScheduled) {
-      return;
-    }
-    this._nextMeasurementFrameScheduled = true;
-    this._schedule();
-  }
-
-  /**
-   * Does the actual scheduling of the callback.
-   */
-  void _schedule();
-
-  /**
-   * Handles the measurement callback and forwards it if necessary.
-   */
-  void _onCallback() {
-    // Ignore spurious messages.
-    if (!_nextMeasurementFrameScheduled) {
-      return;
-    }
-    _nextMeasurementFrameScheduled = false;
-    this._callback();
-  }
-}
-
-/**
- * Scheduler which uses window.postMessage to schedule events.
- */
-class _PostMessageScheduler extends _MeasurementScheduler {
-  const _MEASUREMENT_MESSAGE = "DART-MEASURE";
-
-  _PostMessageScheduler(_MeasurementCallback callback): super(callback) {
-      // Messages from other windows do not cause a security risk as
-      // all we care about is that _handleMessage is called
-      // after the current event loop is unwound and calling the function is
-      // a noop when zero requests are pending.
-      window.on.message.add(this._handleMessage);
-  }
-
-  void _schedule() {
-    window.postMessage(_MEASUREMENT_MESSAGE, "*");
-  }
-
-  _handleMessage(e) {
-    this._onCallback();
-  }
-}
-
-/**
- * Scheduler which uses a MutationObserver to schedule events.
- */
-class _MutationObserverScheduler extends _MeasurementScheduler {
-  MutationObserver _observer;
-  Element _dummy;
-
-  _MutationObserverScheduler(_MeasurementCallback callback): super(callback) {
-    // Mutation events get fired as soon as the current event stack is unwound
-    // so we just make a dummy event and listen for that.
-    _observer = new MutationObserver(this._handleMutation);
-    _dummy = new DivElement();
-    _observer.observe(_dummy, attributes: true);
-  }
-
-  void _schedule() {
-    // Toggle it to trigger the mutation event.
-    _dummy.hidden = !_dummy.hidden;
-  }
-
-  _handleMutation(List<MutationRecord> mutations, MutationObserver observer) {
-    this._onCallback();
-  }
-}
-
-
-List<_MeasurementRequest> _pendingRequests;
-List<TimeoutHandler> _pendingMeasurementFrameCallbacks;
-_MeasurementScheduler _measurementScheduler = null;
-
-void _maybeScheduleMeasurementFrame() {
-  if (_measurementScheduler == null) {
-    _measurementScheduler =
-      new _MeasurementScheduler.best(_completeMeasurementFutures);
-  }
-  _measurementScheduler.maybeSchedule();
-}
-
-/**
- * Registers a [callback] which is called after the next batch of measurements
- * completes. Even if no measurements completed, the callback is triggered
- * when they would have completed to avoid confusing bugs if it happened that
- * no measurements were actually requested.
- */
-void _addMeasurementFrameCallback(TimeoutHandler callback) {
-  if (_pendingMeasurementFrameCallbacks == null) {
-    _pendingMeasurementFrameCallbacks = <TimeoutHandler>[];
-    _maybeScheduleMeasurementFrame();
-  }
-  _pendingMeasurementFrameCallbacks.add(callback);
-}
-
-/**
- * Returns a [Future] whose value will be the result of evaluating
- * [computeValue] during the next safe measurement interval.
- * The next safe measurement interval is after the current event loop has
- * unwound but before the browser has rendered the page.
- * It is important that the [computeValue] function only queries the html
- * layout and html in any way.
- */
-Future _createMeasurementFuture(ComputeValue computeValue,
-                                Completer completer) {
-  if (_pendingRequests == null) {
-    _pendingRequests = <_MeasurementRequest>[];
-    _maybeScheduleMeasurementFrame();
-  }
-  _pendingRequests.add(new _MeasurementRequest(computeValue, completer));
-  return completer.future;
-}
-
-/**
- * Complete all pending measurement futures evaluating them in a single batch
- * so that the the browser is guaranteed to avoid multiple layouts.
- */
-void _completeMeasurementFutures() {
-  // We must compute all new values before fulfilling the futures as
-  // the onComplete callbacks for the futures could modify the DOM making
-  // subsequent measurement calculations expensive to compute.
-  if (_pendingRequests != null) {
-    for (_MeasurementRequest request in _pendingRequests) {
-      try {
-        request.value = request.computeValue();
-      } catch (e) {
-        request.value = e;
-        request.exception = true;
-      }
-    }
-  }
-
-  final completedRequests = _pendingRequests;
-  final readyMeasurementFrameCallbacks = _pendingMeasurementFrameCallbacks;
-  _pendingRequests = null;
-  _pendingMeasurementFrameCallbacks = null;
-  if (completedRequests != null) {
-    for (_MeasurementRequest request in completedRequests) {
-      if (request.exception) {
-        request.completer.completeException(request.value);
-      } else {
-        request.completer.complete(request.value);
-      }
-    }
-  }
-
-  if (readyMeasurementFrameCallbacks != null) {
-    for (TimeoutHandler handler in readyMeasurementFrameCallbacks) {
-      // TODO(jacobr): wrap each call to a handler in a try-catch block.
-      handler();
-    }
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Patch file for the dart:isolate library.
-
-/********************************************************
-  Inserted from lib/isolate/serialization.dart
- ********************************************************/
-
-class _MessageTraverserVisitedMap {
-
-  operator[](var object) => null;
-  void operator[]=(var object, var info) { }
-
-  void reset() { }
-  void cleanup() { }
-
-}
-
-/** Abstract visitor for dart objects that can be sent as isolate messages. */
-class _MessageTraverser {
-
-  _MessageTraverserVisitedMap _visited;
-  _MessageTraverser() : _visited = new _MessageTraverserVisitedMap();
-
-  /** Visitor's entry point. */
-  traverse(var x) {
-    if (isPrimitive(x)) return visitPrimitive(x);
-    _visited.reset();
-    var result;
-    try {
-      result = _dispatch(x);
-    } finally {
-      _visited.cleanup();
-    }
-    return result;
-  }
-
-  _dispatch(var x) {
-    if (isPrimitive(x)) return visitPrimitive(x);
-    if (x is List) return visitList(x);
-    if (x is Map) return visitMap(x);
-    if (x is SendPort) return visitSendPort(x);
-    if (x is SendPortSync) return visitSendPortSync(x);
-
-    // Overridable fallback.
-    return visitObject(x);
-  }
-
-  abstract visitPrimitive(x);
-  abstract visitList(List x);
-  abstract visitMap(Map x);
-  abstract visitSendPort(SendPort x);
-  abstract visitSendPortSync(SendPortSync x);
-
-  visitObject(Object x) {
-    // TODO(floitsch): make this a real exception. (which one)?
-    throw "Message serialization: Illegal value $x passed";
-  }
-
-  static bool isPrimitive(x) {
-    return (x == null) || (x is String) || (x is num) || (x is bool);
-  }
-}
-
-
-/** A visitor that recursively copies a message. */
-class _Copier extends _MessageTraverser {
-
-  visitPrimitive(x) => x;
-
-  List visitList(List list) {
-    List copy = _visited[list];
-    if (copy != null) return copy;
-
-    int len = list.length;
-
-    // TODO(floitsch): we loose the generic type of the List.
-    copy = new List(len);
-    _visited[list] = copy;
-    for (int i = 0; i < len; i++) {
-      copy[i] = _dispatch(list[i]);
-    }
-    return copy;
-  }
-
-  Map visitMap(Map map) {
-    Map copy = _visited[map];
-    if (copy != null) return copy;
-
-    // TODO(floitsch): we loose the generic type of the map.
-    copy = new Map();
-    _visited[map] = copy;
-    map.forEach((key, val) {
-      copy[_dispatch(key)] = _dispatch(val);
-    });
-    return copy;
-  }
-
-}
-
-/** Visitor that serializes a message as a JSON array. */
-class _Serializer extends _MessageTraverser {
-  int _nextFreeRefId = 0;
-
-  visitPrimitive(x) => x;
-
-  visitList(List list) {
-    int copyId = _visited[list];
-    if (copyId != null) return ['ref', copyId];
-
-    int id = _nextFreeRefId++;
-    _visited[list] = id;
-    var jsArray = _serializeList(list);
-    // TODO(floitsch): we are losing the generic type.
-    return ['list', id, jsArray];
-  }
-
-  visitMap(Map map) {
-    int copyId = _visited[map];
-    if (copyId != null) return ['ref', copyId];
-
-    int id = _nextFreeRefId++;
-    _visited[map] = id;
-    var keys = _serializeList(map.keys);
-    var values = _serializeList(map.values);
-    // TODO(floitsch): we are losing the generic type.
-    return ['map', id, keys, values];
-  }
-
-  _serializeList(List list) {
-    int len = list.length;
-    var result = new List(len);
-    for (int i = 0; i < len; i++) {
-      result[i] = _dispatch(list[i]);
-    }
-    return result;
-  }
-}
-
-/** Deserializes arrays created with [_Serializer]. */
-class _Deserializer {
-  Map<int, dynamic> _deserialized;
-
-  _Deserializer();
-
-  static bool isPrimitive(x) {
-    return (x == null) || (x is String) || (x is num) || (x is bool);
-  }
-
-  deserialize(x) {
-    if (isPrimitive(x)) return x;
-    // TODO(floitsch): this should be new HashMap<int, dynamic>()
-    _deserialized = new HashMap();
-    return _deserializeHelper(x);
-  }
-
-  _deserializeHelper(x) {
-    if (isPrimitive(x)) return x;
-    assert(x is List);
-    switch (x[0]) {
-      case 'ref': return _deserializeRef(x);
-      case 'list': return _deserializeList(x);
-      case 'map': return _deserializeMap(x);
-      case 'sendport': return deserializeSendPort(x);
-      default: return deserializeObject(x);
-    }
-  }
-
-  _deserializeRef(List x) {
-    int id = x[1];
-    var result = _deserialized[id];
-    assert(result != null);
-    return result;
-  }
-
-  List _deserializeList(List x) {
-    int id = x[1];
-    // We rely on the fact that Dart-lists are directly mapped to Js-arrays.
-    List dartList = x[2];
-    _deserialized[id] = dartList;
-    int len = dartList.length;
-    for (int i = 0; i < len; i++) {
-      dartList[i] = _deserializeHelper(dartList[i]);
-    }
-    return dartList;
-  }
-
-  Map _deserializeMap(List x) {
-    Map result = new Map();
-    int id = x[1];
-    _deserialized[id] = result;
-    List keys = x[2];
-    List values = x[3];
-    int len = keys.length;
-    assert(len == values.length);
-    for (int i = 0; i < len; i++) {
-      var key = _deserializeHelper(keys[i]);
-      var value = _deserializeHelper(values[i]);
-      result[key] = value;
-    }
-    return result;
-  }
-
-  abstract deserializeSendPort(List x);
-
-  deserializeObject(List x) {
-    // TODO(floitsch): Use real exception (which one?).
-    throw "Unexpected serialized object";
-  }
-}
-
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _CustomEventFactoryProvider {
-  static CustomEvent createCustomEvent(String type, [bool canBubble = true,
-      bool cancelable = true, Object detail = null]) {
-    final _CustomEventImpl e = _document.$dom_createEvent("CustomEvent");
-    e.$dom_initCustomEvent(type, canBubble, cancelable, detail);
-    return e;
-  }
-}
-
-class _EventFactoryProvider {
-  static Event createEvent(String type, [bool canBubble = true,
-      bool cancelable = true]) {
-    final _EventImpl e = _document.$dom_createEvent("Event");
-    e.$dom_initEvent(type, canBubble, cancelable);
-    return e;
-  }
-}
-
-class _MouseEventFactoryProvider {
-  static MouseEvent createMouseEvent(String type, Window view, int detail,
-      int screenX, int screenY, int clientX, int clientY, int button,
-      [bool canBubble = true, bool cancelable = true, bool ctrlKey = false,
-      bool altKey = false, bool shiftKey = false, bool metaKey = false,
-      EventTarget relatedTarget = null]) {
-    final e = _document.$dom_createEvent("MouseEvent");
-    e.$dom_initMouseEvent(type, canBubble, cancelable, view, detail,
-        screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
-        button, relatedTarget);
-    return e;
-  }
-}
-
-class _CSSStyleDeclarationFactoryProvider {
-  static CSSStyleDeclaration createCSSStyleDeclaration_css(String css) {
-    final style = new Element.tag('div').style;
-    style.cssText = css;
-    return style;
-  }
-
-  static CSSStyleDeclaration createCSSStyleDeclaration() {
-    return new CSSStyleDeclaration.css('');
-  }
-}
-
-class _DocumentFragmentFactoryProvider {
-  /** @domName Document.createDocumentFragment */
-  static DocumentFragment createDocumentFragment() =>
-      document.createDocumentFragment();
-
-  static DocumentFragment createDocumentFragment_html(String html) {
-    final fragment = new DocumentFragment();
-    fragment.innerHTML = html;
-    return fragment;
-  }
-
-  // TODO(nweiz): enable this when XML is ported.
-  // factory DocumentFragment.xml(String xml) {
-  //   final fragment = new DocumentFragment();
-  //   final e = new XMLElement.tag("xml");
-  //   e.innerHTML = xml;
-  //
-  //   // Copy list first since we don't want liveness during iteration.
-  //   final List nodes = new List.from(e.nodes);
-  //   fragment.nodes.addAll(nodes);
-  //   return fragment;
-  // }
-
-  static DocumentFragment createDocumentFragment_svg(String svg) {
-    final fragment = new DocumentFragment();
-    final e = new SVGSVGElement();
-    e.innerHTML = svg;
-
-    // Copy list first since we don't want liveness during iteration.
-    final List nodes = new List.from(e.nodes);
-    fragment.nodes.addAll(nodes);
-    return fragment;
-  }
-}
-
-class _SVGElementFactoryProvider {
-  static SVGElement createSVGElement_tag(String tag) {
-    final Element temp =
-      _document.$dom_createElementNS("http://www.w3.org/2000/svg", tag);
-    return temp;
-  }
-
-  static SVGElement createSVGElement_svg(String svg) {
-    Element parentTag;
-    final match = _START_TAG_REGEXP.firstMatch(svg);
-    if (match != null && match.group(1).toLowerCase() == 'svg') {
-      parentTag = new Element.tag('div');
-    } else {
-      parentTag = new SVGSVGElement();
-    }
-
-    parentTag.innerHTML = svg;
-    if (parentTag.elements.length == 1) return parentTag.elements.removeLast();
-
-    throw new ArgumentError(
-        'SVG had ${parentTag.elements.length} '
-        'top-level elements but 1 expected');
-  }
-}
-
-class _SVGSVGElementFactoryProvider {
-  static SVGSVGElement createSVGSVGElement() {
-    final el = new SVGElement.tag("svg");
-    // The SVG spec requires the version attribute to match the spec version
-    el.attributes['version'] = "1.1";
-    return el;
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-// Conversions for IDBKey.
-//
-// Per http://www.w3.org/TR/IndexedDB/#key-construct
-//
-// "A value is said to be a valid key if it is one of the following types: Array
-// JavaScript objects [ECMA-262], DOMString [WEBIDL], Date [ECMA-262] or float
-// [WEBIDL]. However Arrays are only valid keys if every item in the array is
-// defined and is a valid key (i.e. sparse arrays can not be valid keys) and if
-// the Array doesn't directly or indirectly contain itself. Any non-numeric
-// properties are ignored, and thus does not affect whether the Array is a valid
-// key. Additionally, if the value is of type float, it is only a valid key if
-// it is not NaN, and if the value is of type Date it is only a valid key if its
-// [[PrimitiveValue]] internal property, as defined by [ECMA-262], is not NaN."
-
-// What is required is to ensure that an Lists in the key are actually
-// JavaScript arrays, and any Dates are JavaScript Dates.
-
-// Conversions for Window.  These check if the window is the local
-// window, and if it's not, wraps or unwraps it with a secure wrapper.
-// We need to test for EventTarget here as well as it's a base type.
-// We omit an unwrapper for Window as no methods take a non-local
-// window as a parameter.
-
-Window _convertNativeToDart_Window(win) {
-  return _DOMWindowCrossFrameImpl._createSafe(win);
-}
-
-EventTarget _convertNativeToDart_EventTarget(e) {
-  // Assume it's a Window if it contains the setInterval property.  It may be
-  // from a different frame - without a patched prototype - so we cannot
-  // rely on Dart type checking.
-  if (JS('bool', r'"setInterval" in #', e))
-    return _DOMWindowCrossFrameImpl._createSafe(e);
-  else
-    return e;
-}
-
-EventTarget _convertDartToNative_EventTarget(e) {
-  if (e is _DOMWindowCrossFrameImpl) {
-    return e._window;
-  } else {
-    return e;
-  }
-}
-
-// Conversions for ImageData
-//
-// On Firefox, the returned ImageData is a plain object.
-
-class _TypedImageData implements ImageData {
-  final Uint8ClampedArray data;
-  final int height;
-  final int width;
-
-  _TypedImageData(this.data, this.height, this.width);
-}
-
-ImageData _convertNativeToDart_ImageData(nativeImageData) {
-  if (nativeImageData is ImageData) return nativeImageData;
-
-  // On Firefox the above test fails because imagedata is a plain object.
-  // So we create a _TypedImageData.
-
-  return new _TypedImageData(
-      JS('var', '#.data', nativeImageData),
-      JS('var', '#.height', nativeImageData),
-      JS('var', '#.width', nativeImageData));
-}
-
-// We can get rid of this conversion if _TypedImageData implements the fields
-// with native names.
-_convertDartToNative_ImageData(ImageData imageData) {
-  if (imageData is _ImageDataImpl) return imageData;
-  return JS('Object', '{data: #, height: #, width: #}',
-            imageData.data, imageData.height, imageData.width);
-}
-
-
-/// Converts a JavaScript object with properties into a Dart Map.
-/// Not suitable for nested objects.
-Map _convertNativeToDart_Dictionary(object) {
-  if (object == null) return null;
-  var dict = {};
-  for (final key in JS('List', 'Object.getOwnPropertyNames(#)', object)) {
-    dict[key] = JS('var', '#[#]', object, key);
-  }
-  return dict;
-}
-
-/// Converts a flat Dart map into a JavaScript object with properties.
-_convertDartToNative_Dictionary(Map dict) {
-  if (dict == null) return null;
-  var object = JS('var', '{}');
-  dict.forEach((String key, value) {
-      JS('void', '#[#] = #', object, key, value);
-    });
-  return object;
-}
-
-
-/**
- * Ensures that the input is a JavaScript Array.
- *
- * Creates a new JavaScript array if necessary, otherwise returns the original.
- */
-List _convertDartToNative_StringArray(List<String> input) {
-  // TODO(sra).  Implement this.
-  return input;
-}
-
-
-// -----------------------------------------------------------------------------
-
-/**
- * Converts a native IDBKey into a Dart object.
- *
- * May return the original input.  May mutate the original input (but will be
- * idempotent if mutation occurs).  It is assumed that this conversion happens
- * on native IDBKeys on all paths that return IDBKeys from native DOM calls.
- *
- * If necessary, JavaScript Dates are converted into Dart Dates.
- */
-_convertNativeToDart_IDBKey(nativeKey) {
-  containsDate(object) {
-    if (_isJavaScriptDate(object)) return true;
-    if (object is List) {
-      for (int i = 0; i < object.length; i++) {
-        if (containsDate(object[i])) return true;
-      }
-    }
-    return false;  // number, string.
-  }
-  if (containsDate(nativeKey)) {
-    throw const NotImplementedException('IDBKey containing Date');
-  }
-  // TODO: Cache conversion somewhere?
-  return nativeKey;
-}
-
-/**
- * Converts a Dart object into a valid IDBKey.
- *
- * May return the original input.  Does not mutate input.
- *
- * If necessary, [dartKey] may be copied to ensure all lists are converted into
- * JavaScript Arrays and Dart Dates into JavaScript Dates.
- */
-_convertDartToNative_IDBKey(dartKey) {
-  // TODO: Implement.
-  return dartKey;
-}
-
-
-
-/// May modify original.  If so, action is idempotent.
-_convertNativeToDart_IDBAny(object) {
-  return _convertNativeToDart_AcceptStructuredClone(object, mustCopy: false);
-}
-
-/// Converts a Dart value into a JavaScript SerializedScriptValue.
-_convertDartToNative_SerializedScriptValue(value) {
-  return _convertDartToNative_PrepareForStructuredClone(value);
-}
-
-/// Since the source object may be viewed via a JavaScript event listener the
-/// original may not be modified.
-_convertNativeToDart_SerializedScriptValue(object) {
-  return _convertNativeToDart_AcceptStructuredClone(object, mustCopy: true);
-}
-
-
-/**
- * Converts a Dart value into a JavaScript SerializedScriptValue.  Returns the
- * original input or a functional 'copy'.  Does not mutate the original.
- *
- * The main transformation is the translation of Dart Maps are converted to
- * JavaScript Objects.
- *
- * The algorithm is essentially a dry-run of the structured clone algorithm
- * described at
- * http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#structured-clone
- * https://www.khronos.org/registry/typedarray/specs/latest/#9
- *
- * Since the result of this function is expected to be passed only to JavaScript
- * operations that perform the structured clone algorithm which does not mutate
- * its output, the result may share structure with the input [value].
- */
-_convertDartToNative_PrepareForStructuredClone(value) {
-
-  // TODO(sra): Replace slots with identity hash table.
-  var values = [];
-  var copies = [];  // initially 'null', 'true' during initial DFS, then a copy.
-
-  int findSlot(value) {
-    int length = values.length;
-    for (int i = 0; i < length; i++) {
-      if (identical(values[i], value)) return i;
-    }
-    values.add(value);
-    copies.add(null);
-    return length;
-  }
-  readSlot(int i) => copies[i];
-  writeSlot(int i, x) { copies[i] = x; }
-  cleanupSlots() {}  // Will be needed if we mark objects with a property.
-
-  // Returns the input, or a clone of the input.
-  walk(e) {
-    if (e == null) return e;
-    if (e is bool) return e;
-    if (e is num) return e;
-    if (e is String) return e;
-    if (e is Date) {
-      // TODO(sra).
-      throw const NotImplementedException('structured clone of Date');
-    }
-    if (e is RegExp) {
-      // TODO(sra).
-      throw const NotImplementedException('structured clone of RegExp');
-    }
-
-    // The browser's internal structured cloning algorithm will copy certain
-    // types of object, but it will copy only its own implementations and not
-    // just any Dart implementations of the interface.
-
-    // TODO(sra): The JavaScript objects suitable for direct cloning by the
-    // structured clone algorithm could be tagged with an private interface.
-
-    if (e is _FileImpl) return e;
-    if (e is File) {
-      throw const NotImplementedException('structured clone of File');
-    }
-
-    if (e is _BlobImpl) return e;
-    if (e is Blob) {
-      throw const NotImplementedException('structured clone of Blob');
-    }
-
-    if (e is _FileListImpl) return e;
-
-    // TODO(sra): Firefox: How to convert _TypedImageData on the other end?
-    if (e is _ImageDataImpl) return e;
-    if (e is ImageData) {
-      throw const NotImplementedException('structured clone of ImageData');
-    }
-
-    if (e is _ArrayBufferImpl) return e;
-    if (e is ArrayBuffer) {
-      throw const NotImplementedException('structured clone of ArrayBuffer');
-    }
-
-    if (e is _ArrayBufferViewImpl) return e;
-    if (e is ArrayBufferView) {
-      throw const NotImplementedException('structured clone of ArrayBufferView');
-    }
-
-    if (e is Map) {
-      var slot = findSlot(e);
-      var copy = readSlot(slot);
-      if (copy != null) return copy;
-      copy = JS('var', '{}');
-      writeSlot(slot, copy);
-      e.forEach((key, value) {
-          JS('void', '#[#] = #', copy, key, walk(value));
-        });
-      return copy;
-    }
-
-    if (e is List) {
-      // Since a JavaScript Array is an instance of Dart List it is possible to
-      // avoid making a copy of the list if there is no need to copy anything
-      // reachable from the array.  We defer creating a new array until a cycle
-      // is detected or a subgraph was copied.
-      int length = e.length;
-      var slot = findSlot(e);
-      var copy = readSlot(slot);
-      if (copy != null) {
-        if (true == copy) {  // Cycle, so commit to making a copy.
-          copy = JS('List', 'new Array(#)', length);
-          writeSlot(slot, copy);
-        }
-        return copy;
-      }
-
-      int i = 0;
-
-      if (_isJavaScriptArray(e) &&
-          // We have to copy immutable lists, otherwise the structured clone
-          // algorithm will copy the .immutable$list marker property, making the
-          // list immutable when received!
-          !_isImmutableJavaScriptArray(e)) {
-        writeSlot(slot, true);  // Deferred copy.
-        for ( ; i < length; i++) {
-          var element = e[i];
-          var elementCopy = walk(element);
-          if (!identical(elementCopy, element)) {
-            copy = readSlot(slot);   // Cyclic reference may have created it.
-            if (true == copy) {
-              copy = JS('List', 'new Array(#)', length);
-              writeSlot(slot, copy);
-            }
-            for (int j = 0; j < i; j++) {
-              copy[j] = e[j];
-            }
-            copy[i] = elementCopy;
-            i++;
-            break;
-          }
-        }
-        if (copy == null) {
-          copy = e;
-          writeSlot(slot, copy);
-        }
-      } else {
-        // Not a JavaScript Array.  We are forced to make a copy.
-        copy = JS('List', 'new Array(#)', length);
-        writeSlot(slot, copy);
-      }
-
-      for ( ; i < length; i++) {
-        copy[i] = walk(e[i]);
-      }
-      return copy;
-    }
-
-    throw const NotImplementedException('structured clone of other type');
-  }
-
-  var copy = walk(value);
-  cleanupSlots();
-  return copy;
-}
-
-/**
- * Converts a native value into a Dart object.
- *
- * If [mustCopy] is [:false:], may return the original input.  May mutate the
- * original input (but will be idempotent if mutation occurs).  It is assumed
- * that this conversion happens on native serializable script values such values
- * from native DOM calls.
- *
- * [object] is the result of a structured clone operation.
- *
- * If necessary, JavaScript Dates are converted into Dart Dates.
- *
- * If [mustCopy] is [:true:], the entire object is copied and the original input
- * is not mutated.  This should be the case where Dart and JavaScript code can
- * access the value, for example, via multiple event listeners for
- * MessageEvents.  Mutating the object to make it more 'Dart-like' would corrupt
- * the value as seen from the JavaScript listeners.
- */
-_convertNativeToDart_AcceptStructuredClone(object, {mustCopy = false}) {
-
-  // TODO(sra): Replace slots with identity hash table that works on non-dart
-  // objects.
-  var values = [];
-  var copies = [];
-
-  int findSlot(value) {
-    int length = values.length;
-    for (int i = 0; i < length; i++) {
-      if (identical(values[i], value)) return i;
-    }
-    values.add(value);
-    copies.add(null);
-    return length;
-  }
-  readSlot(int i) => copies[i];
-  writeSlot(int i, x) { copies[i] = x; }
-
-  walk(e) {
-    if (e == null) return e;
-    if (e is bool) return e;
-    if (e is num) return e;
-    if (e is String) return e;
-
-    if (_isJavaScriptDate(e)) {
-      // TODO(sra).
-      throw const NotImplementedException('structured clone of Date');
-    }
-
-    if (_isJavaScriptRegExp(e)) {
-      // TODO(sra).
-      throw const NotImplementedException('structured clone of RegExp');
-    }
-
-    if (_isJavaScriptSimpleObject(e)) {
-      // TODO(sra): If mustCopy is false, swizzle the prototype for one of a Map
-      // implementation that uses the properies as storage.
-      var slot = findSlot(e);
-      var copy = readSlot(slot);
-      if (copy != null) return copy;
-      copy = {};
-
-      writeSlot(slot, copy);
-      for (final key in JS('List', 'Object.keys(#)', e)) {
-        copy[key] = walk(JS('var', '#[#]', e, key));
-      }
-      return copy;
-    }
-
-    if (_isJavaScriptArray(e)) {
-      var slot = findSlot(e);
-      var copy = readSlot(slot);
-      if (copy != null) return copy;
-
-      int length = e.length;
-      // Since a JavaScript Array is an instance of Dart List, we can modify it
-      // in-place unless we must copy.
-      copy = mustCopy ? JS('List', 'new Array(#)', length) : e;
-      writeSlot(slot, copy);
-
-      for (int i = 0; i < length; i++) {
-        copy[i] = walk(e[i]);
-      }
-      return copy;
-    }
-
-    // Assume anything else is already a valid Dart object, either by having
-    // already been processed, or e.g. a clonable native class.
-    return e;
-  }
-
-  var copy = walk(object);
-  return copy;
-}
-
-
-bool _isJavaScriptDate(value) => JS('bool', '# instanceof Date', value);
-bool _isJavaScriptRegExp(value) => JS('bool', '# instanceof RegExp', value);
-bool _isJavaScriptArray(value) => JS('bool', '# instanceof Array', value);
-bool _isJavaScriptSimpleObject(value) =>
-    JS('bool', 'Object.getPrototypeOf(#) === Object.prototype', value);
-bool _isImmutableJavaScriptArray(value) =>
-    JS('bool', r'!!(#.immutable$list)', value);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// TODO(vsm): Unify with Dartium version.
-class _DOMWindowCrossFrameImpl implements Window {
-  // Private window.  Note, this is a window in another frame, so it
-  // cannot be typed as "Window" as its prototype is not patched
-  // properly.  Its fields and methods can only be accessed via JavaScript.
-  var _window;
-
-  // Fields.
-  History get history =>
-    _HistoryCrossFrameImpl._createSafe(JS('History', '#.history', _window));
-  Location get location =>
-    _LocationCrossFrameImpl._createSafe(JS('Location', '#.location', _window));
-
-  // TODO(vsm): Add frames to navigate subframes.  See 2312.
-
-  bool get closed => JS('bool', '#.closed', _window);
-
-  Window get opener => _createSafe(JS('Window', '#.opener', _window));
-
-  Window get parent => _createSafe(JS('Window', '#.parent', _window));
-
-  Window get top => _createSafe(JS('Window', '#.top', _window));
-
-  // Methods.
-  void focus() => JS('void', '#.focus()', _window);
-
-  void blur() => JS('void', '#.blur()', _window);
-
-  void close() => JS('void', '#.close()', _window);
-
-  void postMessage(var message, String targetOrigin, [List messagePorts = null]) {
-    if (messagePorts == null) {
-      JS('void', '#.postMessage(#,#)', _window, message, targetOrigin);
-    } else {
-      JS('void', '#.postMessage(#,#,#)', _window, message, targetOrigin, messagePorts);
-    }
-  }
-
-  // Implementation support.
-  _DOMWindowCrossFrameImpl(this._window);
-
-  static Window _createSafe(w) {
-    if (identical(w, window)) {
-      return w;
-    } else {
-      // TODO(vsm): Cache or implement equality.
-      return new _DOMWindowCrossFrameImpl(w);
-    }
-  }
-}
-
-class _LocationCrossFrameImpl implements Location {
-  // Private location.  Note, this is a location object in another frame, so it
-  // cannot be typed as "Location" as its prototype is not patched
-  // properly.  Its fields and methods can only be accessed via JavaScript.
-  var _location;
-
-  void set href(String val) => _setHref(_location, val);
-  static void _setHref(location, val) {
-    JS('void', '#.href = #', location, val);
-  }
-
-  // Implementation support.
-  _LocationCrossFrameImpl(this._location);
-
-  static Location _createSafe(location) {
-    if (identical(location, window.location)) {
-      return location;
-    } else {
-      // TODO(vsm): Cache or implement equality.
-      return new _LocationCrossFrameImpl(location);
-    }
-  }
-}
-
-class _HistoryCrossFrameImpl implements History {
-  // Private history.  Note, this is a history object in another frame, so it
-  // cannot be typed as "History" as its prototype is not patched
-  // properly.  Its fields and methods can only be accessed via JavaScript.
-  var _history;
-
-  void back() => JS('void', '#.back()', _history);
-
-  void forward() => JS('void', '#.forward()', _history);
-
-  void go(int distance) => JS('void', '#.go(#)', _history, distance);
-
-  // Implementation support.
-  _HistoryCrossFrameImpl(this._history);
-
-  static History _createSafe(h) {
-    if (identical(h, window.history)) {
-      return h;
-    } else {
-      // TODO(vsm): Cache or implement equality.
-      return new _HistoryCrossFrameImpl(h);
-    }
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _AudioContextFactoryProvider {
-
-  static AudioContext createAudioContext() {
-    return JS('AudioContext',
-              'new (window.AudioContext || window.webkitAudioContext)()');
-  }
-}
-
-class _PointFactoryProvider {
-  static Point createPoint(num x, num y) =>
-      JS('Point', 'new WebKitPoint(#, #)', x, y);
-}
-
-class _WebSocketFactoryProvider {
-  static WebSocket createWebSocket(String url) =>
-      JS('WebSocket', 'new WebSocket(#)', url);
-}
-
-class _TextFactoryProvider {
-  static Text createText(String data) =>
-      JS('Text', 'document.createTextNode(#)', data);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _IDBKeyRangeFactoryProvider {
-
-  static IDBKeyRange createIDBKeyRange_only(/*IDBKey*/ value) =>
-      _only(_class(), _translateKey(value));
-
-  static IDBKeyRange createIDBKeyRange_lowerBound(
-      /*IDBKey*/ bound, [bool open = false]) =>
-      _lowerBound(_class(), _translateKey(bound), open);
-
-  static IDBKeyRange createIDBKeyRange_upperBound(
-      /*IDBKey*/ bound, [bool open = false]) =>
-      _upperBound(_class(), _translateKey(bound), open);
-
-  static IDBKeyRange createIDBKeyRange_bound(/*IDBKey*/ lower, /*IDBKey*/ upper,
-      [bool lowerOpen = false, bool upperOpen = false]) =>
-      _bound(_class(), _translateKey(lower), _translateKey(upper),
-             lowerOpen, upperOpen);
-
-  static var _cachedClass;
-
-  static _class() {
-    if (_cachedClass != null) return _cachedClass;
-    return _cachedClass = _uncachedClass();
-  }
-
-  static _uncachedClass() =>
-    JS('var',
-       '''window.webkitIDBKeyRange || window.mozIDBKeyRange ||
-          window.msIDBKeyRange || window.IDBKeyRange''');
-
-  static _translateKey(idbkey) => idbkey;  // TODO: fixme.
-
-  static _IDBKeyRangeImpl _only(cls, value) =>
-       JS('_IDBKeyRangeImpl', '#.only(#)', cls, value);
-
-  static _IDBKeyRangeImpl _lowerBound(cls, bound, open) =>
-       JS('_IDBKeyRangeImpl', '#.lowerBound(#, #)', cls, bound, open);
-
-  static _IDBKeyRangeImpl _upperBound(cls, bound, open) =>
-       JS('_IDBKeyRangeImpl', '#.upperBound(#, #)', cls, bound, open);
-
-  static _IDBKeyRangeImpl _bound(cls, lower, upper, lowerOpen, upperOpen) =>
-       JS('_IDBKeyRangeImpl', '#.bound(#, #, #, #)',
-          cls, lower, upper, lowerOpen, upperOpen);
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-// On Firefox 11, the object obtained from 'window.location' is very strange.
-// It can't be monkey-patched and seems immune to putting methods on
-// Object.prototype.  We are forced to wrap the object.
-
-class _LocationWrapper implements LocalLocation {
-
-  final _ptr;  // Opaque reference to real location.
-
-  _LocationWrapper(this._ptr);
-
-  // TODO(sra): Replace all the _set and _get calls with 'JS' forms.
-
-  // final List<String> ancestorOrigins;
-  List<String> get ancestorOrigins => _get(_ptr, 'ancestorOrigins');
-
-  // String hash;
-  String get hash => _get(_ptr, 'hash');
-  void set hash(String value) => _set(_ptr, 'hash', value);
-
-  // String host;
-  String get host => _get(_ptr, 'host');
-  void set host(String value) => _set(_ptr, 'host', value);
-
-  // String hostname;
-  String get hostname => _get(_ptr, 'hostname');
-  void set hostname(String value) => _set(_ptr, 'hostname', value);
-
-  // String href;
-  String get href => _get(_ptr, 'href');
-  void set href(String value) => _set(_ptr, 'href', value);
-
-  // final String origin;
-  String get origin => _get(_ptr, 'origin');
-
-  // String pathname;
-  String get pathname => _get(_ptr, 'pathname');
-  void set pathname(String value) => _set(_ptr, 'pathname', value);
-
-  // String port;
-  String get port => _get(_ptr, 'port');
-  void set port(String value) => _set(_ptr, 'port', value);
-
-  // String protocol;
-  String get protocol => _get(_ptr, 'protocol');
-  void set protocol(String value) => _set(_ptr, 'protocol', value);
-
-  // String search;
-  String get search => _get(_ptr, 'search');
-  void set search(String value) => _set(_ptr, 'search', value);
-
-
-  void assign(String url) => JS('void', '#.assign(#)', _ptr, url);
-
-  void reload() => JS('void', '#.reload()', _ptr);
-
-  void replace(String url) => JS('void', '#.replace(#)', _ptr, url);
-
-  String toString() => JS('String', '#.toString()', _ptr);
-
-
-  static _get(p, m) => JS('var', '#[#]', p, m);
-  static _set(p, m, v) => JS('void', '#[#] = #', p, m, v);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Checks to see if the mutation observer API is supported on the current
- * platform.
- */
-bool _isMutationObserverSupported() =>
-  JS('bool', '!!(window.MutationObserver || window.WebKitMutationObserver)');
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _TypedArrayFactoryProvider {
-
-  static Float32Array createFloat32Array(int length) => _F32(length);
-  static Float32Array createFloat32Array_fromList(List<num> list) =>
-      _F32(ensureNative(list));
-  static Float32Array createFloat32Array_fromBuffer(ArrayBuffer buffer,
-                                  [int byteOffset = 0, int length]) {
-    if (length == null) return _F32_2(buffer, byteOffset);
-    return _F32_3(buffer, byteOffset, length);
-  }
-
-  static Float64Array createFloat64Array(int length) => _F64(length);
-  static Float64Array createFloat64Array_fromList(List<num> list) =>
-      _F64(ensureNative(list));
-  static Float64Array createFloat64Array_fromBuffer(ArrayBuffer buffer,
-      [int byteOffset = 0, int length]) {
-    if (length == null) return _F64_2(buffer, byteOffset);
-    return _F64_3(buffer, byteOffset, length);
-  }
-
-  static Int8Array createInt8Array(int length) => _I8(length);
-  static Int8Array createInt8Array_fromList(List<num> list) =>
-      _I8(ensureNative(list));
-  static Int8Array createInt8Array_fromBuffer(ArrayBuffer buffer,
-      [int byteOffset = 0, int length]) {
-    if (length == null) return _I8_2(buffer, byteOffset);
-    return _I8_3(buffer, byteOffset, length);
-  }
-
-  static Int16Array createInt16Array(int length) => _I16(length);
-  static Int16Array createInt16Array_fromList(List<num> list) =>
-      _I16(ensureNative(list));
-  static Int16Array createInt16Array_fromBuffer(ArrayBuffer buffer,
-      [int byteOffset = 0, int length]) {
-    if (length == null) return _I16_2(buffer, byteOffset);
-    return _I16_3(buffer, byteOffset, length);
-  }
-
-  static Int32Array createInt32Array(int length) => _I32(length);
-  static Int32Array createInt32Array_fromList(List<num> list) =>
-      _I32(ensureNative(list));
-  static Int32Array createInt32Array_fromBuffer(ArrayBuffer buffer,
-      [int byteOffset = 0, int length]) {
-    if (length == null) return _I32_2(buffer, byteOffset);
-    return _I32_3(buffer, byteOffset, length);
-  }
-
-  static Uint8Array createUint8Array(int length) => _U8(length);
-  static Uint8Array createUint8Array_fromList(List<num> list) =>
-      _U8(ensureNative(list));
-  static Uint8Array createUint8Array_fromBuffer(ArrayBuffer buffer,
-      [int byteOffset = 0, int length]) {
-    if (length == null) return _U8_2(buffer, byteOffset);
-    return _U8_3(buffer, byteOffset, length);
-  }
-
-  static Uint16Array createUint16Array(int length) => _U16(length);
-  static Uint16Array createUint16Array_fromList(List<num> list) =>
-      _U16(ensureNative(list));
-  static Uint16Array createUint16Array_fromBuffer(ArrayBuffer buffer,
-      [int byteOffset = 0, int length]) {
-    if (length == null) return _U16_2(buffer, byteOffset);
-    return _U16_3(buffer, byteOffset, length);
-  }
-
-  static Uint32Array createUint32Array(int length) => _U32(length);
-  static Uint32Array createUint32Array_fromList(List<num> list) =>
-      _U32(ensureNative(list));
-  static Uint32Array createUint32Array_fromBuffer(ArrayBuffer buffer,
-      [int byteOffset = 0, int length]) {
-    if (length == null) return _U32_2(buffer, byteOffset);
-    return _U32_3(buffer, byteOffset, length);
-  }
-
-  static Uint8ClampedArray createUint8ClampedArray(int length) => _U8C(length);
-  static Uint8ClampedArray createUint8ClampedArray_fromList(List<num> list) =>
-      _U8C(ensureNative(list));
-  static Uint8ClampedArray createUint8ClampedArray_fromBuffer(
-        ArrayBuffer buffer, [int byteOffset = 0, int length]) {
-    if (length == null) return _U8C_2(buffer, byteOffset);
-    return _U8C_3(buffer, byteOffset, length);
-  }
-
-  static Float32Array _F32(arg) =>
-      JS('Float32Array', 'new Float32Array(#)', arg);
-  static Float64Array _F64(arg) =>
-      JS('Float64Array', 'new Float64Array(#)', arg);
-  static Int8Array _I8(arg) =>
-      JS('Int8Array', 'new Int8Array(#)', arg);
-  static Int16Array _I16(arg) =>
-      JS('Int16Array', 'new Int16Array(#)', arg);
-  static Int32Array _I32(arg) =>
-      JS('Int32Array', 'new Int32Array(#)', arg);
-  static Uint8Array _U8(arg) =>
-      JS('Uint8Array', 'new Uint8Array(#)', arg);
-  static Uint16Array _U16(arg) =>
-      JS('Uint16Array', 'new Uint16Array(#)', arg);
-  static Uint32Array _U32(arg) =>
-      JS('Uint32Array', 'new Uint32Array(#)', arg);
-  static Uint8ClampedArray _U8C(arg) =>
-      JS('Uint8ClampedArray', 'new Uint8ClampedArray(#)', arg);
-
-  static Float32Array _F32_2(arg1, arg2) =>
-      JS('Float32Array', 'new Float32Array(#, #)', arg1, arg2);
-  static Float64Array _F64_2(arg1, arg2) =>
-      JS('Float64Array', 'new Float64Array(#, #)', arg1, arg2);
-  static Int8Array _I8_2(arg1, arg2) =>
-      JS('Int8Array', 'new Int8Array(#, #)', arg1, arg2);
-  static Int16Array _I16_2(arg1, arg2) =>
-      JS('Int16Array', 'new Int16Array(#, #)', arg1, arg2);
-  static Int32Array _I32_2(arg1, arg2) =>
-      JS('Int32Array', 'new Int32Array(#, #)', arg1, arg2);
-  static Uint8Array _U8_2(arg1, arg2) =>
-      JS('Uint8Array', 'new Uint8Array(#, #)', arg1, arg2);
-  static Uint16Array _U16_2(arg1, arg2) =>
-      JS('Uint16Array', 'new Uint16Array(#, #)', arg1, arg2);
-  static Uint32Array _U32_2(arg1, arg2) =>
-      JS('Uint32Array', 'new Uint32Array(#, #)', arg1, arg2);
-  static Uint8ClampedArray _U8C_2(arg1, arg2) =>
-      JS('Uint8ClampedArray', 'new Uint8ClampedArray(#, #)', arg1, arg2);
-
-  static Float32Array _F32_3(arg1, arg2, arg3) =>
-      JS('Float32Array', 'new Float32Array(#, #, #)', arg1, arg2, arg3);
-  static Float64Array _F64_3(arg1, arg2, arg3) =>
-      JS('Float64Array', 'new Float64Array(#, #, #)', arg1, arg2, arg3);
-  static Int8Array _I8_3(arg1, arg2, arg3) =>
-      JS('Int8Array', 'new Int8Array(#, #, #)', arg1, arg2, arg3);
-  static Int16Array _I16_3(arg1, arg2, arg3) =>
-      JS('Int16Array', 'new Int16Array(#, #, #)', arg1, arg2, arg3);
-  static Int32Array _I32_3(arg1, arg2, arg3) =>
-      JS('Int32Array', 'new Int32Array(#, #, #)', arg1, arg2, arg3);
-  static Uint8Array _U8_3(arg1, arg2, arg3) =>
-      JS('Uint8Array', 'new Uint8Array(#, #, #)', arg1, arg2, arg3);
-  static Uint16Array _U16_3(arg1, arg2, arg3) =>
-      JS('Uint16Array', 'new Uint16Array(#, #, #)', arg1, arg2, arg3);
-  static Uint32Array _U32_3(arg1, arg2, arg3) =>
-      JS('Uint32Array', 'new Uint32Array(#, #, #)', arg1, arg2, arg3);
-  static Uint8ClampedArray _U8C_3(arg1, arg2, arg3) =>
-      JS('Uint8ClampedArray', 'new Uint8ClampedArray(#, #, #)', arg1, arg2, arg3);
-
-
-  // Ensures that [list] is a JavaScript Array or a typed array.  If necessary,
-  // copies the list.
-  static ensureNative(List list) => list;  // TODO: make sure.
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// TODO(rnystrom): add a way to supress public classes from DartDoc output.
-// TODO(jacobr): we can remove this class now that we are using the $dom_
-// convention for deprecated methods rather than truly private methods.
-/**
- * This class is intended for testing purposes only.
- */
-class Testing {
-  static void addEventListener(EventTarget target, String type, EventListener listener, bool useCapture) {
-    target.$dom_addEventListener(type, listener, useCapture);
-  }
-  static void removeEventListener(EventTarget target, String type, EventListener listener, bool useCapture) {
-    target.$dom_removeEventListener(type, listener, useCapture);
-  }
-
-}// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Utils for device detection.
- */
-class _Device {
-  /**
-   * Gets the browser's user agent. Using this function allows tests to inject
-   * the user agent.
-   * Returns the user agent.
-   */
-  static String get userAgent => window.navigator.userAgent;
-
-  /**
-   * Determines if the current device is running Opera.
-   */
-  static bool get isOpera => userAgent.contains("Opera", 0);
-
-  /**
-   * Determines if the current device is running Internet Explorer.
-   */
-  static bool get isIE => !isOpera && userAgent.contains("MSIE", 0);
-
-  /**
-   * Determines if the current device is running Firefox.
-   */
-  static bool get isFirefox => userAgent.contains("Firefox", 0);
-
-  /**
-   * Determines if the current device is running WebKit.
-   */
-  static bool get isWebKit => !isOpera && userAgent.contains("WebKit", 0);
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Iterator for arrays with fixed size.
-class _FixedSizeListIterator<T> extends _VariableSizeListIterator<T> {
-  _FixedSizeListIterator(List<T> array)
-      : super(array),
-        _length = array.length;
-
-  bool get hasNext => _length > _pos;
-
-  final int _length;  // Cache array length for faster access.
-}
-
-// Iterator for arrays with variable size.
-class _VariableSizeListIterator<T> implements Iterator<T> {
-  _VariableSizeListIterator(List<T> array)
-      : _array = array,
-        _pos = 0;
-
-  bool get hasNext => _array.length > _pos;
-
-  T next() {
-    if (!hasNext) {
-      throw new StateError("No more elements");
-    }
-    return _array[_pos++];
-  }
-
-  final List<T> _array;
-  int _pos;
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _Lists {
-
-  /**
-   * Returns the index in the array [a] of the given [element], starting
-   * the search at index [startIndex] to [endIndex] (exclusive).
-   * Returns -1 if [element] is not found.
-   */
-  static int indexOf(List a,
-                     Object element,
-                     int startIndex,
-                     int endIndex) {
-    if (startIndex >= a.length) {
-      return -1;
-    }
-    if (startIndex < 0) {
-      startIndex = 0;
-    }
-    for (int i = startIndex; i < endIndex; i++) {
-      if (a[i] == element) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  /**
-   * Returns the last index in the array [a] of the given [element], starting
-   * the search at index [startIndex] to 0.
-   * Returns -1 if [element] is not found.
-   */
-  static int lastIndexOf(List a, Object element, int startIndex) {
-    if (startIndex < 0) {
-      return -1;
-    }
-    if (startIndex >= a.length) {
-      startIndex = a.length - 1;
-    }
-    for (int i = startIndex; i >= 0; i--) {
-      if (a[i] == element) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  /**
-   * Returns a sub list copy of this list, from [start] to
-   * [:start + length:].
-   * Returns an empty list if [length] is 0.
-   * Throws an [ArgumentError] if [length] is negative.
-   * Throws a [RangeError] if [start] or [:start + length:] are out of range.
-   */
-  static List getRange(List a, int start, int length, List accumulator) {
-    if (length < 0) throw new ArgumentError('length');
-    if (start < 0) throw new RangeError.value(start);
-    int end = start + length;
-    if (end > a.length) throw new RangeError.value(end);
-    for (int i = start; i < end; i++) {
-      accumulator.add(a[i]);
-    }
-    return accumulator;
-  }
-}
diff --git a/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate b/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate
deleted file mode 100644
index ac6f2d1..0000000
--- a/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-
-  void requestLayoutFrame(TimeoutHandler callback) {
-    _addMeasurementFrameCallback(callback);
-  }
-
-  // TODO(kasperl): Document these.
-  lookupPort(String name) {
-    var port = JSON.parse(localStorage['dart-port:$name']);
-    return _deserialize(port);
-  }
-
-  registerPort(String name, var port) {
-    var serialized = _serialize(port);
-    localStorage['dart-port:$name'] = JSON.stringify(serialized);
-  }
-
-  String createObjectUrl(object) => DOMURL.createObjectURL(object);
-  void revokeObjectUrl(String url) {
-    DOMURL.revokeObjectURL(url);
-  }
-
-$!MEMBERS
-}
diff --git a/lib/html/templates/html/impl/impl_EventTarget.darttemplate b/lib/html/templates/html/impl/impl_EventTarget.darttemplate
deleted file mode 100644
index 23e8f5b..0000000
--- a/lib/html/templates/html/impl/impl_EventTarget.darttemplate
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _EventsImpl implements Events {
-  /* Raw event target. */
-  // TODO(jacobr): it would be nice if we could specify this as
-  // _EventTargetImpl or EventTarget
-  final _ptr;
-
-  _EventsImpl(this._ptr);
-
-  _EventListenerListImpl operator [](String type) {
-    return new _EventListenerListImpl(_ptr, type);
-  }
-}
-
-class _EventListenerListImpl implements EventListenerList {
-
-  // TODO(jacobr): make this _EventTargetImpl
-  final _ptr;
-  final String _type;
-
-  _EventListenerListImpl(this._ptr, this._type);
-
-  // TODO(jacobr): implement equals.
-
-  _EventListenerListImpl add(EventListener listener,
-      [bool useCapture = false]) {
-    _add(listener, useCapture);
-    return this;
-  }
-
-  _EventListenerListImpl remove(EventListener listener,
-      [bool useCapture = false]) {
-    _remove(listener, useCapture);
-    return this;
-  }
-
-  bool dispatch(Event evt) {
-    return _ptr.$dom_dispatchEvent(evt);
-  }
-
-  void _add(EventListener listener, bool useCapture) {
-    _ptr.$dom_addEventListener(_type, listener, useCapture);
-  }
-
-  void _remove(EventListener listener, bool useCapture) {
-    _ptr.$dom_removeEventListener(_type, listener, useCapture);
-  }
-}
-
-
-class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-
-  Events get on => new _EventsImpl(this);
-$!MEMBERS
-}
diff --git a/lib/html/templates/html/interface/interface_SVGSVGElement.darttemplate b/lib/html/templates/html/interface/interface_SVGSVGElement.darttemplate
deleted file mode 100644
index a97d617..0000000
--- a/lib/html/templates/html/interface/interface_SVGSVGElement.darttemplate
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of html;
-
-$!COMMENT
-abstract class SVGSVGElement extends SVGElement implements SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGLocatable, SVGFitToViewBox, SVGZoomAndPan {
-  factory SVGSVGElement() => _$(ID)FactoryProvider.createSVGSVGElement();
-
-$!MEMBERS
-}
diff --git a/pkg/args/example/test_runner.dart b/pkg/args/example/test_runner.dart
index f91e385..d0a6ed8 100644
--- a/pkg/args/example/test_runner.dart
+++ b/pkg/args/example/test_runner.dart
@@ -7,11 +7,11 @@
  * It shows what it looks like to build an [ArgParser] and then, when the code
  * is run, demonstrates what the generated usage text looks like.
  */
-#library('example');
+library example;
 
-#import('dart:io');
+import 'dart:io';
 
-#import('package:args/args.dart');
+import 'package:args/args.dart';
 
 main() {
   var parser = new ArgParser();
diff --git a/pkg/args/lib/args.dart b/pkg/args/lib/args.dart
index a74c981..ad0d907 100644
--- a/pkg/args/lib/args.dart
+++ b/pkg/args/lib/args.dart
@@ -188,12 +188,12 @@
  * [posix]: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02
  * [gnu]: http://www.gnu.org/prep/standards/standards.html#Command_002dLine-Interfaces
  */
-#library('args');
+library args;
 
-#import('dart:math');
+import 'dart:math';
 
 // TODO(rnystrom): Use "package:" URL here when test.dart can handle pub.
-#import('src/utils.dart');
+import 'src/utils.dart';
 
 /**
  * A class for taking a list of raw command line arguments and parsing out
diff --git a/pkg/args/lib/src/utils.dart b/pkg/args/lib/src/utils.dart
index 029ada3..c6997c8 100644
--- a/pkg/args/lib/src/utils.dart
+++ b/pkg/args/lib/src/utils.dart
@@ -4,7 +4,7 @@
 
 // TODO(rnystrom): This file was copied from pub.
 /** Generic utility functions. Stuff that should possibly be in core. */
-#library('args_utils');
+library args_utils;
 
 /** Pads [source] to [length] by adding spaces at the end. */
 String padRight(String source, int length) {
diff --git a/pkg/args/test/args_test.dart b/pkg/args/test/args_test.dart
index d3b219b..6111296 100644
--- a/pkg/args/test/args_test.dart
+++ b/pkg/args/test/args_test.dart
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('args_test');
+library args_test;
 
-#import('../../unittest/unittest.dart');
+import '../../../pkg/unittest/lib/unittest.dart';
 
 // TODO(rnystrom): Use "package:" URL here when test.dart can handle pub.
-#import('../lib/args.dart');
+import '../lib/args.dart';
 
 main() {
   group('ArgParser.addFlag()', () {
diff --git a/pkg/fixnum/fixnum.dart b/pkg/fixnum/fixnum.dart
index a34ea63..837564c 100644
--- a/pkg/fixnum/fixnum.dart
+++ b/pkg/fixnum/fixnum.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('fixnum');
-#import('dart:math', prefix: 'Math');
-#source('intx.dart');
-#source('int32.dart');
-#source('int64.dart');
+library fixnum;
+import 'dart:math' as Math;
+part 'intx.dart';
+part 'int32.dart';
+part 'int64.dart';
diff --git a/pkg/fixnum/int32.dart b/pkg/fixnum/int32.dart
index 295a340..80f5f3c 100644
--- a/pkg/fixnum/int32.dart
+++ b/pkg/fixnum/int32.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of fixnum;
+
 /**
  * An immutable 32-bit signed integer, in the range [-2^31, 2^31 - 1].
  * Arithmetic operations may overflow in order to maintain this range.
diff --git a/pkg/fixnum/int64.dart b/pkg/fixnum/int64.dart
index 8509e72..47ade36 100644
--- a/pkg/fixnum/int64.dart
+++ b/pkg/fixnum/int64.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of fixnum;
+
 /**
  * An immutable 64-bit signed integer, in the range [-2^63, 2^63 - 1].
  * Arithmetic operations may overflow in order to maintain this range.
diff --git a/pkg/fixnum/intx.dart b/pkg/fixnum/intx.dart
index a18d849..582fe72 100644
--- a/pkg/fixnum/intx.dart
+++ b/pkg/fixnum/intx.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of fixnum;
+
 /**
  * A fixed-precision integer.
  */
diff --git a/pkg/fixnum/test/int_32_test.dart b/pkg/fixnum/test/int_32_test.dart
index 63a80f0..9d5cafee 100644
--- a/pkg/fixnum/test/int_32_test.dart
+++ b/pkg/fixnum/test/int_32_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library("int32test");
-#import('../fixnum.dart');
+library int32test;
+import '../fixnum.dart';
 
 void main() {
   Expect.equals("0", new int32.fromInt(0).toString());
diff --git a/pkg/fixnum/test/int_64_test.dart b/pkg/fixnum/test/int_64_test.dart
index a843c89..cd79122 100644
--- a/pkg/fixnum/test/int_64_test.dart
+++ b/pkg/fixnum/test/int_64_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('int64test');
-#import('../fixnum.dart');
+library int64test;
+import '../fixnum.dart';
 
 void main() {
   testAdditive();
diff --git a/pkg/fixnum/test/int_64_vm_test.dart b/pkg/fixnum/test/int_64_vm_test.dart
index 22d026a..97e985c 100644
--- a/pkg/fixnum/test/int_64_vm_test.dart
+++ b/pkg/fixnum/test/int_64_vm_test.dart
@@ -4,11 +4,11 @@
 
 // A test to compare the results of the fixnum library with the Dart VM
 
-#library('int64vmtest');
-#import('dart:math', prefix: 'Math');
-#source('../intx.dart');
-#source('../int32.dart');
-#source('../int64.dart');
+library int64vmtest;
+import 'dart:math', prefix: 'Math';
+part '../intx.dart';
+part '../int32.dart';
+part '../int64.dart';
 
 void main() {
   int64VMTest test = new int64VMTest();
diff --git a/pkg/htmlescape/lib/htmlescape.dart b/pkg/htmlescape/lib/htmlescape.dart
index 6c5e4f8..b34c297 100644
--- a/pkg/htmlescape/lib/htmlescape.dart
+++ b/pkg/htmlescape/lib/htmlescape.dart
@@ -6,7 +6,7 @@
  * This library contains functions to escape strings for safe inclusion
  * in HTML source.
  */
-#library("htmlescape");
+library htmlescape;
 
 /**
  * Escapes HTML-special characters of [text] so that the result can be
diff --git a/pkg/http/lib/http.dart b/pkg/http/lib/http.dart
new file mode 100644
index 0000000..d13b2fb
--- /dev/null
+++ b/pkg/http/lib/http.dart
@@ -0,0 +1,176 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A composable, [Future]-based library for making HTTP requests.
+///
+/// The easiest way to use this library is via the top-level functions. They
+/// allow you to make individual HTTP requests with minimal hassle:
+///
+///     import 'package:http/http.dart' as http;
+///
+///     var url = "http://example.com/whatsit/create";
+///     http.post(url, fields: {"name": "doodle", "color": "blue"})
+///         .then((response) {
+///       print("Response status: ${response.statusCode}");
+///       print("Response body: ${response.body}");
+///     });
+///
+///     http.read("http://example.com/foobar.txt").then(print);
+///
+/// If you're making multiple requests to the same server, you can keep open a
+/// persistent connection by using a [Client] rather than making one-off
+/// requests. If you do this, make sure to close the client when you're done:
+///
+///     var client = new http.Client();
+///     client.post(
+///         "http://example.com/whatsit/create",
+///         fields: {"name": "doodle", "color": "blue"})
+///       .chain((response) => client.get(response.bodyFields['uri']))
+///       .transform((response) => print(response.body))
+///       .onComplete((_) => client.close());
+///
+/// You can also exert more fine-grained control over your requests and
+/// responses by creating [Request] or [StreamedRequest] objects yourself and
+/// passing them to [Client.send].
+///
+/// This package is designed to be composable. This makes it easy for external
+/// libraries to work with one another to add behavior to it. Libraries wishing
+/// to add behavior should create a subclass of [BaseClient] that wraps another
+/// [BaseClient] and adds the desired behavior:
+///
+///     class UserAgentClient extends http.BaseClient {
+///       final String userAgent;
+///       final HttpClient _inner;
+///
+///       UserAgentClient(this.userAgent, this._inner);
+///
+///       Future<StreamedResponse> send(BaseRequest request) {
+///         request.headers[HttpHeaders.USER_AGENT] = userAgent;
+///         return _inner.send(request);
+///       }
+///     }
+///
+/// In turn, libraries using [Client] should take a [BaseClient] so that the
+/// decorated clients can be used transparently.
+
+library http;
+
+import 'dart:scalarlist';
+import 'dart:uri';
+
+import 'src/client.dart';
+import 'src/response.dart';
+
+export 'src/base_client.dart';
+export 'src/base_request.dart';
+export 'src/base_response.dart';
+export 'src/client.dart';
+export 'src/multipart_file.dart';
+export 'src/multipart_request.dart';
+export 'src/request.dart';
+export 'src/response.dart';
+export 'src/streamed_request.dart';
+export 'src/streamed_response.dart';
+
+/// Sends an HTTP HEAD request with the given headers to the given URL, which
+/// can be a [Uri] or a [String].
+///
+/// This automatically initializes a new [Client] and closes that client once
+/// the request is complete. If you're planning on making multiple requests to
+/// the same server, you should use a single [Client] for all of those requests.
+///
+/// For more fine-grained control over the request, use [Request] instead.
+Future<Response> head(url, {Map<String, String> headers}) =>
+  _withClient((client) => client.head(url, headers: headers));
+
+/// Sends an HTTP GET request with the given headers to the given URL, which can
+/// be a [Uri] or a [String].
+///
+/// This automatically initializes a new [Client] and closes that client once
+/// the request is complete. If you're planning on making multiple requests to
+/// the same server, you should use a single [Client] for all of those requests.
+///
+/// For more fine-grained control over the request, use [Request] instead.
+Future<Response> get(url, {Map<String, String> headers}) =>
+  _withClient((client) => client.get(url, headers: headers));
+
+/// Sends an HTTP POST request with the given headers and fields to the given
+/// URL, which an be a [Uri] or a [String]. If any fields are specified, the
+/// content-type is automatically set to `"application/x-www-form-urlencoded"`.
+///
+/// This automatically initializes a new [Client] and closes that client once
+/// the request is complete. If you're planning on making multiple requests to
+/// the same server, you should use a single [Client] for all of those requests.
+///
+/// For more fine-grained control over the request, use [Request] or
+/// [StreamedRequest] instead.
+Future<Response> post(url,
+    {Map<String, String> headers,
+     Map<String, String> fields}) =>
+  _withClient((client) => client.post(url, headers: headers, fields: fields));
+
+/// Sends an HTTP POST request with the given headers and fields to the given
+/// URL, which can be a [Uri] or a [String]. If any fields are specified, the
+/// content-type is automatically set to `"application/x-www-form-urlencoded"`.
+///
+/// This automatically initializes a new [Client] and closes that client once
+/// the request is complete. If you're planning on making multiple requests to
+/// the same server, you should use a single [Client] for all of those requests.
+///
+/// For more fine-grained control over the request, use [Request] or
+/// [StreamedRequest] instead.
+Future<Response> put(url,
+    {Map<String, String> headers,
+     Map<String, String> fields}) =>
+  _withClient((client) => client.put(url, headers: headers, fields: fields));
+
+/// Sends an HTTP DELETE request with the given headers to the given URL, which
+/// can be a [Uri] or a [String].
+///
+/// This automatically initializes a new [Client] and closes that client once
+/// the request is complete. If you're planning on making multiple requests to
+/// the same server, you should use a single [Client] for all of those requests.
+///
+/// For more fine-grained control over the request, use [Request] instead.
+Future<Response> delete(url, {Map<String, String> headers}) =>
+  _withClient((client) => client.delete(url, headers: headers));
+
+/// Sends an HTTP GET request with the given headers to the given URL, which can
+/// be a [Uri] or a [String], and returns a Future that completes to the body of
+/// the response as a [String].
+///
+/// The Future will emit an [HttpException] if the response doesn't have a
+/// success status code.
+///
+/// This automatically initializes a new [Client] and closes that client once
+/// the request is complete. If you're planning on making multiple requests to
+/// the same server, you should use a single [Client] for all of those requests.
+///
+/// For more fine-grained control over the request and response, use [Request]
+/// instead.
+Future<String> read(url, {Map<String, String> headers}) =>
+  _withClient((client) => client.read(url, headers: headers));
+
+/// Sends an HTTP GET request with the given headers to the given URL, which can
+/// be a [Uri] or a [String], and returns a Future that completes to the body of
+/// the response as a list of bytes.
+///
+/// The Future will emit an [HttpException] if the response doesn't have a
+/// success status code.
+///
+/// This automatically initializes a new [Client] and closes that client once
+/// the request is complete. If you're planning on making multiple requests to
+/// the same server, you should use a single [Client] for all of those requests.
+///
+/// For more fine-grained control over the request and response, use [Request]
+/// instead.
+Future<Uint8List> readBytes(url, {Map<String, String> headers}) =>
+  _withClient((client) => client.readBytes(url, headers: headers));
+
+Future _withClient(Future fn(Client)) {
+  var client = new Client();
+  var future = fn(client);
+  future.onComplete((_) => client.close());
+  return future;
+}
diff --git a/pkg/http/lib/src/base_client.dart b/pkg/http/lib/src/base_client.dart
new file mode 100644
index 0000000..0b9c52d
--- /dev/null
+++ b/pkg/http/lib/src/base_client.dart
@@ -0,0 +1,135 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library base_client;
+
+import 'dart:io';
+import 'dart:scalarlist';
+import 'dart:uri';
+
+import 'base_request.dart';
+import 'request.dart';
+import 'response.dart';
+import 'streamed_response.dart';
+import 'utils.dart';
+
+/// The abstract base class for an HTTP client. This is a mixin-style class;
+/// subclasses only need to implement [send] and maybe [close], and then they
+/// get various convenience methods for free.
+abstract class BaseClient {
+  /// Sends an HTTP HEAD request with the given headers to the given URL, which
+  /// can be a [Uri] or a [String].
+  ///
+  /// For more fine-grained control over the request, use [send] instead.
+  Future<Response> head(url, {Map<String, String> headers}) =>
+    _sendUnstreamed("HEAD", url, headers);
+
+  /// Sends an HTTP GET request with the given headers to the given URL, which
+  /// can be a [Uri] or a [String].
+  ///
+  /// For more fine-grained control over the request, use [send] instead.
+  Future<Response> get(url, {Map<String, String> headers}) =>
+    _sendUnstreamed("GET", url, headers);
+
+  /// Sends an HTTP POST request with the given headers and fields to the given
+  /// URL, which can be a [Uri] or a [String]. If any fields are specified, the
+  /// content-type is automatically set to
+  /// `"application/x-www-form-urlencoded"`.
+  ///
+  /// For more fine-grained control over the request, use [send] instead.
+  Future<Response> post(url,
+      {Map<String, String> headers,
+       Map<String, String> fields}) =>
+    _sendUnstreamed("POST", url, headers, fields);
+
+  /// Sends an HTTP PUT request with the given headers and fields to the given
+  /// URL, which can be a [Uri] or a [String]. If any fields are specified, the
+  /// content-type is automatically set to
+  /// `"application/x-www-form-urlencoded"`.
+  ///
+  /// For more fine-grained control over the request, use [send] instead.
+  Future<Response> put(url,
+      {Map<String, String> headers,
+       Map<String, String> fields}) =>
+    _sendUnstreamed("PUT", url, headers, fields);
+
+  /// Sends an HTTP DELETE request with the given headers to the given URL,
+  /// which can be a [Uri] or a [String].
+  ///
+  /// For more fine-grained control over the request, use [send] instead.
+  Future<Response> delete(url, {Map<String, String> headers}) =>
+    _sendUnstreamed("DELETE", url, headers);
+
+  /// Sends an HTTP GET request with the given headers to the given URL, which
+  /// can be a [Uri] or a [String], and returns a Future that completes to the
+  /// body of the response as a String.
+  ///
+  /// The Future will emit an [HttpException] if the response doesn't have a
+  /// success status code.
+  ///
+  /// For more fine-grained control over the request and response, use [send] or
+  /// [get] instead.
+  Future<String> read(url, {Map<String, String> headers}) {
+    return get(url, headers: headers).transform((response) {
+      _checkResponseSuccess(url, response);
+      return response.body;
+    });
+  }
+
+  /// Sends an HTTP GET request with the given headers to the given URL, which
+  /// can be a [Uri] or a [String], and returns a Future that completes to the
+  /// body of the response as a list of bytes.
+  ///
+  /// The Future will emit an [HttpException] if the response doesn't have a
+  /// success status code.
+  ///
+  /// For more fine-grained control over the request and response, use [send] or
+  /// [get] instead.
+  Future<Uint8List> readBytes(url, {Map<String, String> headers}) {
+    return get(url, headers: headers).transform((response) {
+      _checkResponseSuccess(url, response);
+      return response.bodyBytes;
+    });
+  }
+
+  /// Sends an HTTP request and asynchronously returns the response.
+  ///
+  /// Implementers should call [BaseRequest.finalize] to get the body of the
+  /// request as an [InputStream]. They shouldn't make any assumptions about the
+  /// state of the stream; it could have data written to it asynchronously at a
+  /// later point, or it could already be closed when it's returned.
+  Future<StreamedResponse> send(BaseRequest request);
+
+  /// Sends a non-streaming [Request] and returns a non-streaming [Response].
+  Future<Response> _sendUnstreamed(
+      String method, url, Map<String, String> headers,
+      [Map<String, String> fields]) {
+    // Wrap everything in a Future block so that synchronous validation errors
+    // are passed asynchronously through the Future chain.
+    return async.chain((_) {
+      if (url is String) url = new Uri.fromString(url);
+      var request = new Request(method, url);
+
+      if (headers != null) mapAddAll(request.headers, headers);
+      if (fields != null && !fields.isEmpty) request.bodyFields = fields;
+
+      return send(request);
+    }).chain(Response.fromStream);
+  }
+
+  /// Throws an error if [response] is not successful.
+  void _checkResponseSuccess(url, Response response) {
+    if (response.statusCode < 400) return;
+    var message = "Request to $url failed with status ${response.statusCode}";
+    if (response.reasonPhrase != null) {
+      message = "$message: ${response.reasonPhrase}";
+    }
+    throw new HttpException("$message.");
+  }
+
+  /// Closes the client and cleans up any resources associated with it. It's
+  /// important to close each client when it's done being used; failing to do so
+  /// can cause the Dart process to hang.
+  void close() {}
+}
diff --git a/pkg/http/lib/src/base_request.dart b/pkg/http/lib/src/base_request.dart
new file mode 100644
index 0000000..ecf5f7a
--- /dev/null
+++ b/pkg/http/lib/src/base_request.dart
@@ -0,0 +1,117 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library base_request;
+
+import 'dart:io';
+import 'dart:uri';
+
+import 'client.dart';
+import 'streamed_response.dart';
+
+/// The base class for HTTP requests.
+///
+/// Subclasses of [BaseRequest] can be constructed manually and passed to
+/// [BaseClient.send], which allows the user to provide fine-grained control
+/// over the request properties. However, usually it's easier to use convenience
+/// methods like [get] or [BaseClient.get].
+abstract class BaseRequest {
+  /// The HTTP method of the request. Most commonly "GET" or "POST", less
+  /// commonly "HEAD", "PUT", or "DELETE". Non-standard method names are also
+  /// supported.
+  final String method;
+
+  /// The URL to which the request will be sent.
+  final Uri url;
+
+  /// The size of the request body, in bytes. This defaults to -1, which
+  /// indicates that the size of the request is not known in advance.
+  int get contentLength => _contentLength;
+  int _contentLength = -1;
+
+  set contentLength(int value) {
+    _checkFinalized();
+    _contentLength = value;
+  }
+
+  /// Whether a persistent connection should be maintained with the server.
+  /// Defaults to true.
+  bool get persistentConnection => _persistentConnection;
+  bool _persistentConnection = true;
+
+  set persistentConnection(bool value) {
+    _checkFinalized();
+    _persistentConnection = value;
+  }
+
+  /// Whether the client should follow redirects while resolving this request.
+  /// Defaults to true.
+  bool get followRedirects => _followRedirects;
+  bool _followRedirects = true;
+
+  set followRedirects(bool value) {
+    _checkFinalized();
+    _followRedirects = value;
+  }
+
+  /// The maximum number of redirects to follow when [followRedirects] is true.
+  /// If this number is exceeded the [BaseResponse] future will signal a
+  /// [RedirectLimitExceeded] exception. Defaults to 5.
+  int get maxRedirects => _maxRedirects;
+  int _maxRedirects = 5;
+
+  set maxRedirects(int value) {
+    _checkFinalized();
+    _maxRedirects = value;
+  }
+
+  // TODO(nweiz): automatically parse cookies from headers
+
+  // TODO(nweiz): make this a HttpHeaders object
+  /// The headers for this request.
+  final Map<String, String> headers;
+
+  /// Whether the request has been finalized.
+  bool get finalized => _finalized;
+  bool _finalized = false;
+
+  /// Creates a new HTTP request.
+  BaseRequest(this.method, this.url)
+    : headers = <String>{};
+
+  /// Finalizes the HTTP request in preparation for it being sent. This freezes
+  /// all mutable fields and returns an [InputStream] that should emit the body
+  /// of the request. The stream may be closed to indicate a request with no
+  /// body.
+  ///
+  /// The base implementation of this returns null rather than an [InputStream];
+  /// subclasses are responsible for creating the return value. They should also
+  /// freeze any additional mutable fields they add that don't make sense to
+  /// change after the request headers are sent.
+  InputStream finalize() {
+    // TODO(nweiz): freeze headers
+    if (finalized) throw new StateError("Can't finalize a finalized Request.");
+    _finalized = true;
+    return null;
+  }
+
+  /// Sends this request.
+  ///
+  /// This automatically initializes a new [Client] and closes that client once
+  /// the request is complete. If you're planning on making multiple requests to
+  /// the same server, you should use a single [Client] for all of those
+  /// requests.
+  Future<StreamedResponse> send() {
+    var client = new Client();
+    var future = client.send(this);
+    future.onComplete((_) => client.close());
+    return future;
+  }
+
+  /// Throws an error if this request has been finalized.
+  void _checkFinalized() {
+    if (!finalized) return;
+    throw new StateError("Can't modify a finalized Request.");
+  }
+}
diff --git a/pkg/http/lib/src/base_response.dart b/pkg/http/lib/src/base_response.dart
new file mode 100644
index 0000000..57f4a95
--- /dev/null
+++ b/pkg/http/lib/src/base_response.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library base_response;
+
+import 'dart:io';
+
+/// The base class for HTTP responses.
+///
+/// Subclasses of [BaseResponse] are usually not constructed manually; instead,
+/// they're returned by [BaseClient.send] or other HTTP client methods.
+abstract class BaseResponse {
+  /// The status code of the response.
+  final int statusCode;
+
+  /// The reason phrase associated with the status code.
+  final String reasonPhrase;
+
+  /// The size of the response body, in bytes. If the size of the request is not
+  /// known in advance, this is -1.
+  final int contentLength;
+
+  // TODO(nweiz): automatically parse cookies from headers
+
+  // TODO(nweiz): make this a HttpHeaders object.
+  /// The headers for this response.
+  final Map<String, String> headers;
+
+  /// Whether this response is a redirect.
+  final bool isRedirect;
+
+  /// Whether the server requested that a persistent connection be maintained.
+  final bool persistentConnection;
+
+  /// Creates a new HTTP response.
+  BaseResponse(
+      this.statusCode,
+      this.contentLength,
+      {this.headers: const <String>{},
+       this.isRedirect: false,
+       this.persistentConnection: true,
+       this.reasonPhrase});
+}
diff --git a/pkg/http/lib/src/client.dart b/pkg/http/lib/src/client.dart
new file mode 100644
index 0000000..bbee58d
--- /dev/null
+++ b/pkg/http/lib/src/client.dart
@@ -0,0 +1,82 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library client;
+
+import 'dart:io';
+
+import 'base_client.dart';
+import 'base_request.dart';
+import 'streamed_response.dart';
+import 'utils.dart';
+
+/// An HTTP client which takes care of maintaining persistent connections across
+/// multiple requests to the same server. If you only need to send a single
+/// request, it's usually easier to use [head], [get], [post],
+/// [put], or [delete] instead.
+///
+/// When creating an HTTP client class with additional functionality, it's
+/// recommended that you subclass [BaseClient] and wrap another instance of
+/// [BaseClient] rather than subclassing [Client] directly. This allows all
+/// subclasses of [BaseClient] to be mutually composable.
+class Client extends BaseClient {
+  /// The underlying `dart:io` HTTP client.
+  HttpClient _inner;
+
+  /// Creates a new HTTP client.
+  Client() : _inner = new HttpClient();
+
+  /// Sends an HTTP request and asynchronously returns the response.
+  Future<StreamedResponse> send(BaseRequest request) {
+    var stream = request.finalize();
+
+    var completer = new Completer<StreamedResponse>();
+    var connection = _inner.openUrl(request.method, request.url);
+    connection.onError = (e) {
+      async.then((_) {
+        // TODO(nweiz): remove this when issue 4974 is fixed
+        if (completer.future.isComplete) throw e;
+
+        completer.completeException(e);
+      });
+    };
+
+    connection.onRequest = (underlyingRequest) {
+      underlyingRequest.contentLength = request.contentLength;
+      underlyingRequest.persistentConnection = request.persistentConnection;
+      request.headers.forEach((name, value) {
+        underlyingRequest.headers.set(name, value);
+      });
+
+      if (stream.closed) {
+        underlyingRequest.outputStream.close();
+      } else {
+        stream.pipe(underlyingRequest.outputStream);
+      }
+    };
+
+    connection.onResponse = (response) {
+      var headers = <String>{};
+      response.headers.forEach((key, value) => headers[key] = value);
+
+      completer.complete(new StreamedResponse(
+          response.inputStream,
+          response.statusCode,
+          response.contentLength,
+          headers: headers,
+          isRedirect: response.isRedirect,
+          persistentConnection: response.persistentConnection,
+          reasonPhrase: response.reasonPhrase));
+    };
+
+    return completer.future;
+  }
+
+  /// Closes the client. This terminates all active connections. If a client
+  /// remains unclosed, the Dart process may not terminate.
+  void close() {
+    if (_inner != null) _inner.shutdown();
+    _inner = null;
+  }
+}
diff --git a/pkg/http/lib/src/mock_client.dart b/pkg/http/lib/src/mock_client.dart
new file mode 100644
index 0000000..ce2916f
--- /dev/null
+++ b/pkg/http/lib/src/mock_client.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library mock_client;
+
+import 'dart:io';
+
+import 'base_client.dart';
+import 'base_request.dart';
+import 'request.dart';
+import 'response.dart';
+import 'streamed_response.dart';
+import 'utils.dart';
+
+// TODO(nweiz): once Dart has some sort of Rack- or WSGI-like standard for
+// server APIs, MockClient should conform to it.
+
+/// A mock HTTP client designed for use when testing code that uses
+/// [BaseClient]. This client allows you to define a handler callback for all
+/// requests that are made through it so that you can mock a server without
+/// having to send real HTTP requests.
+class MockClient extends BaseClient {
+  /// The handler for receiving [StreamedRequest]s and sending
+  /// [StreamedResponse]s.
+  final MockClientStreamHandler _handler;
+
+  /// Creates a [MockClient] with a handler that receives [Request]s and sends
+  /// [Response]s.
+  MockClient(MockClientHandler fn)
+    : this.streaming((baseRequest, bodyStream) {
+      return consumeInputStream(bodyStream).chain((bodyBytes) {
+        var request = new Request(baseRequest.method, baseRequest.url);
+        request.persistentConnection = baseRequest.persistentConnection;
+        request.followRedirects = baseRequest.followRedirects;
+        request.maxRedirects = baseRequest.maxRedirects;
+        mapAddAll(request.headers, baseRequest.headers);
+        request.bodyBytes = bodyBytes;
+        request.finalize();
+
+        return fn(request);
+      }).transform((response) {
+        var stream = new ListInputStream();
+        stream.write(response.bodyBytes);
+        stream.markEndOfStream();
+
+        return new StreamedResponse(
+            stream,
+            response.statusCode,
+            response.contentLength,
+            headers: response.headers,
+            isRedirect: response.isRedirect,
+            persistentConnection: response.persistentConnection,
+            reasonPhrase: response.reasonPhrase);
+      });
+    });
+
+  /// Creates a [MockClient] with a handler that receives [StreamedRequest]s and
+  /// sends [StreamedResponse]s.
+  MockClient.streaming(MockClientStreamHandler this._handler);
+
+  /// Sends a request.
+  Future<StreamedResponse> send(BaseRequest request) {
+    var bodyStream = request.finalize();
+    return async.chain((_) => _handler(request, bodyStream));
+  }
+}
+
+/// A handler function that receives [StreamedRequest]s and sends
+/// [StreamedResponse]s. Note that [request] will be finalized.
+typedef Future<StreamedResponse> MockClientStreamHandler(
+    BaseRequest request, InputStream bodyStream);
+
+/// A handler function that receives [Request]s and sends [Response]s. Note that
+/// [request] will be finalized.
+typedef Future<Response> MockClientHandler(Request request);
diff --git a/pkg/http/lib/src/multipart_file.dart b/pkg/http/lib/src/multipart_file.dart
new file mode 100644
index 0000000..9894b3d
--- /dev/null
+++ b/pkg/http/lib/src/multipart_file.dart
@@ -0,0 +1,105 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library multipart_file;
+
+import 'dart:io';
+
+import 'utils.dart';
+
+/// A file to be uploaded as part of a [MultipartRequest]. This doesn't need to
+/// correspond to a physical file.
+class MultipartFile {
+  /// The name of the form field for the file.
+  final String field;
+
+  /// The size of the file in bytes. This must be known in advance, even if this
+  /// file is created from an [InputStream].
+  final int length;
+
+  /// The basename of the file. May be null.
+  final String filename;
+
+  /// The content-type of the file. Defaults to `application/octet-stream`.
+  final ContentType contentType;
+
+  /// The stream that will emit the file's contents.
+  final InputStream _stream;
+
+  /// Whether [finalize] has been called.
+  bool get isFinalized => _isFinalized;
+  bool _isFinalized = false;
+
+  /// Creates a new [MultipartFile] from an [InputStream]. The length of the
+  /// file in bytes must be known in advance. If it's not, read the data from
+  /// the stream and use [MultipartFile.fromBytes] instead.
+  ///
+  /// [contentType] currently defaults to `application/octet-stream`, but in the
+  /// future may be inferred from [filename].
+  MultipartFile(this.field, this._stream, this.length,
+      {this.filename, ContentType contentType})
+    : this.contentType = contentType != null ? contentType :
+          new ContentType("application", "octet-stream");
+
+  /// Creates a new [MultipartFile] from a byte array.
+  ///
+  /// [contentType] currently defaults to `application/octet-stream`, but in the
+  /// future may be inferred from [filename].
+  factory MultipartFile.fromBytes(String field, List<int> value,
+      {String filename, ContentType contentType}) {
+    var stream = new ListInputStream();
+    stream.write(value);
+    stream.markEndOfStream();
+    return new MultipartFile(field, stream, value.length,
+        filename: filename,
+        contentType: contentType);
+  }
+
+  /// Creates a new [MultipartFile] from a string.
+  ///
+  /// The encoding to use when translating [value] into bytes is taken from
+  /// [contentType] if it has a charset set. Otherwise, it defaults to UTF-8.
+  /// [contentType] currently defaults to `text/plain; charset=utf-8`, but in
+  /// the future may be inferred from [filename].
+  factory MultipartFile.fromString(String field, String value,
+      {String filename, ContentType contentType}) {
+    contentType = contentType == null ? new ContentType("text", "plain") :
+        // Make a copy of the original contentType so we can modify charset.
+        new ContentType.fromString(contentType.toString());
+    var charset = contentType.charset;
+    var encoding = encodingForCharset(contentType.charset, Encoding.UTF_8);
+    contentType.charset = encoding.name;
+
+    return new MultipartFile.fromBytes(field, encodeString(value, encoding),
+        filename: filename,
+        contentType: contentType);
+  }
+
+  // TODO(nweiz): Infer the content-type from the filename.
+  /// Creates a new [MultipartFile] from a [File].
+  ///
+  /// [filename] defaults to the name of the file on disk. [contentType]
+  /// currently defaults to `application/octet-stream`, but in the future may be
+  /// inferred from [filename].
+  static Future<MultipartFile> fromFile(String field, File file,
+      {String filename, ContentType contentType}) {
+    if (filename == null) filename = new Path(file.name).filename;
+    return file.length().transform((length) {
+      return new MultipartFile(field, file.openInputStream(), length,
+          filename: filename,
+          contentType: contentType);
+    });
+  }
+
+  // Finalizes the file in preparation for it being sent as part of a
+  // [MultipartRequest]. This returns an [InputStream] that should emit the body
+  // of the file. The stream may be closed to indicate an empty file.
+  InputStream finalize() {
+    if (isFinalized) {
+      throw new StateError("Can't finalize a finalized MultipartFile.");
+    }
+    _isFinalized = true;
+    return _stream;
+  }
+}
diff --git a/pkg/http/lib/src/multipart_request.dart b/pkg/http/lib/src/multipart_request.dart
new file mode 100644
index 0000000..b523956
--- /dev/null
+++ b/pkg/http/lib/src/multipart_request.dart
@@ -0,0 +1,166 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library multipart_request;
+
+import 'dart:io';
+import 'dart:math';
+import 'dart:uri';
+import 'dart:utf';
+
+import 'base_request.dart';
+import 'multipart_file.dart';
+import 'utils.dart';
+
+/// A `multipart/form-data` request. Such a request has both string [fields],
+/// which function as normal form fields, and (potentially streamed) binary
+/// [files].
+///
+/// This request automatically sets the Content-Type header to
+/// `multipart/form-data` and the Content-Transfer-Encoding header to `binary`.
+/// These values will override any values set by the user.
+///
+///     var uri = new Uri.fromString("http://pub.dartlang.org/packages/create");
+///     var request = new http.MultipartRequest("POST", url);
+///     request.fields['user'] = 'nweiz@google.com';
+///     request.files.add(new http.MultipartFile.fromFile(
+///         'package',
+///         new File('build/package.tar.gz'),
+///         contentType: new ContentType('application', 'x-tar'));
+///     request.send().then((response) {
+///       if (response.statusCode == 200) print("Uploaded!");
+///     });
+class MultipartRequest extends BaseRequest {
+  /// The total length of the multipart boundaries used when building the
+  /// request body. According to http://tools.ietf.org/html/rfc1341.html, this
+  /// can't be longer than 70.
+  static final int _BOUNDARY_LENGTH = 70;
+
+  static final Random _random = new Random();
+
+  /// The total length of the request body, in bytes. This is calculated from
+  /// [fields] and [files] and cannot be set manually.
+  int get contentLength {
+    var length = 0;
+
+    fields.forEach((name, value) {
+      length += "--".length + _BOUNDARY_LENGTH + "\r\n".length +
+          _headerForField(name, value).length +
+          encodeUtf8(value).length + "\r\n".length;
+    });
+
+    for (var file in files) {
+      length += "--".length + _BOUNDARY_LENGTH + "\r\n".length +
+          _headerForFile(file).length +
+          file.length + "\r\n".length;
+    }
+
+    return length + "--".length + _BOUNDARY_LENGTH + "--\r\n".length;
+  }
+
+  set contentLength(int value) {
+    throw new UnsupportedError("Cannot set the contentLength property of "
+        "multipart requests.");
+  }
+
+  /// The form fields to send for this request.
+  final Map<String, String> fields;
+
+  /// The files to upload for this request.
+  final List<MultipartFile> files;
+
+  /// Creates a new [MultipartRequest].
+  MultipartRequest(String method, Uri url)
+    : super(method, url),
+      fields = <String>{},
+      files = <MultipartFile>[];
+
+  /// Freezes all mutable fields and returns an [InputStream] that will emit the
+  /// request body.
+  InputStream finalize() {
+    // TODO(nweiz): freeze fields and files
+    var boundary = _boundaryString(_BOUNDARY_LENGTH);
+    headers['content-type'] = 'multipart/form-data, boundary="$boundary"';
+    headers['content-transfer-encoding'] = 'binary';
+    super.finalize();
+
+    var stream = new ListInputStream();
+
+    void writeAscii(String string) {
+      assert(isPlainAscii(string));
+      stream.write(string.charCodes);
+    }
+
+    void writeUtf8(String string) => stream.write(encodeUtf8(string));
+    void writeLine() => stream.write([13, 10]); // \r\n
+
+    fields.forEach((name, value) {
+      writeAscii('--$boundary\r\n');
+      writeAscii(_headerForField(name, value));
+      writeUtf8(value);
+      writeLine();
+    });
+
+    forEachFuture(files, (file) {
+      writeAscii('--$boundary\r\n');
+      writeAscii(_headerForFile(file));
+      return writeInputToInput(file.finalize(), stream)
+        .transform((_) => writeLine());
+    }).then((_) {
+      // TODO(nweiz): pass any errors propagated through this future on to
+      // the stream. See issue 3657.
+      writeAscii('--$boundary--\r\n');
+      stream.markEndOfStream();
+    });
+
+    return stream;
+  }
+
+  /// All character codes that are valid in multipart boundaries. From
+  /// http://tools.ietf.org/html/rfc2046#section-5.1.1.
+  static final List<int> _BOUNDARY_CHARACTERS = const <int>[
+    39, 40, 41, 43, 95, 44, 45, 46, 47, 58, 61, 63, 48, 49, 50, 51, 52, 53, 54,
+    55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103,
+    104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
+    119, 120, 121, 122
+  ];
+
+  /// Returns the header string for a field. The return value is guaranteed to
+  /// contain only ASCII characters.
+  String _headerForField(String name, String value) {
+    // http://tools.ietf.org/html/rfc2388 mandates some complex encodings for
+    // field names and file names, but in practice user agents seem to just
+    // URL-encode them so we do the same.
+    var header = 'content-disposition: form-data; name="${encodeUri(name)}"';
+    if (!isPlainAscii(value)) {
+      header = '$header\r\ncontent-type: text/plain; charset=UTF-8';
+    }
+    return '$header\r\n\r\n';
+  }
+
+  /// Returns the header string for a file. The return value is guaranteed to
+  /// contain only ASCII characters.
+  String _headerForFile(MultipartFile file) {
+    var header = 'content-type: ${file.contentType}\r\n'
+      'content-disposition: form-data; name="${encodeUri(file.field)}"';
+
+    if (file.filename != null) {
+      header = '$header; filename="${encodeUri(file.filename)}"';
+    }
+    return '$header\r\n\r\n';
+  }
+
+  /// Returns a randomly-generated multipart boundary string of the given
+  /// [length].
+  String _boundaryString(int length) {
+    var prefix = "dart-http-boundary-";
+    var list = new List<int>(length - prefix.length);
+    for (var i = 0; i < list.length; i++) {
+      list[i] = _BOUNDARY_CHARACTERS[
+          _random.nextInt(_BOUNDARY_CHARACTERS.length)];
+    }
+    return "$prefix${new String.fromCharCodes(list)}";
+  }
+}
diff --git a/pkg/http/lib/src/request.dart b/pkg/http/lib/src/request.dart
new file mode 100644
index 0000000..574070a
--- /dev/null
+++ b/pkg/http/lib/src/request.dart
@@ -0,0 +1,162 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library request;
+
+import 'dart:io';
+import 'dart:scalarlist';
+import 'dart:uri';
+
+import 'base_request.dart';
+import 'utils.dart';
+
+/// An HTTP request where the entire request body is known in advance.
+class Request extends BaseRequest {
+  /// The size of the request body, in bytes. This is calculated from
+  /// [bodyBytes].
+  ///
+  /// The content length cannot be set for [Request], since it's automatically
+  /// calculated from [bodyBytes].
+  int get contentLength => bodyBytes.length;
+
+  set contentLength(int value) {
+    throw new UnsupportedError("Cannot set the contentLength property of "
+        "non-streaming Request objects.");
+  }
+
+  /// The default encoding to use when converting between [bodyBytes] and
+  /// [body]. This is only used if [encoding] hasn't been manually set and if
+  /// the content-type header has no encoding information.
+  Encoding _defaultEncoding;
+
+  /// The encoding used for the request. This encoding is used when converting
+  /// between [bodyBytes] and [body].
+  ///
+  /// If the request has a `Content-Type` header and that header has a `charset`
+  /// parameter, that parameter's value is used as the encoding. Otherwise, if
+  /// [encoding] has been set manually, that encoding is used. If that hasn't
+  /// been set either, this defaults to [Encoding.UTF_8].
+  ///
+  /// If the `charset` parameter's value is not a known [Encoding], reading this
+  /// will throw a [FormatException].
+  ///
+  /// If the request has a `Content-Type` header, setting this will set the
+  /// charset parameter on that header.
+  Encoding get encoding {
+    if (_contentType == null || _contentType.charset == null) {
+      return _defaultEncoding;
+    }
+    return requiredEncodingForCharset(_contentType.charset);
+  }
+
+  set encoding(Encoding value) {
+    _checkFinalized();
+    _defaultEncoding = value;
+    var contentType = _contentType;
+    if (contentType != null) {
+      contentType.charset = value.name;
+      _contentType = contentType;
+    }
+  }
+
+  // TODO(nweiz): make this return a read-only view
+  /// The bytes comprising the body of the request. This is converted to and
+  /// from [body] using [encoding].
+  ///
+  /// This list should only be set, not be modified in place.
+  Uint8List get bodyBytes => _bodyBytes;
+  Uint8List _bodyBytes;
+
+  set bodyBytes(List<int> value) {
+    _checkFinalized();
+    _bodyBytes = toUint8List(value);
+  }
+
+  /// The body of the request as a string. This is converted to and from
+  /// [bodyBytes] using [encoding].
+  ///
+  /// When this is set, if the request does not yet have a `Content-Type`
+  /// header, one will be added with the type `text/plain`. Then the `charset`
+  /// parameter of the `Content-Type` header (whether new or pre-existing) will
+  /// be set to [encoding] if it wasn't already set.
+  String get body => decodeString(bodyBytes, encoding);
+
+  set body(String value) {
+    bodyBytes = encodeString(value, encoding);
+    var contentType = _contentType;
+    if (contentType == null) contentType = new ContentType("text", "plain");
+    if (contentType.charset == null) contentType.charset = encoding.name;
+    _contentType = contentType;
+  }
+
+  /// The form-encoded fields in the body of the request as a map from field
+  /// names to values. The form-encoded body is converted to and from
+  /// [bodyBytes] using [encoding] (in the same way as [body]).
+  ///
+  /// If the request doesn't have a `Content-Type` header of
+  /// `application/x-www-form-urlencoded`, reading this will throw a
+  /// [StateError].
+  ///
+  /// If the request has a `Content-Type` header with a type other than
+  /// `application/x-www-form-urlencoded`, setting this will throw a
+  /// [StateError]. Otherwise, the content type will be set to
+  /// `application/x-www-form-urlencoded`.
+  ///
+  /// This map should only be set, not modified in place.
+  Map<String, String> get bodyFields {
+    if (_contentType == null ||
+        _contentType.value != "application/x-www-form-urlencoded") {
+      throw new StateError('Cannot access the body fields of a Request without '
+          'content-type "application/x-www-form-urlencoded".');
+    }
+
+    return queryToMap(body);
+  }
+
+  set bodyFields(Map<String, String> fields) {
+    if (_contentType == null) {
+      _contentType = new ContentType("application", "x-www-form-urlencoded");
+    } else if (_contentType.value != "application/x-www-form-urlencoded") {
+      throw new StateError('Cannot set the body fields of a Request with '
+          'content-type "${_contentType.value}".');
+    }
+
+    this.body = mapToQuery(fields);
+  }
+
+  /// Creates a new HTTP request.
+  Request(String method, Uri url)
+    : super(method, url),
+      _defaultEncoding = Encoding.UTF_8,
+      _bodyBytes = new Uint8List(0);
+
+  /// Freeze all mutable fields and return an [InputStream] containing the
+  /// request body.
+  InputStream finalize() {
+    super.finalize();
+
+    var stream = new ListInputStream();
+    stream.write(bodyBytes);
+    stream.markEndOfStream();
+    return stream;
+  }
+
+  /// The `Content-Type` header of the request (if it exists) as a
+  /// [ContentType].
+  ContentType get _contentType {
+    var contentType = headers[HttpHeaders.CONTENT_TYPE];
+    if (contentType == null) return null;
+    return new ContentType.fromString(contentType);
+  }
+
+  set _contentType(ContentType value) {
+    headers[HttpHeaders.CONTENT_TYPE] = value.toString();
+  }
+
+  /// Throw an error if this request has been finalized.
+  void _checkFinalized() {
+    if (!finalized) return;
+    throw new StateError("Can't modify a finalized Request.");
+  }
+}
diff --git a/pkg/http/lib/src/response.dart b/pkg/http/lib/src/response.dart
new file mode 100644
index 0000000..d3546fe
--- /dev/null
+++ b/pkg/http/lib/src/response.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library response;
+
+import 'dart:io';
+import 'dart:scalarlist';
+
+import 'base_response.dart';
+import 'streamed_response.dart';
+import 'utils.dart';
+
+/// An HTTP response where the entire response body is known in advance.
+class Response extends BaseResponse {
+  /// The bytes comprising the body of this response.
+  final Uint8List bodyBytes;
+
+  /// The body of the response as a string. This is converted from [bodyBytes]
+  /// using the `charset` parameter of the `Content-Type` header field, if
+  /// available. If it's unavailable or if the encoding name is unknown,
+  /// [Encoding.ISO_8859_1] is used by default, as per [RFC 2616][].
+  ///
+  /// [RFC 2616]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html
+  String get body => decodeString(bodyBytes, _encodingForHeaders(headers));
+
+  /// Creates a new HTTP response with a string body.
+  Response(
+      String body,
+      int statusCode,
+      {Map<String, String> headers: const <String>{},
+       bool isRedirect: false,
+       bool persistentConnection: true,
+       String reasonPhrase})
+    : this.bytes(
+        encodeString(body, _encodingForHeaders(headers)),
+        statusCode,
+        headers: headers,
+        isRedirect: isRedirect,
+        persistentConnection: persistentConnection,
+        reasonPhrase: reasonPhrase);
+
+  /// Create a new HTTP response with a byte array body.
+  Response.bytes(
+      List<int> bodyBytes,
+      int statusCode,
+      {Map<String, String> headers: const <String>{},
+       bool isRedirect: false,
+       bool persistentConnection: true,
+       String reasonPhrase})
+    : bodyBytes = toUint8List(bodyBytes),
+      super(
+        statusCode,
+        bodyBytes.length,
+        headers: headers,
+        isRedirect: isRedirect,
+        persistentConnection: persistentConnection,
+        reasonPhrase: reasonPhrase);
+
+  /// Creates a new HTTP response by waiting for the full body to become
+  /// available from a [StreamedResponse].
+  static Future<Response> fromStream(StreamedResponse response) {
+    return consumeInputStream(response.stream).transform((body) {
+      return new Response.bytes(
+          body,
+          response.statusCode,
+          headers: response.headers,
+          isRedirect: response.isRedirect,
+          persistentConnection: response.persistentConnection,
+          reasonPhrase: response.reasonPhrase);
+    });
+  }
+}
+
+/// Returns the encoding to use for a response with the given headers. This
+/// defaults to [Encoding.ISO_8859_1] if the headers don't specify a charset or
+/// if that charset is unknown.
+Encoding _encodingForHeaders(Map<String, String> headers) =>
+  encodingForCharset(_contentTypeForHeaders(headers).charset);
+
+/// Returns the [ContentType] object for the given headers. Defaults to
+/// `application/octet-stream`.
+ContentType _contentTypeForHeaders(Map<String, String> headers) {
+  var contentType = headers[HttpHeaders.CONTENT_TYPE];
+  if (contentType != null) return new ContentType.fromString(contentType);
+  return new ContentType("application", "octet-stream");
+}
diff --git a/pkg/http/lib/src/streamed_request.dart b/pkg/http/lib/src/streamed_request.dart
new file mode 100644
index 0000000..3570541
--- /dev/null
+++ b/pkg/http/lib/src/streamed_request.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library streamed_request;
+
+import 'dart:io';
+import 'dart:uri';
+
+import 'base_request.dart';
+
+/// An HTTP request where the request body is sent asynchronously after the
+/// connection has been established and the headers have been sent.
+///
+/// When the request is sent via [BaseClient.send], only the headers and
+/// whatever data has already been written to [StreamedRequest.stream] will be
+/// sent immediately. More data will be sent as soon as it's written to
+/// [StreamedRequest.stream], and when the stream is closed the request will
+/// end.
+class StreamedRequest extends BaseRequest {
+  /// The stream to which to write data that will be sent as the request body.
+  /// This may be safely written to before the request is sent; the data will be
+  /// buffered.
+  ///
+  /// Closing this signals the end of the request.
+  final OutputStream stream;
+
+  /// The stream from which the [BaseClient] will read the data in [stream] once
+  /// the request has been finalized.
+  final ListInputStream _inputStream;
+
+  /// Creates a new streaming request.
+  StreamedRequest(String method, Uri url)
+    : super(method, url),
+      stream = new ListOutputStream(),
+      _inputStream = new ListInputStream() {
+    // TODO(nweiz): pipe errors from the output stream to the input stream once
+    // issue 3657 is fixed
+    stream.onData = () => _inputStream.write(stream.read());
+    stream.onClosed = _inputStream.markEndOfStream;
+  }
+
+  /// Freezes all mutable fields other than [stream] and returns an [InputStream]
+  /// that emits the data being written to [stream].
+  InputStream finalize() {
+    super.finalize();
+    return _inputStream;
+  }
+}
diff --git a/pkg/http/lib/src/streamed_response.dart b/pkg/http/lib/src/streamed_response.dart
new file mode 100644
index 0000000..8810df7
--- /dev/null
+++ b/pkg/http/lib/src/streamed_response.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library streamed_response;
+
+import 'dart:io';
+
+import 'base_response.dart';
+
+/// An HTTP response where the response body is received asynchronously after
+/// the headers have been received.
+class StreamedResponse extends BaseResponse {
+  /// The stream from which the response body data can be read.
+  final InputStream stream;
+
+  /// Creates a new streaming response.
+  StreamedResponse(
+      this.stream,
+      int statusCode,
+      int contentLength,
+      {Map<String, String> headers: const <String>{},
+       bool isRedirect: false,
+       bool persistentConnection: true,
+       String reasonPhrase})
+    : super(
+        statusCode,
+        contentLength,
+        headers: headers,
+        isRedirect: isRedirect,
+        persistentConnection: persistentConnection,
+        reasonPhrase: reasonPhrase);
+}
diff --git a/pkg/http/lib/src/utils.dart b/pkg/http/lib/src/utils.dart
new file mode 100644
index 0000000..02a0f7e
--- /dev/null
+++ b/pkg/http/lib/src/utils.dart
@@ -0,0 +1,185 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utils;
+
+import 'dart:crypto';
+import 'dart:io';
+import 'dart:isolate';
+import 'dart:scalarlist';
+import 'dart:uri';
+import 'dart:utf';
+
+/// Converts a URL query string (or `application/x-www-form-urlencoded` body)
+/// into a [Map] from parameter names to values.
+///
+///     queryToMap("foo=bar&baz=bang&qux");
+///     //=> {"foo": "bar", "baz": "bang", "qux": ""}
+Map<String, String> queryToMap(String queryList) {
+  var map = <String>{};
+  for (var pair in queryList.split("&")) {
+    var split = split1(pair, "=");
+    if (split.isEmpty) continue;
+    var key = urlDecode(split[0]);
+    var value = urlDecode(split.length > 1 ? split[1] : "");
+    map[key] = value;
+  }
+  return map;
+}
+
+/// Converts a [Map] from parameter names to values to a URL query string.
+///
+///     mapToQuery({"foo": "bar", "baz": "bang"});
+///     //=> "foo=bar&baz=bang"
+String mapToQuery(Map<String, String> map) {
+  var pairs = <List<String>>[];
+  map.forEach((key, value) =>
+      pairs.add([encodeUriComponent(key), encodeUriComponent(value)]));
+  return Strings.join(pairs.map((pair) => "${pair[0]}=${pair[1]}"), "&");
+}
+
+/// Adds all key/value pairs from [source] to [destination], overwriting any
+/// pre-existing values.
+///
+///     var a = {"foo": "bar", "baz": "bang"};
+///     mapAddAll(a, {"baz": "zap", "qux": "quux"});
+///     a; //=> {"foo": "bar", "baz": "zap", "qux": "quux"}
+void mapAddAll(Map destination, Map source) =>
+  source.forEach((key, value) => destination[key] = value);
+
+/// Decodes a URL-encoded string. Unlike [decodeUriComponent], this includes
+/// replacing `+` with ` `.
+String urlDecode(String encoded) =>
+  decodeUriComponent(encoded.replaceAll("+", " "));
+
+/// Like [String.split], but only splits on the first occurrence of the pattern.
+/// This will always return an array of two elements or fewer.
+///
+///     split1("foo,bar,baz", ","); //=> ["foo", "bar,baz"]
+///     split1("foo", ","); //=> ["foo"]
+///     split1("", ","); //=> []
+List<String> split1(String toSplit, String pattern) {
+  if (toSplit.isEmpty) return <String>[];
+
+  var index = toSplit.indexOf(pattern);
+  if (index == -1) return [toSplit];
+  return [
+    toSplit.substring(0, index),
+    toSplit.substring(index + pattern.length)
+  ];
+}
+
+/// Returns the [Encoding] that corresponds to [charset]. Returns [fallback] if
+/// [charset] is null or if no [Encoding] was found that corresponds to
+/// [charset].
+Encoding encodingForCharset(
+    String charset, [Encoding fallback = Encoding.ISO_8859_1]) {
+  if (charset == null) return fallback;
+  var encoding = _encodingForCharset(charset);
+  return encoding == null ? fallback : encoding;
+}
+
+/// Returns the [Encoding] that corresponds to [charset]. Throws a
+/// [FormatException] if no [Encoding] was found that corresponds to [charset].
+/// [charset] may not be null.
+Encoding requiredEncodingForCharset(String charset) {
+  var encoding = _encodingForCharset(charset);
+  if (encoding != null) return encoding;
+  throw new FormatException('Unsupported encoding "$charset".');
+}
+
+/// Returns the [Encoding] that corresponds to [charset]. Returns null if no
+/// [Encoding] was found that corresponds to [charset]. [charset] may not be
+/// null.
+Encoding _encodingForCharset(String charset) {
+  charset = charset.toLowerCase();
+  if (charset == 'ascii' || charset == 'us-ascii') return Encoding.ASCII;
+  if (charset == 'utf-8') return Encoding.UTF_8;
+  if (charset == 'iso-8859-1') return Encoding.ISO_8859_1;
+  return null;
+}
+
+/// Converts [bytes] into a [String] according to [encoding].
+String decodeString(List<int> bytes, Encoding encoding) {
+  // TODO(nweiz): implement this once issue 6284 is fixed.
+  return new String.fromCharCodes(bytes);
+}
+
+/// Converts [string] into a byte array according to [encoding].
+List<int> encodeString(String string, Encoding encoding) {
+  // TODO(nweiz): implement this once issue 6284 is fixed.
+  return string.charCodes;
+}
+
+/// A regular expression that matches strings that are composed entirely of
+/// ASCII-compatible characters.
+final RegExp _ASCII_ONLY = const RegExp(r"^[\x00-\x7F]+$");
+
+/// Returns whether [string] is composed entirely of ASCII-compatible
+/// characters.
+bool isPlainAscii(String string) => _ASCII_ONLY.hasMatch(string);
+
+/// Converts [input] into a [Uint8List]. If [input] is a [ByteArray] or
+/// [ByteArrayViewable], this just returns a view on [input].
+Uint8List toUint8List(List<int> input) {
+  if (input is Uint8List) return input;
+  if (input is ByteArrayViewable) input = input.asByteArray();
+  if (input is ByteArray) return new Uint8List.view(input);
+  var output = new Uint8List(input.length);
+  output.setRange(0, input.length, input);
+  return output;
+}
+
+/// Buffers all input from an InputStream and returns it as a future.
+Future<List<int>> consumeInputStream(InputStream stream) {
+  var completer = new Completer<List<int>>();
+  /// TODO(nweiz): use BufferList when issue 6409 is fixed
+  var buffer = <int>[];
+  stream.onClosed = () => completer.complete(buffer);
+  stream.onData = () => buffer.addAll(stream.read());
+  stream.onError = completer.completeException;
+  return completer.future;
+}
+
+/// Takes all input from [source] and writes it to [sink], then closes [sink].
+void pipeInputToInput(InputStream source, ListInputStream sink) {
+  source.onClosed = () => sink.markEndOfStream();
+  source.onData = () => sink.write(source.read());
+  // TODO(nweiz): propagate source errors to the sink. See issue 3657.
+}
+
+/// Takes all input from [source] and writes it to [sink], but does not close
+/// [sink] when [source] is closed. Returns a [Future] that completes when
+/// [source] is closed.
+Future writeInputToInput(InputStream source, ListInputStream sink) {
+  var completer = new Completer();
+  source.onClosed = () => completer.complete(null);
+  source.onData = () => sink.write(source.read());
+  // TODO(nweiz): propagate source errors to the sink. See issue 3657.
+  return completer.future;
+}
+
+/// Returns a [Future] that asynchronously completes to `null`.
+Future get async {
+  var completer = new Completer();
+  new Timer(0, (_) => completer.complete(null));
+  return completer.future;
+}
+
+// TOOD(nweiz): Get rid of this once https://codereview.chromium.org/11293132/
+// is in.
+/// Runs [fn] for each element in [input] in order, moving to the next element
+/// only when the [Future] returned by [fn] completes. Returns a [Future] that
+/// completes when all elements have been processed.
+///
+/// The return values of all [Future]s are discarded. Any errors will cause the
+/// iteration to stop and will be piped through the return value.
+Future forEachFuture(Iterable input, Future fn(element)) {
+  var iterator = input.iterator();
+  Future nextElement(_) {
+    if (!iterator.hasNext) return new Future.immediate(null);
+    return fn(iterator.next()).chain(nextElement);
+  }
+  return nextElement(null);
+}
diff --git a/pkg/http/lib/testing.dart b/pkg/http/lib/testing.dart
new file mode 100644
index 0000000..2d9ccaf
--- /dev/null
+++ b/pkg/http/lib/testing.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library testing;
+
+/// This library contains testing classes for the HTTP library.
+///
+/// The [MockClient] class is a drop-in replacement for `http.Client` that
+/// allows test code to set up a local request handler in order to fake a server
+/// that responds to HTTP requests:
+///
+///     import 'dart:json';
+///     import 'package:http/testing.dart';
+///
+///     var client = new MockClient((request) {
+///       if (request.url.path != "/data.json") {
+///         return new Response("", 404);
+///       }
+///       return new Response(JSON.stringify({
+///         'numbers': [1, 4, 15, 19, 214]
+///       }, 200, headers: {
+///         'content-type': 'application/json'
+///       });
+///     };
+
+export 'src/mock_client.dart';
diff --git a/pkg/http/pubspec.yaml b/pkg/http/pubspec.yaml
new file mode 100644
index 0000000..9978dd4
--- /dev/null
+++ b/pkg/http/pubspec.yaml
@@ -0,0 +1,5 @@
+name: http
+description: A composable, Future-based API for making HTTP requests.
+dependencies:
+  unittest:
+    sdk: unittest
diff --git a/pkg/http/test/client_test.dart b/pkg/http/test/client_test.dart
new file mode 100644
index 0000000..e7c3501
--- /dev/null
+++ b/pkg/http/test/client_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library client_test;
+
+import 'dart:io';
+
+import '../../unittest/lib/unittest.dart';
+import '../lib/http.dart' as http;
+import '../lib/src/utils.dart';
+import 'utils.dart';
+
+void main() {
+  setUp(startServer);
+  tearDown(stopServer);
+
+  test('#send a StreamedRequest', () {
+    var client = new http.Client();
+    var request = new http.StreamedRequest("POST", serverUrl);
+    request.headers[HttpHeaders.CONTENT_TYPE] =
+      'application/json; charset=utf-8';
+
+    var future = client.send(request).chain((response) {
+      expect(response.statusCode, equals(200));
+      return consumeInputStream(response.stream);
+    }).transform((bytes) => new String.fromCharCodes(bytes));
+    future.onComplete((_) => client.close());
+
+    expect(future, completion(parse(equals({
+      'method': 'POST',
+      'path': '/',
+      'headers': {
+        'content-type': ['application/json; charset=utf-8'],
+        'transfer-encoding': ['chunked']
+      },
+      'body': '{"hello": "world"}'
+    }))));
+
+    request.stream.writeString('{"hello": "world"}');
+    request.stream.close();
+  });
+}
diff --git a/pkg/http/test/http_test.dart b/pkg/http/test/http_test.dart
new file mode 100644
index 0000000..9085171
--- /dev/null
+++ b/pkg/http/test/http_test.dart
@@ -0,0 +1,185 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_test;
+
+import 'dart:io';
+
+import '../../unittest/lib/unittest.dart';
+import '../lib/http.dart' as http;
+import 'utils.dart';
+
+main() {
+  group('http.', () {
+    setUp(startServer);
+    tearDown(stopServer);
+
+    test('head', () {
+      expect(http.head(serverUrl).transform((response) {
+        expect(response.statusCode, equals(200));
+        expect(response.body, equals(''));
+      }), completes);
+    });
+
+    test('get', () {
+      expect(http.get(serverUrl, headers: {
+        'X-Random-Header': 'Value',
+        'X-Other-Header': 'Other Value'
+      }).transform((response) {
+        expect(response.statusCode, equals(200));
+        expect(response.body, parse(equals({
+          'method': 'GET',
+          'path': '/',
+          'headers': {
+            'x-random-header': ['Value'],
+            'x-other-header': ['Other Value']
+          },
+        })));
+      }), completes);
+    });
+
+    test('post', () {
+      expect(http.post(serverUrl, headers: {
+        'X-Random-Header': 'Value',
+        'X-Other-Header': 'Other Value'
+      }, fields: {
+        'some-field': 'value',
+        'other-field': 'other value'
+      }).transform((response) {
+        expect(response.statusCode, equals(200));
+        expect(response.body, parse(equals({
+          'method': 'POST',
+          'path': '/',
+          'headers': {
+            'content-type': [
+              'application/x-www-form-urlencoded; charset=UTF-8'
+            ],
+            'content-length': ['42'],
+            'x-random-header': ['Value'],
+            'x-other-header': ['Other Value']
+          },
+          'body': 'some-field=value&other-field=other%20value'
+        })));
+      }), completes);
+    });
+
+    test('post without fields', () {
+      expect(http.post(serverUrl, headers: {
+        'X-Random-Header': 'Value',
+        'X-Other-Header': 'Other Value',
+        'Content-Type': 'text/plain'
+      }).transform((response) {
+        expect(response.statusCode, equals(200));
+        expect(response.body, parse(equals({
+          'method': 'POST',
+          'path': '/',
+          'headers': {
+            'content-type': ['text/plain'],
+            'x-random-header': ['Value'],
+            'x-other-header': ['Other Value']
+          }
+        })));
+      }), completes);
+    });
+
+    test('put', () {
+      expect(http.put(serverUrl, headers: {
+        'X-Random-Header': 'Value',
+        'X-Other-Header': 'Other Value'
+      }, fields: {
+        'some-field': 'value',
+        'other-field': 'other value'
+      }).transform((response) {
+        expect(response.statusCode, equals(200));
+        expect(response.body, parse(equals({
+          'method': 'PUT',
+          'path': '/',
+          'headers': {
+            'content-type': [
+              'application/x-www-form-urlencoded; charset=UTF-8'
+            ],
+            'content-length': ['42'],
+            'x-random-header': ['Value'],
+            'x-other-header': ['Other Value']
+          },
+          'body': 'some-field=value&other-field=other%20value'
+        })));
+      }), completes);
+    });
+
+    test('put without fields', () {
+      expect(http.put(serverUrl, headers: {
+        'X-Random-Header': 'Value',
+        'X-Other-Header': 'Other Value',
+        'Content-Type': 'text/plain'
+      }).transform((response) {
+        expect(response.statusCode, equals(200));
+        expect(response.body, parse(equals({
+          'method': 'PUT',
+          'path': '/',
+          'headers': {
+            'content-type': ['text/plain'],
+            'x-random-header': ['Value'],
+            'x-other-header': ['Other Value']
+          }
+        })));
+      }), completes);
+    });
+
+    test('delete', () {
+      expect(http.delete(serverUrl, headers: {
+        'X-Random-Header': 'Value',
+        'X-Other-Header': 'Other Value'
+      }).transform((response) {
+        expect(response.statusCode, equals(200));
+        expect(response.body, parse(equals({
+          'method': 'DELETE',
+          'path': '/',
+          'headers': {
+            'x-random-header': ['Value'],
+            'x-other-header': ['Other Value']
+          }
+        })));
+      }), completes);
+    });
+
+    test('read', () {
+      expect(http.read(serverUrl, headers: {
+        'X-Random-Header': 'Value',
+        'X-Other-Header': 'Other Value'
+      }), completion(parse(equals({
+        'method': 'GET',
+        'path': '/',
+        'headers': {
+          'x-random-header': ['Value'],
+          'x-other-header': ['Other Value']
+        },
+      }))));
+    });
+
+    test('read throws an error for a 4** status code', () {
+      expect(http.read(serverUrl.resolve('/error')), throwsHttpException);
+    });
+
+    test('readBytes', () {
+      var future = http.readBytes(serverUrl, headers: {
+        'X-Random-Header': 'Value',
+        'X-Other-Header': 'Other Value'
+      }).transform((bytes) => new String.fromCharCodes(bytes));
+
+      expect(future, completion(parse(equals({
+        'method': 'GET',
+        'path': '/',
+        'headers': {
+          'x-random-header': ['Value'],
+          'x-other-header': ['Other Value']
+        },
+      }))));
+    });
+
+    test('readBytes throws an error for a 4** status code', () {
+      expect(http.readBytes(serverUrl.resolve('/error')), throwsHttpException);
+    });
+  });
+}
diff --git a/pkg/http/test/mock_client_test.dart b/pkg/http/test/mock_client_test.dart
new file mode 100644
index 0000000..2425467
--- /dev/null
+++ b/pkg/http/test/mock_client_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library mock_client_test;
+
+import 'dart:io';
+import 'dart:json';
+import 'dart:uri';
+
+// TODO(nweiz): make these "package:" imports.
+import '../../unittest/lib/unittest.dart';
+import '../lib/http.dart' as http;
+import '../lib/testing.dart';
+import '../lib/src/utils.dart';
+import 'utils.dart';
+
+void main() {
+  test('handles a request', () {
+    var client = new MockClient((request) {
+      return new Future.immediate(new http.Response(
+          JSON.stringify(request.bodyFields), 200,
+          headers: {'content-type': 'application/json'}));
+    });
+
+    expect(client.post("http://example.com/foo", fields: {
+      'field1': 'value1',
+      'field2': 'value2'
+    }).transform((response) => response.body), completion(parse(equals({
+      'field1': 'value1',
+      'field2': 'value2'
+    }))));
+  });
+
+  test('handles a streamed request', () {
+    var client = new MockClient.streaming((request, bodyStream) {
+      return consumeInputStream(bodyStream).transform((body) {
+        var stream = new ListInputStream();
+        async.then((_) {
+          var bodyString = new String.fromCharCodes(body);
+          stream.write('Request body was "$bodyString"'.charCodes);
+          stream.markEndOfStream();
+        });
+
+        return new http.StreamedResponse(stream, 200, -1);
+      });
+    });
+
+    var uri = new Uri.fromString("http://example.com/foo");
+    var request = new http.Request("POST", uri);
+    request.body = "hello, world";
+    var future = client.send(request)
+        .chain(http.Response.fromStream)
+        .transform((response) => response.body);
+    expect(future, completion(equals('Request body was "hello, world"')));
+  });
+}
diff --git a/pkg/http/test/multipart_test.dart b/pkg/http/test/multipart_test.dart
new file mode 100644
index 0000000..136dfa0
--- /dev/null
+++ b/pkg/http/test/multipart_test.dart
@@ -0,0 +1,206 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library multipart_test;
+
+import 'dart:io';
+import 'dart:utf';
+
+// TODO(nweiz): get rid of this import before packaging this
+import '../../../tests/utils/test_utils.dart';
+// TODO(nweiz): make these package: imports
+import '../../unittest/lib/unittest.dart';
+import '../lib/http.dart' as http;
+import '../lib/src/utils.dart';
+
+import 'utils.dart';
+
+/// A matcher that validates the body of a multipart request after finalization.
+/// The string "{{boundary}}" in [pattern] will be replaced by the boundary
+/// string for the request, and LF newlines will be replaced with CRLF.
+/// Indentation will be normalized.
+Matcher bodyMatches(String pattern) => new _BodyMatches(pattern);
+
+class _BodyMatches extends BaseMatcher {
+  final String _pattern;
+
+  _BodyMatches(this._pattern);
+
+  bool matches(item, MatchState matchState) {
+    if (item is! http.MultipartRequest) return false;
+
+    var future = consumeInputStream(item.finalize()).transform((bodyBytes) {
+      var body = decodeUtf8(bodyBytes);
+      var contentType = new ContentType.fromString(
+          item.headers['content-type']);
+      var boundary = contentType.parameters['boundary'];
+      var expected = cleanUpLiteral(_pattern)
+          .replaceAll("\n", "\r\n")
+          .replaceAll("{{boundary}}", boundary);
+
+      expect(body, equals(expected));
+      expect(item.contentLength, equals(bodyBytes.length));
+    });
+
+    return completes.matches(future, matchState);
+  }
+
+  Description describe(Description description) {
+    return description.add('has a body that matches "$_pattern"');
+  }
+}
+
+void main() {
+  test('empty', () {
+    var request = new http.MultipartRequest('POST', dummyUrl);
+    expect(request, bodyMatches('''
+        --{{boundary}}--
+        '''));
+  });
+
+  test('with fields and files', () {
+    var request = new http.MultipartRequest('POST', dummyUrl);
+    request.fields['field1'] = 'value1';
+    request.fields['field2'] = 'value2';
+    request.files.add(new http.MultipartFile.fromString("file1", "contents1",
+        filename: "filename1.txt"));
+    request.files.add(new http.MultipartFile.fromString("file2", "contents2"));
+
+    expect(request, bodyMatches('''
+        --{{boundary}}
+        content-disposition: form-data; name="field1"
+
+        value1
+        --{{boundary}}
+        content-disposition: form-data; name="field2"
+
+        value2
+        --{{boundary}}
+        content-type: text/plain; charset=UTF-8
+        content-disposition: form-data; name="file1"; filename="filename1.txt"
+
+        contents1
+        --{{boundary}}
+        content-type: text/plain; charset=UTF-8
+        content-disposition: form-data; name="file2"
+
+        contents2
+        --{{boundary}}--
+        '''));
+  });
+
+  test('with a unicode field name', () {
+    var request = new http.MultipartRequest('POST', dummyUrl);
+    request.fields['fïēld'] = 'value';
+
+    expect(request, bodyMatches('''
+        --{{boundary}}
+        content-disposition: form-data; name="f%C3%AF%C4%93ld"
+
+        value
+        --{{boundary}}--
+        '''));
+  });
+
+  test('with a unicode field value', () {
+    var request = new http.MultipartRequest('POST', dummyUrl);
+    request.fields['field'] = 'vⱥlūe';
+
+    expect(request, bodyMatches('''
+        --{{boundary}}
+        content-disposition: form-data; name="field"
+        content-type: text/plain; charset=UTF-8
+
+        vⱥlūe
+        --{{boundary}}--
+        '''));
+  });
+
+  test('with a unicode filename', () {
+    var request = new http.MultipartRequest('POST', dummyUrl);
+    request.files.add(new http.MultipartFile.fromString('file', 'contents',
+        filename: 'fïlēname.txt'));
+
+    expect(request, bodyMatches('''
+        --{{boundary}}
+        content-type: text/plain; charset=UTF-8
+        content-disposition: form-data; name="file"; filename="f%C3%AFl%C4%93name.txt"
+
+        contents
+        --{{boundary}}--
+        '''));
+  });
+
+  test('with a string file with a content-type but no charset', () {
+    var request = new http.MultipartRequest('POST', dummyUrl);
+    var file = new http.MultipartFile.fromString('file', '{"hello": "world"}',
+        contentType: new ContentType('application', 'json'));
+    request.files.add(file);
+
+    expect(request, bodyMatches('''
+        --{{boundary}}
+        content-type: application/json; charset=UTF-8
+        content-disposition: form-data; name="file"
+
+        {"hello": "world"}
+        --{{boundary}}--
+        '''));
+  });
+
+  // TODO(nweiz): test creating a multipart file with a charset other than UTF-8
+  // once issue 6284 is fixed.
+
+  // TODO(nweiz): test creating a string with a unicode body once issue 6284 is
+  // fixed.
+
+  test('with a stream file', () {
+    var request = new http.MultipartRequest('POST', dummyUrl);
+    var stream = new ListInputStream();
+    request.files.add(new http.MultipartFile('file', stream, 5));
+
+    expect(request, bodyMatches('''
+        --{{boundary}}
+        content-type: application/octet-stream
+        content-disposition: form-data; name="file"
+
+        hello
+        --{{boundary}}--
+        '''));
+
+    stream.write([104, 101, 108, 108, 111]);
+    stream.markEndOfStream();
+  });
+
+  test('with an empty stream file', () {
+    var request = new http.MultipartRequest('POST', dummyUrl);
+    var stream = new ListInputStream();
+    stream.markEndOfStream();
+    request.files.add(new http.MultipartFile('file', stream, 0));
+
+    expect(request, bodyMatches('''
+        --{{boundary}}
+        content-type: application/octet-stream
+        content-disposition: form-data; name="file"
+
+        
+        --{{boundary}}--
+        '''));
+  });
+
+  test('with a byte file', () {
+    var request = new http.MultipartRequest('POST', dummyUrl);
+    var file = new http.MultipartFile.fromBytes(
+        'file', [104, 101, 108, 108, 111]);
+    request.files.add(file);
+
+    expect(request, bodyMatches('''
+        --{{boundary}}
+        content-type: application/octet-stream
+        content-disposition: form-data; name="file"
+
+        hello
+        --{{boundary}}--
+        '''));
+  });
+}
diff --git a/pkg/http/test/request_test.dart b/pkg/http/test/request_test.dart
new file mode 100644
index 0000000..5c2d98c
--- /dev/null
+++ b/pkg/http/test/request_test.dart
@@ -0,0 +1,352 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library request_test;
+
+import 'dart:io';
+
+import '../../unittest/lib/unittest.dart';
+import '../lib/http.dart' as http;
+import '../lib/src/utils.dart';
+import 'utils.dart';
+
+void main() {
+  test('.send', () {
+    print("This test is known to be flaky, please ignore "
+          "(debug prints below added by sgjesse@)");
+    print(".send test starting server...");
+    startServer();
+    print(".send test server running");
+
+    var request = new http.Request('POST', serverUrl);
+    request.body = "hello";
+    var future = request.send().chain((response) {
+      print(".send test response received");
+      expect(response.statusCode, equals(200));
+      return consumeInputStream(response.stream);
+    }).transform((bytes) => new String.fromCharCodes(bytes));
+    future.onComplete((_) {
+      print(".send test stopping server...");
+      stopServer();
+      print(".send test server stopped");
+    });
+
+    expect(future, completion(parse(equals({
+      'method': 'POST',
+      'path': '/',
+      'headers': {
+        'content-type': ['text/plain; charset=UTF-8'],
+        'content-length': ['5']
+      },
+      'body': 'hello'
+    }))));
+    print(".send test started");
+  });
+
+  group('#contentLength', () {
+    test('is computed from bodyBytes', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.bodyBytes = [1, 2, 3, 4, 5];
+      expect(request.contentLength, equals(5));
+      request.bodyBytes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+      expect(request.contentLength, equals(10));
+    });
+
+    test('is computed from body', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.body = "hello";
+      expect(request.contentLength, equals(5));
+      request.body = "hello, world";
+      expect(request.contentLength, equals(12));
+    });
+
+    test('is not directly mutable', () {
+      var request = new http.Request('POST', dummyUrl);
+      expect(() => request.contentLength = 50, throwsUnsupportedError);
+    });
+  });
+
+  group('#encoding', () {
+    test('defaults to utf-8', () {
+      var request = new http.Request('POST', dummyUrl);
+      expect(request.encoding.name, equals(Encoding.UTF_8.name));
+    });
+
+    test('can be set', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.encoding = Encoding.ISO_8859_1;
+      expect(request.encoding.name, equals(Encoding.ISO_8859_1.name));
+    });
+
+    test('is based on the content-type charset if it exists', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.headers[HttpHeaders.CONTENT_TYPE] =
+          'text/plain; charset=iso-8859-1';
+      expect(request.encoding.name, equals(Encoding.ISO_8859_1.name));
+    });
+
+    test('remains the default if the content-type charset is set and unset',
+        () {
+      var request = new http.Request('POST', dummyUrl);
+      request.encoding = Encoding.ISO_8859_1;
+      request.headers[HttpHeaders.CONTENT_TYPE] =
+          'text/plain; charset=utf-8';
+      expect(request.encoding.name, equals(Encoding.UTF_8.name));
+
+      request.headers.remove(HttpHeaders.CONTENT_TYPE);
+      expect(request.encoding.name, equals(Encoding.ISO_8859_1.name));
+    });
+
+    test('throws an error if the content-type charset is unknown', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.headers[HttpHeaders.CONTENT_TYPE] =
+          'text/plain; charset=not-a-real-charset';
+      expect(() => request.encoding, throwsFormatException);
+    });
+  });
+
+  group('#bodyBytes', () {
+    test('defaults to empty', () {
+      var request = new http.Request('POST', dummyUrl);
+      expect(request.bodyBytes, isEmpty);
+    });
+
+    test('can be set', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.bodyBytes = [104, 101, 108, 108, 111];
+      expect(request.bodyBytes, equals([104, 101, 108, 108, 111]));
+    });
+
+    test('changes when body changes', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.body = "hello";
+      expect(request.bodyBytes, equals([104, 101, 108, 108, 111]));
+    });
+  });
+
+  group('#body', () {
+    test('defaults to empty', () {
+      var request = new http.Request('POST', dummyUrl);
+      expect(request.body, isEmpty);
+    });
+
+    test('can be set', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.body = "hello";
+      expect(request.body, equals("hello"));
+    });
+
+    test('changes when bodyBytes changes', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.bodyBytes = [104, 101, 108, 108, 111];
+      expect(request.body, equals("hello"));
+    });
+
+    // TODO(nweiz): test that both the getter and the setter respect #encoding
+    // when issue 6284 is fixed.
+  });
+
+  group('#bodyFields', () {
+    test("can't be read without setting the content-type", () {
+      var request = new http.Request('POST', dummyUrl);
+      expect(() => request.bodyFields, throwsStateError);
+    });
+
+    test("can't be read with the wrong content-type", () {
+      var request = new http.Request('POST', dummyUrl);
+      request.headers[HttpHeaders.CONTENT_TYPE] = 'text/plain';
+      expect(() => request.bodyFields, throwsStateError);
+    });
+
+    test("can't be set with the wrong content-type", () {
+      var request = new http.Request('POST', dummyUrl);
+      request.headers[HttpHeaders.CONTENT_TYPE] = 'text/plain';
+      expect(() => request.bodyFields = {}, throwsStateError);
+    });
+
+    test('defaults to empty', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.headers[HttpHeaders.CONTENT_TYPE] =
+          'application/x-www-form-urlencoded';
+      expect(request.bodyFields, isEmpty);
+    });
+
+    test('can be set with no content-type', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.bodyFields = {'hello': 'world'};
+      expect(request.bodyFields, equals({'hello': 'world'}));
+    });
+
+    test('changes when body changes', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.headers[HttpHeaders.CONTENT_TYPE] =
+          'application/x-www-form-urlencoded';
+      request.body = 'key%201=value&key+2=other%2bvalue';
+      expect(request.bodyFields,
+          equals({'key 1': 'value', 'key 2': 'other+value'}));
+    });
+
+    // TODO(nweiz): test that both the getter and the setter respect #encoding
+    // when issue 6284 is fixed.
+  });
+
+  group('content-type header', () {
+    test('defaults to empty', () {
+      var request = new http.Request('POST', dummyUrl);
+      expect(request.headers[HttpHeaders.CONTENT_TYPE], isNull);
+    });
+
+    test('defaults to empty if only encoding is set', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.encoding = Encoding.ISO_8859_1;
+      expect(request.headers[HttpHeaders.CONTENT_TYPE], isNull);
+    });
+
+    test('is set to application/x-www-form-urlencoded with charset utf-8 if '
+        'bodyFields is set', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.bodyFields = {'hello': 'world'};
+      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+          equals('application/x-www-form-urlencoded; charset=UTF-8'));
+    });
+
+    test('is set to application/x-www-form-urlencoded with the given charset '
+        'if bodyFields and encoding are set', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.encoding = Encoding.ISO_8859_1;
+      request.bodyFields = {'hello': 'world'};
+      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+          equals('application/x-www-form-urlencoded; charset=ISO-8859-1'));
+    });
+
+    test('is set to text/plain and the given encoding if body and encoding are '
+        'both set', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.encoding = Encoding.ISO_8859_1;
+      request.body = 'hello, world';
+      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+          equals('text/plain; charset=ISO-8859-1'));
+    });
+
+    test('is modified to include utf-8 if body is set', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.headers[HttpHeaders.CONTENT_TYPE] = 'application/json';
+      request.body = '{"hello": "world"}';
+      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+          equals('application/json; charset=UTF-8'));
+    });
+
+    test('is modified to include the given encoding if encoding is set', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.headers[HttpHeaders.CONTENT_TYPE] = 'application/json';
+      request.encoding = Encoding.ISO_8859_1;
+      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+          equals('application/json; charset=ISO-8859-1'));
+    });
+
+    test('has its charset overridden by an explicit encoding', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.headers[HttpHeaders.CONTENT_TYPE] =
+          'application/json; charset=utf-8';
+      request.encoding = Encoding.ISO_8859_1;
+      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+          equals('application/json; charset=ISO-8859-1'));
+    });
+
+    test("doen't have its charset overridden by setting bodyFields", () {
+      var request = new http.Request('POST', dummyUrl);
+      request.headers[HttpHeaders.CONTENT_TYPE] =
+          'application/x-www-form-urlencoded; charset=iso-8859-1';
+      request.bodyFields = {'hello': 'world'};
+      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+          equals('application/x-www-form-urlencoded; charset=iso-8859-1'));
+    });
+
+    test("doen't have its charset overridden by setting body", () {
+      var request = new http.Request('POST', dummyUrl);
+      request.headers[HttpHeaders.CONTENT_TYPE] =
+          'application/json; charset=iso-8859-1';
+      request.body = '{"hello": "world"}';
+      expect(request.headers[HttpHeaders.CONTENT_TYPE],
+          equals('application/json; charset=iso-8859-1'));
+    });
+  });
+
+  group('#finalize', () {
+    test('returns a stream that emits the request body', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.body = "Hello, world!";
+      expect(
+          consumeInputStream(request.finalize())
+              .transform((bytes) => new String.fromCharCodes(bytes)),
+          completion(equals("Hello, world!")));
+    });
+
+    test('freezes #persistentConnection', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.finalize();
+
+      expect(request.persistentConnection, isTrue);
+      expect(() => request.persistentConnection = false, throwsStateError);
+    });
+
+    test('freezes #followRedirects', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.finalize();
+
+      expect(request.followRedirects, isTrue);
+      expect(() => request.followRedirects = false, throwsStateError);
+    });
+
+    test('freezes #maxRedirects', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.finalize();
+
+      expect(request.maxRedirects, equals(5));
+      expect(() => request.maxRedirects = 10, throwsStateError);
+    });
+
+    test('freezes #encoding', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.finalize();
+
+      expect(request.encoding.name, equals(Encoding.UTF_8.name));
+      expect(() => request.encoding = Encoding.ASCII, throwsStateError);
+    });
+
+    test('freezes #bodyBytes', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.bodyBytes = [1, 2, 3];
+      request.finalize();
+
+      expect(request.bodyBytes, equals([1, 2, 3]));
+      expect(() => request.bodyBytes = [4, 5, 6], throwsStateError);
+    });
+
+    test('freezes #body', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.body = "hello";
+      request.finalize();
+
+      expect(request.body, equals("hello"));
+      expect(() => request.body = "goodbye", throwsStateError);
+    });
+
+    test('freezes #bodyFields', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.bodyFields = {"hello": "world"};
+      request.finalize();
+
+      expect(request.bodyFields, equals({"hello": "world"}));
+      expect(() => request.bodyFields = {}, throwsStateError);
+    });
+
+    test("can't be called twice", () {
+      var request = new http.Request('POST', dummyUrl);
+      request.finalize();
+      expect(request.finalize, throwsStateError);
+    });
+  });
+}
+
diff --git a/pkg/http/test/response_test.dart b/pkg/http/test/response_test.dart
new file mode 100644
index 0000000..6062dab
--- /dev/null
+++ b/pkg/http/test/response_test.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library response_test;
+
+import 'dart:io';
+
+import '../../unittest/lib/unittest.dart';
+import '../lib/http.dart' as http;
+
+void main() {
+  group('()', () {
+    test('sets body', () {
+      var response = new http.Response("Hello, world!", 200);
+      expect(response.body, equals("Hello, world!"));
+    });
+
+    test('sets bodyBytes', () {
+      var response = new http.Response("Hello, world!", 200);
+      expect(response.bodyBytes, equals(
+          [72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33]));
+    });
+
+    // TODO(nweiz): test that this respects the inferred encoding when issue
+    // 6284 is fixed.
+  });
+
+  group('.bytes()', () {
+    test('sets body', () {
+      var response = new http.Response.bytes([104, 101, 108, 108, 111], 200);
+      expect(response.body, equals("hello"));
+    });
+
+    test('sets bodyBytes', () {
+      var response = new http.Response.bytes([104, 101, 108, 108, 111], 200);
+      expect(response.bodyBytes, equals([104, 101, 108, 108, 111]));
+    });
+
+    // TODO(nweiz): test that this respects the inferred encoding when issue
+    // 6284 is fixed.
+  });
+
+  group('.fromStream()', () {
+    test('sets body', () {
+      var stream = new ListInputStream();
+      var streamResponse = new http.StreamedResponse(stream, 200, 13);
+      var future = http.Response.fromStream(streamResponse)
+        .transform((response) => response.body);
+      expect(future, completion(equals("Hello, world!")));
+
+      stream.write([72, 101, 108, 108, 111, 44, 32]);
+      stream.write([119, 111, 114, 108, 100, 33]);
+      stream.markEndOfStream();
+    });
+
+    test('sets bodyBytes', () {
+      var stream = new ListInputStream();
+      var streamResponse = new http.StreamedResponse(stream, 200, 5);
+      var future = http.Response.fromStream(streamResponse)
+        .transform((response) => response.bodyBytes);
+      expect(future, completion(equals([104, 101, 108, 108, 111])));
+
+      stream.write([104, 101, 108, 108, 111]);
+      stream.markEndOfStream();
+    });
+  });
+}
diff --git a/pkg/http/test/streamed_request_test.dart b/pkg/http/test/streamed_request_test.dart
new file mode 100644
index 0000000..e71d50b
--- /dev/null
+++ b/pkg/http/test/streamed_request_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library streamed_request_test;
+
+import 'dart:io';
+
+import '../../unittest/lib/unittest.dart';
+import '../lib/http.dart' as http;
+import 'utils.dart';
+
+void main() {
+  test('#finalize freezes contentLength', () {
+    var request = new http.StreamedRequest('POST', dummyUrl);
+    request.finalize();
+
+    expect(request.contentLength, equals(-1));
+    expect(() => request.contentLength = 10, throwsStateError);
+  });
+}
\ No newline at end of file
diff --git a/pkg/http/test/utils.dart b/pkg/http/test/utils.dart
new file mode 100644
index 0000000..9b4d7e9
--- /dev/null
+++ b/pkg/http/test/utils.dart
@@ -0,0 +1,140 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utils;
+
+import 'dart:io';
+import 'dart:json';
+import 'dart:uri';
+
+import '../../unittest/lib/unittest.dart';
+import '../lib/http.dart' as http;
+import '../lib/src/utils.dart';
+
+/// The current server instance.
+HttpServer _server;
+
+/// The URL for the current server instance.
+Uri get serverUrl => new Uri.fromString('http://localhost:${_server.port}');
+
+/// A dummy URL for constructing requests that won't be sent.
+Uri get dummyUrl => new Uri.fromString('http://dartlang.org/');
+
+/// Starts a new HTTP server.
+void startServer() {
+  _server = new HttpServer();
+
+  _server.addRequestHandler((request) => request.path == '/error',
+      (request, response) {
+    response.statusCode = 400;
+    response.outputStream.close();
+  });
+
+  _server.defaultRequestHandler = (request, response) {
+    consumeInputStream(request.inputStream).then((requestBodyBytes) {
+      response.statusCode = 200;
+      response.headers.contentType = new ContentType("application", "json");
+
+      var requestBody;
+      if (requestBodyBytes.isEmpty) {
+        requestBody = null;
+      } else if (request.headers.contentType.charset != null) {
+        var encoding = requiredEncodingForCharset(
+            request.headers.contentType.charset);
+        requestBody = decodeString(requestBodyBytes, encoding);
+      } else {
+        requestBody = requestBodyBytes;
+      }
+
+      var content = {
+        'method': request.method,
+        'path': request.path,
+        'headers': <String>{}
+      };
+      if (requestBody != null) content['body'] = requestBody;
+      request.headers.forEach((name, values) {
+        // These headers are automatically generated by dart:io, so we don't
+        // want to test them here.
+        if (name == 'cookie' || name == 'host') return;
+
+        content['headers'][name] = values;
+      });
+
+      var outputEncoding;
+      var encodingName = request.queryParameters['response-encoding'];
+      if (encodingName != null) {
+        outputEncoding = requiredEncodingForCharset(encodingName);
+      } else {
+        outputEncoding = Encoding.ASCII;
+      }
+
+      var body = JSON.stringify(content);
+      response.contentLength = body.length;
+      response.outputStream.writeString(body, outputEncoding);
+      response.outputStream.close();
+    });
+  };
+
+  _server.listen("127.0.0.1", 0);
+}
+
+/// Stops the current HTTP server.
+void stopServer() {
+  _server.close();
+  _server = null;
+}
+
+/// A matcher that matches JSON that parses to a value that matches the inner
+/// matcher.
+Matcher parse(matcher) => new _Parse(matcher);
+
+class _Parse extends BaseMatcher {
+  final Matcher _matcher;
+
+  _Parse(this._matcher);
+
+  bool matches(item, MatchState matchState) {
+    print("_Parse.matches [$item]");
+    if (item is! String) return false;
+
+    var parsed;
+    try {
+      parsed = JSON.parse(item);
+    } catch (e) {
+      return false;
+    }
+
+    return _matcher.matches(parsed, matchState);
+  }
+
+  Description describe(Description description) {
+    return description.add('parses to a value that ')
+      .addDescriptionOf(_matcher);
+  }
+}
+
+// TODO(nweiz): remove this once it's built in to unittest
+/// A matcher for StateErrors.
+const isStateError = const _StateError();
+
+/// A matcher for functions that throw StateError.
+const Matcher throwsStateError =
+    const Throws(isStateError);
+
+class _StateError extends TypeMatcher {
+  const _StateError() : super("StateError");
+  bool matches(item, MatchState matchState) => item is StateError;
+}
+
+/// A matcher for HttpExceptions.
+const isHttpException = const _HttpException();
+
+/// A matcher for functions that throw HttpException.
+const Matcher throwsHttpException =
+    const Throws(isHttpException);
+
+class _HttpException extends TypeMatcher {
+  const _HttpException() : super("HttpException");
+  bool matches(item, MatchState matchState) => item is HttpException;
+}
diff --git a/pkg/intl/lib/src/date_format_field.dart b/pkg/intl/lib/src/date_format_field.dart
index 3e7c6cf..7e210a3 100644
--- a/pkg/intl/lib/src/date_format_field.dart
+++ b/pkg/intl/lib/src/date_format_field.dart
@@ -378,15 +378,15 @@
 
   String formatTimeZoneId(Date date) {
     // TODO(alanknight): implement time zone support
-    throw new NotImplementedException();
+    throw new UnimplementedError();
   }
 
   String formatTimeZone(Date date) {
-    throw new NotImplementedException();
+    throw new UnimplementedError();
   }
 
   String formatTimeZoneRFC(Date date) {
-    throw new NotImplementedException();
+    throw new UnimplementedError();
   }
 
  /**
diff --git a/pkg/intl/test/bidi_format_test.dart b/pkg/intl/test/bidi_format_test.dart
index 6b26672..639adab 100644
--- a/pkg/intl/test/bidi_format_test.dart
+++ b/pkg/intl/test/bidi_format_test.dart
@@ -6,7 +6,7 @@
 library bidi_format_test;
 
 import '../lib/intl.dart';
-import '../../../pkg/unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 
 /**
  * Tests the bidirectional text formatting library.
diff --git a/pkg/intl/test/bidi_utils_test.dart b/pkg/intl/test/bidi_utils_test.dart
index e65a241..629f670 100644
--- a/pkg/intl/test/bidi_utils_test.dart
+++ b/pkg/intl/test/bidi_utils_test.dart
@@ -6,7 +6,7 @@
 library bidi_utils_test;
 
 import '../lib/intl.dart';
-import '../../../pkg/unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 
 /**
  * Tests the bidi utilities library.
diff --git a/pkg/intl/test/data_directory.dart b/pkg/intl/test/data_directory.dart
index b2e23da..96fa450 100644
--- a/pkg/intl/test/data_directory.dart
+++ b/pkg/intl/test/data_directory.dart
@@ -22,4 +22,4 @@
     return 'lib${_sep}src${_sep}data${_sep}dates${_sep}';
   }
   return 'pkg${_sep}intl${_sep}lib${_sep}src${_sep}data${_sep}dates${_sep}';
-}
\ No newline at end of file
+}
diff --git a/pkg/intl/test/date_time_format_file_test_stub.dart b/pkg/intl/test/date_time_format_file_test_stub.dart
index 4a09ccf..18b596c 100644
--- a/pkg/intl/test/date_time_format_file_test_stub.dart
+++ b/pkg/intl/test/date_time_format_file_test_stub.dart
@@ -14,7 +14,7 @@
 import 'dart:io';
 import 'date_time_format_test_core.dart';
 import 'data_directory.dart';
-import '../../../pkg/unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 
 runWith([Function getSubset]) {
   // Initialize one locale just so we know what the list is.
@@ -32,4 +32,4 @@
     Futures.wait(futures).then(
         expectAsync1((results) => runDateTests(getSubset())));
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/intl/test/date_time_format_http_request_test.dart b/pkg/intl/test/date_time_format_http_request_test.dart
index d0b9062..fb147b4 100644
--- a/pkg/intl/test/date_time_format_http_request_test.dart
+++ b/pkg/intl/test/date_time_format_http_request_test.dart
@@ -13,7 +13,7 @@
 import '../lib/date_symbol_data_http_request.dart';
 import 'date_time_format_test_core.dart';
 import 'dart:html';
-import '../../../pkg/unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 
 var url = "http://localhost:9876/pkg/intl/lib/src/data/dates/";
 
diff --git a/pkg/intl/test/date_time_format_local_test_stub.dart b/pkg/intl/test/date_time_format_local_test_stub.dart
index 862832e..0556cd5 100644
--- a/pkg/intl/test/date_time_format_local_test_stub.dart
+++ b/pkg/intl/test/date_time_format_local_test_stub.dart
@@ -27,4 +27,4 @@
   var futures = DateFormat.allLocalesWithSymbols().map(
       (locale) => initializeDateFormatting(locale, null));
   Futures.wait(futures).then((results) => runDateTests(getSubset()));
-}
\ No newline at end of file
+}
diff --git a/pkg/intl/test/date_time_format_test_core.dart b/pkg/intl/test/date_time_format_test_core.dart
index 8be3aab..ef13882 100644
--- a/pkg/intl/test/date_time_format_test_core.dart
+++ b/pkg/intl/test/date_time_format_test_core.dart
@@ -10,7 +10,7 @@
 
 library date_time_format_tests;
 
-import '../../../pkg/unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 import 'date_time_format_test_data.dart';
 import '../lib/intl.dart';
 import '../lib/src/date_format_internal.dart';
diff --git a/pkg/intl/test/date_time_format_test_data.dart b/pkg/intl/test/date_time_format_test_data.dart
index eae473c..cec221a 100644
--- a/pkg/intl/test/date_time_format_test_data.dart
+++ b/pkg/intl/test/date_time_format_test_data.dart
@@ -334,4 +334,4 @@
       "Παρ, 27 Ιαν 2012 8:58:59 μ.μ. GMT-08:00",
   "HOUR_MINUTE_SECOND + ABBR_GENERIC_TZ" :
       "8:58:59 μ.μ. Ηνωμένες Πολιτείες της Αμερικής (Λος Άντζελες)",
-  "HOUR_MINUTE + ABBR_SPECIFIC_TZ" : "8:58 μ.μ. GMT-08:00"};
\ No newline at end of file
+  "HOUR_MINUTE + ABBR_SPECIFIC_TZ" : "8:58 μ.μ. GMT-08:00"};
diff --git a/pkg/intl/test/find_default_locale_browser_test.dart b/pkg/intl/test/find_default_locale_browser_test.dart
index 29b6523..a9798ed 100644
--- a/pkg/intl/test/find_default_locale_browser_test.dart
+++ b/pkg/intl/test/find_default_locale_browser_test.dart
@@ -6,7 +6,7 @@
 
 import '../lib/intl.dart';
 import '../lib/intl_browser.dart';
-import '../../unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("Find system locale in browser", () {
diff --git a/pkg/intl/test/find_default_locale_standalone_test.dart b/pkg/intl/test/find_default_locale_standalone_test.dart
index 0e3a150..c8f5224 100644
--- a/pkg/intl/test/find_default_locale_standalone_test.dart
+++ b/pkg/intl/test/find_default_locale_standalone_test.dart
@@ -6,7 +6,7 @@
 
 import '../lib/intl.dart';
 import '../lib/intl_standalone.dart';
-import '../../unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("Find system locale standalone", () {
diff --git a/pkg/intl/test/intl_message_basic_example_test.dart b/pkg/intl/test/intl_message_basic_example_test.dart
index 3bf4ce6..bc92f9d 100644
--- a/pkg/intl/test/intl_message_basic_example_test.dart
+++ b/pkg/intl/test/intl_message_basic_example_test.dart
@@ -11,7 +11,7 @@
 import '../lib/intl.dart';
 import '../lib/message_lookup_local.dart';
 import '../example/basic/basic_example.dart';
-import '../../unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 
 List list;
 
@@ -30,4 +30,4 @@
   expect(list[2], "วิ่ง 0:00:00 on วันพฤหัสบดี 1 มกราคม 1970.");
   expect(list[3], "วิ่ง now on today.");
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/intl/test/intl_message_test.dart b/pkg/intl/test/intl_message_test.dart
index c15ee5b..6d433cd 100644
--- a/pkg/intl/test/intl_message_test.dart
+++ b/pkg/intl/test/intl_message_test.dart
@@ -5,7 +5,7 @@
 library intl_message_test;
 
 import '../lib/intl.dart';
-import '../../unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 import '../lib/message_lookup_local.dart';
 
 /** Tests the MessageFormat library in dart. */
diff --git a/pkg/intl/test/intl_test.dart b/pkg/intl/test/intl_test.dart
index 519497d..d03b5e7 100644
--- a/pkg/intl/test/intl_test.dart
+++ b/pkg/intl/test/intl_test.dart
@@ -6,7 +6,7 @@
 
 import '../lib/intl.dart';
 // TODO(rnystrom): Use "package:" import when test.dart supports it (#4968).
-import '../../unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 import '../lib/date_symbol_data_local.dart';
 
 main() {
diff --git a/pkg/intl/test/number_format_test.dart b/pkg/intl/test/number_format_test.dart
index b0baf21..a1c0d9d 100644
--- a/pkg/intl/test/number_format_test.dart
+++ b/pkg/intl/test/number_format_test.dart
@@ -6,7 +6,7 @@
 
 library number_format_test;
 
-import '../../../pkg/unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 import '../lib/number_format.dart';
 import '../lib/intl.dart';
 
@@ -46,4 +46,4 @@
       expect(formatted, x);
     }
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/logging/lib/logging.dart b/pkg/logging/lib/logging.dart
index b423e20..3713175 100644
--- a/pkg/logging/lib/logging.dart
+++ b/pkg/logging/lib/logging.dart
@@ -7,7 +7,7 @@
  * abstractions similar to those used in other languages, such as the Closure JS
  * Logger and java.util.logging.Logger.
  */
-#library('logging');
+library logging;
 
 /**
  * Whether to allow fine-grain logging and configuration of loggers in a
diff --git a/pkg/logging/test/logging_test.dart b/pkg/logging/test/logging_test.dart
index a3e1cd5d..37518b1 100644
--- a/pkg/logging/test/logging_test.dart
+++ b/pkg/logging/test/logging_test.dart
@@ -3,11 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-#library('logging_test');
+library logging_test;
 
 // TODO(rnystrom): Use "package:" import when test.dart supports it (#4968).
-#import('../lib/logging.dart');
-#import('../../../pkg/unittest/unittest.dart');
+import '../lib/logging.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('level comparison is a valid comparator', () {
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index cd8d64a..ba49c2b 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -7,7 +7,7 @@
  * semantic information about the program being annotated. These annotations are
  * intended to be used by tools to provide a better user experience.
  */
-#library('meta');
+library meta;
 
 /**
  * An annotation used to mark a class, field, getter, setter, method, top-level
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 4d2c5e5..3599c65 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -12,8 +12,13 @@
 [$compiler == dart2dart]
 *: Skip
 
+# Don't compiile tests that use dart:io to JS
+[ $compiler == dart2js || $compiler == dart2dart || $compiler == dartc ]
+http/test/*: Skip
+
 # Skip tests that use local file access if we're running in any browser
 [ $runtime == opera || $runtime == ff || $runtime == ie9 || $runtime == dartium || $runtime == chrome || $runtime == safari || $runtime == drt ]
+http/test/*: Skip
 intl/test/date_time_format_file_even_test: Skip
 intl/test/date_time_format_file_odd_test: Skip
 intl/test/find_default_locale_standalone_test: Skip
@@ -26,24 +31,12 @@
 [ $runtime == vm ]
 intl/test/find_default_locale_browser_test: Skip
 intl/test/date_time_format_http_request_test: Skip
-unittest/test/mock_test: Fail  # noSuchMethod InvocationMirror not correct yet.
 
 # Skip http request tests on Dartium while resolving an odd
 # error there that causes the tests to timeout.
 [ $runtime == dartium || $runtime == drt ]
 intl/test/date_time_format_http_request_test: Skip
 
-[ $runtime == drt && $compiler == none ]
-intl/test/bidi_format_test: Fail # New import syntax is not supported by test frameowrk
-intl/test/bidi_utils_test: Fail # New import syntax is not supported by test frameowrk
-intl/test/date_time_format_local_even_test: Fail # New import syntax is not supported by test frameowrk
-intl/test/date_time_format_local_odd_test: Fail # New import syntax is not supported by test frameowrk
-intl/test/find_default_locale_browser_test: Fail # New import syntax is not supported by test frameowrk
-intl/test/intl_message_basic_example_test: Fail # New import syntax is not supported by test frameowrk
-intl/test/intl_message_test: Fail # New import syntax is not supported by test frameowrk
-intl/test/intl_test: Fail # New import syntax is not supported by test frameowrk
-intl/test/number_format_test: Fail # New import syntax is not supported by test frameowrk
-
 # Skip intl_message tests that use mirrors on dart2js until it's been
 # implemented there.
 [ $compiler == dart2js ]
@@ -54,11 +47,8 @@
 unittest/test/mock_regexp_negative_test: Fail
 unittest/test/mock_stepwise_negative_test: Fail
 
-# pkg issue 6340
-fixnum/test/int_32_test: Fail, OK
-fixnum/test/int_64_test: Fail, OK
-unittest/test/matchers_test: Fail, OK
-
+[ $system == windows ]
+http/test/request_test: Pass, Timeout # Issue 6594
 
 [ $compiler == dart2js || $compiler == dartc ]
 unittest/test/instance_test: Skip
@@ -66,5 +56,3 @@
 [ $compiler == none && $runtime == drt ]
 dartdoc/test/dartdoc_test: Skip # See dartbug.com/4541.
 
-[ $compiler == none && ($runtime == dartium || $runtime == drt) ]
-unittest/test/mock_test: Fail
diff --git a/pkg/unittest/html_config.dart b/pkg/unittest/html_config.dart
deleted file mode 100644
index e7a5dbd..0000000
--- a/pkg/unittest/html_config.dart
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * A simple unit test library for running tests in a browser.
- */
-#library('unittest_html_config');
-
-#import('dart:html');
-#import('unittest.dart');
-
-#source('html_print.dart');
-
-class HtmlConfiguration extends Configuration {
-  /** Whether this is run within dartium layout tests. */
-  final bool _isLayoutTest;
-  HtmlConfiguration(this._isLayoutTest);
-
-  // TODO(rnystrom): Get rid of this if we get canonical closures for methods.
-  EventListener _onErrorClosure;
-  EventListener _onMessageClosure;
-
-  void _installHandlers() {
-    if (_onErrorClosure == null) {
-      _onErrorClosure =
-          (e) => handleExternalError(e, '(DOM callback has errors)');
-      // Listen for uncaught errors.
-      window.on.error.add(_onErrorClosure);
-    }
-    if (_onMessageClosure == null) {
-      _onMessageClosure = (e) => processMessage(e);
-      // Listen for errors from JS.
-      window.on.message.add(_onMessageClosure);
-    }
-  }
-
-  void _uninstallHandlers() {
-    if (_onErrorClosure != null) {
-      window.on.error.remove(_onErrorClosure);
-      _onErrorClosure = null;
-    }
-    if (_onMessageClosure != null) {
-      window.on.message.remove(_onMessageClosure);
-      _onMessageClosure = null;
-    }
-  }
-
-  void processMessage(e) {
-    if ('unittest-suite-external-error' == e.data) {
-      handleExternalError('<unknown>', '(external error detected)');
-    }
-  }
-
-  void onInit() {
-    _installHandlers();
-  }
-
-  void onStart() {
-    window.postMessage('unittest-suite-wait-for-done', '*');
-  }
-
-  void onTestResult(TestCase testCase) {}
-
-  void onDone(int passed, int failed, int errors, List<TestCase> results,
-      String uncaughtError) {
-    _uninstallHandlers();
-    _showResultsInPage(passed, failed, errors, results, _isLayoutTest,
-        uncaughtError);
-    window.postMessage('unittest-suite-done', '*');
-  }
-}
-
-void useHtmlConfiguration([bool isLayoutTest = false]) {
-  configure(new HtmlConfiguration(isLayoutTest));
-}
diff --git a/pkg/unittest/html_print.dart b/pkg/unittest/html_print.dart
deleted file mode 100644
index 1ee70e7..0000000
--- a/pkg/unittest/html_print.dart
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/** This file is sourced by both dom_config.dart and html_config.dart. */
-
-/** Creates a table showing tests results in HTML. */
-void _showResultsInPage(int passed, int failed, int errors,
-    List<TestCase> results, bool isLayoutTest, String uncaughtError) {
-  if (isLayoutTest && (passed == results.length) && uncaughtError == null) {
-    document.body.innerHTML = "PASS";
-  } else {
-    var newBody = new StringBuffer();
-    newBody.add("<table class='unittest-table'><tbody>");
-    newBody.add(passed == results.length && uncaughtError == null
-        ? "<tr><td colspan='3' class='unittest-pass'>PASS</td></tr>"
-        : "<tr><td colspan='3' class='unittest-fail'>FAIL</td></tr>");
-
-    for (final test_ in results) {
-      newBody.add(_toHtml(test_));
-    }
-
-    if (uncaughtError != null) {
-        newBody.add('''<tr>
-          <td>--</td>
-          <td class="unittest-error">ERROR</td>
-          <td>Uncaught error: $uncaughtError</td>
-        </tr>''');
-    }
-
-    if (passed == results.length && uncaughtError == null) {
-      newBody.add("""
-          <tr><td colspan='3' class='unittest-pass'>
-            All ${passed} tests passed
-          </td></tr>""");
-    } else {
-      newBody.add("""
-          <tr><td colspan='3'>Total
-            <span class='unittest-pass'>${passed} passed</span>,
-            <span class='unittest-fail'>${failed} failed</span>
-            <span class='unittest-error'>
-            ${errors + (uncaughtError == null ? 0 : 1)} errors</span>
-          </td></tr>""");
-    }
-    newBody.add("</tbody></table>");
-    document.body.innerHTML = newBody.toString();
-  }
-}
-
-String _toHtml(TestCase test_) {
-  if (!test_.isComplete) {
-    return '''
-        <tr>
-          <td>${test_.id}</td>
-          <td class="unittest-error">NO STATUS</td>
-          <td>Test did not complete</td>
-        </tr>''';
-  }
-
-  var html = '''
-      <tr>
-        <td>${test_.id}</td>
-        <td class="unittest-${test_.result}">${test_.result.toUpperCase()}</td>
-        <td>Expectation: ${test_.description}. ${_htmlEscape(test_.message)}</td>
-      </tr>''';
-
-  if (test_.stackTrace != null) {
-    html = '$html<tr><td></td><td colspan="2"><pre>${_htmlEscape(test_.stackTrace)}</pre></td></tr>';
-  }
-
-  return html;
-}
-
-//TODO(pquitslund): Move to a common lib
-String _htmlEscape(String string) {
-  return string.replaceAll('&', '&amp;')
-               .replaceAll('<','&lt;')
-               .replaceAll('>','&gt;');
-}
diff --git a/pkg/unittest/lib/html_config.dart b/pkg/unittest/lib/html_config.dart
new file mode 100644
index 0000000..3a8b3c4
--- /dev/null
+++ b/pkg/unittest/lib/html_config.dart
@@ -0,0 +1,148 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * A simple unit test library for running tests in a browser.
+ */
+library unittest_html_config;
+
+import 'dart:html';
+import 'unittest.dart';
+
+/** Creates a table showing tests results in HTML. */
+void _showResultsInPage(int passed, int failed, int errors,
+    List<TestCase> results, bool isLayoutTest, String uncaughtError) {
+  if (isLayoutTest && (passed == results.length) && uncaughtError == null) {
+    document.body.innerHTML = "PASS";
+  } else {
+    var newBody = new StringBuffer();
+    newBody.add("<table class='unittest-table'><tbody>");
+    newBody.add(passed == results.length && uncaughtError == null
+        ? "<tr><td colspan='3' class='unittest-pass'>PASS</td></tr>"
+        : "<tr><td colspan='3' class='unittest-fail'>FAIL</td></tr>");
+
+    for (final test_ in results) {
+      newBody.add(_toHtml(test_));
+    }
+
+    if (uncaughtError != null) {
+        newBody.add('''<tr>
+          <td>--</td>
+          <td class="unittest-error">ERROR</td>
+          <td>Uncaught error: $uncaughtError</td>
+        </tr>''');
+    }
+
+    if (passed == results.length && uncaughtError == null) {
+      newBody.add("""
+          <tr><td colspan='3' class='unittest-pass'>
+            All ${passed} tests passed
+          </td></tr>""");
+    } else {
+      newBody.add("""
+          <tr><td colspan='3'>Total
+            <span class='unittest-pass'>${passed} passed</span>,
+            <span class='unittest-fail'>${failed} failed</span>
+            <span class='unittest-error'>
+            ${errors + (uncaughtError == null ? 0 : 1)} errors</span>
+          </td></tr>""");
+    }
+    newBody.add("</tbody></table>");
+    document.body.innerHTML = newBody.toString();
+  }
+}
+
+String _toHtml(TestCase test_) {
+  if (!test_.isComplete) {
+    return '''
+        <tr>
+          <td>${test_.id}</td>
+          <td class="unittest-error">NO STATUS</td>
+          <td>Test did not complete</td>
+        </tr>''';
+  }
+
+  var html = '''
+      <tr>
+        <td>${test_.id}</td>
+        <td class="unittest-${test_.result}">${test_.result.toUpperCase()}</td>
+        <td>Expectation: ${test_.description}. ${_htmlEscape(test_.message)}</td>
+      </tr>''';
+
+  if (test_.stackTrace != null) {
+    html = '$html<tr><td></td><td colspan="2"><pre>${_htmlEscape(test_.stackTrace)}</pre></td></tr>';
+  }
+
+  return html;
+}
+
+//TODO(pquitslund): Move to a common lib
+String _htmlEscape(String string) {
+  return string.replaceAll('&', '&amp;')
+               .replaceAll('<','&lt;')
+               .replaceAll('>','&gt;');
+}
+
+class HtmlConfiguration extends Configuration {
+  /** Whether this is run within dartium layout tests. */
+  final bool _isLayoutTest;
+  HtmlConfiguration(this._isLayoutTest);
+
+  // TODO(rnystrom): Get rid of this if we get canonical closures for methods.
+  EventListener _onErrorClosure;
+  EventListener _onMessageClosure;
+
+  void _installHandlers() {
+    if (_onErrorClosure == null) {
+      _onErrorClosure =
+          (e) => handleExternalError(e, '(DOM callback has errors)');
+      // Listen for uncaught errors.
+      window.on.error.add(_onErrorClosure);
+    }
+    if (_onMessageClosure == null) {
+      _onMessageClosure = (e) => processMessage(e);
+      // Listen for errors from JS.
+      window.on.message.add(_onMessageClosure);
+    }
+  }
+
+  void _uninstallHandlers() {
+    if (_onErrorClosure != null) {
+      window.on.error.remove(_onErrorClosure);
+      _onErrorClosure = null;
+    }
+    if (_onMessageClosure != null) {
+      window.on.message.remove(_onMessageClosure);
+      _onMessageClosure = null;
+    }
+  }
+
+  void processMessage(e) {
+    if ('unittest-suite-external-error' == e.data) {
+      handleExternalError('<unknown>', '(external error detected)');
+    }
+  }
+
+  void onInit() {
+    _installHandlers();
+  }
+
+  void onStart() {
+    window.postMessage('unittest-suite-wait-for-done', '*');
+  }
+
+  void onTestResult(TestCase testCase) {}
+
+  void onDone(int passed, int failed, int errors, List<TestCase> results,
+      String uncaughtError) {
+    _uninstallHandlers();
+    _showResultsInPage(passed, failed, errors, results, _isLayoutTest,
+        uncaughtError);
+    window.postMessage('unittest-suite-done', '*');
+  }
+}
+
+void useHtmlConfiguration([bool isLayoutTest = false]) {
+  configure(new HtmlConfiguration(isLayoutTest));
+}
diff --git a/pkg/unittest/html_enhanced_config.dart b/pkg/unittest/lib/html_enhanced_config.dart
similarity index 98%
rename from pkg/unittest/html_enhanced_config.dart
rename to pkg/unittest/lib/html_enhanced_config.dart
index 65d0e47..ce68ef7 100644
--- a/pkg/unittest/html_enhanced_config.dart
+++ b/pkg/unittest/lib/html_enhanced_config.dart
@@ -8,11 +8,10 @@
  * Provides enhanced HTML output with collapsible group headers
  * and other at-a-glance information about the test results.
  */
-#library('unittest_html_enhanced_config');
+library unittest_html_enhanced_config;
 
-#import('dart:html');
-#import('unittest.dart');
-
+import 'dart:html';
+import 'unittest.dart';
 
 class HtmlEnhancedConfiguration extends Configuration {
   /** Whether this is run within dartium layout tests. */
diff --git a/pkg/unittest/html_layout_config.dart b/pkg/unittest/lib/html_layout_config.dart
similarity index 98%
rename from pkg/unittest/html_layout_config.dart
rename to pkg/unittest/lib/html_layout_config.dart
index 198a50e..1e56248 100644
--- a/pkg/unittest/html_layout_config.dart
+++ b/pkg/unittest/lib/html_layout_config.dart
@@ -9,11 +9,11 @@
  * recreated the IFrame for each test, here the IFrames are preserved.
  * Furthermore we post a message on completion.
  */
-#library('html_layout_config');
+library html_layout_config;
 
-#import('dart:html');
-#import('dart:math');
-#import('unittest.dart');
+import 'dart:html';
+import 'dart:math';
+import 'unittest.dart';
 
 /** The messages exchanged between parent and child. */
 // TODO(gram) At some point postMessage was supposed to support
diff --git a/pkg/unittest/interactive_html_config.dart b/pkg/unittest/lib/interactive_html_config.dart
similarity index 99%
rename from pkg/unittest/interactive_html_config.dart
rename to pkg/unittest/lib/interactive_html_config.dart
index f8f3a81..3ff750a 100644
--- a/pkg/unittest/interactive_html_config.dart
+++ b/pkg/unittest/lib/interactive_html_config.dart
@@ -9,14 +9,14 @@
  * config that manages all the tests, and a 'child' config for the
  * IFrame that runs the individual tests.
  */
-#library('unittest_interactive_html_config');
+library unittest_interactive_html_config;
 
 // TODO(gram) - add options for: remove IFrame on done/keep
 // IFrame for failed tests/keep IFrame for all tests.
 
-#import('dart:html');
-#import('dart:math');
-#import('unittest.dart');
+import 'dart:html';
+import 'dart:math';
+import 'unittest.dart';
 
 /** The messages exchanged between parent and child. */
 
diff --git a/pkg/unittest/lib/matcher.dart b/pkg/unittest/lib/matcher.dart
new file mode 100644
index 0000000..83d6d03
--- /dev/null
+++ b/pkg/unittest/lib/matcher.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+/**
+ * The matcher library provides a 3rd generation assertion mechanism, drawing
+ * inspiration from [Hamcrest] and Ladislav Thon's [dart-matchers]
+ * library.
+ *
+ * See [Hamcrest] http://en.wikipedia.org/wiki/Hamcrest
+ *     [Hamcrest] http://code.google.com/p/hamcrest/
+ *     [dart-matchers] https://github.com/Ladicek/dart-matchers
+ */
+library matcher;
+
+part 'src/basematcher.dart';
+part 'src/collection_matchers.dart';
+part 'src/core_matchers.dart';
+part 'src/description.dart';
+part 'src/expect.dart';
+part 'src/future_matchers.dart';
+part 'src/interfaces.dart';
+part 'src/map_matchers.dart';
+part 'src/numeric_matchers.dart';
+part 'src/operator_matchers.dart';
+part 'src/string_matchers.dart';
diff --git a/pkg/unittest/mock.dart b/pkg/unittest/lib/mock.dart
similarity index 98%
rename from pkg/unittest/mock.dart
rename to pkg/unittest/lib/mock.dart
index f0f5765..928cb88 100644
--- a/pkg/unittest/mock.dart
+++ b/pkg/unittest/lib/mock.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of unittest;
+library mock;
+import 'matcher.dart';
 
 /**
  * The error formatter for mocking is a bit different from the default one
@@ -40,9 +41,10 @@
 
 _MockFailureHandler _mockFailureHandler = null;
 
-/**
- * [_noArg] is a sentinel value representing no argument.
- */
+/** Sentinel value for representing no argument. */
+class _Sentinel {
+  const _Sentinel();
+}
 const _noArg = const _Sentinel();
 
 /** The ways in which a call to a mock method can be handled. */
@@ -1270,23 +1272,21 @@
   }
 
   /**
-   * This is the handler for method calls. We loo through the list
+   * This is the handler for method calls. We loop through the list
    * of [Behavior]s, and find the first match that still has return
    * values available, and then do the action specified by that
    * return value. If we find no [Behavior] to apply an exception is
    * thrown.
    */
   noSuchMethod(InvocationMirror invocation) {
-    String method = invocation.memberName;
-    // Remove this when InvocationMirror works correctly.
-    if (method.startsWith("get:")) method = method.substring(4);
-
+    var method = invocation.memberName;
+    var args = invocation.positionalArguments;
     if (invocation.isGetter) {
       method = 'get $method';
+    } else if (method.startsWith('get:')) {
+      // TODO(gram): Remove this when VM handles the isGetter version above.
+      method = 'get ${method.substring(4)}';
     }
-    List args = invocation.positionalArguments;
-    // TODO: Handle named arguments too.
-
     bool matchedMethodName = false;
     MatchState matchState = new MatchState();
     for (String k in _behaviors.keys) {
@@ -1322,6 +1322,9 @@
           }
           throw value;
         } else if (action == Action.PROXY) {
+          // TODO(gram): Replace all this with:
+          //     var rtn = invocation.invokeOn(value);
+          // once that is supported.
           var rtn;
           switch (args.length) {
             case 0:
diff --git a/pkg/unittest/matcher.dart b/pkg/unittest/lib/src/basematcher.dart
similarity index 98%
rename from pkg/unittest/matcher.dart
rename to pkg/unittest/lib/src/basematcher.dart
index 1c430f1..2859336 100644
--- a/pkg/unittest/matcher.dart
+++ b/pkg/unittest/lib/src/basematcher.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of matcher;
+
 /**
  * MatchState is a simple wrapper around an arbitrary object.
  * [Matcher] [matches] methods can use this to store useful
@@ -13,9 +15,6 @@
  * state, if set, will typically be a [Map] with a number of key-value
  * pairs containing relevant state information.
  */
-
-part of unittest;
-
 class MatchState {
   var state = null;
 
diff --git a/pkg/unittest/collection_matchers.dart b/pkg/unittest/lib/src/collection_matchers.dart
similarity index 99%
rename from pkg/unittest/collection_matchers.dart
rename to pkg/unittest/lib/src/collection_matchers.dart
index 4f8de3b..db13658 100644
--- a/pkg/unittest/collection_matchers.dart
+++ b/pkg/unittest/lib/src/collection_matchers.dart
@@ -7,7 +7,7 @@
  * match the given [matcher].
  */
 
-part of unittest;
+part of matcher;
 
 Matcher everyElement(matcher) => new _EveryElement(wrapMatcher(matcher));
 
diff --git a/pkg/unittest/config.dart b/pkg/unittest/lib/src/config.dart
similarity index 100%
rename from pkg/unittest/config.dart
rename to pkg/unittest/lib/src/config.dart
diff --git a/pkg/unittest/core_matchers.dart b/pkg/unittest/lib/src/core_matchers.dart
similarity index 94%
rename from pkg/unittest/core_matchers.dart
rename to pkg/unittest/lib/src/core_matchers.dart
index fc40400..046da2c 100644
--- a/pkg/unittest/core_matchers.dart
+++ b/pkg/unittest/lib/src/core_matchers.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of unittest;
+part of matcher;
 
 /**
  * Returns a matcher that matches empty strings, maps or collections.
@@ -284,7 +284,7 @@
     if (item is Future) {
       // Queue up an asynchronous expectation that validates when the future
       // completes.
-      item.onComplete(expectAsync1((future) {
+      item.onComplete(wrapAsync((future) {
         if (future.hasValue) {
           expect(false, isTrue, reason:
               "Expected future to fail, but succeeded with '${future.value}'.");
@@ -456,7 +456,7 @@
 /** A matcher for RangeErrors. */
 const isRangeError = const _RangeError();
 
-/** A matcher for functions that throw RangeError */
+/** A matcher for functions that throw RangeError. */
 const Matcher throwsRangeError =
     const Throws(isRangeError);
 
@@ -465,6 +465,19 @@
   bool matches(item, MatchState matchState) => item is RangeError;
 }
 
+// Temporary matcher for deprecated IndexOutOfRangeException.
+/** A matcher for IndexOutOfRangeExceptions. */
+const isIndexOutOfRangeException = const _IndexOutOfRangeException();
+
+/** A matcher for functions that throw IndexOutOfRangeException. */
+const Matcher throwsIndexOutOfRangeException =
+    const Throws(isIndexOutOfRangeException);
+
+class _IndexOutOfRangeException extends TypeMatcher {
+  const _IndexOutOfRangeException() : super("IndexOutOfRangeException");
+  bool matches(item, MatchState matchState) => item is IndexOutOfRangeException;
+}
+
 /** A matcher for NoSuchMethodErrors. */
 const isNoSuchMethodError = const _NoSuchMethodError();
 
@@ -477,17 +490,26 @@
   bool matches(item, MatchState matchState) => item is NoSuchMethodError;
 }
 
+/** A matcher for UnimplementedErrors. */
+const isUnimplementedError = const _UnimplementedError();
+
+/** A matcher for functions that throw Exception. */
+const Matcher throwsUnimplementedError =
+    const Throws(isUnimplementedError);
+
+class _UnimplementedError extends TypeMatcher {
+  const _UnimplementedError() : super("UnimplementedError");
+  bool matches(item, MatchState matchState) => item is UnimplementedError;
+}
+
+// Temporary matcher until NotImplementedException is removed.
 /** A matcher for NotImplementedExceptions. */
-const isNotImplementedException = const _NotImplementedException();
+const isNotImplementedException = isUnimplementedError;
 
 /** A matcher for functions that throw Exception. */
 const Matcher throwsNotImplementedException =
-    const Throws(isNotImplementedException);
+    const Throws(isUnimplementedError);
 
-class _NotImplementedException extends TypeMatcher {
-  const _NotImplementedException() : super("NotImplementedException");
-  bool matches(item, MatchState matchState) => item is NotImplementedException;
-}
 
 /** A matcher for NullPointerExceptions. */
 const isNullPointerException = const _NullPointerException();
diff --git a/pkg/unittest/description.dart b/pkg/unittest/lib/src/description.dart
similarity index 98%
rename from pkg/unittest/description.dart
rename to pkg/unittest/lib/src/description.dart
index 6652e6b..d851d33 100644
--- a/pkg/unittest/description.dart
+++ b/pkg/unittest/lib/src/description.dart
@@ -7,7 +7,7 @@
  * could be supported.
  */
 
-part of unittest;
+part of matcher;
 
 class StringDescription implements Description {
   var _out;
diff --git a/pkg/unittest/expect.dart b/pkg/unittest/lib/src/expect.dart
similarity index 89%
rename from pkg/unittest/expect.dart
rename to pkg/unittest/lib/src/expect.dart
index 1269493..3a5a160 100644
--- a/pkg/unittest/expect.dart
+++ b/pkg/unittest/lib/src/expect.dart
@@ -2,7 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of unittest;
+part of matcher;
+
+/**
+ * Some matchers, like those for Futures and exception testing,
+ * can fail in asynchronous sections, and throw exceptions.
+ * A user of this library will typically want to catch and handle 
+ * such exceptions. The [wrapAsync] property is a function that
+ * can wrap callbacks used by these Matchers so that they can be
+ * used safely. For example, the unittest library will set this
+ * to be expectAsync1. By default this is an identity function.
+ */
+Function wrapAsync = (f) => f;
 
 /**
  * This is the main assertion function. It asserts that [actual]
@@ -23,14 +34,6 @@
  * In some cases extra diagnostic info can be produced on failure (for
  * example, stack traces on mismatched exceptions). To enable these,
  * [verbose] should be specified as true;
- *
- * expect() is a 3rd generation assertion mechanism, drawing
- * inspiration from [Hamcrest] and Ladislav Thon's [dart-matchers]
- * library.
- *
- * See [Hamcrest] http://en.wikipedia.org/wiki/Hamcrest
- *     [Hamcrest] http://code.google.com/p/hamcrest/
- *     [dart-matchers] https://github.com/Ladicek/dart-matchers
  */
 void expect(actual, matcher, {String reason, FailureHandler failureHandler,
             bool verbose : false}) {
diff --git a/pkg/unittest/future_matchers.dart b/pkg/unittest/lib/src/future_matchers.dart
similarity index 96%
rename from pkg/unittest/future_matchers.dart
rename to pkg/unittest/lib/src/future_matchers.dart
index 87d30f2..ce7e804 100644
--- a/pkg/unittest/future_matchers.dart
+++ b/pkg/unittest/lib/src/future_matchers.dart
@@ -12,7 +12,7 @@
  * [throwsA].
  */
 
-part of unittest;
+part of matcher;
 
 Matcher completes = const _Completes(null);
 
@@ -35,7 +35,7 @@
   bool matches(item, MatchState matchState) {
     if (item is! Future) return false;
 
-    item.onComplete(expectAsync1((future) {
+    item.onComplete(wrapAsync((future) {
       var reason = 'Expected future to complete successfully, but it failed '
         'with ${future.exception}';
       if (future.stackTrace != null) {
diff --git a/pkg/unittest/interfaces.dart b/pkg/unittest/lib/src/interfaces.dart
similarity index 99%
rename from pkg/unittest/interfaces.dart
rename to pkg/unittest/lib/src/interfaces.dart
index 42c498b..3757f40 100644
--- a/pkg/unittest/interfaces.dart
+++ b/pkg/unittest/lib/src/interfaces.dart
@@ -14,7 +14,7 @@
  * error formatter with another.
  */
 
-part of unittest;
+part of matcher;
 
 typedef String ErrorFormatter(actual, Matcher matcher, String reason,
     MatchState matchState, bool verbose);
diff --git a/pkg/unittest/map_matchers.dart b/pkg/unittest/lib/src/map_matchers.dart
similarity index 98%
rename from pkg/unittest/map_matchers.dart
rename to pkg/unittest/lib/src/map_matchers.dart
index e4b40ba..4c1e572 100644
--- a/pkg/unittest/map_matchers.dart
+++ b/pkg/unittest/lib/src/map_matchers.dart
@@ -6,7 +6,7 @@
  * Returns a matcher which matches maps containing the given [value].
  */
 
-part of unittest;
+part of matcher;
 
 Matcher containsValue(value) => new _ContainsValue(value);
 
diff --git a/pkg/unittest/numeric_matchers.dart b/pkg/unittest/lib/src/numeric_matchers.dart
similarity index 99%
rename from pkg/unittest/numeric_matchers.dart
rename to pkg/unittest/lib/src/numeric_matchers.dart
index bb4cb96..e1f1adf 100644
--- a/pkg/unittest/numeric_matchers.dart
+++ b/pkg/unittest/lib/src/numeric_matchers.dart
@@ -7,7 +7,7 @@
  * than the given [value].
  */
 
-part of unittest;
+part of matcher;
 
 Matcher greaterThan(value) =>
   new _OrderingComparison(value, false, false, true, 'a value greater than');
diff --git a/pkg/unittest/operator_matchers.dart b/pkg/unittest/lib/src/operator_matchers.dart
similarity index 99%
rename from pkg/unittest/operator_matchers.dart
rename to pkg/unittest/lib/src/operator_matchers.dart
index 183be06..d5142be 100644
--- a/pkg/unittest/operator_matchers.dart
+++ b/pkg/unittest/lib/src/operator_matchers.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of unittest;
+part of matcher;
 
 /**
  * This returns a matcher that inverts [matcher] to its logical negation.
diff --git a/pkg/unittest/string_matchers.dart b/pkg/unittest/lib/src/string_matchers.dart
similarity index 99%
rename from pkg/unittest/string_matchers.dart
rename to pkg/unittest/lib/src/string_matchers.dart
index 8899379..8409f53 100644
--- a/pkg/unittest/string_matchers.dart
+++ b/pkg/unittest/lib/src/string_matchers.dart
@@ -7,7 +7,7 @@
  * is equal to [value] when compared case-insensitively.
  */
 
-part of unittest;
+part of matcher;
 
 Matcher equalsIgnoringCase(String value) => new _IsEqualIgnoringCase(value);
 
diff --git a/pkg/unittest/test_case.dart b/pkg/unittest/lib/src/test_case.dart
similarity index 96%
rename from pkg/unittest/test_case.dart
rename to pkg/unittest/lib/src/test_case.dart
index bf4f1a2..0b13cb1 100644
--- a/pkg/unittest/test_case.dart
+++ b/pkg/unittest/lib/src/test_case.dart
@@ -105,7 +105,7 @@
     _complete();
   }
 
-  void fail(String messageText, String stack) {
+  void fail(String messageText, [String stack = '']) {
     if (result != null) {
       if (result == PASS) {
         error('Test failed after initially passing: $messageText', stack);
@@ -120,7 +120,7 @@
     }
   }
 
-  void error(String messageText, String stack) {
+  void error(String messageText, [String stack = '']) {
     result = ERROR;
     message = messageText;
     stackTrace = stack;
diff --git a/pkg/unittest/unittest.dart b/pkg/unittest/lib/unittest.dart
similarity index 98%
rename from pkg/unittest/unittest.dart
rename to pkg/unittest/lib/unittest.dart
index 4f7bdf0..87a6f9d 100644
--- a/pkg/unittest/unittest.dart
+++ b/pkg/unittest/lib/unittest.dart
@@ -11,10 +11,10 @@
  *     dependencies:
  *       unittest:
  *         sdk: unittest
- *         
+ *
  * Then run 'pub install' from your project directory or using
  * the DartEditor.
- *         
+ *
  * Please see [Pub Getting Started](http://pub.dartlang.org/doc)
  * for more details about the pub package manager.
  *
@@ -148,21 +148,11 @@
 library unittest;
 
 import 'dart:isolate';
+import 'matcher.dart';
+export 'matcher.dart';
 
-part 'collection_matchers.dart';
-part 'config.dart';
-part 'core_matchers.dart';
-part 'description.dart';
-part 'expect.dart';
-part 'future_matchers.dart';
-part 'interfaces.dart';
-part 'map_matchers.dart';
-part 'matcher.dart';
-part 'mock.dart';
-part 'numeric_matchers.dart';
-part 'operator_matchers.dart';
-part 'string_matchers.dart';
-part 'test_case.dart';
+part 'src/config.dart';
+part 'src/test_case.dart';
 
 /** [Configuration] used by the unittest library. */
 Configuration _config = null;
@@ -860,6 +850,8 @@
     return;
   }
   _initialized = true;
+  // Hook our async guard into the matcher library.
+  wrapAsync = expectAsync1;
 
   _tests = <TestCase>[];
   _testRunner = _nextBatch;
diff --git a/pkg/unittest/vm_config.dart b/pkg/unittest/lib/vm_config.dart
similarity index 90%
rename from pkg/unittest/vm_config.dart
rename to pkg/unittest/lib/vm_config.dart
index e77f293..3a9efb8 100644
--- a/pkg/unittest/vm_config.dart
+++ b/pkg/unittest/lib/vm_config.dart
@@ -5,10 +5,10 @@
 /**
  * A simple unit test library for running tests on the VM.
  */
-#library('unittest_vm_config');
+library unittest_vm_config;
 
-#import('dart:io');
-#import('unittest.dart');
+import 'dart:io';
+import 'unittest.dart';
 
 class VmConfiguration extends Configuration {
   void onDone(int passed, int failed, int errors, List<TestCase> results,
diff --git a/pkg/unittest/test/instance_test.dart b/pkg/unittest/test/instance_test.dart
index f70127a..889d078 100644
--- a/pkg/unittest/test/instance_test.dart
+++ b/pkg/unittest/test/instance_test.dart
@@ -2,9 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('instance_test');
-#import('../../../pkg/unittest/unittest.dart');
-#source('test_utils.dart');
+library unittestTests;
+import '../../../pkg/unittest/lib/unittest.dart';
+
+part 'test_utils.dart';
 
 doesThrow() { throw 'X'; }
 
diff --git a/pkg/unittest/test/matchers_test.dart b/pkg/unittest/test/matchers_test.dart
index fe400f0..22f2f0c 100644
--- a/pkg/unittest/test/matchers_test.dart
+++ b/pkg/unittest/test/matchers_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('matcherTest');
-#import('../../../pkg/unittest/unittest.dart');
-#source('test_utils.dart');
+library unittestTests;
+import '../../../pkg/unittest/lib/unittest.dart';
+part 'test_utils.dart';
 
 doesNotThrow() {}
 doesThrow() { throw 'X'; }
@@ -126,17 +126,16 @@
     });
 
     test('throwsRangeError', () {
-      shouldPass(() { throw new RangeError.value(0); },
+      shouldPass(() { throw new RangeError(0); },
           throwsRangeError);
       shouldFail(() { throw new Exception(); },
           throwsRangeError,
         "Expected: throws an exception which matches RangeError "
-        "but:  exception <Exception> does not match "
-            "RangeError.");
+        "but:  exception <Exception> does not match RangeError.");
     });
 
     test('throwsNoSuchMethodError', () {
-      shouldPass(() { throw new NoSuchMethodError(null, '', null); },
+      shouldPass(() { throw new NoSuchMethodError(null, '', null, null); },
           throwsNoSuchMethodError);
       shouldFail(() { throw new Exception(); },
           throwsNoSuchMethodError,
@@ -145,14 +144,14 @@
             "NoSuchMethodError.");
     });
 
-    test('throwsNotImplementedException', () {
-      shouldPass(() { throw new NotImplementedException(''); },
-          throwsNotImplementedException);
+    test('throwsUnimplementedError', () {
+      shouldPass(() { throw new UnimplementedError(''); },
+          throwsUnimplementedError);
       shouldFail(() { throw new Exception(); },
-          throwsNotImplementedException,
-        "Expected: throws an exception which matches NotImplementedException "
+          throwsUnimplementedError,
+        "Expected: throws an exception which matches UnimplementedError "
         "but:  exception <Exception> does not match "
-            "NotImplementedException.");
+            "UnimplementedError.");
     });
 
     test('throwsNullPointerException', () {
diff --git a/pkg/unittest/test/mock_regexp_negative_test.dart b/pkg/unittest/test/mock_regexp_negative_test.dart
index 5f5267d..91811f5 100644
--- a/pkg/unittest/test/mock_regexp_negative_test.dart
+++ b/pkg/unittest/test/mock_regexp_negative_test.dart
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('unittestTest');
-#import('../../../pkg/unittest/unittest.dart');
+library mock_regexp_negative_test;
+import '../../../pkg/unittest/lib/unittest.dart';
+import '../../../pkg/unittest/lib/mock.dart';
 
 main() {
   test('Mocking: RegExp CallMatcher bad', () {
diff --git a/pkg/unittest/test/mock_stepwise_negative_test.dart b/pkg/unittest/test/mock_stepwise_negative_test.dart
index 9a29976..b6bbaf8 100644
--- a/pkg/unittest/test/mock_stepwise_negative_test.dart
+++ b/pkg/unittest/test/mock_stepwise_negative_test.dart
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('unittestTest');
-#import('../../../pkg/unittest/unittest.dart');
+library mock_stepwise_negative_test;
+import '../../../pkg/unittest/lib/unittest.dart';
+import '../../../pkg/unittest/lib/mock.dart';
 
 main() {
   test('Mocking: stepwiseValidate', () {
diff --git a/pkg/unittest/test/mock_test.dart b/pkg/unittest/test/mock_test.dart
index ea6426c..7a6534d 100644
--- a/pkg/unittest/test/mock_test.dart
+++ b/pkg/unittest/test/mock_test.dart
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('unittestTest');
-#import('../../../pkg/unittest/unittest.dart');
+library mock_test;
+import '../../../pkg/unittest/lib/unittest.dart';
+import '../../../pkg/unittest/lib/mock.dart';
 
 class MockList extends Mock implements List {
 }
diff --git a/pkg/unittest/test/test_utils.dart b/pkg/unittest/test/test_utils.dart
index 3d61abd..cdacdfc 100644
--- a/pkg/unittest/test/test_utils.dart
+++ b/pkg/unittest/test/test_utils.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of unittestTests;
+
 int errorCount;
 String errorString;
 var _testHandler = null;
diff --git a/pkg/unittest/test/unittest_test.dart b/pkg/unittest/test/unittest_test.dart
index ecf6c89..c7a474f 100644
--- a/pkg/unittest/test/unittest_test.dart
+++ b/pkg/unittest/test/unittest_test.dart
@@ -9,9 +9,9 @@
 // so the outer timeout doesn't fire. So I removed all such tests.
 // I'd like to revisit this at some point.
 
-#library('unittestTest');
-#import('dart:isolate');
-#import('../../../pkg/unittest/unittest.dart');
+library unittestTest;
+import 'dart:isolate';
+import '../../../pkg/unittest/lib/unittest.dart';
 
 var tests; // array of test names
 var expected; // array of test expected results (from buildStatusString)
diff --git a/pkg/unittest/test_controller.js b/pkg/unittest/test_controller.js
index 94c9f2f..5a7db1e 100644
--- a/pkg/unittest/test_controller.js
+++ b/pkg/unittest/test_controller.js
@@ -14,7 +14,12 @@
 // Set window onerror to make sure that we catch test harness errors across all
 // browsers.
 window.onerror = function (message, url, lineNumber) {
-  showErrorAndExit("\n\n" + url + ":" + lineNumber + ":\n" + message + "\n\n");
+  if (url) {
+    showErrorAndExit(
+        "\n\n" + url + ":" + lineNumber + ":\n" + message + "\n\n");
+  } else {
+    showErrorAndExit(message);
+  }
   window.postMessage('unittest-suite-external-error', '*');
 };
 
diff --git a/pkg/webdriver/base64decoder.dart b/pkg/webdriver/lib/src/base64decoder.dart
similarity index 86%
rename from pkg/webdriver/base64decoder.dart
rename to pkg/webdriver/lib/src/base64decoder.dart
index 343030f..616f2f4 100644
--- a/pkg/webdriver/base64decoder.dart
+++ b/pkg/webdriver/lib/src/base64decoder.dart
@@ -1,3 +1,9 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of webdriver;
+
 /**
  * A simple base64 decoder class, used to decode web browser screenshots
  * returned by WebDriver.
diff --git a/pkg/webdriver/webdriver.dart b/pkg/webdriver/lib/webdriver.dart
similarity index 98%
rename from pkg/webdriver/webdriver.dart
rename to pkg/webdriver/lib/webdriver.dart
index 64785fb..efb6a41 100644
--- a/pkg/webdriver/webdriver.dart
+++ b/pkg/webdriver/lib/webdriver.dart
@@ -1,9 +1,15 @@
-#library('webdriver');
-#import('dart:json');
-#import('dart:uri');
-#import('dart:io');
-#import('dart:math');
-#source('base64decoder.dart');
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library webdriver;
+
+import 'dart:json';
+import 'dart:uri';
+import 'dart:io';
+import 'dart:math';
+
+part 'src/base64decoder.dart';
 
 /**
  * WebDriver bindings for Dart.
diff --git a/pkg/webdriver/pubspec.yaml b/pkg/webdriver/pubspec.yaml
new file mode 100644
index 0000000..d5bd4fa
--- /dev/null
+++ b/pkg/webdriver/pubspec.yaml
@@ -0,0 +1,5 @@
+name: webdriver
+description: >
+ Provides WedDriver bindings for Dart. These use the WebDriver JSON
+ interface, and as such, require the use of the WebDriver remote server.
+
diff --git a/pkg/webdriver/test/webdrivertest.dart b/pkg/webdriver/test/webdrivertest.dart
index af7655b..69b8073 100644
--- a/pkg/webdriver/test/webdrivertest.dart
+++ b/pkg/webdriver/test/webdrivertest.dart
@@ -1,6 +1,6 @@
-#library('webdriver_test');
-#import('../webdriver.dart');
-#import('../../../pkg/unittest/unittest.dart');
+library webdriver_test;
+import '../webdriver.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 
 WebDriver web_driver;
 
diff --git a/runtime/bin/bin.gypi b/runtime/bin/bin.gypi
index c851c97..3cde1ee 100644
--- a/runtime/bin/bin.gypi
+++ b/runtime/bin/bin.gypi
@@ -84,7 +84,7 @@
         'io.dart',
       ],
       'includes': [
-        '../../lib/io/iolib_sources.gypi',
+        '../../sdk/lib/io/iolib_sources.gypi',
       ],
       'actions': [
         {
@@ -322,6 +322,9 @@
         '../vm/debugger_api_impl.cc',
         '<(version_cc_file)',
       ],
+      'defines': [
+        'DART_SHARED_LIB',
+      ],
     },
     {
       # Completely statically linked binary for generating snapshots.
@@ -472,6 +475,13 @@
           'link_settings': {
             'libraries': [ '-lws2_32.lib', '-lRpcrt4.lib' ],
           },
+          # Generate an import library on Windows, by exporting a function.
+          # Extensions use this import library to link to the API in dart.exe.
+          'msvs_settings': {
+            'VCLinkerTool': {
+              'AdditionalOptions': [ '/EXPORT:Dart_True' ],
+            },
+          },
        }]],
     },
     {
@@ -543,6 +553,7 @@
         'test_extension_dllmain_win.cc',
       ],
       'defines': [
+        # The only effect of DART_SHARED_LIB is to export the Dart API entries.
         'DART_SHARED_LIB',
       ],
       'conditions': [
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 5807fc6..27b7e09 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -106,7 +106,7 @@
       throw "Not a known scheme: $uri";
   }
 
-  if (isWindows) {
+  if (isWindows && path.startsWith("/")) {
     // For Windows we need to massage the paths a bit according to
     // http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx
     //
diff --git a/runtime/bin/builtin_natives.cc b/runtime/bin/builtin_natives.cc
index 995207c..68258c3 100644
--- a/runtime/bin/builtin_natives.cc
+++ b/runtime/bin/builtin_natives.cc
@@ -103,17 +103,16 @@
 // test/debug functionality in standalone dart mode.
 
 void Builtin::PrintString(FILE* out, Dart_Handle str) {
-  const char* chars = NULL;
-
-  Dart_Handle result = Dart_StringToCString(str, &chars);
+  intptr_t length = 0;
+  uint8_t* chars = NULL;
+  Dart_Handle result = Dart_StringToUTF8(str, &chars, &length);
   if (Dart_IsError(result)) {
     // TODO(turnidge): Consider propagating some errors here.  What if
     // an isolate gets interrupted by the embedder in the middle of
-    // Dart_StringToBytes?  We need to make sure not to swallow the
+    // Dart_StringToUTF8?  We need to make sure not to swallow the
     // interrupt.
     fputs(Dart_GetError(result), out);
   } else {
-    intptr_t length = strlen(chars);
     fwrite(chars, sizeof(*chars), length, out);
   }
   fputc('\n', out);
diff --git a/runtime/bin/crypto_sources.gypi b/runtime/bin/crypto_sources.gypi
index 302edbe..fc8f00f 100644
--- a/runtime/bin/crypto_sources.gypi
+++ b/runtime/bin/crypto_sources.gypi
@@ -6,15 +6,15 @@
 #
 # TODO(ager): ../lib/crypto/crypto_vm.dart should be removed when the
 # VM can use the #source directive for libraries.  At that point
-# ../../lib/crypto/crypto.dart should be the only crypto library file.
+# ../../sdk/lib/crypto/crypto.dart should be the only crypto library file.
 {
   'sources': [
     '../lib/crypto/crypto_vm.dart',
-    '../../lib/crypto/crypto_utils.dart',
-    '../../lib/crypto/hash_utils.dart',
-    '../../lib/crypto/hmac.dart',
-    '../../lib/crypto/md5.dart',
-    '../../lib/crypto/sha1.dart',
-    '../../lib/crypto/sha256.dart',
+    '../../sdk/lib/crypto/crypto_utils.dart',
+    '../../sdk/lib/crypto/hash_utils.dart',
+    '../../sdk/lib/crypto/hmac.dart',
+    '../../sdk/lib/crypto/md5.dart',
+    '../../sdk/lib/crypto/sha1.dart',
+    '../../sdk/lib/crypto/sha256.dart',
   ],
 }
diff --git a/runtime/bin/json_sources.gypi b/runtime/bin/json_sources.gypi
index c41f93e..6c9ca3d 100644
--- a/runtime/bin/json_sources.gypi
+++ b/runtime/bin/json_sources.gypi
@@ -5,6 +5,6 @@
 # This file contains all sources for the dart:io library.
 {
   'sources': [
-    '../../lib/json/json.dart',
+    '../../sdk/lib/json/json.dart',
   ],
 }
diff --git a/runtime/bin/uri_sources.gypi b/runtime/bin/uri_sources.gypi
index e100e90..36a9e3c 100644
--- a/runtime/bin/uri_sources.gypi
+++ b/runtime/bin/uri_sources.gypi
@@ -5,8 +5,8 @@
 # This file contains all sources for the dart:uri library.
 {
   'sources': [
-    '../../lib/uri/uri.dart',
-    '../../lib/uri/helpers.dart',
-    '../../lib/uri/encode_decode.dart',
+    '../../sdk/lib/uri/uri.dart',
+    '../../sdk/lib/uri/helpers.dart',
+    '../../sdk/lib/uri/encode_decode.dart',
   ],
 }
diff --git a/runtime/bin/utf_sources.gypi b/runtime/bin/utf_sources.gypi
index 4698fcd..a8fc95b 100644
--- a/runtime/bin/utf_sources.gypi
+++ b/runtime/bin/utf_sources.gypi
@@ -6,7 +6,7 @@
 #
 # TODO(ager): ../lib/utf/utf_vm.dart should be removed when the
 # VM can use the #source directive for libraries.  At that point
-# ../../lib/utf/utf.dart should be the only utf library file.
+# ../../sdk/lib/utf/utf.dart should be the only utf library file.
 {
   'sources': [
     # The utf_vm.dart file needs to be the first source file. It contains
@@ -15,9 +15,9 @@
     # in the order they are listed.
     '../lib/utf/utf_vm.dart',
 
-    '../../lib/utf/utf_core.dart',
-    '../../lib/utf/utf8.dart',
-    '../../lib/utf/utf16.dart',
-    '../../lib/utf/utf32.dart',
+    '../../sdk/lib/utf/utf_core.dart',
+    '../../sdk/lib/utf/utf8.dart',
+    '../../sdk/lib/utf/utf16.dart',
+    '../../sdk/lib/utf/utf32.dart',
   ],
 }
diff --git a/runtime/dart-runtime.gyp b/runtime/dart-runtime.gyp
index 8eb37ec..9286e71 100644
--- a/runtime/dart-runtime.gyp
+++ b/runtime/dart-runtime.gyp
@@ -67,6 +67,7 @@
         '<(version_cc_file)',
       ],
       'defines': [
+        # The only effect of DART_SHARED_LIB is to export the Dart API entries.
         'DART_SHARED_LIB',
       ],
       'direct_dependent_settings': {
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 17c2dc0..33f1775 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -1455,15 +1455,16 @@
  * Gets a UTF-8 encoded representation of a String.
  *
  * \param str A string.
- * \param utf8_array An array allocated by the caller, used to return
- *   the array of UTF-8 encoded characters.
- * \param length Used to pass in the length of the provided array.
- *   Used to return the length of the array which was actually used.
+ * \param utf8_array Returns the String represented as UTF-8 code
+ *   units.  This UTF-8 array is scope allocated and is only valid
+ *   until the next call to Dart_ExitScope.
+ * \param length Used to return the length of the array which was
+ *   actually used.
  *
  * \return A valid handle if no error occurs during the operation.
  */
 DART_EXPORT Dart_Handle Dart_StringToUTF8(Dart_Handle str,
-                                          uint8_t* utf8_array,
+                                          uint8_t** utf8_array,
                                           intptr_t* length);
 
 /**
diff --git a/runtime/lib/function_patch.dart b/runtime/lib/function_patch.dart
index c90dc6e..a82084e 100644
--- a/runtime/lib/function_patch.dart
+++ b/runtime/lib/function_patch.dart
@@ -6,6 +6,6 @@
   /* patch */ static apply(Function function,
                            List positionalArguments,
                            [Map<String,Dynamic> namedArguments]) {
-    throw new NotImplementedException('Function.apply not implemented');
+    throw new UnimplementedError('Function.apply not implemented');
   }
 }
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index d2fec8b..2fdef36 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -335,7 +335,7 @@
 static bool RunIsolate(uword parameter) {
   Isolate* isolate = reinterpret_cast<Isolate*>(parameter);
   SpawnState* state = reinterpret_cast<SpawnState*>(isolate->spawn_data());
-  isolate->set_spawn_data(NULL);
+  isolate->set_spawn_data(0);
   {
     StartIsolateScope start_scope(isolate);
     StackZone zone(isolate);
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index 0233d09..969e1ae 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -95,7 +95,7 @@
 
 abstract class _LocalMirrorImpl implements Mirror {
   int get hashCode {
-    throw new NotImplementedException('Mirror.hashCode is not implemented');
+    throw new UnimplementedError('Mirror.hashCode is not implemented');
   }
 
   // Local mirrors always return the same MirrorSystem.  This field
@@ -144,7 +144,7 @@
                                 List positionalArguments,
                                 [Map<String,Dynamic> namedArguments]) {
     if (namedArguments != null) {
-      throw new NotImplementedException(
+      throw new UnimplementedError(
           'named argument support is not implemented');
     }
     // Walk the arguments and make sure they are legal.
@@ -300,14 +300,14 @@
   final MethodMirror function;
 
   String get source {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'ClosureMirror.source is not implemented');
   }
 
   Future<InstanceMirror> apply(List<Object> positionalArguments,
                                [Map<String,Object> namedArguments]) {
     if (namedArguments != null) {
-      throw new NotImplementedException(
+      throw new UnimplementedError(
           'named argument support is not implemented');
     }
     // Walk the arguments and make sure they are legal.
@@ -326,7 +326,7 @@
   }
 
   Future<InstanceMirror> findInContext(String name) {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'ClosureMirror.findInContext() is not implemented');
   }
 
@@ -345,13 +345,13 @@
       } else if (typeName == 'void') {
         return mirrors.voidType;
       } else {
-        throw new NotImplementedException(
+        throw new UnimplementedError(
             "Mirror for type '$typeName' is not implemented");
       }
     }
     var resolved = mirrors.libraries[libraryName].members[typeName];
     if (resolved == null) {
-      throw new NotImplementedException(
+      throw new UnimplementedError(
           "Mirror for type '$typeName' is not implemented");
     }
     return resolved;
@@ -403,7 +403,7 @@
   final bool isTopLevel = true;
 
   SourceLocation get location {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'ClassMirror.location is not implemented');
   }
 
@@ -485,17 +485,17 @@
   Map<String, TypeVariableMirror> typeVariables;
 
   Map<String, TypeMirror> get typeArguments {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'ClassMirror.typeArguments is not implemented');
   }
 
   bool get isOriginalDeclaration {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'ClassMirror.isOriginalDeclaration is not implemented');
   }
 
   ClassMirror get genericDeclaration {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'ClassMirror.originalDeclaration is not implemented');
   }
 
@@ -505,7 +505,7 @@
                                      List positionalArguments,
                                      [Map<String,Dynamic> namedArguments]) {
     if (namedArguments != null) {
-      throw new NotImplementedException(
+      throw new UnimplementedError(
           'named argument support is not implemented');
     }
     // Walk the arguments and make sure they are legal.
@@ -610,7 +610,7 @@
   final bool isTopLevel = false;
 
   SourceLocation get location {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'TypeVariableMirror.location is not implemented');
   }
 
@@ -654,7 +654,7 @@
   final bool isTopLevel = true;
 
   SourceLocation get location {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'TypedefMirror.location is not implemented');
   }
 
@@ -702,7 +702,7 @@
   final bool isTopLevel = false;
 
   SourceLocation get location {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'LibraryMirror.location is not implemented');
   }
 
@@ -799,7 +799,7 @@
   bool get isTopLevel =>  owner is LibraryMirror;
 
   SourceLocation get location {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'MethodMirror.location is not implemented');
   }
 
@@ -819,7 +819,7 @@
   bool get isRegularMethod => !isGetter && !isSetter && !isConstructor;
 
   TypeMirror get isOperator {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'MethodMirror.isOperator is not implemented');
   }
 
@@ -891,7 +891,7 @@
   }
 
   SourceLocation get location {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'VariableMirror.location is not implemented');
   }
 
@@ -917,12 +917,12 @@
   final bool isOptional;
 
   String get defaultValue {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'ParameterMirror.defaultValue is not implemented');
   }
 
   bool get hasDefaultValue {
-    throw new NotImplementedException(
+    throw new UnimplementedError(
         'ParameterMirror.hasDefaultValue is not implemented');
   }
 }
@@ -956,7 +956,7 @@
       }
     } else {
       // Make a remote mirror system
-      throw new NotImplementedException(
+      throw new UnimplementedError(
           'Remote mirror support is not implemented');
     }
     return completer.future;
diff --git a/runtime/lib/mirrors_sources.gypi b/runtime/lib/mirrors_sources.gypi
index 1bce812..8f1f805 100644
--- a/runtime/lib/mirrors_sources.gypi
+++ b/runtime/lib/mirrors_sources.gypi
@@ -6,7 +6,7 @@
 
 {
   'sources': [
-    '../../lib/mirrors/mirrors.dart',
+    '../../sdk/lib/mirrors/mirrors.dart',
     'mirrors.cc',
     'mirrors.h',
     'mirrors_impl.dart',
diff --git a/runtime/tests/vm/dart/isolate_mirror_remote_test.dart b/runtime/tests/vm/dart/isolate_mirror_remote_test.dart
index e1a1c64..6bf6537 100644
--- a/runtime/tests/vm/dart/isolate_mirror_remote_test.dart
+++ b/runtime/tests/vm/dart/isolate_mirror_remote_test.dart
@@ -27,6 +27,6 @@
     mirrorSystemOf(sp).then(testMirrorSystem);
     Expect.fail('Should not reach here.  Remote isolates not implemented.');
   } catch (exception) {
-    Expect.isTrue(exception is NotImplementedException);
+    Expect.isTrue(exception is UnimplementedError);
   }
 }
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index 96ff9af..3498c6b 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -906,7 +906,7 @@
     : AstNode(token_pos),
       kind_(kind),
       label_(label),
-      inlined_finally_list_(NULL) {
+      inlined_finally_list_() {
     ASSERT(label_ != NULL);
     ASSERT(kind_ == Token::kBREAK || kind_ == Token::kCONTINUE);
     if (kind_ == Token::kCONTINUE) {
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index ccc840c..29a2417 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -233,7 +233,8 @@
 static char* ComputeDart2JSPath(const char* arg) {
   char buffer[2048];
   char* dart2js_path = strdup(File::GetCanonicalPath(arg));
-  const char* compiler_path = "%s%slib%scompiler%scompiler.dart";
+  const char* compiler_path =
+      "%s%ssdk%slib%s_internal%scompiler%scompiler.dart";
   const char* path_separator = File::PathSeparator();
   ASSERT(path_separator != NULL && strlen(path_separator) == 1);
   char* ptr = strrchr(dart2js_path, *path_separator);
@@ -243,6 +244,8 @@
                 dart2js_path,
                 path_separator,
                 path_separator,
+                path_separator,
+                path_separator,
                 path_separator);
     if (File::Exists(buffer)) {
       break;
@@ -271,7 +274,8 @@
   char* dart_root = ComputeDart2JSPath(Benchmark::Executable());
   char* script = NULL;
   if (dart_root != NULL) {
-    const char* kFormatStr ="#import('%s/lib/compiler/compiler.dart');";
+    const char* kFormatStr =
+        "#import('%s/sdk/lib/_internal/compiler/compiler.dart');";
     intptr_t len = OS::SNPrint(NULL, 0, kFormatStr, dart_root) + 1;
     script = reinterpret_cast<char*>(malloc(len));
     EXPECT(script != NULL);
@@ -282,7 +286,7 @@
     EXPECT_VALID(lib);
   } else {
     Dart_Handle lib = TestCase::LoadTestScript(
-        "#import('lib/compiler/compiler.dart');",
+        "#import('sdk/lib/_internal/compiler/compiler.dart');",
         reinterpret_cast<Dart_NativeEntryResolver>(NativeResolver));
     EXPECT_VALID(lib);
   }
diff --git a/runtime/vm/cha.cc b/runtime/vm/cha.cc
index 63dde76..01aabcc 100644
--- a/runtime/vm/cha.cc
+++ b/runtime/vm/cha.cc
@@ -70,6 +70,27 @@
 }
 
 
+bool CHA::HasOverride(const Class& cls, const String& function_name) {
+  const GrowableObjectArray& cls_direct_subclasses =
+      GrowableObjectArray::Handle(cls.direct_subclasses());
+  if (cls_direct_subclasses.IsNull()) {
+    return false;
+  }
+  Class& direct_subclass = Class::Handle();
+  for (intptr_t i = 0; i < cls_direct_subclasses.Length(); i++) {
+    direct_subclass ^= cls_direct_subclasses.At(i);
+    if (direct_subclass.LookupDynamicFunction(function_name) !=
+        Function::null()) {
+      return true;
+    }
+    if (HasOverride(direct_subclass, function_name)) {
+      return true;
+    }
+  }
+  return false;
+}
+
+
 ZoneGrowableArray<Function*>* CHA::GetNamedInstanceFunctionsOf(
     const ZoneGrowableArray<intptr_t>& cids,
     const String& function_name) {
diff --git a/runtime/vm/cha.h b/runtime/vm/cha.h
index 9eb25ff..d20445f 100644
--- a/runtime/vm/cha.h
+++ b/runtime/vm/cha.h
@@ -9,6 +9,7 @@
 
 namespace dart {
 
+class Class;
 class Function;
 template <typename T> class ZoneGrowableArray;
 class String;
@@ -33,6 +34,9 @@
   // Returns an array of functions overriding the given function.
   // Must not be called for a function of class Object.
   static ZoneGrowableArray<Function*>* GetOverridesOf(const Function& function);
+
+  // Returns true if any subclass of 'cls' contains the function.
+  static bool HasOverride(const Class& cls, const String& function_name);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index dec72be..f2bb1dc 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -711,6 +711,8 @@
                             parameterized_class.NumTypeParameters();
     type_parameter.set_index(type_parameter.index() + offset);
     type_parameter.set_is_finalized();
+    // TODO(regis): We are not able to finalize the bound here without getting
+    // into cycles. Revisit.
     // We do not canonicalize type parameters.
     return type_parameter.raw();
   }
@@ -953,6 +955,8 @@
 }
 
 
+// Check if an instance field or method of same name exists
+// in any super class.
 static RawClass* FindSuperOwnerOfInstanceMember(const Class& cls,
                                                 const String& name) {
   Class& super_class = Class::Handle();
@@ -960,7 +964,6 @@
   Field& field = Field::Handle();
   super_class = cls.SuperClass();
   while (!super_class.IsNull()) {
-    // Check if an instance member of same name exists in any super class.
     function = super_class.LookupFunction(name);
     if (!function.IsNull() && !function.is_static()) {
       return super_class.raw();
@@ -975,13 +978,13 @@
 }
 
 
+// Check if an instance method of same name exists in any super class.
 static RawClass* FindSuperOwnerOfFunction(const Class& cls,
                                           const String& name) {
   Class& super_class = Class::Handle();
   Function& function = Function::Handle();
   super_class = cls.SuperClass();
   while (!super_class.IsNull()) {
-    // Check if a function of same name exists in any super class.
     function = super_class.LookupFunction(name);
     if (!function.IsNull() && !function.is_static()) {
       return super_class.raw();
@@ -1021,8 +1024,6 @@
   // The only compile errors we report are therefore:
   // - a getter having the same name as a method (but not a getter) in a super
   //   class or in a subclass.
-  // - a setter having the same name as a method (but not a setter) in a super
-  //   class or in a subclass.
   // - a static field, instance field, or static method (but not an instance
   //   method) having the same name as an instance member in a super class.
 
@@ -1040,18 +1041,36 @@
     type = FinalizeType(cls, type, kCanonicalize);
     field.set_type(type);
     name = field.name();
-    super_class = FindSuperOwnerOfInstanceMember(cls, name);
-    if (!super_class.IsNull()) {
-      const String& class_name = String::Handle(cls.Name());
-      const String& super_class_name = String::Handle(super_class.Name());
-      const Script& script = Script::Handle(cls.script());
-      ReportError(script, field.token_pos(),
-                  "field '%s' of class '%s' conflicts with instance "
-                  "member '%s' of super class '%s'",
-                  name.ToCString(),
-                  class_name.ToCString(),
-                  name.ToCString(),
-                  super_class_name.ToCString());
+    if (field.is_static()) {
+      super_class = FindSuperOwnerOfInstanceMember(cls, name);
+      if (!super_class.IsNull()) {
+        const String& class_name = String::Handle(cls.Name());
+        const String& super_class_name = String::Handle(super_class.Name());
+        const Script& script = Script::Handle(cls.script());
+        ReportError(script, field.token_pos(),
+                    "static field '%s' of class '%s' conflicts with "
+                    "instance member '%s' of super class '%s'",
+                    name.ToCString(),
+                    class_name.ToCString(),
+                    name.ToCString(),
+                    super_class_name.ToCString());
+      }
+    } else {
+      // Instance field. Check whether the field overrides a method
+      // (but not getter).
+      super_class = FindSuperOwnerOfFunction(cls, name);
+      if (!super_class.IsNull()) {
+        const String& class_name = String::Handle(cls.Name());
+        const String& super_class_name = String::Handle(super_class.Name());
+        const Script& script = Script::Handle(cls.script());
+        ReportError(script, field.token_pos(),
+                    "field '%s' of class '%s' conflicts with method '%s' "
+                    "of super class '%s'",
+                    name.ToCString(),
+                    class_name.ToCString(),
+                    name.ToCString(),
+                    super_class_name.ToCString());
+      }
     }
   }
   // Collect interfaces, super interfaces, and super classes of this class.
@@ -1129,22 +1148,9 @@
                     name.ToCString(),
                     super_class_name.ToCString());
       }
-    } else if (function.IsSetterFunction()) {
-      name = Field::NameFromSetter(function_name);
-      super_class = FindSuperOwnerOfFunction(cls, name);
-      if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(cls.Name());
-        const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(script, function.token_pos(),
-                    "setter '%s' of class '%s' conflicts with "
-                    "function '%s' of super class '%s'",
-                    name.ToCString(),
-                    class_name.ToCString(),
-                    name.ToCString(),
-                    super_class_name.ToCString());
-      }
-    } else {
+    } else if (!function.IsSetterFunction()) {
+      // A function cannot conflict with a setter, since they cannot
+      // have the same name. Thus, we do not need to check setters.
       name = Field::GetterName(function_name);
       super_class = FindSuperOwnerOfFunction(cls, name);
       if (!super_class.IsNull()) {
@@ -1159,20 +1165,6 @@
                     function_name.ToCString(),
                     super_class_name.ToCString());
       }
-      name = Field::SetterName(function_name);
-      super_class = FindSuperOwnerOfFunction(cls, name);
-      if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(cls.Name());
-        const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(script, function.token_pos(),
-                    "function '%s' of class '%s' conflicts with "
-                    "setter '%s' of super class '%s'",
-                    function_name.ToCString(),
-                    class_name.ToCString(),
-                    function_name.ToCString(),
-                    super_class_name.ToCString());
-      }
     }
   }
 }
diff --git a/runtime/vm/code_generator.h b/runtime/vm/code_generator.h
index 34b60f0..7716ccf 100644
--- a/runtime/vm/code_generator.h
+++ b/runtime/vm/code_generator.h
@@ -84,6 +84,7 @@
   V(UnboxInteger)                                                              \
   V(CheckClass)                                                                \
   V(CheckSmi)                                                                  \
+  V(CheckArrayBound)                                                           \
   V(AtCall)                                                                    \
   V(NumReasons)                                                                \
 
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 7007b6a..16c426e 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -132,10 +132,7 @@
                        &CompilerStats::graphbuilder_timer,
                        isolate);
       if (optimized) {
-        // Transition to optimized code only from unoptimized code ...
-        // for now.
         ASSERT(parsed_function.function().HasCode());
-        ASSERT(!parsed_function.function().HasOptimizedCode());
         // Extract type feedback before the graph is built, as the graph
         // builder uses it to attach it to nodes.
         // Do not use type feedback to optimize a function that was
@@ -151,7 +148,8 @@
 
       // Build the flow graph.
       FlowGraphBuilder builder(parsed_function);
-      flow_graph = builder.BuildGraph(FlowGraphBuilder::kNotInlining);
+      flow_graph = builder.BuildGraph(FlowGraphBuilder::kNotInlining,
+                                      0);  // The initial loop depth is zero.
     }
 
     if (optimized) {
@@ -280,8 +278,8 @@
       graph_compiler.FinalizeExceptionHandlers(code);
       graph_compiler.FinalizeComments(code);
       if (optimized) {
+        CodePatcher::PatchEntry(Code::Handle(function.CurrentCode()));
         function.SetCode(code);
-        CodePatcher::PatchEntry(Code::Handle(function.unoptimized_code()));
         if (FLAG_trace_compiler) {
           OS::Print("--> patching entry %#"Px"\n",
                     Code::Handle(function.unoptimized_code()).EntryPoint());
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 7194b57..202a81f 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -33,7 +33,6 @@
 namespace dart {
 
 DECLARE_FLAG(bool, print_class_table);
-DECLARE_FLAG(bool, use_cha);
 
 ThreadLocalKey Api::api_native_key_ = Thread::kUnsetThreadLocalKey;
 
@@ -143,7 +142,7 @@
     }                                                                          \
     return type::Handle(iso);                                                  \
   }
-CLASS_LIST_NO_OBJECT(DEFINE_UNWRAP)
+CLASS_LIST_FOR_HANDLES(DEFINE_UNWRAP)
 #undef DEFINE_UNWRAP
 
 
@@ -1643,6 +1642,9 @@
                                              const char** cstr) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
+  if (cstr == NULL) {
+    RETURN_NULL_ERROR(cstr);
+  }
   const String& str_obj = Api::UnwrapStringHandle(isolate, object);
   if (str_obj.IsNull()) {
     RETURN_TYPE_ERROR(isolate, object, String);
@@ -1661,20 +1663,27 @@
 
 
 DART_EXPORT Dart_Handle Dart_StringToUTF8(Dart_Handle str,
-                                          uint8_t* utf8_array,
+                                          uint8_t** utf8_array,
                                           intptr_t* length) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
+  if (utf8_array == NULL) {
+    RETURN_NULL_ERROR(utf8_array);
+  }
+  if (length == NULL) {
+    RETURN_NULL_ERROR(length);
+  }
   const String& str_obj = Api::UnwrapStringHandle(isolate, str);
   if (str_obj.IsNull()) {
     RETURN_TYPE_ERROR(isolate, str, String);
   }
-  intptr_t str_len = str_obj.Length();
-  if (str_len > *length) {
-    return Api::NewError("Input array is not large enough to hold the result");
+  intptr_t str_len = Utf8::Length(str_obj);
+  *utf8_array = Api::TopScope(isolate)->zone()->Alloc<uint8_t>(str_len);
+  if (*utf8_array == NULL) {
+    return Api::NewError("Unable to allocate memory");
   }
-  str_obj.ToUTF8(utf8_array, str_len);
-  *length= str_len;
+  str_obj.ToUTF8(*utf8_array, str_len);
+  *length = str_len;
   return Api::Success(isolate);
 }
 
@@ -4002,45 +4011,11 @@
 }
 
 
-// Removes optimized code once we load more classes, since --use_cha based
-// optimizations may have become invalid.
-// TODO(srdjan): Note which functions use which CHA decision and deoptimize
-// only the necessary ones.
-static void RemoveOptimizedCode() {
-  ASSERT(FLAG_use_cha);
-  // Deoptimize all live frames.
-  DeoptimizeAll();
-  // Switch all functions' code to unoptimized.
-  const ClassTable& class_table = *Isolate::Current()->class_table();
-  Class& cls = Class::Handle();
-  Array& array = Array::Handle();
-  Function& function = Function::Handle();
-  const intptr_t num_cids = class_table.NumCids();
-  for (intptr_t i = kInstanceCid; i < num_cids; i++) {
-    if (!class_table.HasValidClassAt(i)) continue;
-    cls = class_table.At(i);
-    ASSERT(!cls.IsNull());
-    array = cls.functions();
-    intptr_t num_functions = array.IsNull() ? 0 : array.Length();
-    for (intptr_t f = 0; f < num_functions; f++) {
-      function ^= array.At(f);
-      ASSERT(!function.IsNull());
-      if (function.HasOptimizedCode()) {
-        function.SwitchToUnoptimizedCode();
-      }
-    }
-  }
-}
-
-
 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url,
                                         Dart_Handle source) {
   TIMERSCOPE(time_script_loading);
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  if (FLAG_use_cha) {
-    RemoveOptimizedCode();
-  }
   const String& url_str = Api::UnwrapStringHandle(isolate, url);
   if (url_str.IsNull()) {
     RETURN_TYPE_ERROR(isolate, url, String);
@@ -4078,9 +4053,6 @@
   if (buffer == NULL) {
     RETURN_NULL_ERROR(buffer);
   }
-  if (FLAG_use_cha) {
-    RemoveOptimizedCode();
-  }
   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer);
   if (!snapshot->IsScriptSnapshot()) {
     return Api::NewError("%s expects parameter 'buffer' to be a script type"
@@ -4252,9 +4224,6 @@
   TIMERSCOPE(time_script_loading);
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  if (FLAG_use_cha) {
-    RemoveOptimizedCode();
-  }
   const String& url_str = Api::UnwrapStringHandle(isolate, url);
   if (url_str.IsNull()) {
     RETURN_TYPE_ERROR(isolate, url, String);
@@ -4344,9 +4313,6 @@
   TIMERSCOPE(time_script_loading);
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  if (FLAG_use_cha) {
-    RemoveOptimizedCode();
-  }
   const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
   if (lib.IsNull()) {
     RETURN_TYPE_ERROR(isolate, library, Library);
@@ -4372,9 +4338,6 @@
   TIMERSCOPE(time_script_loading);
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  if (FLAG_use_cha) {
-    RemoveOptimizedCode();
-  }
   const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
   if (lib.IsNull()) {
     RETURN_TYPE_ERROR(isolate, library, Library);
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 28c24dc..674b643c 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -81,7 +81,7 @@
 #define DECLARE_UNWRAP(Type)                                                   \
   static const Type& Unwrap##Type##Handle(Isolate* isolate,                    \
                                           Dart_Handle object);
-  CLASS_LIST_NO_OBJECT(DECLARE_UNWRAP)
+  CLASS_LIST_FOR_HANDLES(DECLARE_UNWRAP)
 #undef DECLARE_UNWRAP
 
   // Validates and converts the passed in handle as a local handle.
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index 26e2eb1..0ead0a2 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -940,7 +940,9 @@
     exits.Sort(LowestBlockIdFirst);
     // Create a join of the returns.
     JoinEntryInstr* join =
-        new JoinEntryInstr(++max_block_id_, CatchClauseNode::kInvalidTryIndex);
+        new JoinEntryInstr(++max_block_id_,
+                           CatchClauseNode::kInvalidTryIndex,
+                           caller_entry->loop_depth());
     for (intptr_t i = 0; i < exits.length(); ++i) {
       ReturnInstr* exit_instr = exits[i]->last_instruction()->AsReturn();
       ASSERT(exit_instr != NULL);
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 5684503..96d9e43 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -162,7 +162,9 @@
     temp_index_ = true_fragment.temp_index();
   } else {
     JoinEntryInstr* join =
-        new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+        new JoinEntryInstr(owner()->AllocateBlockId(),
+                           owner()->try_index(),
+                           loop_depth());
     true_exit->Goto(join);
     false_exit->Goto(join);
     exit_ = join;
@@ -191,7 +193,9 @@
     Append(test_fragment);
   } else {
     JoinEntryInstr* join =
-        new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+        new JoinEntryInstr(owner()->AllocateBlockId(),
+                           owner()->try_index(),
+                           loop_depth() + 1);
     join->LinkTo(test_fragment.entry());
     Goto(join);
     body_exit->Goto(join);
@@ -303,7 +307,9 @@
   ASSERT(!branches.is_empty());
   for (intptr_t i = 0; i < branches.length(); i++) {
     TargetEntryInstr* target =
-        new TargetEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+        new TargetEntryInstr(owner()->AllocateBlockId(),
+                             owner()->try_index(),
+                             loop_depth());
     *(branches[i]) = target;
     target->Goto(join);
   }
@@ -326,13 +332,17 @@
 
   if (branches.length() == 1) {
     TargetEntryInstr* target =
-        new TargetEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+        new TargetEntryInstr(owner()->AllocateBlockId(),
+                             owner()->try_index(),
+                             loop_depth());
     *(branches[0]) = target;
     return target;
   }
 
   JoinEntryInstr* join =
-      new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+      new JoinEntryInstr(owner()->AllocateBlockId(),
+                         owner()->try_index(),
+                         loop_depth());
   ConnectBranchesTo(branches, join);
   return join;
 }
@@ -425,11 +435,13 @@
   if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) {
     TestGraphVisitor for_left(owner(),
                               temp_index(),
+                              loop_depth(),
                               node->left()->token_pos());
     node->left()->Visit(&for_left);
 
     TestGraphVisitor for_right(owner(),
                                temp_index(),
+                               loop_depth(),
                                node->right()->token_pos());
     node->right()->Visit(&for_right);
 
@@ -468,13 +480,13 @@
 // <Statement> ::= Return { value:                <Expression>
 //                          inlined_finally_list: <InlinedFinally>* }
 void EffectGraphVisitor::VisitReturnNode(ReturnNode* node) {
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner(), temp_index(), loop_depth());
   node->value()->Visit(&for_value);
   Append(for_value);
 
   for (intptr_t i = 0; i < node->inlined_finally_list_length(); i++) {
     InlineBailout("EffectGraphVisitor::VisitReturnNode (exception)");
-    EffectGraphVisitor for_effect(owner(), temp_index());
+    EffectGraphVisitor for_effect(owner(), temp_index(), loop_depth());
     node->InlinedFinallyNodeAt(i)->Visit(&for_effect);
     Append(for_effect);
     if (!is_open()) return;
@@ -599,7 +611,7 @@
 
 
 void ValueGraphVisitor::VisitAssignableNode(AssignableNode* node) {
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner(), temp_index(), loop_depth());
   node->expr()->Visit(&for_value);
   Append(for_value);
   ReturnValue(BuildAssignableValue(node->expr()->token_pos(),
@@ -619,11 +631,12 @@
     // See ValueGraphVisitor::VisitBinaryOpNode.
     TestGraphVisitor for_left(owner(),
                               temp_index(),
+                              loop_depth(),
                               node->left()->token_pos());
     node->left()->Visit(&for_left);
-    EffectGraphVisitor for_right(owner(), temp_index());
+    EffectGraphVisitor for_right(owner(), temp_index(), loop_depth());
     node->right()->Visit(&for_right);
-    EffectGraphVisitor empty(owner(), temp_index());
+    EffectGraphVisitor empty(owner(), temp_index(), loop_depth());
     if (node->kind() == Token::kAND) {
       Join(for_left, for_right, empty);
     } else {
@@ -631,12 +644,12 @@
     }
     return;
   }
-  ValueGraphVisitor for_left_value(owner(), temp_index());
+  ValueGraphVisitor for_left_value(owner(), temp_index(), loop_depth());
   node->left()->Visit(&for_left_value);
   Append(for_left_value);
   PushArgumentInstr* push_left = PushArgument(for_left_value.value());
 
-  ValueGraphVisitor for_right_value(owner(), temp_index());
+  ValueGraphVisitor for_right_value(owner(), temp_index(), loop_depth());
   node->right()->Visit(&for_right_value);
   Append(for_right_value);
   PushArgumentInstr* push_right = PushArgument(for_right_value.value());
@@ -670,10 +683,11 @@
 
     TestGraphVisitor for_test(owner(),
                               temp_index(),
+                              loop_depth(),
                               node->left()->token_pos());
     node->left()->Visit(&for_test);
 
-    ValueGraphVisitor for_right(owner(), temp_index());
+    ValueGraphVisitor for_right(owner(), temp_index(), loop_depth());
     node->right()->Visit(&for_right);
     Value* right_value = for_right.value();
     if (FLAG_enable_type_checks) {
@@ -689,13 +703,13 @@
     for_right.Do(BuildStoreExprTemp(compare));
 
     if (node->kind() == Token::kAND) {
-      ValueGraphVisitor for_false(owner(), temp_index());
+      ValueGraphVisitor for_false(owner(), temp_index(), loop_depth());
       Value* constant_false = for_false.Bind(new ConstantInstr(bool_false));
       for_false.Do(BuildStoreExprTemp(constant_false));
       Join(for_test, for_right, for_false);
     } else {
       ASSERT(node->kind() == Token::kOR);
-      ValueGraphVisitor for_true(owner(), temp_index());
+      ValueGraphVisitor for_true(owner(), temp_index(), loop_depth());
       Value* constant_true = for_true.Bind(new ConstantInstr(bool_true));
       for_true.Do(BuildStoreExprTemp(constant_true));
       Join(for_test, for_true, for_right);
@@ -780,7 +794,7 @@
 
 void EffectGraphVisitor::BuildTypeTest(ComparisonNode* node) {
   ASSERT(Token::IsTypeTestOperator(node->kind()));
-  EffectGraphVisitor for_left_value(owner(), temp_index());
+  EffectGraphVisitor for_left_value(owner(), temp_index(), loop_depth());
   node->left()->Visit(&for_left_value);
   Append(for_left_value);
 }
@@ -790,7 +804,7 @@
   ASSERT(Token::IsTypeCastOperator(node->kind()));
   const AbstractType& type = node->right()->AsTypeNode()->type();
   ASSERT(type.IsFinalized());  // The type in a type cast may be malformed.
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner(), temp_index(), loop_depth());
   node->left()->Visit(&for_value);
   const String& dst_name = String::ZoneHandle(
       Symbols::New(Exceptions::kCastErrorDstName));
@@ -813,7 +827,7 @@
   const Type& object_type = Type::Handle(Type::ObjectType());
   if (type.IsInstantiated() && object_type.IsSubtypeOf(type, NULL)) {
     // Must evaluate left side.
-    EffectGraphVisitor for_left_value(owner(), temp_index());
+    EffectGraphVisitor for_left_value(owner(), temp_index(), loop_depth());
     node->left()->Visit(&for_left_value);
     Append(for_left_value);
     ReturnDefinition(new ConstantInstr(negate_result ? bool_false : bool_true));
@@ -844,7 +858,7 @@
     return;
   }
 
-  ValueGraphVisitor for_left_value(owner(), temp_index());
+  ValueGraphVisitor for_left_value(owner(), temp_index(), loop_depth());
   node->left()->Visit(&for_left_value);
   Append(for_left_value);
   Value* instantiator = NULL;
@@ -874,7 +888,7 @@
   ASSERT(Token::IsTypeCastOperator(node->kind()));
   const AbstractType& type = node->right()->AsTypeNode()->type();
   ASSERT(type.IsFinalized());  // The type in a type cast may be malformed.
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner(), temp_index(), loop_depth());
   node->left()->Visit(&for_value);
   Append(for_value);
   const String& dst_name = String::ZoneHandle(
@@ -901,10 +915,10 @@
   }
   if ((node->kind() == Token::kEQ_STRICT) ||
       (node->kind() == Token::kNE_STRICT)) {
-    ValueGraphVisitor for_left_value(owner(), temp_index());
+    ValueGraphVisitor for_left_value(owner(), temp_index(), loop_depth());
     node->left()->Visit(&for_left_value);
     Append(for_left_value);
-    ValueGraphVisitor for_right_value(owner(), temp_index());
+    ValueGraphVisitor for_right_value(owner(), temp_index(), loop_depth());
     node->right()->Visit(&for_right_value);
     Append(for_right_value);
     StrictCompareInstr* comp = new StrictCompareInstr(
@@ -914,10 +928,10 @@
   }
 
   if ((node->kind() == Token::kEQ) || (node->kind() == Token::kNE)) {
-    ValueGraphVisitor for_left_value(owner(), temp_index());
+    ValueGraphVisitor for_left_value(owner(), temp_index(), loop_depth());
     node->left()->Visit(&for_left_value);
     Append(for_left_value);
-    ValueGraphVisitor for_right_value(owner(), temp_index());
+    ValueGraphVisitor for_right_value(owner(), temp_index(), loop_depth());
     node->right()->Visit(&for_right_value);
     Append(for_right_value);
     if (FLAG_enable_type_checks) {
@@ -944,10 +958,10 @@
     return;
   }
 
-  ValueGraphVisitor for_left_value(owner(), temp_index());
+  ValueGraphVisitor for_left_value(owner(), temp_index(), loop_depth());
   node->left()->Visit(&for_left_value);
   Append(for_left_value);
-  ValueGraphVisitor for_right_value(owner(), temp_index());
+  ValueGraphVisitor for_right_value(owner(), temp_index(), loop_depth());
   node->right()->Visit(&for_right_value);
   Append(for_right_value);
   RelationalOpInstr* comp = new RelationalOpInstr(node->token_pos(),
@@ -961,7 +975,7 @@
 void EffectGraphVisitor::VisitUnaryOpNode(UnaryOpNode* node) {
   // "!" cannot be overloaded, therefore do not call operator.
   if (node->kind() == Token::kNOT) {
-    ValueGraphVisitor for_value(owner(), temp_index());
+    ValueGraphVisitor for_value(owner(), temp_index(), loop_depth());
     node->operand()->Visit(&for_value);
     Append(for_value);
     Value* value = for_value.value();
@@ -974,7 +988,7 @@
     return;
   }
 
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner(), temp_index(), loop_depth());
   node->operand()->Visit(&for_value);
   Append(for_value);
   PushArgumentInstr* push_value = PushArgument(for_value.value());
@@ -996,13 +1010,14 @@
 void EffectGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
   TestGraphVisitor for_test(owner(),
                             temp_index(),
+                            loop_depth(),
                             node->condition()->token_pos());
   node->condition()->Visit(&for_test);
 
   // Translate the subexpressions for their effects.
-  EffectGraphVisitor for_true(owner(), temp_index());
+  EffectGraphVisitor for_true(owner(), temp_index(), loop_depth());
   node->true_expr()->Visit(&for_true);
-  EffectGraphVisitor for_false(owner(), temp_index());
+  EffectGraphVisitor for_false(owner(), temp_index(), loop_depth());
   node->false_expr()->Visit(&for_false);
 
   Join(for_test, for_true, for_false);
@@ -1012,15 +1027,16 @@
 void ValueGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
   TestGraphVisitor for_test(owner(),
                             temp_index(),
+                            loop_depth(),
                             node->condition()->token_pos());
   node->condition()->Visit(&for_test);
 
-  ValueGraphVisitor for_true(owner(), temp_index());
+  ValueGraphVisitor for_true(owner(), temp_index(), loop_depth());
   node->true_expr()->Visit(&for_true);
   ASSERT(for_true.is_open());
   for_true.Do(BuildStoreExprTemp(for_true.value()));
 
-  ValueGraphVisitor for_false(owner(), temp_index());
+  ValueGraphVisitor for_false(owner(), temp_index(), loop_depth());
   node->false_expr()->Visit(&for_false);
   ASSERT(for_false.is_open());
   for_false.Do(BuildStoreExprTemp(for_false.value()));
@@ -1036,11 +1052,12 @@
 void EffectGraphVisitor::VisitIfNode(IfNode* node) {
   TestGraphVisitor for_test(owner(),
                             temp_index(),
+                            loop_depth(),
                             node->condition()->token_pos());
   node->condition()->Visit(&for_test);
 
-  EffectGraphVisitor for_true(owner(), temp_index());
-  EffectGraphVisitor for_false(owner(), temp_index());
+  EffectGraphVisitor for_true(owner(), temp_index(), loop_depth());
+  EffectGraphVisitor for_false(owner(), temp_index(), loop_depth());
 
   node->true_branch()->Visit(&for_true);
   // The for_false graph fragment will be empty (default graph fragment) if
@@ -1051,10 +1068,11 @@
 
 
 void EffectGraphVisitor::VisitSwitchNode(SwitchNode* node) {
-  EffectGraphVisitor switch_body(owner(), temp_index());
+  EffectGraphVisitor switch_body(owner(), temp_index(), loop_depth());
   node->body()->Visit(&switch_body);
   Append(switch_body);
   if ((node->label() != NULL) && (node->label()->join_for_break() != NULL)) {
+    node->label()->join_for_break()->set_loop_depth(loop_depth());
     if (is_open()) Goto(node->label()->join_for_break());
     exit_ = node->label()->join_for_break();
   }
@@ -1088,7 +1106,7 @@
 void EffectGraphVisitor::VisitCaseNode(CaseNode* node) {
   const intptr_t len = node->case_expressions()->length();
   // Create case statements instructions.
-  EffectGraphVisitor for_case_statements(owner(), temp_index());
+  EffectGraphVisitor for_case_statements(owner(), temp_index(), loop_depth());
   // Compute start of statements fragment.
   JoinEntryInstr* statement_start = NULL;
   if ((node->label() != NULL) && node->label()->is_continue_target()) {
@@ -1096,13 +1114,15 @@
     // allocate JoinNode here and use it as statement start.
     statement_start = node->label()->join_for_continue();
     if (statement_start == NULL) {
-      statement_start =
-          new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+      statement_start = new JoinEntryInstr(owner()->AllocateBlockId(),
+                                           owner()->try_index(),
+                                           loop_depth());
       node->label()->set_join_for_continue(statement_start);
     }
   } else {
-    statement_start =
-        new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+    statement_start = new JoinEntryInstr(owner()->AllocateBlockId(),
+                                         owner()->try_index(),
+                                         loop_depth());
   }
   node->statements()->Visit(&for_case_statements);
   Instruction* statement_exit =
@@ -1121,6 +1141,7 @@
     AstNode* case_expr = node->case_expressions()->NodeAt(i);
     TestGraphVisitor for_case_expression(owner(),
                                          temp_index(),
+                                         loop_depth(),
                                          case_expr->token_pos());
     case_expr->Visit(&for_case_expression);
     if (i == 0) {
@@ -1149,7 +1170,8 @@
     } else {
       if (statement_exit != NULL) {
         JoinEntryInstr* join = new JoinEntryInstr(owner()->AllocateBlockId(),
-                                                  owner()->try_index());
+                                                  owner()->try_index(),
+                                                  loop_depth());
         statement_exit->Goto(join);
         next_target->Goto(join);
         exit_instruction = join;
@@ -1183,11 +1205,12 @@
 void EffectGraphVisitor::VisitWhileNode(WhileNode* node) {
   TestGraphVisitor for_test(owner(),
                             temp_index(),
+                            loop_depth() + 1,
                             node->condition()->token_pos());
   node->condition()->Visit(&for_test);
   ASSERT(!for_test.is_empty());  // Language spec.
 
-  EffectGraphVisitor for_body(owner(), temp_index());
+  EffectGraphVisitor for_body(owner(), temp_index(), loop_depth() + 1);
   for_body.AddInstruction(
       new CheckStackOverflowInstr(node->token_pos()));
   node->body()->Visit(&for_body);
@@ -1197,12 +1220,14 @@
   ASSERT(lbl != NULL);
   JoinEntryInstr* join = lbl->join_for_continue();
   if (join != NULL) {
+    join->set_loop_depth(loop_depth() + 1);
     if (for_body.is_open()) for_body.Goto(join);
     for_body.exit_ = join;
   }
   TieLoop(for_test, for_body);
   join = lbl->join_for_break();
   if (join != NULL) {
+    join->set_loop_depth(loop_depth());
     Goto(join);
     exit_ = join;
   }
@@ -1219,28 +1244,34 @@
 // g) break-join
 void EffectGraphVisitor::VisitDoWhileNode(DoWhileNode* node) {
   // Traverse body first in order to generate continue and break labels.
-  EffectGraphVisitor for_body(owner(), temp_index());
+  EffectGraphVisitor for_body(owner(), temp_index(), loop_depth() + 1);
   for_body.AddInstruction(
       new CheckStackOverflowInstr(node->token_pos()));
   node->body()->Visit(&for_body);
 
   TestGraphVisitor for_test(owner(),
                             temp_index(),
+                            loop_depth() + 1,
                             node->condition()->token_pos());
   node->condition()->Visit(&for_test);
   ASSERT(is_open());
 
   // Tie do-while loop (test is after the body).
   JoinEntryInstr* body_entry_join =
-      new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+      new JoinEntryInstr(owner()->AllocateBlockId(),
+                         owner()->try_index(),
+                         loop_depth() + 1);
   Goto(body_entry_join);
   Instruction* body_exit = AppendFragment(body_entry_join, for_body);
 
   JoinEntryInstr* join = node->label()->join_for_continue();
   if ((body_exit != NULL) || (join != NULL)) {
     if (join == NULL) {
-      join =
-          new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+      join = new JoinEntryInstr(owner()->AllocateBlockId(),
+                                owner()->try_index(),
+                                loop_depth() + 1);
+    } else {
+      join->set_loop_depth(loop_depth() + 1);
     }
     join->LinkTo(for_test.entry());
     if (body_exit != NULL) {
@@ -1248,13 +1279,14 @@
     }
   }
 
-
   for_test.IfTrueGoto(body_entry_join);
-  if (node->label()->join_for_break() == NULL) {
+  join = node->label()->join_for_break();
+  if (join == NULL) {
     exit_ = for_test.CreateFalseSuccessor();
   } else {
-    for_test.IfFalseGoto(node->label()->join_for_break());
-    exit_ = node->label()->join_for_break();
+    join->set_loop_depth(loop_depth());
+    for_test.IfFalseGoto(join);
+    exit_ = join;
   }
 }
 
@@ -1272,13 +1304,13 @@
 // h) loop-exit-target
 // i) break-join
 void EffectGraphVisitor::VisitForNode(ForNode* node) {
-  EffectGraphVisitor for_initializer(owner(), temp_index());
+  EffectGraphVisitor for_initializer(owner(), temp_index(), loop_depth());
   node->initializer()->Visit(&for_initializer);
   Append(for_initializer);
   ASSERT(is_open());
 
   // Compose body to set any jump labels.
-  EffectGraphVisitor for_body(owner(), temp_index());
+  EffectGraphVisitor for_body(owner(), temp_index(), loop_depth() + 1);
   for_body.AddInstruction(
       new CheckStackOverflowInstr(node->token_pos()));
   node->body()->Visit(&for_body);
@@ -1286,10 +1318,11 @@
   // Join loop body, increment and compute their end instruction.
   ASSERT(!for_body.is_empty());
   Instruction* loop_increment_end = NULL;
-  EffectGraphVisitor for_increment(owner(), temp_index());
+  EffectGraphVisitor for_increment(owner(), temp_index(), loop_depth() + 1);
   node->increment()->Visit(&for_increment);
   JoinEntryInstr* join = node->label()->join_for_continue();
   if (join != NULL) {
+    join->set_loop_depth(loop_depth() + 1);
     // Insert the join between the body and increment.
     if (for_body.is_open()) for_body.Goto(join);
     loop_increment_end = AppendFragment(join, for_increment);
@@ -1308,7 +1341,9 @@
   // body is not open, i.e., no backward branch exists.
   if (loop_increment_end != NULL) {
     JoinEntryInstr* loop_start =
-        new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+        new JoinEntryInstr(owner()->AllocateBlockId(),
+                           owner()->try_index(),
+                           loop_depth() + 1);
     Goto(loop_start);
     loop_increment_end->Goto(loop_start);
     exit_ = loop_start;
@@ -1317,16 +1352,20 @@
   if (node->condition() == NULL) {
     // Endless loop, no test.
     JoinEntryInstr* body_entry =
-        new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+        new JoinEntryInstr(owner()->AllocateBlockId(),
+                           owner()->try_index(),
+                           loop_depth() + 1);
     AppendFragment(body_entry, for_body);
     Goto(body_entry);
     if (node->label()->join_for_break() != NULL) {
+      node->label()->join_for_break()->set_loop_depth(loop_depth());
       // Control flow of ForLoop continues into join_for_break.
       exit_ = node->label()->join_for_break();
     }
   } else {
     TestGraphVisitor for_test(owner(),
                               temp_index(),
+                              loop_depth() + 1,
                               node->condition()->token_pos());
     node->condition()->Visit(&for_test);
     Append(for_test);
@@ -1337,6 +1376,7 @@
     if (node->label()->join_for_break() == NULL) {
       exit_ = for_test.CreateFalseSuccessor();
     } else {
+      node->label()->join_for_break()->set_loop_depth(loop_depth());
       for_test.IfFalseGoto(node->label()->join_for_break());
       exit_ = node->label()->join_for_break();
     }
@@ -1346,7 +1386,7 @@
 
 void EffectGraphVisitor::VisitJumpNode(JumpNode* node) {
   for (intptr_t i = 0; i < node->inlined_finally_list_length(); i++) {
-    EffectGraphVisitor for_effect(owner(), temp_index());
+    EffectGraphVisitor for_effect(owner(), temp_index(), loop_depth());
     node->InlinedFinallyNodeAt(i)->Visit(&for_effect);
     Append(for_effect);
     if (!is_open()) return;
@@ -1384,13 +1424,17 @@
   if (node->kind() == Token::kBREAK) {
     if (node->label()->join_for_break() == NULL) {
       node->label()->set_join_for_break(
-          new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index()));
+          new JoinEntryInstr(owner()->AllocateBlockId(),
+                             owner()->try_index(),
+                             BlockEntryInstr::kInvalidLoopDepth));
     }
     jump_target = node->label()->join_for_break();
   } else {
     if (node->label()->join_for_continue() == NULL) {
       node->label()->set_join_for_continue(
-          new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index()));
+          new JoinEntryInstr(owner()->AllocateBlockId(),
+                             owner()->try_index(),
+                             BlockEntryInstr::kInvalidLoopDepth));
     }
     jump_target = node->label()->join_for_continue();
   }
@@ -1419,7 +1463,7 @@
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>(node->length());
   for (int i = 0; i < node->length(); ++i) {
-    ValueGraphVisitor for_value(owner(), temp_index());
+    ValueGraphVisitor for_value(owner(), temp_index(), loop_depth());
     node->ElementAt(i)->Visit(&for_value);
     Append(for_value);
     arguments->Add(PushArgument(for_value.value()));
@@ -1453,7 +1497,7 @@
     }
     receiver = BuildNullValue();
   } else if (function.IsImplicitInstanceClosureFunction()) {
-    ValueGraphVisitor for_receiver(owner(), temp_index());
+    ValueGraphVisitor for_receiver(owner(), temp_index(), loop_depth());
     node->receiver()->Visit(&for_receiver);
     Append(for_receiver);
     receiver = for_receiver.value();
@@ -1488,7 +1532,7 @@
     const ArgumentListNode& node,
     ZoneGrowableArray<Value*>* values) {
   for (intptr_t i = 0; i < node.length(); ++i) {
-    ValueGraphVisitor for_argument(owner(), temp_index());
+    ValueGraphVisitor for_argument(owner(), temp_index(), loop_depth());
     node.NodeAt(i)->Visit(&for_argument);
     Append(for_argument);
     values->Add(for_argument.value());
@@ -1500,7 +1544,7 @@
     const ArgumentListNode& node,
     ZoneGrowableArray<PushArgumentInstr*>* values) {
   for (intptr_t i = 0; i < node.length(); ++i) {
-    ValueGraphVisitor for_argument(owner(), temp_index());
+    ValueGraphVisitor for_argument(owner(), temp_index(), loop_depth());
     node.NodeAt(i)->Visit(&for_argument);
     Append(for_argument);
     PushArgumentInstr* push_arg = PushArgument(for_argument.value());
@@ -1510,7 +1554,7 @@
 
 
 void EffectGraphVisitor::VisitInstanceCallNode(InstanceCallNode* node) {
-  ValueGraphVisitor for_receiver(owner(), temp_index());
+  ValueGraphVisitor for_receiver(owner(), temp_index(), loop_depth());
   node->receiver()->Visit(&for_receiver);
   Append(for_receiver);
   PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
@@ -1539,10 +1583,10 @@
       const Library& core_lib = Library::Handle(Library::CoreLibrary());
       if (cls.library() == core_lib.raw()) {
         ASSERT(node->arguments()->length() == 2);
-        ValueGraphVisitor for_left_value(owner(), temp_index());
+        ValueGraphVisitor for_left_value(owner(), temp_index(), loop_depth());
         node->arguments()->NodeAt(0)->Visit(&for_left_value);
         Append(for_left_value);
-        ValueGraphVisitor for_right_value(owner(), temp_index());
+        ValueGraphVisitor for_right_value(owner(), temp_index(), loop_depth());
         node->arguments()->NodeAt(1)->Visit(&for_right_value);
         Append(for_right_value);
         StrictCompareInstr* comp = new StrictCompareInstr(
@@ -1568,7 +1612,7 @@
 
 ClosureCallInstr* EffectGraphVisitor::BuildClosureCall(
     ClosureCallNode* node) {
-  ValueGraphVisitor for_closure(owner(), temp_index());
+  ValueGraphVisitor for_closure(owner(), temp_index(), loop_depth());
   node->closure()->Visit(&for_closure);
   Append(for_closure);
   PushArgumentInstr* push_closure = PushArgument(for_closure.value());
@@ -1771,7 +1815,7 @@
   }
 
   ASSERT(owner()->parsed_function().instantiator() != NULL);
-  ValueGraphVisitor for_instantiator(owner(), temp_index());
+  ValueGraphVisitor for_instantiator(owner(), temp_index(), loop_depth());
   owner()->parsed_function().instantiator()->Visit(&for_instantiator);
   Append(for_instantiator);
   return for_instantiator.value();
@@ -1806,7 +1850,7 @@
     // No instantiator for factories.
     ASSERT(instantiator == NULL);
     ASSERT(owner()->parsed_function().instantiator() != NULL);
-    ValueGraphVisitor for_instantiator(owner(), temp_index());
+    ValueGraphVisitor for_instantiator(owner(), temp_index(), loop_depth());
     owner()->parsed_function().instantiator()->Visit(&for_instantiator);
     Append(for_instantiator);
     return for_instantiator.value();
@@ -1954,7 +1998,7 @@
 
 
 void EffectGraphVisitor::VisitInstanceGetterNode(InstanceGetterNode* node) {
-  ValueGraphVisitor for_receiver(owner(), temp_index());
+  ValueGraphVisitor for_receiver(owner(), temp_index(), loop_depth());
   node->receiver()->Visit(&for_receiver);
   Append(for_receiver);
   PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
@@ -1974,12 +2018,12 @@
     InstanceSetterNode* node,
     ZoneGrowableArray<PushArgumentInstr*>* arguments,
     bool result_is_needed) {
-  ValueGraphVisitor for_receiver(owner(), temp_index());
+  ValueGraphVisitor for_receiver(owner(), temp_index(), loop_depth());
   node->receiver()->Visit(&for_receiver);
   Append(for_receiver);
   arguments->Add(PushArgument(for_receiver.value()));
 
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner(), temp_index(), loop_depth());
   node->value()->Visit(&for_value);
   Append(for_value);
 
@@ -2037,7 +2081,7 @@
         Resolver::ResolveDynamicAnyArgs(node->cls(), getter_name);
     ASSERT(!getter_function.IsNull());
     ASSERT(node->receiver() != NULL);
-    ValueGraphVisitor receiver_value(owner(), temp_index());
+    ValueGraphVisitor receiver_value(owner(), temp_index(), loop_depth());
     node->receiver()->Visit(&receiver_value);
     Append(receiver_value);
     arguments->Add(PushArgument(receiver_value.value()));
@@ -2105,12 +2149,12 @@
       new ZoneGrowableArray<PushArgumentInstr*>(1);
   if (is_super_setter) {
     // Add receiver of instance getter.
-    ValueGraphVisitor for_receiver(owner(), temp_index());
+    ValueGraphVisitor for_receiver(owner(), temp_index(), loop_depth());
     node->receiver()->Visit(&for_receiver);
     Append(for_receiver);
     arguments->Add(PushArgument(for_receiver.value()));
   }
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner(), temp_index(), loop_depth());
   node->value()->Visit(&for_value);
   Append(for_value);
   Value* value = NULL;
@@ -2160,7 +2204,7 @@
 // <Expression> ::= LoadLocal { local: LocalVariable }
 void EffectGraphVisitor::VisitLoadLocalNode(LoadLocalNode* node) {
   if (node->HasPseudo()) {
-    EffectGraphVisitor for_pseudo(owner(), temp_index());
+    EffectGraphVisitor for_pseudo(owner(), temp_index(), loop_depth());
     node->pseudo()->Visit(&for_pseudo);
     Append(for_pseudo);
   }
@@ -2178,7 +2222,7 @@
 //                               value: <Expression> }
 void EffectGraphVisitor::HandleStoreLocal(StoreLocalNode* node,
                                           bool result_is_needed) {
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner(), temp_index(), loop_depth());
   node->value()->Visit(&for_value);
   Append(for_value);
   Value* store_value = for_value.value();
@@ -2207,7 +2251,7 @@
 
 void EffectGraphVisitor::VisitLoadInstanceFieldNode(
     LoadInstanceFieldNode* node) {
-  ValueGraphVisitor for_instance(owner(), temp_index());
+  ValueGraphVisitor for_instance(owner(), temp_index(), loop_depth());
   node->instance()->Visit(&for_instance);
   Append(for_instance);
   LoadFieldInstr* load = new LoadFieldInstr(
@@ -2220,10 +2264,10 @@
 
 void EffectGraphVisitor::VisitStoreInstanceFieldNode(
     StoreInstanceFieldNode* node) {
-  ValueGraphVisitor for_instance(owner(), temp_index());
+  ValueGraphVisitor for_instance(owner(), temp_index(), loop_depth());
   node->instance()->Visit(&for_instance);
   Append(for_instance);
-  ValueGraphVisitor for_value(owner(), for_instance.temp_index());
+  ValueGraphVisitor for_value(owner(), for_instance.temp_index(), loop_depth());
   node->value()->Visit(&for_value);
   Append(for_value);
   Value* store_value = for_value.value();
@@ -2257,7 +2301,7 @@
 
 Definition* EffectGraphVisitor::BuildStoreStaticField(
   StoreStaticFieldNode* node, bool result_is_needed) {
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner(), temp_index(), loop_depth());
   node->value()->Visit(&for_value);
   Append(for_value);
   Value* store_value = NULL;
@@ -2321,12 +2365,12 @@
   }
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>(2);
-  ValueGraphVisitor for_array(owner(), temp_index());
+  ValueGraphVisitor for_array(owner(), temp_index(), loop_depth());
   node->array()->Visit(&for_array);
   Append(for_array);
   arguments->Add(PushArgument(for_array.value()));
 
-  ValueGraphVisitor for_index(owner(), temp_index());
+  ValueGraphVisitor for_index(owner(), temp_index(), loop_depth());
   node->index_expr()->Visit(&for_index);
   Append(for_index);
   arguments->Add(PushArgument(for_index.value()));
@@ -2370,7 +2414,7 @@
       if (result_is_needed) {
         // Even though noSuchMethod most likely does not return,
         // we save the stored value if the result is needed.
-        ValueGraphVisitor for_value(owner(), temp_index());
+        ValueGraphVisitor for_value(owner(), temp_index(), loop_depth());
         node->value()->Visit(&for_value);
         Append(for_value);
         Bind(BuildStoreExprTemp(for_value.value()));
@@ -2394,17 +2438,17 @@
 
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>(3);
-  ValueGraphVisitor for_array(owner(), temp_index());
+  ValueGraphVisitor for_array(owner(), temp_index(), loop_depth());
   node->array()->Visit(&for_array);
   Append(for_array);
   arguments->Add(PushArgument(for_array.value()));
 
-  ValueGraphVisitor for_index(owner(), temp_index());
+  ValueGraphVisitor for_index(owner(), temp_index(), loop_depth());
   node->index_expr()->Visit(&for_index);
   Append(for_index);
   arguments->Add(PushArgument(for_index.value()));
 
-  ValueGraphVisitor for_value(owner(), temp_index());
+  ValueGraphVisitor for_value(owner(), temp_index(), loop_depth());
   node->value()->Visit(&for_value);
   Append(for_value);
   Value* value = NULL;
@@ -2588,7 +2632,7 @@
 
   intptr_t i = 0;
   while (is_open() && (i < node->length())) {
-    EffectGraphVisitor for_effect(owner(), temp_index());
+    EffectGraphVisitor for_effect(owner(), temp_index(), loop_depth());
     node->NodeAt(i++)->Visit(&for_effect);
     Append(for_effect);
     if (!is_open()) {
@@ -2613,6 +2657,7 @@
   // taken care of unchaining the context.
   if ((node->label() != NULL) &&
       (node->label()->join_for_break() != NULL)) {
+    node->label()->join_for_break()->set_loop_depth(loop_depth());
     if (is_open()) Goto(node->label()->join_for_break());
     exit_ = node->label()->join_for_break();
   }
@@ -2633,7 +2678,7 @@
       new CatchEntryInstr(node->exception_var(), node->stacktrace_var()));
   BuildLoadContext(node->context_var());
 
-  EffectGraphVisitor for_catch(owner(), temp_index());
+  EffectGraphVisitor for_catch(owner(), temp_index(), loop_depth());
   node->VisitChildren(&for_catch);
   Append(for_catch);
 }
@@ -2648,18 +2693,20 @@
   // Preserve CTX into local variable '%saved_context'.
   BuildStoreContext(node->context_var());
 
-  EffectGraphVisitor for_try_block(owner(), temp_index());
+  EffectGraphVisitor for_try_block(owner(), temp_index(), loop_depth());
   node->try_block()->Visit(&for_try_block);
 
   if (for_try_block.is_open()) {
     JoinEntryInstr* after_try =
-        new JoinEntryInstr(owner()->AllocateBlockId(), old_try_index);
+        new JoinEntryInstr(owner()->AllocateBlockId(),
+                           old_try_index,
+                           loop_depth());
     for_try_block.Goto(after_try);
     for_try_block.exit_ = after_try;
   }
 
   JoinEntryInstr* try_entry =
-      new JoinEntryInstr(owner()->AllocateBlockId(), try_index);
+      new JoinEntryInstr(owner()->AllocateBlockId(), try_index, loop_depth());
 
   Goto(try_entry);
   AppendFragment(try_entry, for_try_block);
@@ -2674,10 +2721,12 @@
     // that we can set the appropriate handler pc when we generate
     // code for this catch block.
     catch_block->set_try_index(try_index);
-    EffectGraphVisitor for_catch_block(owner(), temp_index());
+    EffectGraphVisitor for_catch_block(owner(), temp_index(), loop_depth());
     catch_block->Visit(&for_catch_block);
     TargetEntryInstr* catch_entry =
-        new TargetEntryInstr(owner()->AllocateBlockId(), old_try_index);
+        new TargetEntryInstr(owner()->AllocateBlockId(),
+                             old_try_index,
+                             loop_depth());
     catch_entry->set_catch_try_index(try_index);
     owner()->AddCatchEntry(catch_entry);
     ASSERT(!for_catch_block.is_open());
@@ -2685,6 +2734,7 @@
     if (node->end_catch_label() != NULL) {
       JoinEntryInstr* join = node->end_catch_label()->join_for_continue();
       if (join != NULL) {
+        join->set_loop_depth(loop_depth());
         if (is_open()) Goto(join);
         exit_ = join;
       }
@@ -2693,7 +2743,7 @@
 
   // Generate code for the finally block if one exists.
   if ((node->finally_block() != NULL) && is_open()) {
-    EffectGraphVisitor for_finally_block(owner(), temp_index());
+    EffectGraphVisitor for_finally_block(owner(), temp_index(), loop_depth());
     node->finally_block()->Visit(&for_finally_block);
     Append(for_finally_block);
   }
@@ -2724,7 +2774,7 @@
 
   // Evaluate the receiver before the arguments. This will be used
   // as an argument to the noSuchMethod call.
-  ValueGraphVisitor for_receiver(owner(), temp_index());
+  ValueGraphVisitor for_receiver(owner(), temp_index(), loop_depth());
   receiver->Visit(&for_receiver);
   Append(for_receiver);
   PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
@@ -2773,7 +2823,7 @@
   // TODO(kmillikin) non-local control flow is not handled correctly
   // by the inliner.
   InlineBailout("EffectGraphVisitor::BuildThrowNode (exception)");
-  ValueGraphVisitor for_exception(owner(), temp_index());
+  ValueGraphVisitor for_exception(owner(), temp_index(), loop_depth());
   node->exception()->Visit(&for_exception);
   Append(for_exception);
   PushArgument(for_exception.value());
@@ -2781,7 +2831,7 @@
   if (node->stacktrace() == NULL) {
     instr = new ThrowInstr(node->token_pos());
   } else {
-    ValueGraphVisitor for_stack_trace(owner(), temp_index());
+    ValueGraphVisitor for_stack_trace(owner(), temp_index(), loop_depth());
     node->stacktrace()->Visit(&for_stack_trace);
     Append(for_stack_trace);
     PushArgument(for_stack_trace.value());
@@ -2818,8 +2868,10 @@
   BuildLoadContext(node->context_var());
 
   JoinEntryInstr* finally_entry =
-      new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
-  EffectGraphVisitor for_finally_block(owner(), temp_index());
+      new JoinEntryInstr(owner()->AllocateBlockId(),
+                         owner()->try_index(),
+                         loop_depth());
+  EffectGraphVisitor for_finally_block(owner(), temp_index(), loop_depth());
   node->finally_block()->Visit(&for_finally_block);
 
   if (try_index >= 0) {
@@ -2828,7 +2880,9 @@
 
   if (for_finally_block.is_open()) {
     JoinEntryInstr* after_finally =
-        new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+        new JoinEntryInstr(owner()->AllocateBlockId(),
+                           owner()->try_index(),
+                           loop_depth());
     for_finally_block.Goto(after_finally);
     for_finally_block.exit_ = after_finally;
   }
@@ -2839,7 +2893,8 @@
 }
 
 
-FlowGraph* FlowGraphBuilder::BuildGraph(InliningContext context) {
+FlowGraph* FlowGraphBuilder::BuildGraph(InliningContext context,
+                                        intptr_t initial_loop_depth) {
   if (FLAG_print_ast) {
     // Print the function ast before IL generation.
     AstPrinter::PrintFunctionNodes(parsed_function());
@@ -2852,9 +2907,10 @@
   const Function& function = parsed_function().function();
   TargetEntryInstr* normal_entry =
       new TargetEntryInstr(AllocateBlockId(),
-                           CatchClauseNode::kInvalidTryIndex);
+                           CatchClauseNode::kInvalidTryIndex,
+                           initial_loop_depth);
   graph_entry_ = new GraphEntryInstr(normal_entry);
-  EffectGraphVisitor for_effect(this, 0);
+  EffectGraphVisitor for_effect(this, 0, initial_loop_depth);
   if (InInliningContext()) {
     exits_ = new ZoneGrowableArray<ReturnInstr*>();
   }
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 9c675af..64139bd 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -28,7 +28,7 @@
     kTestContext
   };
 
-  FlowGraph* BuildGraph(InliningContext context);
+  FlowGraph* BuildGraph(InliningContext context, intptr_t initial_loop_depth);
 
   const ParsedFunction& parsed_function() const { return parsed_function_; }
 
@@ -106,11 +106,14 @@
 //   - (i0, i1): an open graph fragment
 class EffectGraphVisitor : public AstNodeVisitor {
  public:
-  EffectGraphVisitor(FlowGraphBuilder* owner, intptr_t temp_index)
+  EffectGraphVisitor(FlowGraphBuilder* owner,
+                     intptr_t temp_index,
+                     intptr_t loop_depth)
       : owner_(owner),
         temp_index_(temp_index),
         entry_(NULL),
-        exit_(NULL) { }
+        exit_(NULL),
+        loop_depth_(loop_depth) { }
 
 #define DEFINE_VISIT(type, name) virtual void Visit##type(type* node);
   NODE_LIST(DEFINE_VISIT)
@@ -118,6 +121,7 @@
 
   FlowGraphBuilder* owner() const { return owner_; }
   intptr_t temp_index() const { return temp_index_; }
+  intptr_t loop_depth() const { return loop_depth_; }
   Instruction* entry() const { return entry_; }
   Instruction* exit() const { return exit_; }
 
@@ -288,6 +292,9 @@
   // Output parameters.
   Instruction* entry_;
   Instruction* exit_;
+
+  // Internal state.
+  const intptr_t loop_depth_;
 };
 
 
@@ -298,8 +305,10 @@
 // language Value.
 class ValueGraphVisitor : public EffectGraphVisitor {
  public:
-  ValueGraphVisitor(FlowGraphBuilder* owner, intptr_t temp_index)
-      : EffectGraphVisitor(owner, temp_index), value_(NULL) { }
+  ValueGraphVisitor(FlowGraphBuilder* owner,
+                    intptr_t temp_index,
+                    intptr_t loop_depth)
+      : EffectGraphVisitor(owner, temp_index, loop_depth), value_(NULL) { }
 
   // Visit functions overridden by this class.
   virtual void VisitLiteralNode(LiteralNode* node);
@@ -360,8 +369,9 @@
  public:
   TestGraphVisitor(FlowGraphBuilder* owner,
                    intptr_t temp_index,
+                   intptr_t loop_depth,
                    intptr_t condition_token_pos)
-      : ValueGraphVisitor(owner, temp_index),
+      : ValueGraphVisitor(owner, temp_index, loop_depth),
         true_successor_addresses_(1),
         false_successor_addresses_(1),
         condition_token_pos_(condition_token_pos) { }
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 57e02d4..ef47dc0 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -477,23 +477,27 @@
     const ICData& ic_data) {
   ASSERT(!ic_data.IsNull());
   ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfChecks() == 0));
-  // Because optimized code should not waste time.
-  ASSERT(!is_optimizing() || ic_data.num_args_tested() == 1);
   const Array& arguments_descriptor =
       DartEntry::ArgumentsDescriptor(argument_count, argument_names);
   uword label_address = 0;
-  switch (ic_data.num_args_tested()) {
-    case 1:
-      label_address = StubCode::OneArgCheckInlineCacheEntryPoint();
-      break;
-    case 2:
-      label_address = StubCode::TwoArgsCheckInlineCacheEntryPoint();
-      break;
-    case 3:
-      label_address = StubCode::ThreeArgsCheckInlineCacheEntryPoint();
-      break;
-    default:
-      UNIMPLEMENTED();
+  if (is_optimizing()) {
+    // Megamorphic call requires one argument ICData.
+    ASSERT(ic_data.num_args_tested() == 1);
+    label_address = StubCode::MegamorphicCallEntryPoint();
+  } else {
+    switch (ic_data.num_args_tested()) {
+      case 1:
+        label_address = StubCode::OneArgCheckInlineCacheEntryPoint();
+        break;
+      case 2:
+        label_address = StubCode::TwoArgsCheckInlineCacheEntryPoint();
+        break;
+      case 3:
+        label_address = StubCode::ThreeArgsCheckInlineCacheEntryPoint();
+        break;
+      default:
+        UNIMPLEMENTED();
+    }
   }
   ExternalLabel target_label("InlineCache", label_address);
 
@@ -576,8 +580,9 @@
                                         LocationSummary* locs) {
   ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
   Label match_found;
-  for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
-    const bool is_last_check = (i == (ic_data.NumberOfChecks() - 1));
+  const intptr_t len = ic_data.NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
+    const bool is_last_check = (i == (len - 1));
     Label next_test;
     assembler()->cmpl(class_id_reg, Immediate(ic_data.GetReceiverClassIdAt(i)));
     if (is_last_check) {
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 74cc804..b5848d6 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -20,11 +20,23 @@
 
 DEFINE_FLAG(bool, trace_inlining, false, "Trace inlining");
 DEFINE_FLAG(charp, inlining_filter, NULL, "Inline only in named function");
-DEFINE_FLAG(int, inlining_size_threshold, 50,
-    "Inline only functions with up to threshold instructions (default 50)");
-// TODO(srdjan): set to 3 once crash in apidoc.dart is resolved.
+
+// Flags for inlining heuristics.
 DEFINE_FLAG(int, inlining_depth_threshold, 3,
-    "Inline recursively up to threshold depth (default 3)");
+    "Inline function calls up to threshold nesting depth");
+DEFINE_FLAG(int, inlining_size_threshold, 20,
+    "Always inline functions that have threshold or fewer instructions");
+DEFINE_FLAG(int, inlining_in_loop_size_threshold, 80,
+    "Inline functions in loops that have threshold or fewer instructions");
+DEFINE_FLAG(int, inlining_callee_call_sites_threshold, 1,
+    "Always inline functions containing threshold or fewer calls.");
+DEFINE_FLAG(int, inlining_constant_arguments_count, 1,
+    "Inline function calls with sufficient constant arguments "
+    "and up to the increased threshold on instructions");
+DEFINE_FLAG(int, inlining_constant_arguments_size_threshold, 60,
+    "Inline function calls with sufficient constant arguments "
+    "and up to the increased threshold on instructions");
+
 DECLARE_FLAG(bool, print_flow_graph);
 DECLARE_FLAG(int, deoptimization_counter_threshold);
 DECLARE_FLAG(bool, verify_compiler);
@@ -127,6 +139,42 @@
 };
 
 
+// Helper to collect information about a callee graph when considering it for
+// inlining.
+class GraphInfoCollector : public ValueObject {
+ public:
+  GraphInfoCollector()
+      : call_site_count_(0),
+        instruction_count_(0) { }
+
+  void Collect(const FlowGraph& graph) {
+    call_site_count_ = 0;
+    instruction_count_ = 0;
+    for (BlockIterator block_it = graph.postorder_iterator();
+         !block_it.Done();
+         block_it.Advance()) {
+      for (ForwardInstructionIterator it(block_it.Current());
+           !it.Done();
+           it.Advance()) {
+        ++instruction_count_;
+        if (it.Current()->IsStaticCall() ||
+            it.Current()->IsClosureCall() ||
+            it.Current()->IsPolymorphicInstanceCall()) {
+          ++call_site_count_;
+        }
+      }
+    }
+  }
+
+  intptr_t call_site_count() const { return call_site_count_; }
+  intptr_t instruction_count() const { return instruction_count_; }
+
+ private:
+  intptr_t call_site_count_;
+  intptr_t instruction_count_;
+};
+
+
 // A collection of call sites to consider for inlining.
 class CallSites : public FlowGraphVisitor {
  public:
@@ -134,7 +182,8 @@
       : FlowGraphVisitor(flow_graph->postorder()),  // We don't use this order.
         static_calls_(),
         closure_calls_(),
-        instance_calls_() { }
+        instance_calls_(),
+        skip_static_call_deopt_ids_() { }
 
   GrowableArray<StaticCallInstr*>* static_calls() {
     return &static_calls_;
@@ -158,9 +207,16 @@
     static_calls_.Clear();
     closure_calls_.Clear();
     instance_calls_.Clear();
+    skip_static_call_deopt_ids_.Clear();
   }
 
   void FindCallSites(FlowGraph* graph) {
+    ASSERT(graph != NULL);
+    const Function& function = graph->parsed_function().function();
+    ASSERT(function.HasCode());
+    const Code& code = Code::Handle(function.CurrentCode());
+    skip_static_call_deopt_ids_.Clear();
+    code.ExtractUncalledStaticCallDeoptIds(&skip_static_call_deopt_ids_);
     for (BlockIterator block_it = graph->postorder_iterator();
          !block_it.Done();
          block_it.Advance()) {
@@ -181,13 +237,22 @@
   }
 
   void VisitStaticCall(StaticCallInstr* call) {
-    if (call->function().IsInlineable()) static_calls_.Add(call);
+    if (!call->function().IsInlineable()) return;
+    const intptr_t call_deopt_id = call->deopt_id();
+    for (intptr_t i = 0; i < skip_static_call_deopt_ids_.length(); i++) {
+      if (call_deopt_id == skip_static_call_deopt_ids_[i]) {
+        // Do not inline this call.
+        return;
+      }
+    }
+    static_calls_.Add(call);
   }
 
  private:
   GrowableArray<StaticCallInstr*> static_calls_;
   GrowableArray<ClosureCallInstr*> closure_calls_;
   GrowableArray<PolymorphicInstanceCallInstr*> instance_calls_;
+  GrowableArray<intptr_t> skip_static_call_deopt_ids_;
 
   DISALLOW_COPY_AND_ASSIGN(CallSites);
 };
@@ -206,6 +271,30 @@
         inlining_call_sites_(NULL),
         function_cache_() { }
 
+  // Inlining heuristics based on Cooper et al. 2008.
+  bool ShouldWeInline(intptr_t loop_depth,
+                      intptr_t instr_count,
+                      intptr_t call_site_count,
+                      intptr_t const_arg_count) {
+    if (instr_count <= FLAG_inlining_size_threshold) {
+      return true;
+    }
+    if (call_site_count <= FLAG_inlining_callee_call_sites_threshold) {
+      return true;
+    }
+    if ((loop_depth > 0) &&
+        (instr_count <= FLAG_inlining_in_loop_size_threshold)) {
+      return true;
+    }
+    if ((const_arg_count >= FLAG_inlining_constant_arguments_count) &&
+        (instr_count <= FLAG_inlining_constant_arguments_size_threshold)) {
+      return true;
+    }
+    return false;
+  }
+
+  // TODO(srdjan): Handle large 'skip_static_call_deopt_ids'. Currently
+  // max. size observed is 11 (dart2js).
   void InlineCalls() {
     // If inlining depth is less then one abort.
     if (FLAG_inlining_depth_threshold < 1) return;
@@ -309,6 +398,7 @@
       }
 
       // Build the callee graph.
+      const intptr_t loop_depth = call->GetBlock()->loop_depth();
       FlowGraphBuilder builder(*parsed_function);
       builder.SetInitialBlockId(caller_graph_->max_block_id());
       FlowGraph* callee_graph;
@@ -316,7 +406,8 @@
         TimerScope timer(FLAG_compiler_stats,
                          &CompilerStats::graphinliner_build_timer,
                          isolate);
-        callee_graph = builder.BuildGraph(FlowGraphBuilder::kValueContext);
+        callee_graph =
+            builder.BuildGraph(FlowGraphBuilder::kValueContext, loop_depth);
       }
 
       // The parameter stubs are a copy of the actual arguments providing
@@ -381,15 +472,39 @@
         printer.PrintBlocks();
       }
 
-      // If result is more than size threshold then abort.
+      // Collect information about the call site and caller graph.
       // TODO(zerny): Do this after CP and dead code elimination.
-      intptr_t size = callee_graph->InstructionCount();
-      if (size > FLAG_inlining_size_threshold) {
-        function.set_is_inlinable(false);
+      intptr_t constants_count = 0;
+      for (intptr_t i = 0; i < param_stubs.length(); ++i) {
+        if (param_stubs[i]->IsConstant()) ++constants_count;
+      }
+      GraphInfoCollector info;
+      info.Collect(*callee_graph);
+      const intptr_t size = info.instruction_count();
+      // Use heuristics do decide if this call should be inlined.
+      if (!ShouldWeInline(loop_depth,
+                          size,
+                          info.call_site_count(),
+                          constants_count)) {
+        // If size is larger than all thresholds, don't consider it again.
+        if ((size > FLAG_inlining_size_threshold) &&
+            (size > FLAG_inlining_in_loop_size_threshold) &&
+            (size > FLAG_inlining_callee_call_sites_threshold) &&
+            (size > FLAG_inlining_constant_arguments_size_threshold)) {
+          function.set_is_inlinable(false);
+        }
         isolate->set_long_jump_base(base);
         isolate->set_deopt_id(prev_deopt_id);
         isolate->set_ic_data_array(prev_ic_data.raw());
-        TRACE_INLINING(OS::Print("     Bailout: graph size %"Pd"\n", size));
+        TRACE_INLINING(OS::Print("     Bailout: heuristics with "
+                                 "loop depth: %"Pd", "
+                                 "code size:  %"Pd", "
+                                 "call sites: %"Pd", "
+                                 "const args: %"Pd"\n",
+                                 loop_depth,
+                                 size,
+                                 info.call_site_count(),
+                                 constants_count));
         return false;
       }
 
diff --git a/runtime/vm/flow_graph_inliner.h b/runtime/vm/flow_graph_inliner.h
index ba2d080..7f37ac6 100644
--- a/runtime/vm/flow_graph_inliner.h
+++ b/runtime/vm/flow_graph_inliner.h
@@ -10,11 +10,12 @@
 namespace dart {
 
 class FlowGraph;
+template <typename T> class GrowableArray;
 
 class FlowGraphInliner : ValueObject {
  public:
   explicit FlowGraphInliner(FlowGraph* flow_graph)
-      : flow_graph_(flow_graph) { }
+      : flow_graph_(flow_graph) {}
 
   // The flow graph is destructively updated upon inlining.
   void Inline();
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index e82a9e4..9b61175 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -273,7 +273,8 @@
 
 static bool ICDataHasReceiverClassId(const ICData& ic_data, intptr_t class_id) {
   ASSERT(ic_data.num_args_tested() > 0);
-  for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
+  const intptr_t len = ic_data.NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
     const intptr_t test_class_id = ic_data.GetReceiverClassIdAt(i);
     if (test_class_id == class_id) {
       return true;
@@ -291,7 +292,8 @@
   if (ic_data.num_args_tested() != 2) return false;
 
   Function& target = Function::Handle();
-  for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
+  const intptr_t len = ic_data.NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
     GrowableArray<intptr_t> class_ids;
     ic_data.GetCheckAt(i, &class_ids, &target);
     ASSERT(class_ids.length() == 2);
@@ -323,7 +325,8 @@
     const GrowableArray<intptr_t>& argument_class_ids) {
   if (ic_data.num_args_tested() != 2) return false;
   Function& target = Function::Handle();
-  for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
+  const intptr_t len = ic_data.NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
     GrowableArray<intptr_t> class_ids;
     ic_data.GetCheckAt(i, &class_ids, &target);
     ASSERT(class_ids.length() == 2);
@@ -447,7 +450,8 @@
   if (ic_data.NumberOfChecks() == 0) return false;
   GrowableArray<intptr_t> class_ids;
   Function& target = Function::Handle();
-  for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
+  const intptr_t len = ic_data.NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
     ic_data.GetCheckAt(i, &class_ids, &target);
     if (class_ids[arg_n] != kSmiCid) return false;
   }
@@ -470,10 +474,20 @@
                new CheckSmiInstr((*index)->Copy(), call->deopt_id()),
                call->env(),
                Definition::kEffect);
-  // If both index and array are constants, then the bound check always
-  // succeeded.
-  // TODO(srdjan): Remove once constant propagation lands.
-  if (!((*array)->BindsToConstant() && (*index)->BindsToConstant())) {
+  // If both index and array are constants, then do a compile-time check.
+  // TODO(srdjan): Remove once constant propagation handles bounds checks.
+  bool skip_check = false;
+  if ((*array)->BindsToConstant() && (*index)->BindsToConstant()) {
+    ConstantInstr* array_def = (*array)->definition()->AsConstant();
+    const ImmutableArray& constant_array =
+        ImmutableArray::Cast(array_def->value());
+    ConstantInstr* index_def = (*index)->definition()->AsConstant();
+    if (index_def->value().IsSmi()) {
+      intptr_t constant_index = Smi::Cast(index_def->value()).Value();
+      skip_check = (constant_index < constant_array.Length());
+    }
+  }
+  if (!skip_check) {
     // Insert array bounds check.
     InsertBefore(call,
                  new CheckArrayBoundInstr((*array)->Copy(),
@@ -876,19 +890,8 @@
   if (function.IsDynamicFunction() &&
       callee_receiver->IsParameter() &&
       (callee_receiver->AsParameter()->index() == 0)) {
-    const intptr_t static_receiver_cid = Class::Handle(function.Owner()).id();
-    ZoneGrowableArray<intptr_t>* subclass_cids =
-        CHA::GetSubclassIdsOf(static_receiver_cid);
-    if (subclass_cids->is_empty()) {
-      // No subclasses, no check needed.
-      return false;
-    }
-    ZoneGrowableArray<Function*>* overriding_functions =
-        CHA::GetNamedInstanceFunctionsOf(*subclass_cids, call->function_name());
-    if (overriding_functions->is_empty()) {
-      // No overriding functions.
-      return false;
-    }
+    return CHA::HasOverride(Class::Handle(function.Owner()),
+                            call->function_name());
   }
   return true;
 }
@@ -1096,6 +1099,46 @@
   ic_data.GetCheckAt(0, &class_ids, &target);
   MethodRecognizer::Kind recognized_kind =
       MethodRecognizer::RecognizeKind(target);
+  if ((recognized_kind == MethodRecognizer::kStringBaseCharCodeAt) &&
+      (ic_data.NumberOfChecks() == 1) &&
+      ((class_ids[0] == kOneByteStringCid) ||
+       (class_ids[0] == kTwoByteStringCid))) {
+    Value* str= call->ArgumentAt(0)->value();
+    Value* index = call->ArgumentAt(1)->value();
+    AddCheckClass(call, str->Copy());
+    InsertBefore(call,
+                 new CheckSmiInstr(index->Copy(), call->deopt_id()),
+                 call->env(),
+                 Definition::kEffect);
+    // If both index and string are constants, then do a compile-time check.
+    // TODO(srdjan): Remove once constant propagation handles bounds checks.
+    bool skip_check = false;
+    if (str->BindsToConstant() && index->BindsToConstant()) {
+      ConstantInstr* string_def = str->definition()->AsConstant();
+      const String& constant_string =
+          String::Cast(string_def->value());
+      ConstantInstr* index_def = index->definition()->AsConstant();
+      if (index_def->value().IsSmi()) {
+        intptr_t constant_index = Smi::Cast(index_def->value()).Value();
+        skip_check = (constant_index < constant_string.Length());
+      }
+    }
+    if (!skip_check) {
+      // Insert bounds check.
+      InsertBefore(call,
+                   new CheckArrayBoundInstr(str->Copy(),
+                                            index->Copy(),
+                                            class_ids[0],
+                                            call),
+                   call->env(),
+                   Definition::kEffect);
+    }
+    StringCharCodeAtInstr* instr =
+        new StringCharCodeAtInstr(str, index, class_ids[0]);
+    call->ReplaceWith(instr, current_iterator());
+    RemovePushArguments(call);
+    return true;
+  }
 
   if ((recognized_kind == MethodRecognizer::kIntegerToDouble) &&
       (class_ids[0] == kSmiCid)) {
@@ -1132,7 +1175,8 @@
       ICData::ZoneHandle(instr->ic_data()->AsUnaryClassChecks());
   if ((unary_checks.NumberOfChecks() > FLAG_max_polymorphic_checks) &&
       InstanceCallNeedsClassCheck(instr)) {
-    // Too many checks, leave it megamorphic.
+    // Too many checks, it will be megamorphic which needs unary checks.
+    instr->set_ic_data(&unary_checks);
     return;
   }
 
@@ -1155,7 +1199,8 @@
   if ((op_kind == Token::kGET) && TryInlineInstanceGetter(instr)) {
     return;
   }
-  if ((op_kind == Token::kSET) && TryInlineInstanceSetter(instr)) {
+  if ((op_kind == Token::kSET) &&
+      TryInlineInstanceSetter(instr, unary_checks)) {
     return;
   }
   if (TryInlineInstanceMethod(instr)) {
@@ -1198,15 +1243,16 @@
 }
 
 
-bool FlowGraphOptimizer::TryInlineInstanceSetter(InstanceCallInstr* instr) {
+bool FlowGraphOptimizer::TryInlineInstanceSetter(InstanceCallInstr* instr,
+                                                 const ICData& unary_ic_data) {
+  ASSERT((unary_ic_data.NumberOfChecks() > 0) &&
+      (unary_ic_data.num_args_tested() == 1));
   if (FLAG_enable_type_checks) {
     // TODO(srdjan): Add assignable check node if --enable_type_checks.
     return false;
   }
 
   ASSERT(instr->HasICData());
-  const ICData& unary_ic_data =
-      ICData::Handle(instr->ic_data()->AsUnaryClassChecks());
   if (unary_ic_data.NumberOfChecks() == 0) {
     // No type feedback collected.
     return false;
@@ -3230,6 +3276,11 @@
 }
 
 
+void ConstantPropagator::VisitStringCharCodeAt(StringCharCodeAtInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
 void ConstantPropagator::VisitLoadIndexed(LoadIndexedInstr* instr) {
   SetValue(instr, non_constant_);
 }
@@ -3615,14 +3666,17 @@
         ASSERT(branch->comparison()->IsStrictCompare());
         ASSERT(if_false->parallel_move() == NULL);
         ASSERT(if_false->loop_info() == NULL);
-        join =
-            new JoinEntryInstr(if_false->block_id(), if_false->try_index());
+        join = new JoinEntryInstr(if_false->block_id(),
+                                  if_false->try_index(),
+                                  if_false->loop_depth());
         next = if_false->next();
       } else if (!reachable_->Contains(if_false->preorder_number())) {
         ASSERT(branch->comparison()->IsStrictCompare());
         ASSERT(if_true->parallel_move() == NULL);
         ASSERT(if_true->loop_info() == NULL);
-        join = new JoinEntryInstr(if_true->block_id(), if_true->try_index());
+        join = new JoinEntryInstr(if_true->block_id(),
+                                  if_true->try_index(),
+                                  if_true->loop_depth());
         next = if_true->next();
       }
 
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index cd0cda1..047dd0c 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -63,7 +63,8 @@
   bool TryReplaceWithUnaryOp(InstanceCallInstr* call, Token::Kind op_kind);
 
   bool TryInlineInstanceGetter(InstanceCallInstr* call);
-  bool TryInlineInstanceSetter(InstanceCallInstr* call);
+  bool TryInlineInstanceSetter(InstanceCallInstr* call,
+                               const ICData& unary_ic_data);
 
   bool TryInlineInstanceMethod(InstanceCallInstr* call);
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 97fd838..340065d 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -153,6 +153,13 @@
 }
 
 
+bool StringCharCodeAtInstr::AttributesEqual(Instruction* other) const {
+  StringCharCodeAtInstr* other_load = other->AsStringCharCodeAt();
+  ASSERT(other_load != NULL);
+  return class_id() == other_load->class_id();
+}
+
+
 bool LoadIndexedInstr::AttributesEqual(Instruction* other) const {
   LoadIndexedInstr* other_load = other->AsLoadIndexed();
   ASSERT(other_load != NULL);
@@ -189,7 +196,7 @@
 
 
 GraphEntryInstr::GraphEntryInstr(TargetEntryInstr* normal_entry)
-    : BlockEntryInstr(0, CatchClauseNode::kInvalidTryIndex),
+    : BlockEntryInstr(0, CatchClauseNode::kInvalidTryIndex, 0),
       normal_entry_(normal_entry),
       catch_entries_(),
       initial_definitions_(),
@@ -1113,6 +1120,16 @@
 }
 
 
+RawAbstractType* StringCharCodeAtInstr::CompileType() const {
+  return Type::IntType();
+}
+
+
+intptr_t StringCharCodeAtInstr::ResultCid() const {
+  return kSmiCid;
+}
+
+
 RawAbstractType* LoadIndexedInstr::CompileType() const {
   switch (class_id_) {
     case kArrayCid:
@@ -2118,8 +2135,7 @@
 
 RangeBoundary RangeBoundary::LowerBound() const {
   if (IsConstant()) return *this;
-  if (symbol()->range() == NULL) return MinSmi();
-  return Add(symbol()->range()->min().LowerBound(),
+  return Add(Range::ConstantMin(symbol()->range()),
              RangeBoundary::FromConstant(offset_),
              MinSmi());
 }
@@ -2127,14 +2143,23 @@
 
 RangeBoundary RangeBoundary::UpperBound() const {
   if (IsConstant()) return *this;
-  if (symbol()->range() == NULL) return MaxSmi();
-  return Add(symbol()->range()->max().UpperBound(),
+  return Add(Range::ConstantMax(symbol()->range()),
              RangeBoundary::FromConstant(offset_),
              MaxSmi());
 }
 
 
+static Definition* UnwrapConstraint(Definition* defn) {
+  while (defn->IsConstraint()) {
+    defn = defn->AsConstraint()->value()->definition();
+  }
+  return defn;
+}
+
+
 static bool AreEqualDefinitions(Definition* a, Definition* b) {
+  a = UnwrapConstraint(a);
+  b = UnwrapConstraint(b);
   return (a == b) || (!a->AffectedBySideEffect() && a->Equals(b));
 }
 
@@ -2605,6 +2630,26 @@
 }
 
 
+intptr_t CheckArrayBoundInstr::LengthOffsetFor(intptr_t class_id) {
+  switch (class_id) {
+    case kGrowableObjectArrayCid:
+      return GrowableObjectArray::length_offset();
+    case kFloat64ArrayCid:
+      return Float64Array::length_offset();
+    case kFloat32ArrayCid:
+      return Float32Array::length_offset();
+    case kOneByteStringCid:
+    case kTwoByteStringCid:
+      return String::length_offset();
+    case kArrayCid:
+    case kImmutableArrayCid:
+      return Array::length_offset();
+    default:
+      UNREACHABLE();
+      return -1;
+  }
+}
+
 #undef __
 
 }  // namespace dart
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 0bd4fde..7010631 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -37,6 +37,7 @@
   V(_GrowableObjectArray, get:capacity, GrowableArrayCapacity)                 \
   V(_StringBase, get:length, StringBaseLength)                                 \
   V(_StringBase, get:isEmpty, StringBaseIsEmpty)                               \
+  V(_StringBase, charCodeAt, StringBaseCharCodeAt)                             \
   V(_IntegerImplementation, toDouble, IntegerToDouble)                         \
   V(_Double, toInt, DoubleToInteger)                                           \
   V(::, sqrt, MathSqrt)                                                        \
@@ -263,6 +264,7 @@
   M(UnaryMintOp)                                                               \
   M(CheckArrayBound)                                                           \
   M(Constraint)                                                                \
+  M(StringCharCodeAt)
 
 
 #define FORWARD_DECLARATION(type) class type##Instr;
@@ -525,6 +527,7 @@
   friend class CheckSmiInstr;
   friend class CheckArrayBoundInstr;
   friend class CheckEitherNonSmiInstr;
+  friend class StringCharCodeAtInstr;
   friend class LICM;
 
   intptr_t deopt_id_;
@@ -664,6 +667,8 @@
 // branches.
 class BlockEntryInstr : public Instruction {
  public:
+  static const intptr_t kInvalidLoopDepth = -1;
+
   virtual BlockEntryInstr* AsBlockEntry() { return this; }
 
   virtual intptr_t PredecessorCount() const = 0;
@@ -744,12 +749,19 @@
     loop_info_ = loop_info;
   }
 
+  intptr_t loop_depth() const { return loop_depth_; }
+  void set_loop_depth(intptr_t loop_depth) {
+    ASSERT(loop_depth_ == kInvalidLoopDepth);
+    ASSERT(loop_depth != kInvalidLoopDepth);
+    loop_depth_ = loop_depth;
+  }
+
   virtual BlockEntryInstr* GetBlock() const {
     return const_cast<BlockEntryInstr*>(this);
   }
 
  protected:
-  BlockEntryInstr(intptr_t block_id, intptr_t try_index)
+  BlockEntryInstr(intptr_t block_id, intptr_t try_index, intptr_t loop_depth)
       : block_id_(block_id),
         try_index_(try_index),
         preorder_number_(-1),
@@ -758,7 +770,8 @@
         dominated_blocks_(1),
         last_instruction_(NULL),
         parallel_move_(NULL),
-        loop_info_(NULL) { }
+        loop_info_(NULL),
+        loop_depth_(loop_depth) { }
 
  private:
   virtual void ClearPredecessors() = 0;
@@ -785,6 +798,9 @@
   // preorder number.
   BitVector* loop_info_;
 
+  // Syntactic loop depth of the block.
+  intptr_t loop_depth_;
+
   DISALLOW_COPY_AND_ASSIGN(BlockEntryInstr);
 };
 
@@ -898,8 +914,8 @@
 
 class JoinEntryInstr : public BlockEntryInstr {
  public:
-  JoinEntryInstr(intptr_t block_id, intptr_t try_index)
-      : BlockEntryInstr(block_id, try_index),
+  JoinEntryInstr(intptr_t block_id, intptr_t try_index, intptr_t loop_depth)
+      : BlockEntryInstr(block_id, try_index, loop_depth),
         predecessors_(2),  // Two is the assumed to be the common case.
         phis_(NULL),
         phi_count_(0) { }
@@ -968,8 +984,8 @@
 
 class TargetEntryInstr : public BlockEntryInstr {
  public:
-  TargetEntryInstr(intptr_t block_id, intptr_t try_index)
-      : BlockEntryInstr(block_id, try_index),
+  TargetEntryInstr(intptr_t block_id, intptr_t try_index, intptr_t loop_depth)
+      : BlockEntryInstr(block_id, try_index, loop_depth),
         predecessor_(NULL),
         catch_try_index_(CatchClauseNode::kInvalidTryIndex) { }
 
@@ -2042,6 +2058,9 @@
     return (ic_data() != NULL) && !ic_data()->IsNull();
   }
 
+  // ICData can be replaced by optimizer.
+  void set_ic_data(const ICData* value) { ic_data_ = value; }
+
   intptr_t token_pos() const { return token_pos_; }
   const String& function_name() const { return function_name_; }
   Token::Kind token_kind() const { return token_kind_; }
@@ -2635,6 +2654,42 @@
 };
 
 
+class StringCharCodeAtInstr : public TemplateDefinition<2> {
+ public:
+  StringCharCodeAtInstr(Value* receiver,
+                        Value* index,
+                        intptr_t class_id)
+      : class_id_(class_id) {
+    ASSERT(receiver != NULL);
+    ASSERT(index != NULL);
+    inputs_[0] = receiver;
+    inputs_[1] = index;
+  }
+
+  DECLARE_INSTRUCTION(StringCharCodeAt)
+  virtual RawAbstractType* CompileType() const;
+
+  Value* receiver() const { return inputs_[0]; }
+  Value* index() const { return inputs_[1]; }
+  intptr_t class_id() const { return class_id_; }
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual bool HasSideEffect() const { return false; }
+
+  virtual intptr_t ResultCid() const;
+
+  virtual bool AttributesEqual(Instruction* other) const;
+
+  virtual bool AffectedBySideEffect() const { return true; }
+
+ private:
+  const intptr_t class_id_;
+
+  DISALLOW_COPY_AND_ASSIGN(StringCharCodeAtInstr);
+};
+
+
 class LoadIndexedInstr : public TemplateDefinition<2> {
  public:
   LoadIndexedInstr(Value* array, Value* index, intptr_t class_id)
@@ -3980,6 +4035,9 @@
  private:
   intptr_t array_type_;
 
+  // Returns the length offset for array and string types.
+  static intptr_t LengthOffsetFor(intptr_t class_id);
+
   DISALLOW_COPY_AND_ASSIGN(CheckArrayBoundInstr);
 };
 
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index cabafbe..3d2ebb5 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -60,16 +60,14 @@
       // Do not optimize if usage count must be reported.
       __ cmpl(FieldAddress(temp, Function::usage_counter_offset()),
           Immediate(FLAG_optimization_counter_threshold));
-      Label not_yet_hot, already_optimized;
+      Label not_yet_hot;
       __ j(LESS, &not_yet_hot, Assembler::kNearJump);
-      __ j(GREATER, &already_optimized, Assembler::kNearJump);
       __ pushl(result);  // Preserve result.
       __ pushl(temp);  // Argument for runtime: function to optimize.
       __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry);
       __ popl(temp);  // Remove argument.
       __ popl(result);  // Restore result.
       __ Bind(&not_yet_hot);
-      __ Bind(&already_optimized);
     }
   }
   if (FLAG_trace_functions) {
@@ -455,7 +453,8 @@
   ObjectStore* object_store = Isolate::Current()->object_store();
   Condition cond = TokenKindToSmiCondition(kind);
   Label done;
-  for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
+  const intptr_t len = ic_data.NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
     // Assert that the Smi is at position 0, if at all.
     ASSERT((ic_data.GetReceiverClassIdAt(i) != kSmiCid) || (i == 0));
     Label next_test;
@@ -538,9 +537,10 @@
   __ j(EQUAL, &identity_compare);
 
   __ LoadClassId(temp, left);
-  for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
+  const intptr_t len = ic_data.NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
     __ cmpl(temp, Immediate(ic_data.GetReceiverClassIdAt(i)));
-    if (i == (ic_data.NumberOfChecks() - 1)) {
+    if (i == (len - 1)) {
       __ j(NOT_EQUAL, deopt);
     } else {
       __ j(EQUAL, &identity_compare);
@@ -1080,12 +1080,52 @@
 static bool CanBeImmediateIndex(Value* index) {
   if (!index->definition()->IsConstant()) return false;
   const Object& constant = index->definition()->AsConstant()->value();
+  if (!constant.IsSmi()) return false;
   const Smi& smi_const = Smi::Cast(constant);
   int64_t disp = smi_const.AsInt64Value() * kWordSize + sizeof(RawArray);
   return Utils::IsInt(32, disp);
 }
 
 
+LocationSummary* StringCharCodeAtInstr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RequiresRegister());
+  // TODO(fschneider): Allow immediate operands for the index.
+  locs->set_in(1, Location::RequiresRegister());
+  locs->set_out(Location::RequiresRegister());
+  return locs;
+}
+
+
+void StringCharCodeAtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register str = locs()->in(0).reg();
+  Register index = locs()->in(1).reg();
+  Register result = locs()->out().reg();
+
+  ASSERT((class_id() == kOneByteStringCid) ||
+         (class_id() == kTwoByteStringCid));
+  if (class_id() == kOneByteStringCid) {
+    __ SmiUntag(index);
+    __ movzxb(result, FieldAddress(str,
+                                   index,
+                                   TIMES_1,
+                                   OneByteString::data_offset()));
+    __ SmiTag(index);  // Retag index.
+    __ SmiTag(result);
+  } else {
+    // Don't untag smi-index and use TIMES_1 for two byte strings.
+    __ movzxw(result, FieldAddress(str,
+                                   index,
+                                   TIMES_1,
+                                   TwoByteString::data_offset()));
+    __ SmiTag(result);
+  }
+}
+
+
 LocationSummary* LoadIndexedInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
@@ -2354,29 +2394,16 @@
 
 
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const DeoptReasonId deopt_reason =
-      (array_type() == kGrowableObjectArrayCid) ?
-          kDeoptLoadIndexedGrowableArray : kDeoptLoadIndexedFixedArray;
   Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        deopt_reason);
-  ASSERT((array_type() == kArrayCid) ||
-         (array_type() == kImmutableArrayCid) ||
-         (array_type() == kGrowableObjectArrayCid) ||
-         (array_type() == kFloat64ArrayCid) ||
-         (array_type() == kFloat32ArrayCid));
-  intptr_t length_offset = -1;
-  if (array_type() == kGrowableObjectArrayCid) {
-    length_offset = GrowableObjectArray::length_offset();
-  } else if (array_type() == kFloat64ArrayCid) {
-    length_offset = Float64Array::length_offset();
-  } else if (array_type() == kFloat32ArrayCid) {
-    length_offset = Float32Array::length_offset();
-  } else {
-    length_offset = Array::length_offset();
+                                        kDeoptCheckArrayBound);
+  if (locs()->in(0).IsConstant() && locs()->in(1).IsConstant()) {
+    // Unconditionally deoptimize for constant bounds checks because they
+    // only occur only when index is out-of-bounds.
+    __ jmp(deopt);
+    return;
   }
-  // This case should not have created a bound check instruction.
-  ASSERT(!(locs()->in(0).IsConstant() && locs()->in(1).IsConstant()));
 
+  intptr_t length_offset = LengthOffsetFor(array_type());
   if (locs()->in(1).IsConstant()) {
     Register receiver = locs()->in(0).reg();
     const Object& constant = locs()->in(1).constant();
@@ -2386,12 +2413,14 @@
     __ cmpl(FieldAddress(receiver, length_offset), Immediate(imm));
     __ j(BELOW_EQUAL, deopt);
   } else if (locs()->in(0).IsConstant()) {
-    const Object& constant = locs()->in(0).constant();
-    ASSERT(constant.IsArray());
-    const Array& array =  Array::Cast(constant);
+    ASSERT(locs()->in(0).constant().IsArray() ||
+           locs()->in(0).constant().IsString());
+    intptr_t length = locs()->in(0).constant().IsArray()
+        ? Array::Cast(locs()->in(0).constant()).Length()
+        : String::Cast(locs()->in(0).constant()).Length();
     Register index = locs()->in(1).reg();
     __ cmpl(index,
-        Immediate(reinterpret_cast<int32_t>(Smi::New(array.Length()))));
+        Immediate(reinterpret_cast<int32_t>(Smi::New(length))));
     __ j(ABOVE_EQUAL, deopt);
   } else {
     Register receiver = locs()->in(0).reg();
diff --git a/runtime/vm/intermediate_language_test.cc b/runtime/vm/intermediate_language_test.cc
index cc02c03..26e9de9 100644
--- a/runtime/vm/intermediate_language_test.cc
+++ b/runtime/vm/intermediate_language_test.cc
@@ -9,7 +9,7 @@
 
 TEST_CASE(InstructionTests) {
   TargetEntryInstr* target_instr =
-      new TargetEntryInstr(1, CatchClauseNode::kInvalidTryIndex);
+      new TargetEntryInstr(1, CatchClauseNode::kInvalidTryIndex, 0);
   EXPECT(target_instr->IsBlockEntry());
   EXPECT(!target_instr->IsDefinition());
   CurrentContextInstr* context = new CurrentContextInstr();
@@ -20,7 +20,7 @@
 
 TEST_CASE(OptimizationTests) {
   JoinEntryInstr* join =
-      new JoinEntryInstr(1, CatchClauseNode::kInvalidTryIndex);
+      new JoinEntryInstr(1, CatchClauseNode::kInvalidTryIndex, 0);
 
   Definition* def1 = new PhiInstr(join, 0);
   Definition* def2 = new PhiInstr(join, 0);
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 07e4cb4..e9a35e2 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -61,16 +61,14 @@
       // Do not optimize if usage count must be reported.
       __ cmpq(FieldAddress(temp, Function::usage_counter_offset()),
           Immediate(FLAG_optimization_counter_threshold));
-      Label not_yet_hot, already_optimized;
+      Label not_yet_hot;
       __ j(LESS, &not_yet_hot, Assembler::kNearJump);
-      __ j(GREATER, &already_optimized, Assembler::kNearJump);
       __ pushq(result);  // Preserve result.
       __ pushq(temp);  // Argument for runtime: function to optimize.
       __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry);
       __ popq(temp);  // Remove argument.
       __ popq(result);  // Restore result.
       __ Bind(&not_yet_hot);
-      __ Bind(&already_optimized);
     }
   }
   if (FLAG_trace_functions) {
@@ -453,7 +451,8 @@
   ObjectStore* object_store = Isolate::Current()->object_store();
   Condition cond = TokenKindToSmiCondition(kind);
   Label done;
-  for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
+  const intptr_t len = ic_data.NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
     // Assert that the Smi is at position 0, if at all.
     ASSERT((ic_data.GetReceiverClassIdAt(i) != kSmiCid) || (i == 0));
     Label next_test;
@@ -537,9 +536,10 @@
   __ j(EQUAL, &identity_compare);
 
   __ LoadClassId(temp, left);
-  for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
+  const intptr_t len = ic_data.NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
     __ cmpq(temp, Immediate(ic_data.GetReceiverClassIdAt(i)));
-    if (i == (ic_data.NumberOfChecks() - 1)) {
+    if (i == (len - 1)) {
       __ j(NOT_EQUAL, deopt);
     } else {
       __ j(EQUAL, &identity_compare);
@@ -945,12 +945,52 @@
 static bool CanBeImmediateIndex(Value* index) {
   if (!index->definition()->IsConstant()) return false;
   const Object& constant = index->definition()->AsConstant()->value();
+  if (!constant.IsSmi()) return false;
   const Smi& smi_const = Smi::Cast(constant);
   int64_t disp = smi_const.AsInt64Value() * kWordSize + sizeof(RawArray);
   return Utils::IsInt(32, disp);
 }
 
 
+LocationSummary* StringCharCodeAtInstr::MakeLocationSummary() const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  locs->set_in(0, Location::RequiresRegister());
+  // TODO(fschneider): Allow immediate operands for the index.
+  locs->set_in(1, Location::RequiresRegister());
+  locs->set_out(Location::RequiresRegister());
+  return locs;
+}
+
+
+void StringCharCodeAtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register str = locs()->in(0).reg();
+  Register index = locs()->in(1).reg();
+  Register result = locs()->out().reg();
+
+  ASSERT((class_id() == kOneByteStringCid) ||
+         (class_id() == kTwoByteStringCid));
+  if (class_id() == kOneByteStringCid) {
+    __ SmiUntag(index);
+    __ movzxb(result, FieldAddress(str,
+                                   index,
+                                   TIMES_1,
+                                   OneByteString::data_offset()));
+    __ SmiTag(index);  // Retag index.
+    __ SmiTag(result);
+  } else {
+    // Don't untag smi-index and use TIMES_1 for two byte strings.
+    __ movzxw(result, FieldAddress(str,
+                                   index,
+                                   TIMES_1,
+                                   TwoByteString::data_offset()));
+    __ SmiTag(result);
+  }
+}
+
+
 LocationSummary* LoadIndexedInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
@@ -2231,30 +2271,17 @@
 
 
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const DeoptReasonId deopt_reason =
-      (array_type() == kGrowableObjectArrayCid) ?
-          kDeoptLoadIndexedGrowableArray : kDeoptLoadIndexedFixedArray;
   Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                        deopt_reason);
-  ASSERT((array_type() == kArrayCid) ||
-         (array_type() == kImmutableArrayCid) ||
-         (array_type() == kGrowableObjectArrayCid) ||
-         (array_type() == kFloat64ArrayCid) ||
-         (array_type() == kFloat32ArrayCid));
-  intptr_t length_offset = -1;
-  if (array_type() == kGrowableObjectArrayCid) {
-    length_offset = GrowableObjectArray::length_offset();
-  } else if (array_type() == kFloat64ArrayCid) {
-    length_offset = Float64Array::length_offset();
-  } else if (array_type() == kFloat32ArrayCid) {
-    length_offset = Float32Array::length_offset();
-  } else {
-    length_offset = Array::length_offset();
+                                        kDeoptCheckArrayBound);
+  if (locs()->in(0).IsConstant() && locs()->in(1).IsConstant()) {
+    // Unconditionally deoptimize for constant bounds checks because they
+    // only occur only when index is out-of-bounds.
+    __ jmp(deopt);
+    return;
   }
 
-  // This case should not have created a bound check instruction.
-  ASSERT(!(locs()->in(0).IsConstant() && locs()->in(1).IsConstant()));
 
+  intptr_t length_offset = LengthOffsetFor(array_type());
   if (locs()->in(1).IsConstant()) {
     Register receiver = locs()->in(0).reg();
     const Object& constant = locs()->in(1).constant();
@@ -2264,12 +2291,14 @@
     __ cmpq(FieldAddress(receiver, length_offset), Immediate(imm));
     __ j(BELOW_EQUAL, deopt);
   } else if (locs()->in(0).IsConstant()) {
-    const Object& constant = locs()->in(0).constant();
-    ASSERT(constant.IsArray());
-    const Array& array =  Array::Cast(constant);
+    ASSERT(locs()->in(0).constant().IsArray() ||
+           locs()->in(0).constant().IsString());
+    intptr_t length = locs()->in(0).constant().IsArray()
+        ? Array::Cast(locs()->in(0).constant()).Length()
+        : String::Cast(locs()->in(0).constant()).Length();
     Register index = locs()->in(1).reg();
     __ cmpq(index,
-        Immediate(reinterpret_cast<int64_t>(Smi::New(array.Length()))));
+        Immediate(reinterpret_cast<int64_t>(Smi::New(length))));
     __ j(ABOVE_EQUAL, deopt);
   } else {
     Register receiver = locs()->in(0).reg();
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index 128d131..007ac57 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -69,31 +69,32 @@
 
 bool Intrinsifier::CanIntrinsify(const Function& function) {
   if (!FLAG_intrinsify) return false;
-  // Closure functions may have different arguments.
   if (function.IsClosureFunction()) return false;
+  // Intrinsic kind is set lazily below.
+  if (function.intrinsic_kind() == Function::kIsIntrinsic) return true;
+  if (function.intrinsic_kind() == Function::kIsNotIntrinsic) return false;
+  // Closure functions may have different arguments.
   const char* function_name = String::Handle(function.name()).ToCString();
   const Class& function_class = Class::Handle(function.Owner());
-  const char* class_name = String::Handle(function_class.Name()).ToCString();
   // Only core, math and scalarlist library methods can be intrinsified.
-  const Library& core_lib = Library::Handle(Library::CoreLibrary());
-  const Library& core_impl_lib = Library::Handle(Library::CoreImplLibrary());
-  const Library& math_lib = Library::Handle(Library::MathLibrary());
-  const Library& scalarlist_lib = Library::Handle(Library::ScalarlistLibrary());
-  if ((function_class.library() != core_lib.raw()) &&
-      (function_class.library() != core_impl_lib.raw()) &&
-      (function_class.library() != math_lib.raw()) &&
-      (function_class.library() != scalarlist_lib.raw())) {
+  if ((function_class.library() != Library::CoreLibrary()) &&
+      (function_class.library() != Library::CoreImplLibrary()) &&
+      (function_class.library() != Library::MathLibrary()) &&
+      (function_class.library() != Library::ScalarlistLibrary())) {
     return false;
   }
+  const char* class_name = String::Handle(function_class.Name()).ToCString();
 #define FIND_INTRINSICS(test_class_name, test_function_name, destination)      \
   if (TestFunction(function,                                                   \
                    class_name, function_name,                                  \
                    #test_class_name, #test_function_name)) {                   \
+    function.set_intrinsic_kind(Function::kIsIntrinsic);                       \
     return true;                                                               \
   }                                                                            \
 
 INTRINSIC_LIST(FIND_INTRINSICS);
 #undef FIND_INTRINSICS
+  function.set_intrinsic_kind(Function::kIsNotIntrinsic);
   return false;
 }
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 84263f5..af8f5e3 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -165,7 +165,7 @@
       stack_limit_(0),
       saved_stack_limit_(0),
       message_handler_(NULL),
-      spawn_data_(NULL),
+      spawn_data_(0),
       gc_prologue_callbacks_(),
       gc_epilogue_callbacks_(),
       deopt_cpu_registers_copy_(NULL),
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index 11770d9..2727eac 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -36,7 +36,7 @@
       task_(NULL),
       start_callback_(NULL),
       end_callback_(NULL),
-      callback_data_(NULL) {
+      callback_data_(0) {
   ASSERT(queue_ != NULL);
   ASSERT(oob_queue_ != NULL);
 }
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 342bbca..92f5e28 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -406,7 +406,7 @@
   // strings as symbols.
   cls = Class::New<Array>();
   isolate->object_store()->set_array_class(cls);
-  cls = Class::New<OneByteString>();
+  cls = Class::NewStringClass(kOneByteStringCid);
   isolate->object_store()->set_one_byte_string_class(cls);
 
   // Allocate and initialize the empty_array instance.
@@ -545,7 +545,7 @@
   object_store->set_type_parameter_class(cls);
 
   // Pre-allocate the OneByteString class needed by the symbol table.
-  cls = Class::New<OneByteString>();
+  cls = Class::NewStringClass(kOneByteStringCid);
   object_store->set_one_byte_string_class(cls);
 
   // Setup the symbol table for the symbols created in the isolate.
@@ -606,19 +606,19 @@
   RegisterPrivateClass(cls, name, core_lib);
   pending_classes.Add(cls, Heap::kOld);
 
-  cls = Class::New<TwoByteString>();
+  cls = Class::NewStringClass(kTwoByteStringCid);
   object_store->set_two_byte_string_class(cls);
   name = Symbols::TwoByteString();
   RegisterPrivateClass(cls, name, core_lib);
   pending_classes.Add(cls, Heap::kOld);
 
-  cls = Class::New<ExternalOneByteString>();
+  cls = Class::NewStringClass(kExternalOneByteStringCid);
   object_store->set_external_one_byte_string_class(cls);
   name = Symbols::ExternalOneByteString();
   RegisterPrivateClass(cls, name, core_lib);
   pending_classes.Add(cls, Heap::kOld);
 
-  cls = Class::New<ExternalTwoByteString>();
+  cls = Class::NewStringClass(kExternalTwoByteStringCid);
   object_store->set_external_two_byte_string_class(cls);
   name = Symbols::ExternalTwoByteString();
   RegisterPrivateClass(cls, name, core_lib);
@@ -1085,16 +1085,16 @@
   cls = Class::New<Bigint>();
   object_store->set_bigint_class(cls);
 
-  cls = Class::New<OneByteString>();
+  cls = Class::NewStringClass(kOneByteStringCid);
   object_store->set_one_byte_string_class(cls);
 
-  cls = Class::New<TwoByteString>();
+  cls = Class::NewStringClass(kTwoByteStringCid);
   object_store->set_two_byte_string_class(cls);
 
-  cls = Class::New<ExternalOneByteString>();
+  cls = Class::NewStringClass(kExternalOneByteStringCid);
   object_store->set_external_one_byte_string_class(cls);
 
-  cls = Class::New<ExternalTwoByteString>();
+  cls = Class::NewStringClass(kExternalTwoByteStringCid);
   object_store->set_external_two_byte_string_class(cls);
 
   cls = Class::New<Bool>();
@@ -1559,13 +1559,16 @@
     intptr_t num_type_params = type_params.Length();
     TypeParameter& type_param = TypeParameter::Handle();
     String& type_param_name = String::Handle();
-    AbstractType& bound = AbstractType::Handle();
+    // TODO(regis): We do not copy the bound (= type_param.bound()), since
+    // we are not able to finalize the bounds of type parameter references
+    // without getting into cycles. Revisit.
+    const AbstractType& bound = AbstractType::Handle(
+        Isolate::Current()->object_store()->object_type());
     for (intptr_t i = 0; i < num_type_params; i++) {
       type_param ^= type_params.TypeAt(i);
       type_param_name = type_param.name();
       if (type_param_name.Equals(type_name)) {
         intptr_t index = type_param.index();
-        bound = type_param.bound();
         // Create a non-finalized new TypeParameter with the given token_pos.
         if (type_param.IsFinalized()) {
           // The index was adjusted during finalization. Revert.
@@ -1878,6 +1881,26 @@
 }
 
 
+RawClass* Class::NewStringClass(intptr_t class_id) {
+  intptr_t instance_size;
+  if (class_id == kOneByteStringCid) {
+    instance_size = OneByteString::InstanceSize();
+  } else if (class_id == kTwoByteStringCid) {
+    instance_size = TwoByteString::InstanceSize();
+  } else if (class_id == kExternalOneByteStringCid) {
+    instance_size = ExternalOneByteString::InstanceSize();
+  } else {
+    ASSERT(class_id == kExternalTwoByteStringCid);
+    instance_size = ExternalTwoByteString::InstanceSize();
+  }
+  Class& result = Class::Handle(New<String>(class_id));
+  result.set_instance_size(instance_size);
+  result.set_next_field_offset(instance_size);
+  result.set_is_prefinalized();
+  return result.raw();
+}
+
+
 void Class::set_name(const String& value) const {
   ASSERT(value.IsSymbol());
   StorePointer(&raw_ptr()->name_, value.raw());
@@ -2191,20 +2214,18 @@
 RawFunction* Class::LookupFunction(const String& name) const {
   Isolate* isolate = Isolate::Current();
   ASSERT(name.IsOneByteString());
-  const OneByteString& lookup_name = OneByteString::Cast(name);
   Array& funcs = Array::Handle(isolate, functions());
   if (funcs.IsNull()) {
     // This can occur, e.g., for Null classes.
     return Function::null();
   }
   Function& function = Function::Handle(isolate, Function::null());
-  OneByteString& function_name =
-      OneByteString::Handle(isolate, OneByteString::null());
+  String& function_name = String::Handle(isolate, String::null());
   intptr_t len = funcs.Length();
   for (intptr_t i = 0; i < len; i++) {
     function ^= funcs.At(i);
     function_name ^= function.name();
-    if (function_name.EqualsIgnoringPrivateKey(lookup_name)) {
+    if (OneByteString::EqualsIgnoringPrivateKey(function_name, name)) {
       return function.raw();
     }
   }
@@ -2300,16 +2321,14 @@
 RawField* Class::LookupField(const String& name) const {
   Isolate* isolate = Isolate::Current();
   ASSERT(name.IsOneByteString());
-  const OneByteString& lookup_name = OneByteString::Cast(name);
   const Array& flds = Array::Handle(isolate, fields());
   Field& field = Field::Handle(isolate, Field::null());
-  OneByteString& field_name =
-      OneByteString::Handle(isolate, OneByteString::null());
+  String& field_name = String::Handle(isolate, String::null());
   intptr_t len = flds.Length();
   for (intptr_t i = 0; i < len; i++) {
     field ^= flds.At(i);
     field_name ^= field.name();
-    if (field_name.EqualsIgnoringPrivateKey(lookup_name)) {
+    if (OneByteString::EqualsIgnoringPrivateKey(field_name, name)) {
       return field.raw();
     }
   }
@@ -3280,6 +3299,11 @@
 }
 
 
+void Function::set_intrinsic_kind(IntrinsicKind value) const {
+  set_kind_tag(IntrinsicKindBits::update(value, raw_ptr()->kind_tag_));
+}
+
+
 void Function::set_is_static(bool value) const {
   set_kind_tag(StaticBit::update(value, raw_ptr()->kind_tag_));
 }
@@ -3776,6 +3800,7 @@
   result.set_is_const(is_const);
   result.set_is_abstract(is_abstract);
   result.set_is_external(is_external);
+  result.set_intrinsic_kind(kUnknownIntrinsic);
   result.set_owner(owner);
   result.set_token_pos(token_pos);
   result.set_end_token_pos(token_pos);
@@ -7184,6 +7209,26 @@
 }
 
 
+void Code::ExtractUncalledStaticCallDeoptIds(
+    GrowableArray<intptr_t>* deopt_ids) const {
+  ASSERT(deopt_ids != NULL);
+  deopt_ids->Clear();
+  const PcDescriptors& descriptors =
+      PcDescriptors::Handle(this->pc_descriptors());
+  Function& function = Function::Handle();
+  for (intptr_t i = 0; i < descriptors.Length(); i++) {
+    if (descriptors.DescriptorKind(i) == PcDescriptors::kFuncCall) {
+      // Static call.
+      uword target_addr;
+      CodePatcher::GetStaticCallAt(descriptors.PC(i), &function, &target_addr);
+      if (target_addr == StubCode::CallStaticFunctionEntryPoint()) {
+        deopt_ids->Add(descriptors.DeoptId(i));
+      }
+    }
+  }
+}
+
+
 RawStackmap* Code::GetStackmap(uword pc, Array* maps, Stackmap* map) const {
   // This code is used during iterating frames during a GC and hence it
   // should not in turn start a GC.
@@ -7386,7 +7431,8 @@
 #if defined(DEBUG)
 // Used in asserts to verify that a check is not added twice.
 bool ICData::HasCheck(const GrowableArray<intptr_t>& cids) const {
-  for (intptr_t i = 0; i < NumberOfChecks(); i++) {
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
     GrowableArray<intptr_t> class_ids;
     Function& target = Function::Handle();
     GetCheckAt(i, &class_ids, &target);
@@ -7516,14 +7562,14 @@
 RawFunction* ICData::GetTargetAt(intptr_t index) const {
   const Array& data = Array::Handle(ic_data());
   const intptr_t data_pos = index * TestEntryLength() + num_args_tested();
-  Function& target = Function::Handle();
-  target ^= data.At(data_pos);
-  return target.raw();
+  ASSERT(Object::Handle(data.At(data_pos)).IsFunction());
+  return reinterpret_cast<RawFunction*>(data.At(data_pos));
 }
 
 
 RawFunction* ICData::GetTargetForReceiverClassId(intptr_t class_id) const {
-  for (intptr_t i = 0; i < NumberOfChecks(); i++) {
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
     if (GetReceiverClassIdAt(i) == class_id) {
       return GetTargetAt(i);
     }
@@ -7545,10 +7591,12 @@
       String::Handle(target_name()),
       deopt_id(),
       kNumArgsTested));
-  for (intptr_t i = 0; i < NumberOfChecks(); i++) {
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
     const intptr_t class_id = GetClassIdAt(i, arg_nr);
     intptr_t duplicate_class_id = -1;
-    for (intptr_t k = 0; k < result.NumberOfChecks(); k++) {
+    const intptr_t result_len = result.NumberOfChecks();
+    for (intptr_t k = 0; k < result_len; k++) {
       if (class_id == result.GetReceiverClassIdAt(k)) {
         duplicate_class_id = k;
         break;
@@ -7571,7 +7619,8 @@
 bool ICData::AllTargetsHaveSameOwner(intptr_t owner_cid) const {
   if (NumberOfChecks() == 0) return false;
   Class& cls = Class::Handle();
-  for (intptr_t i = 0; i < NumberOfChecks(); i++) {
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
     cls = Function::Handle(GetTargetAt(i)).Owner();
     if (cls.id() != owner_cid) {
       return false;
@@ -7584,7 +7633,8 @@
 bool ICData::AllReceiversAreNumbers() const {
   if (NumberOfChecks() == 0) return false;
   Class& cls = Class::Handle();
-  for (intptr_t i = 0; i < NumberOfChecks(); i++) {
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
     cls = Function::Handle(GetTargetAt(i)).Owner();
     const intptr_t cid = cls.id();
     if ((cid != kSmiCid) &&
@@ -7603,10 +7653,9 @@
 bool ICData::HasOneTarget() const {
   ASSERT(NumberOfChecks() > 0);
   const Function& first_target = Function::Handle(GetTargetAt(0));
-  Function& test_target = Function::Handle();
-  for (intptr_t i = 1; i < NumberOfChecks(); i++) {
-    test_target = GetTargetAt(i);
-    if (first_target.raw() != test_target.raw()) {
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 1; i < len; i++) {
+    if (GetTargetAt(i) != first_target.raw()) {
       return false;
     }
   }
@@ -9002,10 +9051,9 @@
   // We are not supposed to have integers represented as two byte or
   // four byte strings.
   ASSERT(str.IsOneByteString());
-  const OneByteString& onestr = OneByteString::Cast(str);
   int64_t value;
-  if (!OS::StringToInt64(onestr.ToCString(), &value)) {
-    const Bigint& big = Bigint::Handle(Bigint::New(onestr, space));
+  if (!OS::StringToInt64(str.ToCString(), &value)) {
+    const Bigint& big = Bigint::Handle(Bigint::New(str, space));
     ASSERT(!BigintOperations::FitsIntoSmi(big));
     ASSERT(!BigintOperations::FitsIntoMint(big));
     return big.raw();
@@ -9770,16 +9818,41 @@
 
 
 int32_t String::CharAt(intptr_t index) const {
-  // String is an abstract class.
-  UNREACHABLE();
-  return 0;
+  intptr_t class_id = raw()->GetClassId();
+  ASSERT(RawObject::IsStringClassId(class_id));
+  NoGCScope no_gc;
+  if (class_id == kOneByteStringCid) {
+      return *OneByteString::CharAddr(*this, index);
+  }
+  if (class_id == kTwoByteStringCid) {
+      return *TwoByteString::CharAddr(*this, index);
+  }
+  if (class_id == kExternalOneByteStringCid) {
+      return *ExternalOneByteString::CharAddr(*this, index);
+  }
+  ASSERT(class_id == kExternalTwoByteStringCid);
+  return *ExternalTwoByteString::CharAddr(*this, index);
 }
 
 
 intptr_t String::CharSize() const {
-  // String is an abstract class.
-  UNREACHABLE();
-  return 0;
+  intptr_t class_id = raw()->GetClassId();
+  if (class_id == kOneByteStringCid || class_id == kExternalOneByteStringCid) {
+    return kOneByteChar;
+  }
+  ASSERT(class_id == kTwoByteStringCid ||
+         class_id == kExternalTwoByteStringCid);
+  return kTwoByteChar;
+}
+
+
+void* String::GetPeer() const {
+  intptr_t class_id = raw()->GetClassId();
+  if (class_id == kExternalOneByteStringCid) {
+    return ExternalOneByteString::GetPeer(*this);
+  }
+  ASSERT(class_id == kExternalTwoByteStringCid);
+  return ExternalTwoByteString::GetPeer(*this);
 }
 
 
@@ -9925,19 +9998,19 @@
   Utf8::Type type;
   intptr_t len = Utf8::CodePointCount(utf8_array, array_len, &type);
   if (type == Utf8::kAscii) {
-    const OneByteString& strobj
-        = OneByteString::Handle(OneByteString::New(len, space));
+    const String& strobj = String::Handle(OneByteString::New(len, space));
     if (len > 0) {
       NoGCScope no_gc;
-      Utf8::DecodeToAscii(utf8_array, array_len, strobj.CharAddr(0), len);
+      Utf8::DecodeToAscii(utf8_array, array_len,
+                          OneByteString::CharAddr(strobj, 0), len);
     }
     return strobj.raw();
   }
   ASSERT((type == Utf8::kBMP) || (type == Utf8::kSMP));
-  const TwoByteString& strobj =
-      TwoByteString::Handle(TwoByteString::New(len, space));
+  const String& strobj = String::Handle(TwoByteString::New(len, space));
   NoGCScope no_gc;
-  Utf8::DecodeToUTF16(utf8_array, array_len, strobj.CharAddr(0), len);
+  Utf8::DecodeToUTF16(utf8_array, array_len,
+                      TwoByteString::CharAddr(strobj, 0), len);
   return strobj.raw();
 }
 
@@ -10023,16 +10096,15 @@
   ASSERT(len >= 0);
   ASSERT(len <= (dst.Length() - dst_offset));
   if (dst.IsOneByteString()) {
-    const OneByteString& onestr = OneByteString::Cast(dst);
     NoGCScope no_gc;
     if (len > 0) {
-      memmove(onestr.CharAddr(dst_offset), characters, len);
+      memmove(OneByteString::CharAddr(dst, dst_offset),
+              characters,
+              len);
     }
   } else if (dst.IsTwoByteString()) {
-    const TwoByteString& twostr = TwoByteString::Cast(dst);
-    NoGCScope no_gc;
     for (intptr_t i = 0; i < len; ++i) {
-      *twostr.CharAddr(i + dst_offset) = characters[i];
+      *TwoByteString::CharAddr(dst, i + dst_offset) = characters[i];
     }
   }
 }
@@ -10045,18 +10117,18 @@
   ASSERT(array_len >= 0);
   ASSERT(array_len <= (dst.Length() - dst_offset));
   if (dst.IsOneByteString()) {
-    const OneByteString& onestr = OneByteString::Cast(dst);
     NoGCScope no_gc;
     for (intptr_t i = 0; i < array_len; ++i) {
       ASSERT(utf16_array[i] <= 0x7F);
-      *onestr.CharAddr(i + dst_offset) = utf16_array[i];
+      *OneByteString::CharAddr(dst, i + dst_offset) = utf16_array[i];
     }
   } else {
     ASSERT(dst.IsTwoByteString());
-    const TwoByteString& twostr = TwoByteString::Cast(dst);
     NoGCScope no_gc;
     if (array_len > 0) {
-      memmove(twostr.CharAddr(dst_offset), utf16_array, (array_len * 2));
+      memmove(TwoByteString::CharAddr(dst, dst_offset),
+              utf16_array,
+              array_len * 2);
     }
   }
 }
@@ -10074,26 +10146,34 @@
     intptr_t char_size = src.CharSize();
     if (char_size == kOneByteChar) {
       if (src.IsOneByteString()) {
-        const OneByteString& onestr = OneByteString::Cast(src);
         NoGCScope no_gc;
-        String::Copy(dst, dst_offset, onestr.CharAddr(0) + src_offset, len);
+        String::Copy(dst,
+                     dst_offset,
+                     OneByteString::CharAddr(src, src_offset),
+                     len);
       } else {
         ASSERT(src.IsExternalOneByteString());
-        const ExternalOneByteString& onestr = ExternalOneByteString::Cast(src);
         NoGCScope no_gc;
-        String::Copy(dst, dst_offset, onestr.CharAddr(0) + src_offset, len);
+        String::Copy(dst,
+                     dst_offset,
+                     ExternalOneByteString::CharAddr(src, src_offset),
+                     len);
       }
     } else {
       ASSERT(char_size == kTwoByteChar);
       if (src.IsTwoByteString()) {
-        const TwoByteString& twostr = TwoByteString::Cast(src);
         NoGCScope no_gc;
-        String::Copy(dst, dst_offset, twostr.CharAddr(0) + src_offset, len);
+        String::Copy(dst,
+                     dst_offset,
+                     TwoByteString::CharAddr(src, src_offset),
+                     len);
       } else {
         ASSERT(src.IsExternalTwoByteString());
-        const ExternalTwoByteString& twostr = ExternalTwoByteString::Cast(src);
         NoGCScope no_gc;
-        String::Copy(dst, dst_offset, twostr.CharAddr(0) + src_offset, len);
+        String::Copy(dst,
+                     dst_offset,
+                     ExternalTwoByteString::CharAddr(src, src_offset),
+                     len);
       }
     }
   }
@@ -10102,12 +10182,10 @@
 
 RawString* String::EscapeSpecialCharacters(const String& str, bool raw_str) {
   if (str.IsOneByteString()) {
-    const OneByteString& onestr = OneByteString::Cast(str);
-    return onestr.EscapeSpecialCharacters(raw_str);
+    return OneByteString::EscapeSpecialCharacters(str, raw_str);
   }
   ASSERT(str.IsTwoByteString());
-  const TwoByteString& twostr = TwoByteString::Cast(str);
-  return twostr.EscapeSpecialCharacters(raw_str);
+  return TwoByteString::EscapeSpecialCharacters(str, raw_str);
 }
 
 
@@ -10224,10 +10302,10 @@
 
 void String::ToUTF8(uint8_t* utf8_array, intptr_t array_len) const {
   if (CharSize() == kOneByteChar) {
-    const OneByteString& obj = OneByteString::Cast(*this);
+    const String& obj = *this;
     ASSERT(array_len >= obj.Length());
     if (obj.Length() > 0) {
-      memmove(utf8_array, obj.CharAddr(0), obj.Length());
+      memmove(utf8_array, OneByteString::CharAddr(obj, 0), obj.Length());
     }
   } else {
     ASSERT(array_len >= Utf8::Length(*this));
@@ -10275,41 +10353,42 @@
 }
 
 
-RawOneByteString* OneByteString::EscapeSpecialCharacters(bool raw_str) const {
-  intptr_t len = Length();
+RawOneByteString* OneByteString::EscapeSpecialCharacters(const String& str,
+                                                         bool raw_str) {
+  intptr_t len = str.Length();
   if (len > 0) {
     intptr_t num_escapes = 0;
     intptr_t index = 0;
     for (intptr_t i = 0; i < len; i++) {
-      if (IsSpecialCharacter(*CharAddr(i)) ||
-          (!raw_str && (*CharAddr(i) == '\\'))) {
+      if (IsSpecialCharacter(*CharAddr(str, i)) ||
+          (!raw_str && (*CharAddr(str, i) == '\\'))) {
         num_escapes += 1;
       }
     }
-    const OneByteString& dststr = OneByteString::Handle(
+    const String& dststr = String::Handle(
         OneByteString::New(len + num_escapes, Heap::kNew));
     for (intptr_t i = 0; i < len; i++) {
-      if (IsSpecialCharacter(*CharAddr(i))) {
-        *(dststr.CharAddr(index)) = '\\';
-        *(dststr.CharAddr(index + 1)) = SpecialCharacter(*CharAddr(i));
+      if (IsSpecialCharacter(*CharAddr(str, i))) {
+        *(CharAddr(dststr, index)) = '\\';
+        *(CharAddr(dststr, index + 1)) = SpecialCharacter(*CharAddr(str, i));
         index += 2;
-      } else if (!raw_str && (*CharAddr(i) == '\\')) {
-        *(dststr.CharAddr(index)) = '\\';
-        *(dststr.CharAddr(index + 1)) = '\\';
+      } else if (!raw_str && (*CharAddr(str, i) == '\\')) {
+        *(CharAddr(dststr, index)) = '\\';
+        *(CharAddr(dststr, index + 1)) = '\\';
         index += 2;
       } else {
-        *(dststr.CharAddr(index)) = *CharAddr(i);
+        *(CharAddr(dststr, index)) = *CharAddr(str, i);
         index += 1;
       }
     }
-    return dststr.raw();
+    return OneByteString::raw(dststr);
   }
   return OneByteString::null();
 }
 
 
-// Check to see if 'name' matches 'this' as is or
-// once the private key separator is stripped from name.
+// Check to see if 'str1' matches 'str2' as is or
+// once the private key separator is stripped from str2.
 //
 // Things are made more complicated by the fact that constructors are
 // added *after* the private suffix, so "foo@123.named" should match
@@ -10319,46 +10398,49 @@
 //
 //    _ReceivePortImpl@6be832b._internal@6be832b
 //
-bool OneByteString::EqualsIgnoringPrivateKey(const OneByteString& name) const {
-  if (raw() == name.raw()) {
+bool OneByteString::EqualsIgnoringPrivateKey(const String& str1,
+                                             const String& str2) {
+  ASSERT(str2.IsOneByteString());
+  if (str1.raw() == str2.raw()) {
     return true;  // Both handles point to the same raw instance.
   }
-  intptr_t len = Length();
-  intptr_t name_len = name.Length();
-  if (len == name_len) {
+  NoGCScope no_gc;
+  intptr_t len = str1.Length();
+  intptr_t str2_len = str2.Length();
+  if (len == str2_len) {
     for (intptr_t i = 0; i < len; i++) {
-      if (*(CharAddr(i)) != *(name.CharAddr(i))) {
+      if (*CharAddr(str1, i) != *CharAddr(str2, i)) {
         return false;
       }
     }
     return true;
   }
-  if (len < name_len) {
+  if (len < str2_len) {
     return false;  // No way they can match.
   }
   intptr_t pos = 0;
-  intptr_t name_pos = 0;
+  intptr_t str2_pos = 0;
   while (pos < len) {
-    int32_t ch = *(CharAddr(pos));
+    int32_t ch = *CharAddr(str1, pos);
     pos++;
 
     if (ch == Scanner::kPrivateKeySeparator) {
       // Consume a private key separator.
-      while (pos < len && *(CharAddr(pos)) != '.') {
+      while ((pos < len) && (*CharAddr(str1, pos) != '.')) {
         pos++;
       }
       // Resume matching characters.
       continue;
     }
-    if (name_pos == name_len || ch != *(name.CharAddr(name_pos))) {
+    if ((str2_pos == str2_len) || (ch != *CharAddr(str2, str2_pos))) {
       return false;
     }
-    name_pos++;
+    str2_pos++;
   }
 
   // We have reached the end of mangled_name string.
   ASSERT(pos == len);
-  return (name_pos == name_len);
+  return (str2_pos == str2_len);
 }
 
 
@@ -10371,7 +10453,7 @@
     // This should be caught before we reach here.
     FATAL1("Fatal error in OneByteString::New: invalid len %"Pd"\n", len);
   }
-  OneByteString& result = OneByteString::Handle();
+  String& result = String::Handle();
   {
     RawObject* raw = Object::Allocate(OneByteString::kClassId,
                                       OneByteString::InstanceSize(len),
@@ -10381,56 +10463,52 @@
     result.SetLength(len);
     result.SetHash(0);
   }
-  return result.raw();
+  return OneByteString::raw(result);
 }
 
 
 RawOneByteString* OneByteString::New(const uint8_t* characters,
                                      intptr_t len,
                                      Heap::Space space) {
-  const OneByteString& result =
-      OneByteString::Handle(OneByteString::New(len, space));
+  const String& result = String::Handle(OneByteString::New(len, space));
   if (len > 0) {
     NoGCScope no_gc;
-    memmove(result.CharAddr(0), characters, len);
+    memmove(CharAddr(result, 0), characters, len);
   }
-  return result.raw();
+  return OneByteString::raw(result);
 }
 
 
 RawOneByteString* OneByteString::New(const uint16_t* characters,
                                      intptr_t len,
                                      Heap::Space space) {
-  const OneByteString& result =
-      OneByteString::Handle(OneByteString::New(len, space));
+  const String& result =String::Handle(OneByteString::New(len, space));
   for (intptr_t i = 0; i < len; ++i) {
     ASSERT(characters[i] <= 0x7F);
-    *result.CharAddr(i) = characters[i];
+    *CharAddr(result, i) = characters[i];
   }
-  return result.raw();
+  return OneByteString::raw(result);
 }
 
 
 RawOneByteString* OneByteString::New(const uint32_t* characters,
                                      intptr_t len,
                                      Heap::Space space) {
-  const OneByteString& result =
-      OneByteString::Handle(OneByteString::New(len, space));
+  const String& result = String::Handle(OneByteString::New(len, space));
   for (intptr_t i = 0; i < len; ++i) {
     ASSERT(characters[i] <= 0x7F);
-    *result.CharAddr(i) = characters[i];
+    *CharAddr(result, i) = characters[i];
   }
-  return result.raw();
+  return OneByteString::raw(result);
 }
 
 
-RawOneByteString* OneByteString::New(const OneByteString& str,
+RawOneByteString* OneByteString::New(const String& str,
                                      Heap::Space space) {
   intptr_t len = str.Length();
-  const OneByteString& result =
-      OneByteString::Handle(OneByteString::New(len, space));
+  const String& result = String::Handle(OneByteString::New(len, space));
   String::Copy(result, 0, str, 0, len);
-  return result.raw();
+  return OneByteString::raw(result);
 }
 
 
@@ -10440,20 +10518,18 @@
   intptr_t len1 = str1.Length();
   intptr_t len2 = str2.Length();
   intptr_t len = len1 + len2;
-  const OneByteString& result =
-      OneByteString::Handle(OneByteString::New(len, space));
+  const String& result = String::Handle(OneByteString::New(len, space));
   String::Copy(result, 0, str1, 0, len1);
   String::Copy(result, len1, str2, 0, len2);
-  return result.raw();
+  return OneByteString::raw(result);
 }
 
 
 RawOneByteString* OneByteString::ConcatAll(const Array& strings,
                                            intptr_t len,
                                            Heap::Space space) {
-  const OneByteString& result =
-      OneByteString::Handle(OneByteString::New(len, space));
-  OneByteString& str = OneByteString::Handle();
+  const String& result = String::Handle(OneByteString::New(len, space));
+  String& str = String::Handle();
   intptr_t strings_len = strings.Length();
   intptr_t pos = 0;
   for (intptr_t i = 0; i < strings_len; i++) {
@@ -10462,7 +10538,7 @@
     String::Copy(result, pos, str, 0, str_len);
     pos += str_len;
   }
-  return result.raw();
+  return OneByteString::raw(result);
 }
 
 
@@ -10471,50 +10547,45 @@
                                            Heap::Space space) {
   ASSERT(!str.IsNull());
   intptr_t len = str.Length();
-  const OneByteString& result =
-      OneByteString::Handle(OneByteString::New(len, space));
+  const String& result = String::Handle(OneByteString::New(len, space));
   for (intptr_t i = 0; i < len; ++i) {
     int32_t ch = mapping(str.CharAt(i));
     ASSERT(ch >= 0 && ch <= 0x7F);
-    *result.CharAddr(i) = ch;
+    *CharAddr(result, i) = ch;
   }
-  return result.raw();
+  return OneByteString::raw(result);
 }
 
 
-const char* OneByteString::ToCString() const {
-  return String::ToCString();
-}
-
-
-RawTwoByteString* TwoByteString::EscapeSpecialCharacters(bool raw_str) const {
-  intptr_t len = Length();
+RawTwoByteString* TwoByteString::EscapeSpecialCharacters(const String& str,
+                                                         bool raw_str) {
+  intptr_t len = str.Length();
   if (len > 0) {
     intptr_t num_escapes = 0;
     intptr_t index = 0;
     for (intptr_t i = 0; i < len; i++) {
-      if (IsSpecialCharacter(*CharAddr(i)) ||
-          (!raw_str && (*CharAddr(i) == '\\'))) {
+      if (IsSpecialCharacter(*CharAddr(str, i)) ||
+          (!raw_str && (*CharAddr(str, i) == '\\'))) {
         num_escapes += 1;
       }
     }
-    const TwoByteString& dststr = TwoByteString::Handle(
+    const String& dststr = String::Handle(
         TwoByteString::New(len + num_escapes, Heap::kNew));
     for (intptr_t i = 0; i < len; i++) {
-      if (IsSpecialCharacter(*CharAddr(i))) {
-        *(dststr.CharAddr(index)) = '\\';
-        *(dststr.CharAddr(index + 1)) = SpecialCharacter(*CharAddr(i));
+      if (IsSpecialCharacter(*CharAddr(str, i))) {
+        *(CharAddr(dststr, index)) = '\\';
+        *(CharAddr(dststr, index + 1)) = SpecialCharacter(*CharAddr(str, i));
         index += 2;
-      } else if (!raw_str && (*CharAddr(i) == '\\')) {
-        *(dststr.CharAddr(index)) = '\\';
-        *(dststr.CharAddr(index + 1)) = '\\';
+      } else if (!raw_str && (*CharAddr(str, i) == '\\')) {
+        *(CharAddr(dststr, index)) = '\\';
+        *(CharAddr(dststr, index + 1)) = '\\';
         index += 2;
       } else {
-        *(dststr.CharAddr(index)) = *CharAddr(i);
+        *(CharAddr(dststr, index)) = *CharAddr(str, i);
         index += 1;
       }
     }
-    return dststr.raw();
+    return TwoByteString::raw(dststr);
   }
   return TwoByteString::null();
 }
@@ -10527,7 +10598,7 @@
     // This should be caught before we reach here.
     FATAL1("Fatal error in TwoByteString::New: invalid len %"Pd"\n", len);
   }
-  TwoByteString& result = TwoByteString::Handle();
+  String& result = String::Handle();
   {
     RawObject* raw = Object::Allocate(TwoByteString::kClassId,
                                       TwoByteString::InstanceSize(len),
@@ -10537,7 +10608,7 @@
     result.SetLength(len);
     result.SetHash(0);
   }
-  return result.raw();
+  return TwoByteString::raw(result);
 }
 
 
@@ -10545,13 +10616,12 @@
                                      intptr_t array_len,
                                      Heap::Space space) {
   ASSERT(array_len > 0);
-  const TwoByteString& result =
-      TwoByteString::Handle(TwoByteString::New(array_len, space));
+  const String& result = String::Handle(TwoByteString::New(array_len, space));
   {
     NoGCScope no_gc;
-    memmove(result.CharAddr(0), utf16_array, (array_len * 2));
+    memmove(CharAddr(result, 0), utf16_array, (array_len * 2));
   }
-  return result.raw();
+  return TwoByteString::raw(result);
 }
 
 
@@ -10560,34 +10630,32 @@
                                      intptr_t array_len,
                                      Heap::Space space) {
   ASSERT((array_len > 0) && (utf16_len >= array_len));
-  const TwoByteString& result =
-      TwoByteString::Handle(TwoByteString::New(utf16_len, space));
+  const String& result = String::Handle(TwoByteString::New(utf16_len, space));
   {
     NoGCScope no_gc;
     intptr_t j = 0;
     for (intptr_t i = 0; i < array_len; ++i) {
       if (utf32_array[i] > 0xffff) {
         ASSERT(j < (utf16_len - 1));
-        Utf8::ConvertUTF32ToUTF16(utf32_array[i], result.CharAddr(j));
+        Utf8::ConvertUTF32ToUTF16(utf32_array[i], CharAddr(result, j));
         j += 2;
       } else {
         ASSERT(j < utf16_len);
-        *result.CharAddr(j) = utf32_array[i];
+        *CharAddr(result, j) = utf32_array[i];
         j += 1;
       }
     }
   }
-  return result.raw();
+  return TwoByteString::raw(result);
 }
 
 
-RawTwoByteString* TwoByteString::New(const TwoByteString& str,
+RawTwoByteString* TwoByteString::New(const String& str,
                                      Heap::Space space) {
   intptr_t len = str.Length();
-  const TwoByteString& result =
-      TwoByteString::Handle(TwoByteString::New(len, space));
+  const String& result = String::Handle(TwoByteString::New(len, space));
   String::Copy(result, 0, str, 0, len);
-  return result.raw();
+  return TwoByteString::raw(result);
 }
 
 
@@ -10597,19 +10665,17 @@
   intptr_t len1 = str1.Length();
   intptr_t len2 = str2.Length();
   intptr_t len = len1 + len2;
-  const TwoByteString& result =
-      TwoByteString::Handle(TwoByteString::New(len, space));
+  const String& result = String::Handle(TwoByteString::New(len, space));
   String::Copy(result, 0, str1, 0, len1);
   String::Copy(result, len1, str2, 0, len2);
-  return result.raw();
+  return TwoByteString::raw(result);
 }
 
 
 RawTwoByteString* TwoByteString::ConcatAll(const Array& strings,
                                            intptr_t len,
                                            Heap::Space space) {
-  const TwoByteString& result =
-      TwoByteString::Handle(TwoByteString::New(len, space));
+  const String& result = String::Handle(TwoByteString::New(len, space));
   String& str = String::Handle();
   intptr_t strings_len = strings.Length();
   intptr_t pos = 0;
@@ -10619,7 +10685,7 @@
     String::Copy(result, pos, str, 0, str_len);
     pos += str_len;
   }
-  return result.raw();
+  return TwoByteString::raw(result);
 }
 
 
@@ -10628,19 +10694,13 @@
                                            Heap::Space space) {
   ASSERT(!str.IsNull());
   intptr_t len = str.Length();
-  const TwoByteString& result =
-      TwoByteString::Handle(TwoByteString::New(len, space));
+  const String& result = String::Handle(TwoByteString::New(len, space));
   for (intptr_t i = 0; i < len; ++i) {
     int32_t ch = mapping(str.CharAt(i));
     ASSERT(ch >= 0 && ch <= 0xFFFF);
-    *result.CharAddr(i) = ch;
+    *CharAddr(result, i) = ch;
   }
-  return result.raw();
-}
-
-
-const char* TwoByteString::ToCString() const {
-  return String::ToCString();
+  return TwoByteString::raw(result);
 }
 
 
@@ -10664,14 +10724,14 @@
     void* peer,
     Dart_PeerFinalizer callback,
     Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->external_one_byte_string_class() !=
-         Class::null());
+  ASSERT(Isolate::Current()->object_store()->
+         external_one_byte_string_class() != Class::null());
   if (len < 0 || len > kMaxElements) {
     // This should be caught before we reach here.
     FATAL1("Fatal error in ExternalOneByteString::New: invalid len %"Pd"\n",
            len);
   }
-  ExternalOneByteString& result = ExternalOneByteString::Handle();
+  String& result = String::Handle();
   ExternalStringData<uint8_t>* external_data =
       new ExternalStringData<uint8_t>(data, peer, callback);
   {
@@ -10682,10 +10742,10 @@
     result ^= raw;
     result.SetLength(len);
     result.SetHash(0);
-    result.SetExternalData(external_data);
+    SetExternalData(result, external_data);
   }
   AddFinalizer(result, external_data, ExternalOneByteString::Finalize);
-  return result.raw();
+  return ExternalOneByteString::raw(result);
 }
 
 
@@ -10705,11 +10765,6 @@
 }
 
 
-const char* ExternalOneByteString::ToCString() const {
-  return String::ToCString();
-}
-
-
 RawExternalTwoByteString* ExternalTwoByteString::New(
     const uint16_t* data,
     intptr_t len,
@@ -10723,7 +10778,7 @@
     FATAL1("Fatal error in ExternalTwoByteString::New: invalid len %"Pd"\n",
            len);
   }
-  ExternalTwoByteString& result = ExternalTwoByteString::Handle();
+  String& result = String::Handle();
   ExternalStringData<uint16_t>* external_data =
       new ExternalStringData<uint16_t>(data, peer, callback);
   {
@@ -10734,10 +10789,10 @@
     result ^= raw;
     result.SetLength(len);
     result.SetHash(0);
-    result.SetExternalData(external_data);
+    SetExternalData(result, external_data);
   }
   AddFinalizer(result, external_data, ExternalTwoByteString::Finalize);
-  return result.raw();
+  return ExternalTwoByteString::raw(result);
 }
 
 
@@ -10747,11 +10802,6 @@
 }
 
 
-const char* ExternalTwoByteString::ToCString() const {
-  return String::ToCString();
-}
-
-
 RawBool* Bool::True() {
   return Isolate::Current()->object_store()->true_value();
 }
@@ -10818,21 +10868,19 @@
 
 
 RawArray* Array::New(intptr_t len, Heap::Space space) {
-  ObjectStore* object_store = Isolate::Current()->object_store();
-  ASSERT(object_store->array_class() != Class::null());
-  Class& cls = Class::Handle(object_store->array_class());
-  return New(cls, len, space);
+  ASSERT(Isolate::Current()->object_store()->array_class() != Class::null());
+  return New(kClassId, len, space);
 }
 
 
-RawArray* Array::New(const Class& cls, intptr_t len, Heap::Space space) {
+RawArray* Array::New(intptr_t class_id, intptr_t len, Heap::Space space) {
   if (len < 0 || len > Array::kMaxElements) {
     // This should be caught before we reach here.
     FATAL1("Fatal error in Array::New: invalid len %"Pd"\n", len);
   }
   Array& result = Array::Handle();
   {
-    RawObject* raw = Object::Allocate(cls.id(),
+    RawObject* raw = Object::Allocate(class_id,
                                       Array::InstanceSize(len),
                                       space);
     NoGCScope no_gc;
@@ -10844,15 +10892,10 @@
 
 
 void Array::MakeImmutable() const {
-  Isolate* isolate = Isolate::Current();
-  const Class& cls = Class::Handle(
-      isolate, isolate->object_store()->immutable_array_class());
-  {
-    NoGCScope no_gc;
-    uword tags = raw_ptr()->tags_;
-    tags = RawObject::ClassIdTag::update(cls.id(), tags);
-    raw_ptr()->tags_ = tags;
-  }
+  NoGCScope no_gc;
+  uword tags = raw_ptr()->tags_;
+  tags = RawObject::ClassIdTag::update(kImmutableArrayCid, tags);
+  raw_ptr()->tags_ = tags;
 }
 
 
@@ -10913,10 +10956,9 @@
       // As we have enough space to use an array object, update the leftover
       // space as an Array object.
       RawArray* raw = reinterpret_cast<RawArray*>(RawObject::FromAddr(addr));
-      const Class& cls = Class::Handle(isolate->object_store()->array_class());
       tags = 0;
       tags = RawObject::SizeTag::update(leftover_size, tags);
-      tags = RawObject::ClassIdTag::update(cls.id(), tags);
+      tags = RawObject::ClassIdTag::update(kArrayCid, tags);
       raw->ptr()->tags_ = tags;
       intptr_t leftover_len =
           ((leftover_size - Array::InstanceSize(0)) / kWordSize);
@@ -10938,10 +10980,9 @@
 
 RawImmutableArray* ImmutableArray::New(intptr_t len,
                                        Heap::Space space) {
-  ObjectStore* object_store = Isolate::Current()->object_store();
-  ASSERT(object_store->immutable_array_class() != Class::null());
-  Class& cls = Class::Handle(object_store->immutable_array_class());
-  return reinterpret_cast<RawImmutableArray*>(Array::New(cls, len, space));
+  ASSERT(Isolate::Current()->object_store()->immutable_array_class() !=
+         Class::null());
+  return reinterpret_cast<RawImmutableArray*>(Array::New(kClassId, len, space));
 }
 
 
@@ -11117,7 +11158,7 @@
 
 
 template<typename HandleT, typename RawT, typename ElementT>
-RawT* ByteArray::NewExternalImpl(const Class& cls,
+RawT* ByteArray::NewExternalImpl(intptr_t class_id,
                                  ElementT* data,
                                  intptr_t len,
                                  void* peer,
@@ -11132,7 +11173,7 @@
   ExternalByteArrayData<ElementT>* external_data =
       new ExternalByteArrayData<ElementT>(data, peer, callback);
   {
-    RawObject* raw = Object::Allocate(cls.id(), HandleT::InstanceSize(), space);
+    RawObject* raw = Object::Allocate(class_id, HandleT::InstanceSize(), space);
     NoGCScope no_gc;
     result ^= raw;
     result.SetLength(len);
@@ -11165,14 +11206,14 @@
 
 
 template<typename HandleT, typename RawT>
-RawT* ByteArray::NewImpl(const Class& cls, intptr_t len, Heap::Space space) {
+RawT* ByteArray::NewImpl(intptr_t class_id, intptr_t len, Heap::Space space) {
   if (len < 0 || len > HandleT::kMaxElements) {
     // This should be caught before we reach here.
     FATAL1("Fatal error in ByteArray::NewImpl: invalid len %"Pd"\n", len);
   }
   HandleT& result = HandleT::Handle();
   {
-    RawObject* raw = Object::Allocate(cls.id(),
+    RawObject* raw = Object::Allocate(class_id,
                                       HandleT::InstanceSize(len),
                                       space);
     NoGCScope no_gc;
@@ -11187,7 +11228,7 @@
 
 
 template<typename HandleT, typename RawT, typename ElementT>
-RawT* ByteArray::NewImpl(const Class& cls,
+RawT* ByteArray::NewImpl(intptr_t class_id,
                          const ElementT* data,
                          intptr_t len,
                          Heap::Space space) {
@@ -11197,7 +11238,7 @@
   }
   HandleT& result = HandleT::Handle();
   {
-    RawObject* raw = Object::Allocate(cls.id(),
+    RawObject* raw = Object::Allocate(class_id,
                                       HandleT::InstanceSize(len),
                                       space);
     NoGCScope no_gc;
@@ -11212,22 +11253,18 @@
 
 
 RawInt8Array* Int8Array::New(intptr_t len, Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->int8_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->int8_array_class());
-  return NewImpl<Int8Array, RawInt8Array>(cls, len, space);
+  ASSERT(Isolate::Current()->object_store()->int8_array_class() !=
+         Class::null());
+  return NewImpl<Int8Array, RawInt8Array>(kClassId, len, space);
 }
 
 
 RawInt8Array* Int8Array::New(const int8_t* data,
                              intptr_t len,
                              Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->int8_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->int8_array_class());
-  return NewImpl<Int8Array, RawInt8Array>(cls, data, len, space);
+  ASSERT(Isolate::Current()->object_store()->int8_array_class() !=
+         Class::null());
+  return NewImpl<Int8Array, RawInt8Array>(kClassId, data, len, space);
 }
 
 
@@ -11237,22 +11274,18 @@
 
 
 RawUint8Array* Uint8Array::New(intptr_t len, Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->uint8_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->uint8_array_class());
-  return NewImpl<Uint8Array, RawUint8Array>(cls, len, space);
+  ASSERT(Isolate::Current()->object_store()->uint8_array_class() !=
+         Class::null());
+  return NewImpl<Uint8Array, RawUint8Array>(kClassId, len, space);
 }
 
 
 RawUint8Array* Uint8Array::New(const uint8_t* data,
                                intptr_t len,
                                Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->uint8_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->uint8_array_class());
-  return NewImpl<Uint8Array, RawUint8Array>(cls, data, len, space);
+  ASSERT(Isolate::Current()->object_store()->uint8_array_class() !=
+         Class::null());
+  return NewImpl<Uint8Array, RawUint8Array>(kClassId, data, len, space);
 }
 
 
@@ -11262,22 +11295,18 @@
 
 
 RawInt16Array* Int16Array::New(intptr_t len, Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->int16_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->int16_array_class());
-  return NewImpl<Int16Array, RawInt16Array>(cls, len, space);
+  ASSERT(Isolate::Current()->object_store()->int16_array_class() !=
+         Class::null());
+  return NewImpl<Int16Array, RawInt16Array>(kClassId, len, space);
 }
 
 
 RawInt16Array* Int16Array::New(const int16_t* data,
                                intptr_t len,
                                Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->int16_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->int16_array_class());
-  return NewImpl<Int16Array, RawInt16Array>(cls, data, len, space);
+  ASSERT(Isolate::Current()->object_store()->int16_array_class() !=
+         Class::null());
+  return NewImpl<Int16Array, RawInt16Array>(kClassId, data, len, space);
 }
 
 
@@ -11287,22 +11316,18 @@
 
 
 RawUint16Array* Uint16Array::New(intptr_t len, Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->uint16_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->uint16_array_class());
-  return NewImpl<Uint16Array, RawUint16Array>(cls, len, space);
+  ASSERT(Isolate::Current()->object_store()->uint16_array_class() !=
+         Class::null());
+  return NewImpl<Uint16Array, RawUint16Array>(kClassId, len, space);
 }
 
 
 RawUint16Array* Uint16Array::New(const uint16_t* data,
                                  intptr_t len,
                                  Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->uint16_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->uint16_array_class());
-  return NewImpl<Uint16Array, RawUint16Array>(cls, data, len, space);
+  ASSERT(Isolate::Current()->object_store()->uint16_array_class() !=
+         Class::null());
+  return NewImpl<Uint16Array, RawUint16Array>(kClassId, data, len, space);
 }
 
 
@@ -11312,22 +11337,18 @@
 
 
 RawInt32Array* Int32Array::New(intptr_t len, Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->int32_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->int32_array_class());
-  return NewImpl<Int32Array, RawInt32Array>(cls, len, space);
+  ASSERT(Isolate::Current()->object_store()->int32_array_class() !=
+         Class::null());
+  return NewImpl<Int32Array, RawInt32Array>(kClassId, len, space);
 }
 
 
 RawInt32Array* Int32Array::New(const int32_t* data,
                                intptr_t len,
                                Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->int32_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->int32_array_class());
-  return NewImpl<Int32Array, RawInt32Array>(cls, data, len, space);
+  ASSERT(Isolate::Current()->object_store()->int32_array_class() !=
+         Class::null());
+  return NewImpl<Int32Array, RawInt32Array>(kClassId, data, len, space);
 }
 
 
@@ -11337,22 +11358,18 @@
 
 
 RawUint32Array* Uint32Array::New(intptr_t len, Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->uint32_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->uint32_array_class());
-  return NewImpl<Uint32Array, RawUint32Array>(cls, len, space);
+  ASSERT(Isolate::Current()->object_store()->uint32_array_class() !=
+         Class::null());
+  return NewImpl<Uint32Array, RawUint32Array>(kClassId, len, space);
 }
 
 
 RawUint32Array* Uint32Array::New(const uint32_t* data,
                                  intptr_t len,
                                  Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->uint32_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->uint32_array_class());
-  return NewImpl<Uint32Array, RawUint32Array>(cls, data, len, space);
+  ASSERT(Isolate::Current()->object_store()->uint32_array_class() !=
+         Class::null());
+  return NewImpl<Uint32Array, RawUint32Array>(kClassId, data, len, space);
 }
 
 
@@ -11362,22 +11379,18 @@
 
 
 RawInt64Array* Int64Array::New(intptr_t len, Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->int64_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->int64_array_class());
-  return NewImpl<Int64Array, RawInt64Array>(cls, len, space);
+  ASSERT(Isolate::Current()->object_store()->int64_array_class() !=
+         Class::null());
+  return NewImpl<Int64Array, RawInt64Array>(kClassId, len, space);
 }
 
 
 RawInt64Array* Int64Array::New(const int64_t* data,
                                intptr_t len,
                                Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->int64_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->int64_array_class());
-  return NewImpl<Int64Array, RawInt64Array>(cls, data, len, space);
+  ASSERT(Isolate::Current()->object_store()->int64_array_class() !=
+         Class::null());
+  return NewImpl<Int64Array, RawInt64Array>(kClassId, data, len, space);
 }
 
 
@@ -11387,22 +11400,18 @@
 
 
 RawUint64Array* Uint64Array::New(intptr_t len, Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->uint64_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->uint64_array_class());
-  return NewImpl<Uint64Array, RawUint64Array>(cls, len, space);
+  ASSERT(Isolate::Current()->object_store()->uint64_array_class() !=
+         Class::null());
+  return NewImpl<Uint64Array, RawUint64Array>(kClassId, len, space);
 }
 
 
 RawUint64Array* Uint64Array::New(const uint64_t* data,
                                  intptr_t len,
                                  Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->uint64_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->uint64_array_class());
-  return NewImpl<Uint64Array, RawUint64Array>(cls, data, len, space);
+  ASSERT(Isolate::Current()->object_store()->uint64_array_class() !=
+         Class::null());
+  return NewImpl<Uint64Array, RawUint64Array>(kClassId, data, len, space);
 }
 
 
@@ -11412,22 +11421,18 @@
 
 
 RawFloat32Array* Float32Array::New(intptr_t len, Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->float32_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->float32_array_class());
-  return NewImpl<Float32Array, RawFloat32Array>(cls, len, space);
+  ASSERT(Isolate::Current()->object_store()->float32_array_class() !=
+         Class::null());
+  return NewImpl<Float32Array, RawFloat32Array>(kClassId, len, space);
 }
 
 
 RawFloat32Array* Float32Array::New(const float* data,
                                    intptr_t len,
                                    Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->float32_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->float32_array_class());
-  return NewImpl<Float32Array, RawFloat32Array>(cls, data, len, space);
+  ASSERT(Isolate::Current()->object_store()->float32_array_class() !=
+         Class::null());
+  return NewImpl<Float32Array, RawFloat32Array>(kClassId, data, len, space);
 }
 
 
@@ -11437,22 +11442,18 @@
 
 
 RawFloat64Array* Float64Array::New(intptr_t len, Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->float64_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->float64_array_class());
-  return NewImpl<Float64Array, RawFloat64Array>(cls, len, space);
+  ASSERT(Isolate::Current()->object_store()->float64_array_class() !=
+         Class::null());
+  return NewImpl<Float64Array, RawFloat64Array>(kClassId, len, space);
 }
 
 
 RawFloat64Array* Float64Array::New(const double* data,
                                    intptr_t len,
                                    Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->float64_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->float64_array_class());
-  return NewImpl<Float64Array, RawFloat64Array>(cls, data, len, space);
+  ASSERT(Isolate::Current()->object_store()->float64_array_class() !=
+         Class::null());
+  return NewImpl<Float64Array, RawFloat64Array>(kClassId, data, len, space);
 }
 
 
@@ -11466,12 +11467,10 @@
                                              void* peer,
                                              Dart_PeerFinalizer callback,
                                              Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->external_int8_array_class() != Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->external_int8_array_class());
+  ASSERT(Isolate::Current()->object_store()->external_int8_array_class() !=
+         Class::null());
   return NewExternalImpl<ExternalInt8Array, RawExternalInt8Array>(
-      cls, data, len, peer, callback, space);
+      kClassId, data, len, peer, callback, space);
 }
 
 
@@ -11485,13 +11484,10 @@
                                                void* peer,
                                                Dart_PeerFinalizer callback,
                                                Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->external_uint8_array_class() !=
+  ASSERT(Isolate::Current()->object_store()->external_uint8_array_class() !=
          Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->external_uint8_array_class());
   return NewExternalImpl<ExternalUint8Array, RawExternalUint8Array>(
-      cls, data, len, peer, callback, space);
+      kClassId, data, len, peer, callback, space);
 }
 
 
@@ -11505,13 +11501,10 @@
                                                void* peer,
                                                Dart_PeerFinalizer callback,
                                                Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->external_int16_array_class() !=
+  ASSERT(Isolate::Current()->object_store()->external_int16_array_class() !=
          Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->external_int16_array_class());
   return NewExternalImpl<ExternalInt16Array, RawExternalInt16Array>(
-      cls, data, len, peer, callback, space);
+      kClassId, data, len, peer, callback, space);
 }
 
 
@@ -11525,13 +11518,10 @@
                                                  void* peer,
                                                  Dart_PeerFinalizer callback,
                                                  Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->external_uint16_array_class() !=
+  ASSERT(Isolate::Current()->object_store()->external_uint16_array_class() !=
          Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->external_uint16_array_class());
   return NewExternalImpl<ExternalUint16Array, RawExternalUint16Array>(
-      cls, data, len, peer, callback, space);
+      kClassId, data, len, peer, callback, space);
 }
 
 
@@ -11545,13 +11535,10 @@
                                                void* peer,
                                                Dart_PeerFinalizer callback,
                                                Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->external_int32_array_class() !=
+  ASSERT(Isolate::Current()->object_store()->external_int32_array_class() !=
          Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->external_int32_array_class());
   return NewExternalImpl<ExternalInt32Array, RawExternalInt32Array>(
-      cls, data, len, peer, callback, space);
+      kClassId, data, len, peer, callback, space);
 }
 
 
@@ -11565,13 +11552,10 @@
                                                  void* peer,
                                                  Dart_PeerFinalizer callback,
                                                  Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->external_uint32_array_class() !=
+  ASSERT(Isolate::Current()->object_store()->external_uint32_array_class() !=
          Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->external_uint32_array_class());
   return NewExternalImpl<ExternalUint32Array, RawExternalUint32Array>(
-      cls, data, len, peer, callback, space);
+      kClassId, data, len, peer, callback, space);
 }
 
 
@@ -11585,13 +11569,10 @@
                                                void* peer,
                                                Dart_PeerFinalizer callback,
                                                Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->external_int64_array_class() !=
+  ASSERT(Isolate::Current()->object_store()->external_int64_array_class() !=
          Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->external_int64_array_class());
   return NewExternalImpl<ExternalInt64Array, RawExternalInt64Array>(
-      cls, data, len, peer, callback, space);
+      kClassId, data, len, peer, callback, space);
 }
 
 
@@ -11605,13 +11586,10 @@
                                                  void* peer,
                                                  Dart_PeerFinalizer callback,
                                                  Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->external_uint64_array_class() !=
+  ASSERT(Isolate::Current()->object_store()->external_uint64_array_class() !=
          Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->external_uint64_array_class());
   return NewExternalImpl<ExternalUint64Array, RawExternalUint64Array>(
-      cls, data, len, peer, callback, space);
+      kClassId, data, len, peer, callback, space);
 }
 
 
@@ -11625,13 +11603,10 @@
                                                    void* peer,
                                                    Dart_PeerFinalizer callback,
                                                    Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->external_float32_array_class() !=
+  ASSERT(Isolate::Current()->object_store()->external_float32_array_class() !=
          Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->external_float32_array_class());
   return NewExternalImpl<ExternalFloat32Array, RawExternalFloat32Array>(
-      cls, data, len, peer, callback, space);
+      kClassId, data, len, peer, callback, space);
 }
 
 
@@ -11645,13 +11620,10 @@
                                                    void* peer,
                                                    Dart_PeerFinalizer callback,
                                                    Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate->object_store()->external_float64_array_class() !=
+  ASSERT(Isolate::Current()->object_store()->external_float64_array_class() !=
          Class::null());
-  const Class& cls =
-      Class::Handle(isolate->object_store()->external_float64_array_class());
   return NewExternalImpl<ExternalFloat64Array, RawExternalFloat64Array>(
-      cls, data, len, peer, callback, space);
+      kClassId, data, len, peer, callback, space);
 }
 
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 27dc8d1..2836dda 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -150,7 +150,9 @@
   virtual ~Object() { }
 
   RawObject* raw() const { return raw_; }
-  void operator=(RawObject* value) { SetRaw(value); }
+  void operator=(RawObject* value) {
+    initializeHandle(this, value);
+  }
 
   void set_tags(intptr_t value) const {
     // TODO(asiva): Remove the capability of setting tags in general. The mask
@@ -178,7 +180,7 @@
   // Class testers.
 #define DEFINE_CLASS_TESTER(clazz)                                             \
   virtual bool Is##clazz() const { return false; }
-CLASS_LIST_NO_OBJECT(DEFINE_CLASS_TESTER);
+  CLASS_LIST_FOR_HANDLES(DEFINE_CLASS_TESTER);
 #undef DEFINE_CLASS_TESTER
 
   bool IsNull() const { return raw_ == null_; }
@@ -212,7 +214,7 @@
 
   static Object& Handle(Isolate* isolate, RawObject* raw_ptr) {
     Object* obj = reinterpret_cast<Object*>(VMHandles::AllocateHandle(isolate));
-    obj->SetRaw(raw_ptr);
+    initializeHandle(obj, raw_ptr);
     return *obj;
   }
 
@@ -231,7 +233,7 @@
   static Object& ZoneHandle(Isolate* isolate, RawObject* raw_ptr) {
     Object* obj = reinterpret_cast<Object*>(
         VMHandles::AllocateZoneHandle(isolate));
-    obj->SetRaw(raw_ptr);
+    initializeHandle(obj, raw_ptr);
     return *obj;
   }
 
@@ -371,6 +373,17 @@
                                    const String& name,
                                    const Library& lib);
 
+  /* Initialize the handle based on the raw_ptr in the presence of null. */
+  static void initializeHandle(Object* obj, RawObject* raw_ptr) {
+    if (raw_ptr != Object::null()) {
+      obj->SetRaw(raw_ptr);
+    } else {
+      obj->raw_ = Object::null();
+      Object fake_object;
+      obj->set_vtable(fake_object.vtable());
+    }
+  }
+
   cpp_vtable* vtable_address() const {
     uword vtable_addr = reinterpret_cast<uword>(this);
     return reinterpret_cast<cpp_vtable*>(vtable_addr);
@@ -425,6 +438,10 @@
   friend void RawObject::Validate(Isolate* isolate) const;
   friend class Closure;
   friend class SnapshotReader;
+  friend class OneByteString;
+  friend class TwoByteString;
+  friend class ExternalOneByteString;
+  friend class ExternalTwoByteString;
 
   // Disallow allocation.
   void* operator new(size_t size);
@@ -715,6 +732,9 @@
                                     const String& name,
                                     int num_fields);
 
+  // Allocate the raw string classes.
+  static RawClass* NewStringClass(intptr_t class_id);
+
   // Allocate a class representing a function signature described by
   // signature_function, which must be a closure function or a signature
   // function.
@@ -1273,6 +1293,17 @@
   bool IsInlineable() const;
   void set_is_inlinable(bool value) const;
 
+  enum IntrinsicKind {
+    kUnknownIntrinsic = 0,  // Initial value.
+    kIsIntrinsic,
+    kIsNotIntrinsic,
+  };
+
+  IntrinsicKind intrinsic_kind() const {
+    return IntrinsicKindBits::decode(raw_ptr()->kind_tag_);
+  }
+  void set_intrinsic_kind(IntrinsicKind value) const;
+
   bool HasOptimizedCode() const;
 
   // Returns true if the argument counts are valid for calling this function.
@@ -1402,15 +1433,17 @@
 
  private:
   enum KindTagBits {
-    kStaticBit = 1,
-    kConstBit,
-    kOptimizableBit,
-    kInlinableBit,
-    kHasFinallyBit,
-    kNativeBit,
-    kAbstractBit,
-    kExternalBit,
-    kKindTagBit,
+    kStaticBit = 0,
+    kConstBit = 1,
+    kOptimizableBit = 2,
+    kInlinableBit = 3,
+    kHasFinallyBit = 4,
+    kNativeBit = 5,
+    kAbstractBit = 6,
+    kExternalBit = 7,
+    kIntrinsicTagBit = 8,
+    kIntrinsicTagSize = 2,
+    kKindTagBit = 10,
     kKindTagSize = 4,
   };
   class StaticBit : public BitField<bool, kStaticBit, 1> {};
@@ -1421,6 +1454,9 @@
   class NativeBit : public BitField<bool, kNativeBit, 1> {};
   class AbstractBit : public BitField<bool, kAbstractBit, 1> {};
   class ExternalBit : public BitField<bool, kExternalBit, 1> {};
+  class IntrinsicKindBits :
+    public BitField<Function::IntrinsicKind,
+                    kIntrinsicTagBit, kIntrinsicTagSize> {};  // NOLINT
   class KindBits :
     public BitField<RawFunction::Kind, kKindTagBit, kKindTagSize> {};  // NOLINT
 
@@ -2547,6 +2583,11 @@
   // Returns an array indexed by deopt id, containing the extracted ICData.
   RawArray* ExtractTypeFeedbackArray() const;
 
+  // Returns deopt-ids of all static calls that were never resolved, i.e.,
+  // never executed.
+  void ExtractUncalledStaticCallDeoptIds(
+      GrowableArray<intptr_t>* deopt_ids) const;
+
  private:
   // An object finder visitor interface.
   class FindRawCodeVisitor : public FindObjectVisitor {
@@ -3643,9 +3684,9 @@
   static intptr_t Hash(const uint16_t* characters, intptr_t len);
   static intptr_t Hash(const uint32_t* characters, intptr_t len);
 
-  virtual int32_t CharAt(intptr_t index) const;
+  int32_t CharAt(intptr_t index) const;
 
-  virtual intptr_t CharSize() const;
+  intptr_t CharSize() const;
 
   inline bool Equals(const String& str) const;
   inline bool Equals(const String& str,
@@ -3666,12 +3707,28 @@
 
   bool IsSymbol() const { return raw()->IsCanonical(); }
 
-  virtual bool IsExternal() const { return false; }
-  virtual void* GetPeer() const {
-    UNREACHABLE();
-    return NULL;
+  bool IsOneByteString() const {
+    return raw()->GetClassId() == kOneByteStringCid;
   }
 
+  bool IsTwoByteString() const {
+    return raw()->GetClassId() == kTwoByteStringCid;
+  }
+
+  bool IsExternalOneByteString() const {
+    return raw()->GetClassId() == kExternalOneByteStringCid;
+  }
+
+  bool IsExternalTwoByteString() const {
+    return raw()->GetClassId() == kExternalTwoByteStringCid;
+  }
+
+  bool IsExternal() const {
+    return RawObject::IsExternalStringClassId(raw()->GetClassId());
+  }
+
+  void* GetPeer() const;
+
   void ToUTF8(uint8_t* utf8_array, intptr_t array_len) const;
 
   // Creates a new String object from a C string that is assumed to contain
@@ -3775,30 +3832,33 @@
 
   template<typename HandleType, typename ElementType>
   static void ReadFromImpl(SnapshotReader* reader,
-                           HandleType* str_obj,
+                           String* str_obj,
                            intptr_t len,
                            intptr_t tags,
                            Snapshot::Kind kind);
 
   HEAP_OBJECT_IMPLEMENTATION(String, Instance);
 
+  friend class Class;
   friend class Symbols;
+  friend class OneByteString;
+  friend class TwoByteString;
+  friend class ExternalOneByteString;
+  friend class ExternalTwoByteString;
 };
 
 
-class OneByteString : public String {
+class OneByteString : public AllStatic {
  public:
-  virtual int32_t CharAt(intptr_t index) const {
-    return *CharAddr(index);
+  static int32_t CharAt(const String& str, intptr_t index) {
+    return *CharAddr(str, index);
   }
 
-  virtual intptr_t CharSize() const {
-    return kOneByteChar;
-  }
+  static RawOneByteString* EscapeSpecialCharacters(const String& str,
+                                                   bool raw_str);
 
-  RawOneByteString* EscapeSpecialCharacters(bool raw_str) const;
-
-  bool EqualsIgnoringPrivateKey(const OneByteString& str) const;
+  static bool EqualsIgnoringPrivateKey(const String& str1,
+                                       const String& str2);
 
   // We use the same maximum elements for all strings.
   static const intptr_t kBytesPerElement = 1;
@@ -3812,9 +3872,9 @@
   }
 
   static intptr_t InstanceSize(intptr_t len) {
-    ASSERT(sizeof(RawOneByteString) == kSizeofRawString);
+    ASSERT(sizeof(RawOneByteString) == String::kSizeofRawString);
     ASSERT(0 <= len && len <= kMaxElements);
-    return RoundedAllocationSize(
+    return String::RoundedAllocationSize(
         sizeof(RawOneByteString) + (len * kBytesPerElement));
   }
 
@@ -3835,7 +3895,7 @@
   static RawOneByteString* New(const uint32_t* characters,
                                intptr_t len,
                                Heap::Space space);
-  static RawOneByteString* New(const OneByteString& str,
+  static RawOneByteString* New(const String& str,
                                Heap::Space space);
 
   static RawOneByteString* Concat(const String& str1,
@@ -3849,44 +3909,63 @@
                                      const String& str,
                                      Heap::Space space);
 
- private:
-  uint8_t* CharAddr(intptr_t index) const {
-    // TODO(iposva): Determine if we should throw an exception here.
-    ASSERT((index >= 0) && (index < Length()));
-    return &raw_ptr()->data_[index];
+  static const ClassId kClassId = kOneByteStringCid;
+
+  static RawOneByteString* null() {
+    return reinterpret_cast<RawOneByteString*>(Object::null());
   }
 
-  HEAP_OBJECT_IMPLEMENTATION(OneByteString, String);
+ private:
+  static RawOneByteString* raw(const String& str) {
+    return reinterpret_cast<RawOneByteString*>(str.raw());
+  }
+
+  static RawOneByteString* raw_ptr(const String& str) {
+    return reinterpret_cast<RawOneByteString*>(str.raw_ptr());
+  }
+
+  static uint8_t* CharAddr(const String& str, intptr_t index) {
+    ASSERT((index >= 0) && (index < str.Length()));
+    ASSERT(str.IsOneByteString());
+    NoGCScope no_gc;
+    return &raw_ptr(str)->data_[index];
+  }
+
+  static RawOneByteString* ReadFrom(SnapshotReader* reader,
+                                    intptr_t object_id,
+                                    intptr_t tags,
+                                    Snapshot::Kind kind);
+
   friend class Class;
   friend class String;
+  friend class SnapshotReader;
 };
 
 
-class TwoByteString : public String {
+class TwoByteString : public AllStatic {
  public:
-  virtual int32_t CharAt(intptr_t index) const {
-    return *CharAddr(index);
+  static int32_t CharAt(const String& str, intptr_t index) {
+    return *CharAddr(str, index);
   }
 
-  virtual intptr_t CharSize() const {
-    return kTwoByteChar;
-  }
-
-  RawTwoByteString* EscapeSpecialCharacters(bool raw_str) const;
+  static RawTwoByteString* EscapeSpecialCharacters(const String& str,
+                                                   bool raw_str);
 
   // We use the same maximum elements for all strings.
   static const intptr_t kBytesPerElement = 2;
   static const intptr_t kMaxElements = String::kMaxElements;
 
+  static intptr_t data_offset() { return OFFSET_OF(RawTwoByteString, data_); }
+
   static intptr_t InstanceSize() {
     ASSERT(sizeof(RawTwoByteString) == OFFSET_OF(RawTwoByteString, data_));
     return 0;
   }
 
   static intptr_t InstanceSize(intptr_t len) {
-    ASSERT(sizeof(RawTwoByteString) == kSizeofRawString);
+    ASSERT(sizeof(RawTwoByteString) == String::kSizeofRawString);
     ASSERT(0 <= len && len <= kMaxElements);
-    return RoundedAllocationSize(
+    return String::RoundedAllocationSize(
         sizeof(RawTwoByteString) + (len * kBytesPerElement));
   }
 
@@ -3899,7 +3978,7 @@
                                const uint32_t* characters,
                                intptr_t len,
                                Heap::Space space);
-  static RawTwoByteString* New(const TwoByteString& str,
+  static RawTwoByteString* New(const String& str,
                                Heap::Space space);
 
   static RawTwoByteString* Concat(const String& str1,
@@ -3913,31 +3992,48 @@
                                      const String& str,
                                      Heap::Space space);
 
- private:
-  uint16_t* CharAddr(intptr_t index) const {
-    ASSERT((index >= 0) && (index < Length()));
-    return &raw_ptr()->data_[index];
+  static RawTwoByteString* null() {
+    return reinterpret_cast<RawTwoByteString*>(Object::null());
   }
 
-  HEAP_OBJECT_IMPLEMENTATION(TwoByteString, String);
+
+  static const ClassId kClassId = kTwoByteStringCid;
+
+ private:
+  static RawTwoByteString* raw(const String& str) {
+    return reinterpret_cast<RawTwoByteString*>(str.raw());
+  }
+
+  static RawTwoByteString* raw_ptr(const String& str) {
+    return reinterpret_cast<RawTwoByteString*>(str.raw_ptr());
+  }
+
+  static uint16_t* CharAddr(const String& str, intptr_t index) {
+    ASSERT((index >= 0) && (index < str.Length()));
+    ASSERT(str.IsTwoByteString());
+    NoGCScope no_gc;
+    return &raw_ptr(str)->data_[index];
+  }
+
+  static RawTwoByteString* ReadFrom(SnapshotReader* reader,
+                                    intptr_t object_id,
+                                    intptr_t tags,
+                                    Snapshot::Kind kind);
+
   friend class Class;
   friend class String;
+  friend class SnapshotReader;
 };
 
 
-class ExternalOneByteString : public String {
+class ExternalOneByteString : public AllStatic {
  public:
-  virtual int32_t CharAt(intptr_t index) const {
-    return *CharAddr(index);
+  static int32_t CharAt(const String& str, intptr_t index) {
+    return *CharAddr(str, index);
   }
 
-  virtual intptr_t CharSize() const {
-    return kOneByteChar;
-  }
-
-  virtual bool IsExternal() const { return true; }
-  virtual void* GetPeer() const {
-    return raw_ptr()->external_data_->peer();
+  static void* GetPeer(const String& str) {
+    return raw_ptr(str)->external_data_->peer();
   }
 
   // We use the same maximum elements for all strings.
@@ -3945,7 +4041,7 @@
   static const intptr_t kMaxElements = String::kMaxElements;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawExternalOneByteString));
+    return String::RoundedAllocationSize(sizeof(RawExternalOneByteString));
   }
 
   static RawExternalOneByteString* New(const uint8_t* characters,
@@ -3954,38 +4050,56 @@
                                        Dart_PeerFinalizer callback,
                                        Heap::Space space);
 
- private:
-  const uint8_t* CharAddr(intptr_t index) const {
-    // TODO(iposva): Determine if we should throw an exception here.
-    ASSERT((index >= 0) && (index < Length()));
-    return &(raw_ptr()->external_data_->data()[index]);
+  static RawExternalOneByteString* null() {
+    return reinterpret_cast<RawExternalOneByteString*>(Object::null());
   }
 
-  void SetExternalData(ExternalStringData<uint8_t>* data) {
-    raw_ptr()->external_data_ = data;
+  static const ClassId kClassId = kExternalOneByteStringCid;
+
+ private:
+  static RawExternalOneByteString* raw(const String& str) {
+    return reinterpret_cast<RawExternalOneByteString*>(str.raw());
+  }
+
+  static RawExternalOneByteString* raw_ptr(const String& str) {
+    return reinterpret_cast<RawExternalOneByteString*>(str.raw_ptr());
+  }
+
+  static const uint8_t* CharAddr(const String& str, intptr_t index) {
+    ASSERT((index >= 0) && (index < str.Length()));
+    ASSERT(str.IsExternalOneByteString());
+    NoGCScope no_gc;
+    return &(raw_ptr(str)->external_data_->data()[index]);
+  }
+
+  static void SetExternalData(const String& str,
+                              ExternalStringData<uint8_t>* data) {
+    ASSERT(str.IsExternalOneByteString());
+    NoGCScope no_gc;
+    raw_ptr(str)->external_data_ = data;
   }
 
   static void Finalize(Dart_Handle handle, void* peer);
 
-  HEAP_OBJECT_IMPLEMENTATION(ExternalOneByteString, String);
+  static RawExternalOneByteString* ReadFrom(SnapshotReader* reader,
+                                            intptr_t object_id,
+                                            intptr_t tags,
+                                            Snapshot::Kind kind);
+
   friend class Class;
   friend class String;
+  friend class SnapshotReader;
 };
 
 
-class ExternalTwoByteString : public String {
+class ExternalTwoByteString : public AllStatic {
  public:
-  virtual int32_t CharAt(intptr_t index) const {
-    return *CharAddr(index);
+  static int32_t CharAt(const String& str, intptr_t index) {
+    return *CharAddr(str, index);
   }
 
-  virtual intptr_t CharSize() const {
-    return kTwoByteChar;
-  }
-
-  virtual bool IsExternal() const { return true; }
-  virtual void* GetPeer() const {
-    return raw_ptr()->external_data_->peer();
+  static void* GetPeer(const String& str) {
+    return raw_ptr(str)->external_data_->peer();
   }
 
   // We use the same maximum elements for all strings.
@@ -3993,7 +4107,7 @@
   static const intptr_t kMaxElements = String::kMaxElements;
 
   static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawExternalTwoByteString));
+    return String::RoundedAllocationSize(sizeof(RawExternalTwoByteString));
   }
 
   static RawExternalTwoByteString* New(const uint16_t* characters,
@@ -4002,22 +4116,45 @@
                                        Dart_PeerFinalizer callback,
                                        Heap::Space space = Heap::kNew);
 
- private:
-  const uint16_t* CharAddr(intptr_t index) const {
-    // TODO(iposva): Determine if we should throw an exception here.
-    ASSERT((index >= 0) && (index < Length()));
-    return &(raw_ptr()->external_data_->data()[index]);
+  static RawExternalTwoByteString* null() {
+    return reinterpret_cast<RawExternalTwoByteString*>(Object::null());
   }
 
-  void SetExternalData(ExternalStringData<uint16_t>* data) {
-    raw_ptr()->external_data_ = data;
+  static const ClassId kClassId = kExternalTwoByteStringCid;
+
+ private:
+  static RawExternalTwoByteString* raw(const String& str) {
+    return reinterpret_cast<RawExternalTwoByteString*>(str.raw());
+  }
+
+  static RawExternalTwoByteString* raw_ptr(const String& str) {
+    return reinterpret_cast<RawExternalTwoByteString*>(str.raw_ptr());
+  }
+
+  static const uint16_t* CharAddr(const String& str, intptr_t index) {
+    ASSERT((index >= 0) && (index < str.Length()));
+    ASSERT(str.IsExternalTwoByteString());
+    NoGCScope no_gc;
+    return &(raw_ptr(str)->external_data_->data()[index]);
+  }
+
+  static void SetExternalData(const String& str,
+                              ExternalStringData<uint16_t>* data) {
+    ASSERT(str.IsExternalTwoByteString());
+    NoGCScope no_gc;
+    raw_ptr(str)->external_data_ = data;
   }
 
   static void Finalize(Dart_Handle handle, void* peer);
 
-  HEAP_OBJECT_IMPLEMENTATION(ExternalTwoByteString, String);
+  static RawExternalTwoByteString* ReadFrom(SnapshotReader* reader,
+                                            intptr_t object_id,
+                                            intptr_t tags,
+                                            Snapshot::Kind kind);
+
   friend class Class;
   friend class String;
+  friend class SnapshotReader;
 };
 
 
@@ -4120,7 +4257,7 @@
   static RawArray* MakeArray(const GrowableObjectArray& growable_array);
 
  protected:
-  static RawArray* New(const Class& cls,
+  static RawArray* New(intptr_t class_id,
                        intptr_t len,
                        Heap::Space space = Heap::kNew);
 
@@ -4276,18 +4413,18 @@
   virtual uint8_t* ByteAddr(intptr_t byte_offset) const;
 
   template<typename HandleT, typename RawT>
-  static RawT* NewImpl(const Class& cls,
+  static RawT* NewImpl(intptr_t class_id,
                        intptr_t len,
                        Heap::Space space);
 
   template<typename HandleT, typename RawT, typename ElementT>
-  static RawT* NewImpl(const Class& cls,
+  static RawT* NewImpl(intptr_t class_id,
                        const ElementT* data,
                        intptr_t len,
                        Heap::Space space);
 
   template<typename HandleT, typename RawT, typename ElementT>
-  static RawT* NewExternalImpl(const Class& cls,
+  static RawT* NewExternalImpl(intptr_t class_id,
                                ElementT* data,
                                intptr_t len,
                                void* peer,
@@ -5657,11 +5794,12 @@
   if ((reinterpret_cast<uword>(raw_) & kSmiTagMask) == kSmiTag) {
     set_vtable(Smi::handle_vtable_);
     return;
-  } else if (raw_ == null_) {
-    set_vtable(handle_vtable_);
-    return;
   }
-
+  intptr_t cid = raw_->GetClassId();
+  if (cid >= kNumPredefinedCids) {
+      cid = kInstanceCid;
+  }
+  set_vtable(builtin_vtables_[cid]);
 #if defined(DEBUG)
   Isolate* isolate = Isolate::Current();
   if (FLAG_verify_handles) {
@@ -5670,17 +5808,9 @@
     ASSERT(isolate_heap->Contains(reinterpret_cast<uword>(raw_->ptr())) ||
            vm_isolate_heap->Contains(reinterpret_cast<uword>(raw_->ptr())));
   }
+  ASSERT(builtin_vtables_[cid] ==
+         isolate->class_table()->At(cid)->ptr()->handle_vtable_);
 #endif
-  intptr_t cid = raw_->GetClassId();
-  if (cid < kNumPredefinedCids) {
-#if defined(DEBUG)
-    ASSERT(builtin_vtables_[cid] ==
-           isolate->class_table()->At(cid)->ptr()->handle_vtable_);
-#endif
-    set_vtable(builtin_vtables_[cid]);
-  } else {
-    set_vtable(builtin_vtables_[kInstanceCid]);
-  }
 }
 
 
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 9347a56..2c35fd7 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2488,102 +2488,102 @@
 
 
 TEST_CASE(EqualsIgnoringPrivate) {
-  OneByteString& mangled_name = OneByteString::Handle();
-  OneByteString& bare_name = OneByteString::Handle();
+  String& mangled_name = String::Handle();
+  String& bare_name = String::Handle();
 
   // Simple matches.
   mangled_name = OneByteString::New("foo");
   bare_name = OneByteString::New("foo");
-  EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   mangled_name = OneByteString::New("foo.");
   bare_name = OneByteString::New("foo.");
-  EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   mangled_name = OneByteString::New("foo.named");
   bare_name = OneByteString::New("foo.named");
-  EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   // Simple mismatches.
   mangled_name = OneByteString::New("bar");
   bare_name = OneByteString::New("foo");
-  EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   mangled_name = OneByteString::New("foo.");
   bare_name = OneByteString::New("foo");
-  EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   mangled_name = OneByteString::New("foo");
   bare_name = OneByteString::New("foo.");
-  EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   mangled_name = OneByteString::New("foo.name");
   bare_name = OneByteString::New("foo.named");
-  EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   mangled_name = OneByteString::New("foo.named");
   bare_name = OneByteString::New("foo.name");
-  EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   // Private match.
   mangled_name = OneByteString::New("foo@12345");
   bare_name = OneByteString::New("foo");
-  EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   // Private mismatch.
   mangled_name = OneByteString::New("food@12345");
   bare_name = OneByteString::New("foo");
-  EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   // Private mismatch 2.
   mangled_name = OneByteString::New("foo@12345");
   bare_name = OneByteString::New("food");
-  EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   // Private constructor match.
   mangled_name = OneByteString::New("foo@12345.");
   bare_name = OneByteString::New("foo.");
-  EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   // Private constructor mismatch.
   mangled_name = OneByteString::New("foo@12345.");
   bare_name = OneByteString::New("foo");
-  EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   // Private constructor mismatch 2.
   mangled_name = OneByteString::New("foo@12345");
   bare_name = OneByteString::New("foo.");
-  EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   // Named private constructor match.
   mangled_name = OneByteString::New("foo@12345.named");
   bare_name = OneByteString::New("foo.named");
-  EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   // Named private constructor mismatch.
   mangled_name = OneByteString::New("foo@12345.name");
   bare_name = OneByteString::New("foo.named");
-  EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   // Named private constructor mismatch 2.
   mangled_name = OneByteString::New("foo@12345.named");
   bare_name = OneByteString::New("foo.name");
-  EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   // Named double-private constructor match.  Yes, this happens.
   mangled_name = OneByteString::New("foo@12345.named@12345");
   bare_name = OneByteString::New("foo.named");
-  EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   // Named double-private constructor mismatch.
   mangled_name = OneByteString::New("foo@12345.name@12345");
   bare_name = OneByteString::New("foo.named");
-  EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 
   // Named double-private constructor mismatch.
   mangled_name = OneByteString::New("foo@12345.named@12345");
   bare_name = OneByteString::New("foo.name");
-  EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name));
+  EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name));
 }
 
 
@@ -2659,9 +2659,9 @@
   {
     // Weak property and value in new. Key in old.
     HANDLESCOPE(isolate);
-    OneByteString& key = OneByteString::Handle();
+    String& key = String::Handle();
     key ^= OneByteString::New("key", Heap::kOld);
-    OneByteString& value = OneByteString::Handle();
+    String& value = String::Handle();
     value ^= OneByteString::New("value", Heap::kNew);
     weak ^= WeakProperty::New(Heap::kNew);
     weak.set_key(key);
@@ -2677,9 +2677,9 @@
   {
     // Weak property and value in old. Key in new.
     HANDLESCOPE(isolate);
-    OneByteString& key = OneByteString::Handle();
+    String& key = String::Handle();
     key ^= OneByteString::New("key", Heap::kNew);
-    OneByteString& value = OneByteString::Handle();
+    String& value = String::Handle();
     value ^= OneByteString::New("value", Heap::kOld);
     weak ^= WeakProperty::New(Heap::kOld);
     weak.set_key(key);
@@ -2697,7 +2697,7 @@
     HANDLESCOPE(isolate);
     Integer& key = Integer::Handle();
     key ^= Integer::New(31);
-    OneByteString& value = OneByteString::Handle();
+    String& value = String::Handle();
     value ^= OneByteString::New("value", Heap::kNew);
     weak ^= WeakProperty::New(Heap::kNew);
     weak.set_key(key);
@@ -2715,7 +2715,7 @@
     HANDLESCOPE(isolate);
     Integer& key = Integer::Handle();
     key ^= Integer::New(32);
-    OneByteString& value = OneByteString::Handle();
+    String& value = String::Handle();
     value ^= OneByteString::New("value", Heap::kOld);
     weak ^= WeakProperty::New(Heap::kOld);
     weak.set_key(key);
@@ -2731,9 +2731,9 @@
   {
     // Weak property and value in new. Key in VM isolate.
     HANDLESCOPE(isolate);
-    OneByteString& key = OneByteString::Handle();
+    String& key = String::Handle();
     key ^= Symbols::Dot();
-    OneByteString& value = OneByteString::Handle();
+    String& value = String::Handle();
     value ^= OneByteString::New("value", Heap::kNew);
     weak ^= WeakProperty::New(Heap::kNew);
     weak.set_key(key);
@@ -2749,9 +2749,9 @@
   {
     // Weak property and value in old. Key in VM isolate.
     HANDLESCOPE(isolate);
-    OneByteString& key = OneByteString::Handle();
+    String& key = String::Handle();
     key ^= Symbols::Dot();
-    OneByteString& value = OneByteString::Handle();
+    String& value = String::Handle();
     value ^= OneByteString::New("value", Heap::kOld);
     weak ^= WeakProperty::New(Heap::kOld);
     weak.set_key(key);
@@ -2775,10 +2775,10 @@
   Array& arr = Array::Handle(Array::New(1));
   {
     HANDLESCOPE(isolate);
-    OneByteString& key = OneByteString::Handle();
+    String& key = String::Handle();
     key ^= OneByteString::New("key");
     arr.SetAt(0, key);
-    OneByteString& value = OneByteString::Handle();
+    String& value = String::Handle();
     value ^= OneByteString::New("value");
     weak ^= WeakProperty::New();
     weak.set_key(key);
@@ -2793,11 +2793,11 @@
 TEST_CASE(WeakProperty_PreserveOne_NewSpace) {
   Isolate* isolate = Isolate::Current();
   WeakProperty& weak = WeakProperty::Handle();
-  OneByteString& key = OneByteString::Handle();
+  String& key = String::Handle();
   key ^= OneByteString::New("key");
   {
     HANDLESCOPE(isolate);
-    OneByteString& value = OneByteString::Handle();
+    String& value = String::Handle();
     value ^= OneByteString::New("value");
     weak ^= WeakProperty::New();
     weak.set_key(key);
@@ -2812,19 +2812,19 @@
 TEST_CASE(WeakProperty_PreserveTwo_NewSpace) {
   Isolate* isolate = Isolate::Current();
   WeakProperty& weak1 = WeakProperty::Handle();
-  OneByteString& key1 = OneByteString::Handle();
+  String& key1 = String::Handle();
   key1 ^= OneByteString::New("key1");
   WeakProperty& weak2 = WeakProperty::Handle();
-  OneByteString& key2 = OneByteString::Handle();
+  String& key2 = String::Handle();
   key2 ^= OneByteString::New("key2");
   {
     HANDLESCOPE(isolate);
-    OneByteString& value1 = OneByteString::Handle();
+    String& value1 = String::Handle();
     value1 ^= OneByteString::New("value1");
     weak1 ^= WeakProperty::New();
     weak1.set_key(key1);
     weak1.set_value(value1);
-    OneByteString& value2 = OneByteString::Handle();
+    String& value2 = String::Handle();
     value2 ^= OneByteString::New("value2");
     weak2 ^= WeakProperty::New();
     weak2.set_key(key2);
@@ -2842,16 +2842,16 @@
   Isolate* isolate = Isolate::Current();
   WeakProperty& weak1 = WeakProperty::Handle();
   WeakProperty& weak2 = WeakProperty::Handle();
-  OneByteString& key = OneByteString::Handle();
+  String& key = String::Handle();
   key ^= OneByteString::New("key");
   {
     HANDLESCOPE(isolate);
-    OneByteString& value1 = OneByteString::Handle();
+    String& value1 = String::Handle();
     value1 ^= OneByteString::New("value1");
     weak1 ^= WeakProperty::New();
     weak1.set_key(key);
     weak1.set_value(value1);
-    OneByteString& value2 = OneByteString::Handle();
+    String& value2 = String::Handle();
     value2 ^= OneByteString::New("value2");
     weak2 ^= WeakProperty::New();
     weak2.set_key(key);
@@ -2868,11 +2868,11 @@
 TEST_CASE(WeakProperty_PreserveOne_OldSpace) {
   Isolate* isolate = Isolate::Current();
   WeakProperty& weak = WeakProperty::Handle();
-  OneByteString& key = OneByteString::Handle();
+  String& key = String::Handle();
   key ^= OneByteString::New("key", Heap::kOld);
   {
     HANDLESCOPE(isolate);
-    OneByteString& value = OneByteString::Handle();
+    String& value = String::Handle();
     value ^= OneByteString::New("value", Heap::kOld);
     weak ^= WeakProperty::New(Heap::kOld);
     weak.set_key(key);
@@ -2887,19 +2887,19 @@
 TEST_CASE(WeakProperty_PreserveTwo_OldSpace) {
   Isolate* isolate = Isolate::Current();
   WeakProperty& weak1 = WeakProperty::Handle();
-  OneByteString& key1 = OneByteString::Handle();
+  String& key1 = String::Handle();
   key1 ^= OneByteString::New("key1", Heap::kOld);
   WeakProperty& weak2 = WeakProperty::Handle();
-  OneByteString& key2 = OneByteString::Handle();
+  String& key2 = String::Handle();
   key2 ^= OneByteString::New("key2", Heap::kOld);
   {
     HANDLESCOPE(isolate);
-    OneByteString& value1 = OneByteString::Handle();
+    String& value1 = String::Handle();
     value1 ^= OneByteString::New("value1", Heap::kOld);
     weak1 ^= WeakProperty::New(Heap::kOld);
     weak1.set_key(key1);
     weak1.set_value(value1);
-    OneByteString& value2 = OneByteString::Handle();
+    String& value2 = String::Handle();
     value2 ^= OneByteString::New("value2", Heap::kOld);
     weak2 ^= WeakProperty::New(Heap::kOld);
     weak2.set_key(key2);
@@ -2917,16 +2917,16 @@
   Isolate* isolate = Isolate::Current();
   WeakProperty& weak1 = WeakProperty::Handle();
   WeakProperty& weak2 = WeakProperty::Handle();
-  OneByteString& key = OneByteString::Handle();
+  String& key = String::Handle();
   key ^= OneByteString::New("key", Heap::kOld);
   {
     HANDLESCOPE(isolate);
-    OneByteString& value1 = OneByteString::Handle();
+    String& value1 = String::Handle();
     value1 ^= OneByteString::New("value1", Heap::kOld);
     weak1 ^= WeakProperty::New(Heap::kOld);
     weak1.set_key(key);
     weak1.set_value(value1);
-    OneByteString& value2 = OneByteString::Handle();
+    String& value2 = String::Handle();
     value2 ^= OneByteString::New("value2", Heap::kOld);
     weak2 ^= WeakProperty::New(Heap::kOld);
     weak2.set_key(key);
@@ -2945,9 +2945,9 @@
   WeakProperty& weak = WeakProperty::Handle();
   {
     HANDLESCOPE(isolate);
-    OneByteString& key = OneByteString::Handle();
+    String& key = String::Handle();
     key ^= OneByteString::New("key");
-    OneByteString& value = OneByteString::Handle();
+    String& value = String::Handle();
     value ^= OneByteString::New("value");
     weak ^= WeakProperty::New();
     weak.set_key(key);
@@ -2967,14 +2967,14 @@
   WeakProperty& weak2 = WeakProperty::Handle();
   {
     HANDLESCOPE(isolate);
-    OneByteString& key = OneByteString::Handle();
+    String& key = String::Handle();
     key ^= OneByteString::New("key");
-    OneByteString& value1 = OneByteString::Handle();
+    String& value1 = String::Handle();
     value1 ^= OneByteString::New("value1");
     weak1 ^= WeakProperty::New();
     weak1.set_key(key);
     weak1.set_value(value1);
-    OneByteString& value2 = OneByteString::Handle();
+    String& value2 = String::Handle();
     value2 ^= OneByteString::New("value2");
     weak2 ^= WeakProperty::New();
     weak2.set_key(key);
@@ -2993,9 +2993,9 @@
   WeakProperty& weak = WeakProperty::Handle();
   {
     HANDLESCOPE(isolate);
-    OneByteString& key = OneByteString::Handle();
+    String& key = String::Handle();
     key ^= OneByteString::New("key", Heap::kOld);
-    OneByteString& value = OneByteString::Handle();
+    String& value = String::Handle();
     value ^= OneByteString::New("value", Heap::kOld);
     weak ^= WeakProperty::New(Heap::kOld);
     weak.set_key(key);
@@ -3015,14 +3015,14 @@
   WeakProperty& weak2 = WeakProperty::Handle();
   {
     HANDLESCOPE(isolate);
-    OneByteString& key = OneByteString::Handle();
+    String& key = String::Handle();
     key ^= OneByteString::New("key", Heap::kOld);
-    OneByteString& value1 = OneByteString::Handle();
+    String& value1 = String::Handle();
     value1 ^= OneByteString::New("value1");
     weak1 ^= WeakProperty::New(Heap::kOld);
     weak1.set_key(key);
     weak1.set_value(value1);
-    OneByteString& value2 = OneByteString::Handle();
+    String& value2 = String::Handle();
     value2 ^= OneByteString::New("value2", Heap::kOld);
     weak2 ^= WeakProperty::New(Heap::kOld);
     weak2.set_key(key);
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 49a088d..2ecd491 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -33,6 +33,7 @@
             "Warning on legacy type Dynamic)");
 DEFINE_FLAG(bool, warn_legacy_getters, false,
             "Warning on legacy getter syntax");
+DECLARE_FLAG(bool, use_cha);
 
 static void CheckedModeHandler(bool value) {
   FLAG_enable_asserts = value;
@@ -342,8 +343,42 @@
 }
 
 
+// Removes optimized code once we load more classes, since --use_cha based
+// optimizations may have become invalid.
+// TODO(srdjan): Note which functions use which CHA decision and deoptimize
+// only the necessary ones.
+static void RemoveOptimizedCode() {
+  ASSERT(FLAG_use_cha);
+  // Deoptimize all live frames.
+  DeoptimizeAll();
+  // Switch all functions' code to unoptimized.
+  const ClassTable& class_table = *Isolate::Current()->class_table();
+  Class& cls = Class::Handle();
+  Array& array = Array::Handle();
+  Function& function = Function::Handle();
+  const intptr_t num_cids = class_table.NumCids();
+  for (intptr_t i = kInstanceCid; i < num_cids; i++) {
+    if (!class_table.HasValidClassAt(i)) continue;
+    cls = class_table.At(i);
+    ASSERT(!cls.IsNull());
+    array = cls.functions();
+    intptr_t num_functions = array.IsNull() ? 0 : array.Length();
+    for (intptr_t f = 0; f < num_functions; f++) {
+      function ^= array.At(f);
+      ASSERT(!function.IsNull());
+      if (function.HasOptimizedCode()) {
+        function.SwitchToUnoptimizedCode();
+      }
+    }
+  }
+}
+
+
 void Parser::ParseCompilationUnit(const Library& library,
                                   const Script& script) {
+  if (FLAG_use_cha) {
+    RemoveOptimizedCode();
+  }
   ASSERT(Isolate::Current()->long_jump_base()->IsSafeToJump());
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
   Parser parser(script, library);
@@ -547,48 +582,67 @@
         fields_(GrowableObjectArray::Handle(GrowableObjectArray::New())) {
   }
 
+  // Parameter 'name' is the unmangled name, i.e. without the setter
+  // name mangling.
   bool FunctionNameExists(const String& name, RawFunction::Kind kind) const {
     // First check if a function or field of same name exists.
-    if (NameExists<Function>(functions_, name) ||
-        NameExists<Field>(fields_, name)) {
+    if ((kind != RawFunction::kSetterFunction) && FunctionExists(name)) {
       return true;
     }
-    String& accessor_name = String::Handle();
-    if (kind != RawFunction::kSetterFunction) {
-      // Check if a getter function of same name exists.
-      accessor_name = Field::GetterName(name);
-      if (NameExists<Function>(functions_, accessor_name)) {
+    // Now check whether there is a field and whether its implicit getter
+    // or setter collides with the name.
+    Field* field = LookupField(name);
+    if (field != NULL) {
+      if (kind == RawFunction::kSetterFunction) {
+        // It's ok to have an implicit getter, it does not collide with
+        // this setter function.
+        if (!field->is_final()) {
+          return true;
+        }
+      } else {
+        // The implicit getter of the field collides with the name.
         return true;
       }
     }
-    if (kind != RawFunction::kGetterFunction) {
+
+    String& accessor_name = String::Handle();
+    if (kind == RawFunction::kSetterFunction) {
       // Check if a setter function of same name exists.
       accessor_name = Field::SetterName(name);
-      if (NameExists<Function>(functions_, accessor_name)) {
+      if (FunctionExists(accessor_name)) {
+        return true;
+      }
+    } else {
+      // Check if a getter function of same name exists.
+      accessor_name = Field::GetterName(name);
+      if (FunctionExists(accessor_name)) {
         return true;
       }
     }
     return false;
   }
 
-  bool FieldNameExists(const String& name) const {
+  bool FieldNameExists(const String& name, bool check_setter) const {
     // First check if a function or field of same name exists.
-    if (NameExists<Function>(functions_, name) ||
-        NameExists<Field>(fields_, name)) {
+    if (FunctionExists(name) || FieldExists(name)) {
       return true;
     }
     // Now check if a getter/setter function of same name exists.
     String& getter_name = String::Handle(Field::GetterName(name));
-    String& setter_name = String::Handle(Field::SetterName(name));
-    if (NameExists<Function>(functions_, getter_name) ||
-        NameExists<Function>(functions_, setter_name)) {
+    if (FunctionExists(getter_name)) {
       return true;
     }
+    if (check_setter) {
+      String& setter_name = String::Handle(Field::SetterName(name));
+      if (FunctionExists(setter_name)) {
+        return true;
+      }
+    }
     return false;
   }
 
   void AddFunction(const Function& function) {
-    ASSERT(!NameExists<Function>(functions_, String::Handle(function.name())));
+    ASSERT(!FunctionExists(String::Handle(function.name())));
     functions_.Add(function);
   }
 
@@ -597,7 +651,7 @@
   }
 
   void AddField(const Field& field) {
-    ASSERT(!NameExists<Field>(fields_, String::Handle(field.name())));
+    ASSERT(!FieldExists(String::Handle(field.name())));
     fields_.Add(field);
   }
 
@@ -650,18 +704,38 @@
   }
 
  private:
-  template<typename T>
-  bool NameExists(const GrowableObjectArray& list, const String& name) const {
+  Field* LookupField(const String& name) const {
     String& test_name = String::Handle();
-    T& obj = T::Handle();
-    for (int i = 0; i < list.Length(); i++) {
-      obj ^= list.At(i);
-      test_name = obj.name();
+    Field& field = Field::Handle();
+    for (int i = 0; i < fields_.Length(); i++) {
+      field ^= fields_.At(i);
+      test_name = field.name();
       if (name.Equals(test_name)) {
-        return true;
+        return &field;
       }
     }
-    return false;
+    return NULL;
+  }
+
+  bool FieldExists(const String& name) const {
+    return LookupField(name) != NULL;
+  }
+
+  Function* LookupFunction(const String& name) const {
+    String& test_name = String::Handle();
+    Function& func = Function::Handle();
+    for (int i = 0; i < functions_.Length(); i++) {
+      func ^= functions_.At(i);
+      test_name = func.name();
+      if (name.Equals(test_name)) {
+        return &func;
+      }
+    }
+    return NULL;
+  }
+
+  bool FunctionExists(const String& name) const {
+    return LookupFunction(name) != NULL;
   }
 
   const Class& clazz_;
@@ -2703,6 +2777,7 @@
   ASSERT(field->type != NULL);
   ASSERT(field->name_pos > 0);
   ASSERT(current_member_ == field);
+  // All const fields are also final.
   ASSERT(!field->has_const || field->has_final);
 
   if (field->has_abstract) {
@@ -2714,7 +2789,7 @@
   if (field->has_factory) {
     ErrorMsg("keyword 'factory' not allowed in field declaration");
   }
-  if (members->FieldNameExists(*field->name)) {
+  if (members->FieldNameExists(*field->name, !field->has_final)) {
     ErrorMsg(field->name_pos,
              "'%s' field/method already defined\n", field->name->ToCString());
   }
@@ -3831,10 +3906,14 @@
       ErrorMsg(name_pos, "getter for '%s' is already defined",
                var_name.ToCString());
     }
-    accessor_name = Field::SetterName(var_name);
-    if (library_.LookupLocalObject(accessor_name) != Object::null()) {
-      ErrorMsg(name_pos, "setter for '%s' is already defined",
-               var_name.ToCString());
+    // A const or final variable does not define an implicit setter,
+    // so we only check setters for non-final variables.
+    if (!is_final) {
+      accessor_name = Field::SetterName(var_name);
+      if (library_.LookupLocalObject(accessor_name) != Object::null()) {
+        ErrorMsg(name_pos, "setter for '%s' is already defined",
+                 var_name.ToCString());
+      }
     }
 
     field = Field::New(var_name, is_static, is_final, is_const,
@@ -3922,11 +4001,8 @@
     ErrorMsg(name_pos, "'%s' is already defined as getter",
              func_name.ToCString());
   }
-  accessor_name = Field::SetterName(func_name);
-  if (library_.LookupLocalObject(accessor_name) != Object::null()) {
-    ErrorMsg(name_pos, "'%s' is already defined as setter",
-             func_name.ToCString());
-  }
+  // A setter named x= may co-exist with a function named x, thus we do
+  // not need to check setters.
 
   if (CurrentToken() != Token::kLPAREN) {
     ErrorMsg("'(' expected");
@@ -4036,10 +4112,19 @@
              is_getter ? "getter" : "setter");
   }
 
-  if (library_.LookupLocalObject(*field_name) != Object::null()) {
+  if (is_getter && library_.LookupLocalObject(*field_name) != Object::null()) {
     ErrorMsg(name_pos, "'%s' is already defined in this library",
              field_name->ToCString());
   }
+  if (!is_getter) {
+    // Check whether there is a field with the same name that has an implicit
+    // setter.
+    const Field& field = Field::Handle(library_.LookupLocalField(*field_name));
+    if (!field.IsNull() && !field.is_final()) {
+      ErrorMsg(name_pos, "Variable '%s' is already defined in this library",
+               field_name->ToCString());
+    }
+  }
   bool found = library_.LookupLocalObject(accessor_name) != Object::null();
   if (found && !is_patch) {
     ErrorMsg(name_pos, "%s for '%s' is already defined",
@@ -4088,11 +4173,11 @@
 // TODO(hausner): Remove support for old library definition syntax.
 void Parser::ParseLibraryNameObsoleteSyntax() {
   if ((script_.kind() == RawScript::kLibraryTag) &&
-      (CurrentToken() != Token::kLIBRARY)) {
+      (CurrentToken() != Token::kLEGACY_LIBRARY)) {
     // Handle error case early to get consistent error message.
-    ExpectToken(Token::kLIBRARY);
+    ExpectToken(Token::kLEGACY_LIBRARY);
   }
-  if (CurrentToken() == Token::kLIBRARY) {
+  if (CurrentToken() == Token::kLEGACY_LIBRARY) {
     ConsumeToken();
     ExpectToken(Token::kLPAREN);
     if (CurrentToken() != Token::kSTRING) {
@@ -4129,7 +4214,7 @@
 
 // TODO(hausner): Remove support for old library definition syntax.
 void Parser::ParseLibraryImportObsoleteSyntax() {
-  while (CurrentToken() == Token::kIMPORT) {
+  while (CurrentToken() == Token::kLEGACY_IMPORT) {
     const intptr_t import_pos = TokenPos();
     ConsumeToken();
     ExpectToken(Token::kLPAREN);
@@ -4196,7 +4281,7 @@
 
 // TODO(hausner): Remove support for old library definition syntax.
 void Parser::ParseLibraryIncludeObsoleteSyntax() {
-  while (CurrentToken() == Token::kSOURCE) {
+  while (CurrentToken() == Token::kLEGACY_SOURCE) {
     const intptr_t source_pos = TokenPos();
     ConsumeToken();
     ExpectToken(Token::kLPAREN);
@@ -4217,7 +4302,7 @@
 
 
 void Parser::ParseLibraryName() {
-  ASSERT(IsLiteral("library"));
+  ASSERT(CurrentToken() == Token::kLIBRARY);
   ConsumeToken();
   // TODO(hausner): Exact syntax of library name still unclear: identifier,
   // qualified identifier or even multiple dots allowed? For now we just
@@ -4241,8 +4326,8 @@
 
 
 void Parser::ParseLibraryImportExport() {
-  bool is_import = IsLiteral("import");
-  bool is_export = IsLiteral("export");
+  bool is_import = (CurrentToken() == Token::kIMPORT);
+  bool is_export = (CurrentToken() == Token::kEXPORT);
   ASSERT(is_import || is_export);
   const intptr_t import_pos = TokenPos();
   ConsumeToken();
@@ -4352,9 +4437,9 @@
   }
 
   // TODO(hausner): Remove support for old library definition syntax.
-  if ((CurrentToken() == Token::kLIBRARY) ||
-      (CurrentToken() == Token::kIMPORT) ||
-      (CurrentToken() == Token::kSOURCE)) {
+  if ((CurrentToken() == Token::kLEGACY_LIBRARY) ||
+      (CurrentToken() == Token::kLEGACY_IMPORT) ||
+      (CurrentToken() == Token::kLEGACY_SOURCE)) {
     ParseLibraryNameObsoleteSyntax();
     ParseLibraryImportObsoleteSyntax();
     ParseLibraryIncludeObsoleteSyntax();
@@ -4376,14 +4461,15 @@
   // successfully consumed.
   intptr_t metadata_pos = TokenPos();
   SkipMetadata();
-  if (IsLiteral("library")) {
+  if (CurrentToken() == Token::kLIBRARY) {
     ParseLibraryName();
     metadata_pos = TokenPos();
     SkipMetadata();
   } else if (script_.kind() == RawScript::kLibraryTag) {
     ErrorMsg("library name definition expected");
   }
-  while (IsLiteral("import") || IsLiteral("export")) {
+  while ((CurrentToken() == Token::kIMPORT) ||
+      (CurrentToken() == Token::kEXPORT)) {
     ParseLibraryImportExport();
     metadata_pos = TokenPos();
     SkipMetadata();
@@ -4397,14 +4483,11 @@
         Namespace::New(core_lib, Array::Handle(), Array::Handle()));
     library_.AddImport(core_ns);
   }
-  while (IsLiteral("part")) {
+  while (CurrentToken() == Token::kPART) {
     ParseLibraryPart();
     metadata_pos = TokenPos();
     SkipMetadata();
   }
-  if (IsLiteral("library") || IsLiteral("import") || IsLiteral("export")) {
-    ErrorMsg("unexpected token '%s'", CurrentLiteral()->ToCString());
-  }
   SetPosition(metadata_pos);
 }
 
@@ -4415,7 +4498,7 @@
   // TODO(hausner): Once support for old #source directive is removed
   // from the compiler, add an error message here if we don't find
   // a 'part of' directive.
-  if (IsLiteral("part")) {
+  if (CurrentToken() == Token::kPART) {
     ConsumeToken();
     if (!IsLiteral("of")) {
       ErrorMsg("'part of' expected");
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 18ae342..cc6ae14 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -13,7 +13,7 @@
 namespace dart {
 
 // Macrobatics to define the Object hierarchy of VM implementation classes.
-#define CLASS_LIST_NO_OBJECT(V)                                                \
+#define CLASS_LIST_NO_OBJECT_OR_STRING(V)                                      \
   V(Class)                                                                     \
   V(UnresolvedClass)                                                           \
   V(AbstractTypeArguments)                                                     \
@@ -56,11 +56,6 @@
         V(Mint)                                                                \
         V(Bigint)                                                              \
       V(Double)                                                                \
-    V(String)                                                                  \
-      V(OneByteString)                                                         \
-      V(TwoByteString)                                                         \
-      V(ExternalOneByteString)                                                 \
-      V(ExternalTwoByteString)                                                 \
     V(Bool)                                                                    \
     V(Array)                                                                   \
       V(ImmutableArray)                                                        \
@@ -91,6 +86,21 @@
     V(WeakProperty)                                                            \
     V(DartFunction)                                                            \
 
+#define CLASS_LIST_STRINGS(V)                                                  \
+  V(String)                                                                    \
+    V(OneByteString)                                                           \
+    V(TwoByteString)                                                           \
+    V(ExternalOneByteString)                                                   \
+    V(ExternalTwoByteString)
+
+#define CLASS_LIST_FOR_HANDLES(V)                                              \
+  CLASS_LIST_NO_OBJECT_OR_STRING(V)                                            \
+  V(String)
+
+#define CLASS_LIST_NO_OBJECT(V)                                                \
+  CLASS_LIST_NO_OBJECT_OR_STRING(V)                                            \
+  CLASS_LIST_STRINGS(V)
+
 #define CLASS_LIST(V)                                                          \
   V(Object)                                                                    \
   CLASS_LIST_NO_OBJECT(V)
@@ -385,6 +395,7 @@
   friend class Scavenger;
   friend class SnapshotReader;
   friend class SnapshotWriter;
+  friend class String;
 
   DISALLOW_ALLOCATION();
   DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject);
@@ -1493,9 +1504,8 @@
          kSmiCid == kNumberCid + 2 &&
          kMintCid == kNumberCid + 3 &&
          kBigintCid == kNumberCid + 4 &&
-         kDoubleCid == kNumberCid + 5 &&
-         kStringCid == kNumberCid + 6);
-  return (index >= kNumberCid && index < kStringCid);
+         kDoubleCid == kNumberCid + 5);
+  return (index >= kNumberCid && index < kBoolCid);
 }
 
 
@@ -1514,9 +1524,8 @@
   ASSERT(kOneByteStringCid == kStringCid + 1 &&
          kTwoByteStringCid == kStringCid + 2 &&
          kExternalOneByteStringCid == kStringCid + 3 &&
-         kExternalTwoByteStringCid == kStringCid + 4 &&
-         kBoolCid == kStringCid + 5);
-  return (index >= kStringCid && index < kBoolCid);
+         kExternalTwoByteStringCid == kStringCid + 4);
+  return (index >= kStringCid && index <= kExternalTwoByteStringCid);
 }
 
 
@@ -1525,8 +1534,7 @@
   ASSERT(kOneByteStringCid == kStringCid + 1 &&
          kTwoByteStringCid == kStringCid + 2 &&
          kExternalOneByteStringCid == kStringCid + 3 &&
-         kExternalTwoByteStringCid == kStringCid + 4 &&
-         kBoolCid == kStringCid + 5);
+         kExternalTwoByteStringCid == kStringCid + 4);
   return (index == kOneByteStringCid || index == kExternalOneByteStringCid);
 }
 
@@ -1536,8 +1544,7 @@
   ASSERT(kOneByteStringCid == kStringCid + 1 &&
          kTwoByteStringCid == kStringCid + 2 &&
          kExternalOneByteStringCid == kStringCid + 3 &&
-         kExternalTwoByteStringCid == kStringCid + 4 &&
-         kBoolCid == kStringCid + 5);
+         kExternalTwoByteStringCid == kStringCid + 4);
   return (index == kOneByteStringCid ||
           index == kTwoByteStringCid ||
           index == kExternalOneByteStringCid ||
@@ -1550,8 +1557,7 @@
   ASSERT(kOneByteStringCid == kStringCid + 1 &&
          kTwoByteStringCid == kStringCid + 2 &&
          kExternalOneByteStringCid == kStringCid + 3 &&
-         kExternalTwoByteStringCid == kStringCid + 4 &&
-         kBoolCid == kStringCid + 5);
+         kExternalTwoByteStringCid == kStringCid + 4);
   return (index == kExternalOneByteStringCid ||
           index == kExternalTwoByteStringCid);
 }
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index fd67149..1248eca 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1626,9 +1626,9 @@
 }
 
 
-template<typename HandleType, typename CharacterType>
+template<typename StringType, typename CharacterType>
 void String::ReadFromImpl(SnapshotReader* reader,
-                          HandleType* str_obj,
+                          String* str_obj,
                           intptr_t len,
                           intptr_t tags,
                           Snapshot::Kind kind) {
@@ -1644,11 +1644,11 @@
     *str_obj ^= Symbols::New(ptr, len);
   } else {
     // Set up the string object.
-    *str_obj = HandleType::New(len, HEAP_SPACE(kind));
+    *str_obj = StringType::New(len, HEAP_SPACE(kind));
     str_obj->set_tags(tags);
     str_obj->SetHash(0);  // Will get computed when needed.
     for (intptr_t i = 0; i < len; i++) {
-      *str_obj->CharAddr(i) = reader->Read<CharacterType>();
+      *StringType::CharAddr(*str_obj, i) = reader->Read<CharacterType>();
     }
   }
 }
@@ -1662,8 +1662,7 @@
   ASSERT(reader != NULL);
   intptr_t len = reader->ReadSmiValue();
   intptr_t hash = reader->ReadSmiValue();
-  OneByteString& str_obj = OneByteString::ZoneHandle(reader->isolate(),
-                                                     OneByteString::null());
+  String& str_obj = String::Handle(reader->isolate(), String::null());
 
   if (kind == Snapshot::kFull) {
     ASSERT(reader->isolate()->no_gc_scope_depth() != 0);
@@ -1672,15 +1671,16 @@
     str_obj.set_tags(tags);
     obj->ptr()->hash_ = Smi::New(hash);
     if (len > 0) {
-      uint8_t* raw_ptr = str_obj.CharAddr(0);
+      uint8_t* raw_ptr = CharAddr(str_obj, 0);
       reader->ReadBytes(raw_ptr, len);
     }
     ASSERT((hash == 0) || (String::Hash(str_obj, 0, str_obj.Length()) == hash));
   } else {
-    ReadFromImpl<OneByteString, uint8_t>(reader, &str_obj, len, tags, kind);
+    String::ReadFromImpl<OneByteString, uint8_t>(
+        reader, &str_obj, len, tags, kind);
   }
   reader->AddBackRef(object_id, &str_obj, kIsDeserialized);
-  return str_obj.raw();
+  return raw(str_obj);
 }
 
 
@@ -1692,26 +1692,26 @@
   ASSERT(reader != NULL);
   intptr_t len = reader->ReadSmiValue();
   intptr_t hash = reader->ReadSmiValue();
-  TwoByteString& str_obj = TwoByteString::ZoneHandle(reader->isolate(),
-                                                     TwoByteString::null());
+  String& str_obj = String::Handle(reader->isolate(), String::null());
 
   if (kind == Snapshot::kFull) {
     RawTwoByteString* obj = reader->NewTwoByteString(len);
     str_obj = obj;
     str_obj.set_tags(tags);
     obj->ptr()->hash_ = Smi::New(hash);
-    uint16_t* raw_ptr = (len > 0)? str_obj.CharAddr(0) : NULL;
+    uint16_t* raw_ptr = (len > 0)? CharAddr(str_obj, 0) : NULL;
     for (intptr_t i = 0; i < len; i++) {
-      ASSERT(str_obj.CharAddr(i) == raw_ptr);  // Will trigger assertions.
+      ASSERT(CharAddr(str_obj, i) == raw_ptr);  // Will trigger assertions.
       *raw_ptr = reader->Read<uint16_t>();
       raw_ptr += 1;
     }
     ASSERT(String::Hash(str_obj, 0, str_obj.Length()) == hash);
   } else {
-    ReadFromImpl<TwoByteString, uint16_t>(reader, &str_obj, len, tags, kind);
+    String::ReadFromImpl<TwoByteString, uint16_t>(
+        reader, &str_obj, len, tags, kind);
   }
   reader->AddBackRef(object_id, &str_obj, kIsDeserialized);
-  return str_obj.raw();
+  return raw(str_obj);
 }
 
 
@@ -2032,10 +2032,7 @@
   void* peer = reinterpret_cast<void*>(reader->ReadIntptrValue());             \
   Dart_PeerFinalizer callback =                                                \
       reinterpret_cast<Dart_PeerFinalizer>(reader->ReadIntptrValue());         \
-  const Class& cls = Class::Handle(                                            \
-      reader->isolate()->object_store()->external_##lname##_array_class());    \
-  return NewExternalImpl<External##name##Array, RawExternal##name##Array>(     \
-      cls, data, length, peer, callback, HEAP_SPACE(kind));                    \
+  return New(data, length, peer, callback, HEAP_SPACE(kind));                  \
 }                                                                              \
 
 
diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
index 883f86d..229dfdf 100644
--- a/runtime/vm/scanner.cc
+++ b/runtime/vm/scanner.cc
@@ -24,6 +24,12 @@
     object_store->InitKeywordTable();
     keyword_symbol_table_ = object_store->keyword_symbols();
     ASSERT(!keyword_symbol_table_.IsNull());
+    String& symbol = String::Handle();
+    for (int i = 0; i < Token::numKeywords; i++) {
+      Token::Kind token = static_cast<Token::Kind>(Token::kFirstKeyword + i);
+      symbol = Symbols::New(Token::Str(token));
+      keyword_symbol_table_.SetAt(i, symbol);
+    }
   }
   for (int i = 0; i < Token::numKeywords; i++) {
     Token::Kind token = static_cast<Token::Kind>(Token::kFirstKeyword + i);
@@ -276,10 +282,7 @@
         if (keywords_[i].keyword_symbol == NULL) {
           String& symbol = String::ZoneHandle();
           symbol ^= keyword_symbol_table_.At(i);
-          if (symbol.IsNull()) {
-            symbol = Symbols::New(source_, ident_pos, ident_length);
-            keyword_symbol_table_.SetAt(i, symbol);
-          }
+          ASSERT(!symbol.IsNull());
           keywords_[i].keyword_symbol = &symbol;
         }
         current_token_.literal = keywords_[i].keyword_symbol;
@@ -397,15 +400,15 @@
   const String& kSource = String::Handle(Symbols::Source());
   const String& ident = String::Handle(ConsumeIdentChars(false));
   if (ident.Equals(kLibrary)) {
-    current_token_.kind = Token::kLIBRARY;
+    current_token_.kind = Token::kLEGACY_LIBRARY;
     return;
   }
   if (ident.Equals(kImport)) {
-    current_token_.kind = Token::kIMPORT;
+    current_token_.kind = Token::kLEGACY_IMPORT;
     return;
   }
   if (ident.Equals(kSource)) {
-    current_token_.kind = Token::kSOURCE;
+    current_token_.kind = Token::kLEGACY_SOURCE;
     return;
   }
   ErrorMsg("Unrecognized library token");
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 77204f3..e966889 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -30,7 +30,8 @@
 static bool IsObjectStoreClassId(intptr_t class_id) {
   // Check if this is a class which is stored in the object store.
   return (class_id == kObjectCid ||
-          (class_id >= kInstanceCid && class_id <= kWeakPropertyCid));
+          (class_id >= kInstanceCid && class_id <= kWeakPropertyCid) ||
+          RawObject::IsStringClassId(class_id));
 }
 
 
@@ -431,7 +432,8 @@
   ASSERT(kind_ == Snapshot::kFull);
   ASSERT(isolate()->no_gc_scope_depth() != 0);
   if (class_id < kNumPredefinedCids) {
-    ASSERT((class_id >= kInstanceCid) && (class_id <= kDartFunctionCid));
+    ASSERT((class_id >= kInstanceCid) &&
+           (class_id <= kExternalTwoByteStringCid));
     return isolate()->class_table()->At(class_id);
   }
   cls_ = Object::class_class();
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 3e84b59..d0e57de 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -1140,6 +1140,67 @@
 }
 
 
+UNIT_TEST_CASE(ScriptSnapshot1) {
+  const char* kScriptChars =
+    "class _SimpleNumEnumerable<T extends num> {"
+      "final Iterable<T> _source;"
+      "const _SimpleNumEnumerable(this._source) : super();"
+    "}";
+
+  Dart_Handle result;
+  uint8_t* buffer;
+  intptr_t size;
+  uint8_t* full_snapshot = NULL;
+  uint8_t* script_snapshot = NULL;
+
+  {
+    // Start an Isolate, and create a full snapshot of it.
+    TestIsolateScope __test_isolate__;
+    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
+
+    // Write out the script snapshot.
+    result = Dart_CreateSnapshot(&buffer, &size);
+    EXPECT_VALID(result);
+    full_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
+    memmove(full_snapshot, buffer, size);
+    Dart_ExitScope();
+  }
+
+  {
+    // Create an Isolate using the full snapshot, load a script and create
+    // a script snapshot of the script.
+    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
+    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
+
+    // Create a test library and Load up a test script in it.
+    TestCase::LoadTestScript(kScriptChars, NULL);
+
+    // Write out the script snapshot.
+    result = Dart_CreateScriptSnapshot(&buffer, &size);
+    EXPECT_VALID(result);
+    script_snapshot = reinterpret_cast<uint8_t*>(malloc(size));
+    memmove(script_snapshot, buffer, size);
+    Dart_ExitScope();
+    Dart_ShutdownIsolate();
+  }
+
+  {
+    // Now Create an Isolate using the full snapshot and load the
+    // script snapshot created above and execute it.
+    TestCase::CreateTestIsolateFromSnapshot(full_snapshot);
+    Dart_EnterScope();  // Start a Dart API scope for invoking API functions.
+
+    // Load the test library from the snapshot.
+    EXPECT(script_snapshot != NULL);
+    result = Dart_LoadScriptFromSnapshot(script_snapshot);
+    EXPECT_VALID(result);
+  }
+  Dart_ShutdownIsolate();
+  free(full_snapshot);
+  free(script_snapshot);
+}
+
+
 TEST_CASE(IntArrayMessage) {
   StackZone zone(Isolate::Current());
   uint8_t* buffer = NULL;
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index c26e671..9d309e7 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -55,6 +55,7 @@
   V(OneArgCheckInlineCache)                                                    \
   V(TwoArgsCheckInlineCache)                                                   \
   V(ThreeArgsCheckInlineCache)                                                 \
+  V(MegamorphicCall)                                                           \
   V(BreakpointDynamic)                                                         \
   V(EqualityWithNullArg)                                                       \
 
@@ -183,6 +184,9 @@
                                                const Function& func);
   static void GenerateNArgsCheckInlineCacheStub(Assembler* assembler,
                                                 intptr_t num_args);
+  static void GenerateUsageCounterIncrement(Assembler* assembler,
+                                            Register ic_reg,
+                                            Register temp_reg);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 9be505a..0210021 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -1543,6 +1543,27 @@
 }
 
 
+// Loads function into 'temp_reg', preserves 'ic_reg'.
+void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
+                                             Register ic_reg,
+                                             Register temp_reg) {
+  __ movl(temp_reg, FieldAddress(ic_reg, ICData::function_offset()));
+  Label is_hot;
+  if (FlowGraphCompiler::CanOptimize()) {
+    ASSERT(FLAG_optimization_counter_threshold > 1);
+    // The usage_counter is always less than FLAG_optimization_counter_threshold
+    // except when the function gets optimized.
+    __ cmpl(FieldAddress(temp_reg, Function::usage_counter_offset()),
+        Immediate(FLAG_optimization_counter_threshold));
+    __ j(EQUAL, &is_hot, Assembler::kNearJump);
+    // As long as VM has no OSR do not optimize in the middle of the function
+    // but only at exit so that we have collected all type feedback before
+    // optimizing.
+  }
+  __ incl(FieldAddress(temp_reg, Function::usage_counter_offset()));
+  __ Bind(&is_hot);
+}
+
 
 // Generate inline cache check for 'num_args'.
 //  ECX: Inline cache data object.
@@ -1570,26 +1591,6 @@
   }
 #endif  // DEBUG
 
-  __ movl(EBX, FieldAddress(ECX, ICData::function_offset()));
-  Label is_hot;
-  if (FlowGraphCompiler::CanOptimize()) {
-    ASSERT(FLAG_optimization_counter_threshold > 1);
-    // The usage_counter is always less than FLAG_optimization_counter_threshold
-    // except when the function gets optimized.
-    __ cmpl(FieldAddress(EBX, Function::usage_counter_offset()),
-        Immediate(FLAG_optimization_counter_threshold - 1));
-    // Do not increment to equality with threshold, since a counter greater
-    // than threshold denotes a function that was already optimized.
-    // The equality should be reached only at exit of the method
-    // (return instruction).
-    __ j(EQUAL, &is_hot, Assembler::kNearJump);
-    // As long as VM has no OSR do not optimize in the middle of the function
-    // but only at exit so that we have collected all type feedback before
-    // optimizing.
-  }
-  __ incl(FieldAddress(EBX, Function::usage_counter_offset()));
-  __ Bind(&is_hot);
-
   // Loop that checks if there is an IC data match.
   Label loop, update, test, found, get_class_id_as_smi;
   // ECX: IC data object (preserved).
@@ -1712,30 +1713,40 @@
 
 // Use inline cache data array to invoke the target or continue in inline
 // cache miss handler. Stub for 1-argument check (receiver class).
-//  ECX: Inline cache data array
-//  EDX: Arguments array
-//  TOS(0): return address
-// Inline cache data array structure:
+//  ECX: Inline cache data object.
+//  EDX: Arguments array.
+//  TOS(0): Return address.
+// Inline cache data object structure:
 // 0: function-name
 // 1: N, number of arguments checked.
 // 2 .. (length - 1): group of checks, each check containing:
 //   - N classes.
 //   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, ECX, EBX);
   return GenerateNArgsCheckInlineCacheStub(assembler, 1);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, ECX, EBX);
   return GenerateNArgsCheckInlineCacheStub(assembler, 2);
 }
 
 
 void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, ECX, EBX);
   return GenerateNArgsCheckInlineCacheStub(assembler, 3);
 }
 
 
+// Megamorphic call is currently implemented as IC call but through a stub
+// that does not check/count function invocations.
+void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
+  return GenerateNArgsCheckInlineCacheStub(assembler, 1);
+}
+
+
 //  ECX: Function object.
 //  EDX: Arguments array.
 //  TOS(0): return address (Dart code).
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index a1dbf92..a75461d 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -1523,6 +1523,26 @@
 }
 
 
+// Loads function into 'temp_reg', preserves 'ic_reg'.
+void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
+                                             Register ic_reg,
+                                             Register temp_reg) {
+  __ movq(temp_reg, FieldAddress(ic_reg, ICData::function_offset()));
+  Label is_hot;
+  if (FlowGraphCompiler::CanOptimize()) {
+    ASSERT(FLAG_optimization_counter_threshold > 1);
+    // The usage_counter is always less than FLAG_optimization_counter_threshold
+    // except when the function gets optimized.
+    __ cmpq(FieldAddress(temp_reg, Function::usage_counter_offset()),
+        Immediate(FLAG_optimization_counter_threshold));
+    __ j(EQUAL, &is_hot, Assembler::kNearJump);
+    // As long as VM has no OSR do not optimize in the middle of the function
+    // but only at exit so that we have collected all type feedback before
+    // optimizing.
+  }
+  __ incq(FieldAddress(temp_reg, Function::usage_counter_offset()));
+  __ Bind(&is_hot);
+}
 
 // Generate inline cache check for 'num_args'.
 //  RBX: Inline cache data object.
@@ -1550,26 +1570,6 @@
   }
 #endif  // DEBUG
 
-  __ movq(RCX, FieldAddress(RBX, ICData::function_offset()));
-  Label is_hot;
-  if (FlowGraphCompiler::CanOptimize()) {
-    ASSERT(FLAG_optimization_counter_threshold > 1);
-    // The usage_counter is always less than FLAG_optimization_counter_threshold
-    // except when the function gets optimized.
-    __ cmpq(FieldAddress(RCX, Function::usage_counter_offset()),
-        Immediate(FLAG_optimization_counter_threshold - 1));
-    // Do not increment to equality with threshold, since a counter greater
-    // than threshold denotes a function that was already optimized.
-    // The equality should be reached only at exit of the method
-    // (return instruction).
-    __ j(EQUAL, &is_hot, Assembler::kNearJump);
-    // As long as VM has no OSR do not optimize in the middle of the function
-    // but only at exit so that we have collected all type feedback before
-    // optimizing.
-  }
-  __ incq(FieldAddress(RCX, Function::usage_counter_offset()));
-  __ Bind(&is_hot);
-
   // Loop that checks if there is an IC data match.
   Label loop, update, test, found, get_class_id_as_smi;
   // RBX: IC data object (preserved).
@@ -1689,29 +1689,37 @@
 
 // Use inline cache data array to invoke the target or continue in inline
 // cache miss handler. Stub for 1-argument check (receiver class).
-//  RCX: Inline cache data array
-//  RDX: Arguments array
-//  TOS(0): return address
-// Inline cache data array structure:
+//  RBX: Inline cache data object.
+//  RDX: Arguments array.
+//  TOS(0): Return address.
+// Inline cache data object structure:
 // 0: function-name
 // 1: N, number of arguments checked.
 // 2 .. (length - 1): group of checks, each check containing:
 //   - N classes.
 //   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, RBX, RCX);
   return GenerateNArgsCheckInlineCacheStub(assembler, 1);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, RBX, RCX);
   return GenerateNArgsCheckInlineCacheStub(assembler, 2);
 }
 
 
 void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, RBX, RCX);
   return GenerateNArgsCheckInlineCacheStub(assembler, 3);
 }
 
+// Megamorphic call is currently implemented as IC call but through a stub
+// that does not check/count function invocations.
+void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
+  return GenerateNArgsCheckInlineCacheStub(assembler, 1);
+}
 
 //  RBX: Function object.
 //  R10: Arguments array.
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index 3547f87..3572964 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -47,7 +47,7 @@
   ASSERT((sizeof(names) / sizeof(const char*)) == Symbols::kMaxId);
   const Array& symbol_table =
       Array::Handle(isolate->object_store()->symbol_table());
-  dart::OneByteString& str = OneByteString::Handle();
+  dart::String& str = String::Handle();
 
   for (intptr_t i = 1; i < Symbols::kMaxId; i++) {
     str = OneByteString::New(names[i], Heap::kOld);
diff --git a/runtime/vm/token.h b/runtime/vm/token.h
index a4d1d9f..f1199ff 100644
--- a/runtime/vm/token.h
+++ b/runtime/vm/token.h
@@ -134,9 +134,9 @@
                                                                                \
   /* Support for Dart scripts. */                                              \
   TOK(kSCRIPTTAG, "#!", 0, kNoAttribute)                                       \
-  TOK(kLIBRARY, "#library", 0, kNoAttribute)                                   \
-  TOK(kIMPORT, "#import", 0, kNoAttribute)                                     \
-  TOK(kSOURCE, "#source", 0, kNoAttribute)                                     \
+  TOK(kLEGACY_LIBRARY, "#library", 0, kNoAttribute)                            \
+  TOK(kLEGACY_IMPORT, "#import", 0, kNoAttribute)                              \
+  TOK(kLEGACY_SOURCE, "#source", 0, kNoAttribute)                              \
 
 // List of keywords. The list must be alphabetically ordered. The
 // keyword recognition code depends on the ordering.
@@ -154,6 +154,7 @@
   KW(kDEFAULT, "default", 0, kKeyword)                                         \
   KW(kDO, "do", 0, kKeyword)                                                   \
   KW(kELSE, "else", 0, kKeyword)                                               \
+  KW(kEXPORT, "export", 0, kPseudoKeyword)                                     \
   KW(kEXTENDS, "extends", 0, kKeyword)                                         \
   KW(kEXTERNAL, "external", 0, kPseudoKeyword)                                 \
   KW(kFACTORY, "factory", 0, kPseudoKeyword)                                   \
@@ -164,12 +165,15 @@
   KW(kGET, "get", 0, kPseudoKeyword)                                           \
   KW(kIF, "if", 0, kKeyword)                                                   \
   KW(kIMPLEMENTS, "implements", 0, kPseudoKeyword)                             \
+  KW(kIMPORT, "import", 0, kPseudoKeyword)                                     \
   KW(kIN, "in", 0, kKeyword)                                                   \
   KW(kINTERFACE, "interface", 0, kPseudoKeyword)                               \
   KW(kIS, "is", 10, kKeyword)                                                  \
+  KW(kLIBRARY, "library", 0, kPseudoKeyword)                                   \
   KW(kNEW, "new", 0, kKeyword)                                                 \
   KW(kNULL, "null", 0, kKeyword)                                               \
   KW(kOPERATOR, "operator", 0, kPseudoKeyword)                                 \
+  KW(kPART, "part", 0, kPseudoKeyword)                                         \
   KW(kRETURN, "return", 0, kKeyword)                                           \
   KW(kSET, "set", 0, kPseudoKeyword)                                           \
   KW(kSTATIC, "static", 0, kPseudoKeyword)                                     \
diff --git a/runtime/vm/vm.gypi b/runtime/vm/vm.gypi
index f84916f..cc45491 100644
--- a/runtime/vm/vm.gypi
+++ b/runtime/vm/vm.gypi
@@ -129,7 +129,7 @@
       'type': 'none',
       'includes': [
         # Load the shared core library sources.
-        '../../lib/core/corelib_sources.gypi',
+        '../../sdk/lib/core/corelib_sources.gypi',
       ],
       'sources/': [
         # Exclude all .[cc|h] files.
@@ -205,7 +205,7 @@
       'type': 'none',
       'includes': [
         # Load the shared core library sources.
-        '../../lib/coreimpl/corelib_impl_sources.gypi',
+        '../../sdk/lib/coreimpl/corelib_impl_sources.gypi',
       ],
       'sources/': [
         # Exclude all .[cc|h] files.
@@ -281,7 +281,7 @@
       'type': 'none',
       'includes': [
         # Load the shared collection library sources.
-        '../../lib/collection/collection_sources.gypi',
+        '../../sdk/lib/collection/collection_sources.gypi',
       ],
       'sources/': [
         # Exclude all .[cc|h] files.
@@ -319,7 +319,7 @@
       'type': 'none',
       'includes': [
         # Load the shared math library sources.
-        '../../lib/math/math_sources.gypi',
+        '../../sdk/lib/math/math_sources.gypi',
       ],
       'sources/': [
         # Exclude all .[cc|h] files.
@@ -395,7 +395,7 @@
       'type': 'none',
       'includes': [
         # Load the shared core library sources.
-        '../../lib/mirrors/mirrors_sources.gypi',
+        '../../sdk/lib/mirrors/mirrors_sources.gypi',
       ],
       'sources/': [
         # Exclude all .[cc|h] files.
@@ -471,7 +471,7 @@
       'type': 'none',
       'includes': [
         # Load the runtime implementation sources.
-        '../../lib/isolate/isolate_sources.gypi',
+        '../../sdk/lib/isolate/isolate_sources.gypi',
       ],
       'sources/': [
         # Exclude all .[cc|h] files.
@@ -547,7 +547,7 @@
       'type': 'none',
       'includes': [
         # Load the shared library sources.
-        '../../lib/scalarlist/scalarlist_sources.gypi',
+        '../../sdk/lib/scalarlist/scalarlist_sources.gypi',
       ],
       'sources/': [
         # Exclude all .[cc|h] files.
diff --git a/lib/compiler/compiler.dart b/sdk/lib/_internal/compiler/compiler.dart
similarity index 92%
rename from lib/compiler/compiler.dart
rename to sdk/lib/_internal/compiler/compiler.dart
index 258a8b4..af37116 100644
--- a/lib/compiler/compiler.dart
+++ b/sdk/lib/_internal/compiler/compiler.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('compiler');
+library compiler;
 
-#import('dart:uri');
-#import('implementation/apiimpl.dart');
+import 'dart:uri';
+import 'implementation/apiimpl.dart';
 
 // Unless explicitly allowed, passing [:null:] for any argument to the
 // methods of library will result in a NullPointerException being
@@ -43,6 +43,12 @@
                        ReadStringFromUri provider,
                        DiagnosticHandler handler,
                        [List<String> options = const []]) {
+  if (!libraryRoot.path.endsWith("/")) {
+    throw new ArgumentError("libraryRoot must end with a /");
+  }
+  if (packageRoot != null && !packageRoot.path.endsWith("/")) {
+    throw new ArgumentError("packageRoot must end with a /");
+  }
   // TODO(ahe): Consider completing the future with an exception if
   // code is null.
   Compiler compiler = new Compiler(provider, handler, libraryRoot, packageRoot,
diff --git a/lib/compiler/implementation/README.txt b/sdk/lib/_internal/compiler/implementation/README.txt
similarity index 100%
rename from lib/compiler/implementation/README.txt
rename to sdk/lib/_internal/compiler/implementation/README.txt
diff --git a/lib/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
similarity index 94%
rename from lib/compiler/implementation/apiimpl.dart
rename to sdk/lib/_internal/compiler/implementation/apiimpl.dart
index 8bcd5ca..0d92a95 100644
--- a/lib/compiler/implementation/apiimpl.dart
+++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
@@ -11,7 +11,7 @@
 import 'tree/tree.dart' as tree;
 import 'elements/elements.dart' as elements;
 import 'ssa/tracer.dart' as ssa;
-import '../../../lib/_internal/libraries.dart';
+import '../../libraries.dart';
 import 'source_file.dart';
 
 class Compiler extends leg.Compiler {
@@ -34,7 +34,14 @@
             disallowUnsafeEval: hasOption(options, '--disallow-unsafe-eval'),
             strips: getStrips(options),
             enableConcreteTypeInference:
-              hasOption(options, '--enable-concrete-type-inference'));
+              hasOption(options, '--enable-concrete-type-inference')) {
+    if (!libraryRoot.path.endsWith("/")) {
+      throw new ArgumentError("libraryRoot must end with a /");
+    }
+    if (packageRoot != null && !packageRoot.path.endsWith("/")) {
+      throw new ArgumentError("packageRoot must end with a /");
+    }
+  }
 
   static List<String> getStrips(List<String> options) {
     for (String option in options) {
diff --git a/lib/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
similarity index 100%
rename from lib/compiler/implementation/closure.dart
rename to sdk/lib/_internal/compiler/implementation/closure.dart
diff --git a/lib/compiler/implementation/code_buffer.dart b/sdk/lib/_internal/compiler/implementation/code_buffer.dart
similarity index 100%
rename from lib/compiler/implementation/code_buffer.dart
rename to sdk/lib/_internal/compiler/implementation/code_buffer.dart
diff --git a/lib/compiler/implementation/colors.dart b/sdk/lib/_internal/compiler/implementation/colors.dart
similarity index 96%
rename from lib/compiler/implementation/colors.dart
rename to sdk/lib/_internal/compiler/implementation/colors.dart
index aa9a6a8..42b3e7f 100644
--- a/lib/compiler/implementation/colors.dart
+++ b/sdk/lib/_internal/compiler/implementation/colors.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('colors');
+library colors;
 
 const String GREEN_COLOR = '\u001b[32m';
 const String RED_COLOR = '\u001b[31m';
diff --git a/lib/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
similarity index 99%
rename from lib/compiler/implementation/compile_time_constants.dart
rename to sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index 0b1a61e..e005cd7 100644
--- a/lib/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -301,8 +301,7 @@
 
   Constant visitLiteralMap(LiteralMap node) {
     if (!node.isConst()) {
-      signalNotCompileTimeConstant(node);
-      error(node);
+      return signalNotCompileTimeConstant(node);
     }
     List<StringConstant> keys = <StringConstant>[];
     Map<StringConstant, Constant> map = new Map<StringConstant, Constant>();
diff --git a/lib/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
similarity index 97%
rename from lib/compiler/implementation/compiler.dart
rename to sdk/lib/_internal/compiler/implementation/compiler.dart
index 0f5fa17..774c2c6 100644
--- a/lib/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -72,12 +72,12 @@
     });
   }
 
-  abstract void enqueueHelpers(Enqueuer world);
-  abstract void codegen(WorkItem work);
-  abstract void processNativeClasses(Enqueuer world,
-                                     Collection<LibraryElement> libraries);
-  abstract void assembleProgram();
-  abstract List<CompilerTask> get tasks;
+  void enqueueHelpers(Enqueuer world);
+  void codegen(WorkItem work);
+  void processNativeClasses(Enqueuer world,
+                            Collection<LibraryElement> libraries);
+  void assembleProgram();
+  List<CompilerTask> get tasks;
 
   // TODO(ahe,karlklose): rename this?
   void dumpInferredTypes() {}
@@ -88,7 +88,7 @@
 
   SourceString getCheckedModeHelper(DartType type) => null;
 
-  abstract Element getInterceptor(Selector selector);
+  Element getInterceptor(Selector selector);
 }
 
 abstract class Compiler implements DiagnosticListener {
@@ -127,6 +127,7 @@
   ClassElement functionClass;
   ClassElement nullClass;
   ClassElement listClass;
+  ClassElement typeClass;
   ClassElement mapClass;
   ClassElement jsInvocationMirrorClass;
   Element assertMethod;
@@ -383,7 +384,7 @@
     }
   }
 
-  abstract LibraryElement scanBuiltinLibrary(String filename);
+  LibraryElement scanBuiltinLibrary(String filename);
 
   void initializeSpecialClasses() {
     bool coreLibValid = true;
@@ -403,6 +404,7 @@
     stringClass = lookupSpecialClass(const SourceString('String'));
     functionClass = lookupSpecialClass(const SourceString('Function'));
     listClass = lookupSpecialClass(const SourceString('List'));
+    typeClass = lookupSpecialClass(const SourceString('Type'));
     mapClass = lookupSpecialClass(const SourceString('Map'));
     jsInvocationMirrorClass =
         lookupSpecialClass(const SourceString('JSInvocationMirror'));
@@ -458,7 +460,7 @@
    * Get an [Uri] pointing to a patch for the dart: library with
    * the given path. Returns null if there is no patch.
    */
-  abstract Uri resolvePatchUri(String dartLibraryPath);
+  Uri resolvePatchUri(String dartLibraryPath);
 
   /** Define the JS helper functions in the given library. */
   void addForeignFunctions(LibraryElement library) {
@@ -482,11 +484,13 @@
     String libraryName = library.uri.toString();
     if (library.entryCompilationUnit.script.name.contains(
             'dart/tests/compiler/dart2js_native')
+        || libraryName == 'dart:mirrors'
         || libraryName == 'dart:isolate'
         || libraryName == 'dart:math'
         || libraryName == 'dart:html') {
-      if (libraryName == 'dart:html') {
+      if (libraryName == 'dart:html' || libraryName == 'dart:mirrors') {
         // dart:html needs access to convertDartClosureToJS.
+        // dart:mirrors needs access to the Primitives class.
         importHelperLibrary(library);
       }
       library.addToScope(findHelper(const SourceString('JS')), this);
@@ -748,8 +752,7 @@
     reportDiagnostic(span, "$message", kind);
   }
 
-  abstract void reportDiagnostic(SourceSpan span, String message,
-                                 api.Diagnostic kind);
+  void reportDiagnostic(SourceSpan span, String message, api.Diagnostic kind);
 
   SourceSpan spanFromTokens(Token begin, Token end, [Uri uri]) {
     if (begin == null || end == null) {
diff --git a/lib/compiler/implementation/constant_system.dart b/sdk/lib/_internal/compiler/implementation/constant_system.dart
similarity index 100%
rename from lib/compiler/implementation/constant_system.dart
rename to sdk/lib/_internal/compiler/implementation/constant_system.dart
diff --git a/lib/compiler/implementation/constant_system_dart.dart b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
similarity index 98%
rename from lib/compiler/implementation/constant_system_dart.dart
rename to sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
index ad01e99..7899d17 100644
--- a/lib/compiler/implementation/constant_system_dart.dart
+++ b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
@@ -69,7 +69,7 @@
     return null;
   }
 
-  abstract int foldInts(int left, int right);
+  int foldInts(int left, int right);
 }
 
 class BitOrOperation extends BinaryBitOperation {
@@ -128,7 +128,7 @@
     return null;
   }
 
-  abstract bool foldBools(bool left, bool right);
+  bool foldBools(bool left, bool right);
 }
 
 class BooleanAndOperation extends BinaryBoolOperation {
@@ -172,7 +172,7 @@
 
   bool isDivide() => false;
   num foldInts(int left, int right) => foldNums(left, right);
-  abstract num foldNums(num left, num right);
+  num foldNums(num left, num right);
 }
 
 class SubtractOperation extends ArithmeticNumOperation {
@@ -254,7 +254,7 @@
     }
   }
 
-  abstract bool foldNums(num left, num right);
+  bool foldNums(num left, num right);
 }
 
 class LessOperation extends RelationalNumOperation {
diff --git a/lib/compiler/implementation/constants.dart b/sdk/lib/_internal/compiler/implementation/constants.dart
similarity index 97%
rename from lib/compiler/implementation/constants.dart
rename to sdk/lib/_internal/compiler/implementation/constants.dart
index d4b0e8a..6e20124 100644
--- a/lib/compiler/implementation/constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/constants.dart
@@ -42,11 +42,11 @@
   bool isNaN() => false;
   bool isMinusZero() => false;
 
-  abstract DartType computeType(Compiler compiler);
+  DartType computeType(Compiler compiler);
 
-  abstract List<Constant> getDependencies();
+  List<Constant> getDependencies();
 
-  abstract accept(ConstantVisitor);
+  accept(ConstantVisitor);
 }
 
 class SentinelConstant extends Constant {
@@ -93,7 +93,7 @@
 }
 
 abstract class PrimitiveConstant extends Constant {
-  abstract get value;
+  get value;
   const PrimitiveConstant();
   bool isPrimitive() => true;
 
@@ -107,7 +107,7 @@
   String toString() => value.toString();
   // Primitive constants don't have dependencies.
   List<Constant> getDependencies() => const <Constant>[];
-  abstract DartString toDartString();
+  DartString toDartString();
 }
 
 class NullConstant extends PrimitiveConstant {
@@ -135,7 +135,7 @@
 }
 
 abstract class NumConstant extends PrimitiveConstant {
-  abstract num get value;
+  num get value;
   const NumConstant();
   bool isNum() => true;
 }
@@ -240,7 +240,7 @@
     return compiler.boolClass.computeType(compiler);
   }
 
-  abstract BoolConstant negate();
+  BoolConstant negate();
 }
 
 class TrueConstant extends BoolConstant {
@@ -318,7 +318,7 @@
 
   // TODO(1603): The class should be marked as abstract, but the VM doesn't
   // currently allow this.
-  abstract int get hashCode;
+  int get hashCode;
 }
 
 class ListConstant extends ObjectConstant {
diff --git a/lib/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
similarity index 97%
rename from lib/compiler/implementation/dart2js.dart
rename to sdk/lib/_internal/compiler/implementation/dart2js.dart
index eafb1e6..f6a91d7 100644
--- a/lib/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -2,19 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('dart2js');
+library dart2js;
 
-#import('dart:io');
-#import('dart:uri');
-#import('dart:utf');
+import 'dart:io';
+import 'dart:uri';
+import 'dart:utf';
 
-#import('../compiler.dart', prefix: 'api');
-#import('colors.dart', prefix: 'colors');
-#import('source_file.dart');
-#import('filenames.dart');
-#import('util/uri_extras.dart');
+import '../compiler.dart' as api;
+import 'colors.dart' as colors;
+import 'source_file.dart';
+import 'filenames.dart';
+import 'util/uri_extras.dart';
 
-const String LIBRARY_ROOT = '../../../..';
+const String LIBRARY_ROOT = '../../../../..';
 const String OUTPUT_LANGUAGE_DART = 'Dart';
 
 typedef void HandleOption(String option);
diff --git a/lib/compiler/implementation/dart2jslib.dart b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
similarity index 100%
rename from lib/compiler/implementation/dart2jslib.dart
rename to sdk/lib/_internal/compiler/implementation/dart2jslib.dart
diff --git a/lib/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
similarity index 98%
rename from lib/compiler/implementation/dart_backend/backend.dart
rename to sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index 0ac9d3e..101918b 100644
--- a/lib/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -264,11 +264,12 @@
      * Tells whether we should output given element. Corelib classes like
      * Object should not be in the resulting code.
      */
-    bool shouldOutput(Element element) =>
-      !identical(element.kind, ElementKind.VOID) &&
-      isUserLibrary(element.getLibrary()) &&
-      element is !SynthesizedConstructorElement &&
-      element is !AbstractFieldElement;
+    bool shouldOutput(Element element) {
+      return !identical(element.kind, ElementKind.VOID)
+          && isUserLibrary(element.getLibrary())
+          && element is !SynthesizedConstructorElement
+          && element is !AbstractFieldElement;
+    }
 
     final elementAsts = new Map<Element, ElementAst>();
 
@@ -315,8 +316,7 @@
       if (shouldOutput(classElement)) addClass(classElement);
     });
     resolvedElements.forEach((element, treeElements) {
-      if (!shouldOutput(element)) return;
-
+      if (!shouldOutput(element) || treeElements == null) return;
       var elementAst = new ElementAst.rewrite(
           compiler, parse(element), treeElements, stripAsserts);
       if (element.isField()) {
diff --git a/lib/compiler/implementation/dart_backend/dart_backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
similarity index 100%
rename from lib/compiler/implementation/dart_backend/dart_backend.dart
rename to sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
diff --git a/lib/compiler/implementation/dart_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart
similarity index 100%
rename from lib/compiler/implementation/dart_backend/emitter.dart
rename to sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart
diff --git a/lib/compiler/implementation/dart_backend/placeholder_collector.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
similarity index 99%
rename from lib/compiler/implementation/dart_backend/placeholder_collector.dart
rename to sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
index c0e51de..34d36bc 100644
--- a/lib/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -130,6 +130,10 @@
   internalError(String reason, {Node node}) {
     collector.internalError(reason, node: node);
   }
+
+  visitTypeReferenceSend(Send node) {
+    collector.makeElementPlaceholder(node.selector, elements[node]);
+  }
 }
 
 class PlaceholderCollector extends Visitor {
diff --git a/lib/compiler/implementation/dart_backend/renamer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
similarity index 99%
rename from lib/compiler/implementation/dart_backend/renamer.dart
rename to sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
index 7b71afa..d41d5b2 100644
--- a/lib/compiler/implementation/dart_backend/renamer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
@@ -24,8 +24,8 @@
     return typeDiff != 0 ? typeDiff : compareInternals(other);
   }
 
-  abstract int compareInternals(Renamable other);
-  abstract int getTypeId();
+  int compareInternals(Renamable other);
+  int getTypeId();
 
   String rename() => renamer(this);
 }
diff --git a/lib/compiler/implementation/dart_backend/utils.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/utils.dart
similarity index 100%
rename from lib/compiler/implementation/dart_backend/utils.dart
rename to sdk/lib/_internal/compiler/implementation/dart_backend/utils.dart
diff --git a/lib/compiler/implementation/diagnostic_listener.dart b/sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart
similarity index 100%
rename from lib/compiler/implementation/diagnostic_listener.dart
rename to sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart
diff --git a/lib/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
similarity index 95%
rename from lib/compiler/implementation/elements/elements.dart
rename to sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 82808cf..684ba90 100644
--- a/lib/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -116,6 +116,8 @@
   static const ElementKind VOID =
     const ElementKind('void', ElementCategory.NONE);
 
+  static const ElementKind AMBIGUOUS =
+      const ElementKind('ambiguous', ElementCategory.NONE);
   static const ElementKind ERROR =
       const ElementKind('error', ElementCategory.NONE);
 
@@ -195,6 +197,9 @@
   /** See [ErroneousElement] for documentation. */
   bool isErroneous() => false;
 
+  /** See [AmbiguousElement] for documentation. */
+  bool isAmbiguous() => false;
+
   /**
    * Is [:true:] if this element has a corresponding patch.
    *
@@ -374,15 +379,13 @@
  * to check for unresolvable elements instead of
  *   [: element == null :].
  */
-class ErroneousElement extends Element {
+class ErroneousElement extends Element implements FunctionElement {
   final MessageKind messageKind;
   final List messageArguments;
-  final SourceString targetName;
 
   ErroneousElement(this.messageKind, this.messageArguments,
-                   this.targetName, Element enclosing)
-      : super(const SourceString('erroneous element'),
-              ElementKind.ERROR, enclosing);
+                   SourceString name, Element enclosing)
+      : super(name, ElementKind.ERROR, enclosing);
 
   isErroneous() => true;
 
@@ -390,23 +393,7 @@
     throw 'unsupported operation on erroneous element';
   }
 
-  SourceString get name => unsupported();
   Link<MetadataAnnotation> get metadata => unsupported();
-
-  getLibrary() => enclosingElement.getLibrary();
-
-  String toString() {
-    String n = targetName.slowToString();
-    return '<$n: ${messageKind.message(messageArguments)}>';
-  }
-}
-
-class ErroneousFunctionElement extends ErroneousElement
-                               implements FunctionElement {
-  ErroneousFunctionElement(MessageKind messageKind, List messageArguments,
-                           SourceString targetName, Element enclosing)
-      : super(messageKind, messageArguments, targetName, enclosing);
-
   get type => unsupported();
   get cachedNode => unsupported();
   get functionSignature => unsupported();
@@ -420,6 +407,52 @@
   requiredParameterCount(compiler) => unsupported();
   optionalParameterCount(compiler) => unsupported();
   parameterCount(copmiler) => unsupported();
+
+  get redirectionTarget => this;
+
+  getLibrary() => enclosingElement.getLibrary();
+
+  String toString() {
+    String n = name.slowToString();
+    return '<$n: ${messageKind.message(messageArguments)}>';
+  }
+}
+
+/**
+ * An ambiguous element represent multiple elements accessible by the same name.
+ *
+ * Ambiguous elements are created during handling of import/export scopes. If an
+ * ambiguous element is encountered during resolution a warning/error should be
+ * reported.
+ */
+class AmbiguousElement extends Element {
+  /**
+   * The message to report on resolving this element.
+   */
+  final MessageKind messageKind;
+
+  /**
+   * The message arguments to report on resolving this element.
+   */
+  final List messageArguments;
+
+  /**
+   * The first element that this ambiguous element might refer to.
+   */
+  final Element existingElement;
+
+  /**
+   * The second element that this ambiguous element might refer to.
+   */
+  final Element newElement;
+
+  AmbiguousElement(this.messageKind, this.messageArguments,
+      Element enclosingElement, Element existingElement, Element newElement)
+      : this.existingElement = existingElement,
+        this.newElement = newElement,
+        super(existingElement.name, ElementKind.AMBIGUOUS, enclosingElement);
+
+  bool isAmbiguous() => true;
 }
 
 class ContainerElement extends Element {
@@ -660,13 +693,11 @@
   void addImport(Element element, DiagnosticListener listener) {
     Element existing = importScope[element.name];
     if (existing != null) {
-      if (!existing.isErroneous()) {
-        // TODO(johnniwinther): Provide access to both the new and existing
-        // elements.
-        importScope[element.name] = new ErroneousElement(
-            MessageKind.DUPLICATE_IMPORT,
-            [element.name], element.name, this);
-      }
+      // TODO(johnniwinther): Provide access to the import tags from which
+      // the elements came.
+      importScope[element.name] = new AmbiguousElement(
+          MessageKind.DUPLICATE_IMPORT, [element.name],
+          this, existing, element);
     } else {
       importScope[element.name] = element;
     }
@@ -1101,10 +1132,14 @@
   FunctionElement origin = null;
 
   /**
-   * If this is an interface constructor, [defaultImplementation] will
-   * changed by the resolver to point to the default
-   * implementation. Otherwise, [:defaultImplementation === this:].
+   * If this is a redirecting factory, [defaultImplementation] will be
+   * changed by the resolver to point to the redirection target.  If
+   * this is an interface constructor, [defaultImplementation] will be
+   * changed by the resolver to point to the default implementation.
+   * Otherwise, [:defaultImplementation === this:].
    */
+  // TODO(ahe): Rename this field to redirectionTarget and remove
+  // mention of interface constructors above.
   FunctionElement defaultImplementation;
 
   FunctionElement(SourceString name,
@@ -1141,6 +1176,24 @@
   bool get isPatched => patch != null;
   bool get isPatch => origin != null;
 
+  FunctionElement get redirectionTarget {
+    if (this == defaultImplementation) return this;
+    Element target = defaultImplementation;
+    Set<Element> seen = new Set<Element>();
+    seen.add(target);
+    while (!target.isErroneous() && target != target.defaultImplementation) {
+      target = target.defaultImplementation;
+      if (seen.contains(target)) {
+        // TODO(ahe): This is expedient for now, but it should be
+        // checked by the resolver.  Keeping http://dartbug.com/3970
+        // open to track this.
+        throw new SpannableAssertionFailure(
+            target, 'redirecting factory leads to cycle');
+      }
+    }
+    return target;
+  }
+
   /**
    * Applies a patch function to this function. The patch function's body
    * is used as replacement when parsing this function's body.
@@ -1280,7 +1333,7 @@
    */
   // TODO(johnniwinther): Find a (better) way to decouple [typeVariables] from
   // [Compiler].
-  abstract Link<DartType> get typeVariables;
+  Link<DartType> get typeVariables;
 
   /**
    * Creates the type variables, their type and corresponding element, for the
@@ -1332,7 +1385,7 @@
       resolutionState = initialState,
       super(name, ElementKind.CLASS, enclosing);
 
-  abstract ClassNode parseNode(Compiler compiler);
+  ClassNode parseNode(Compiler compiler);
 
   InterfaceType computeType(compiler) {
     if (type == null) {
@@ -1948,7 +2001,7 @@
    * The compile-time constant which this annotation resolves to.
    * In the mirror system, this would be an object mirror.
    */
-  abstract Constant get value;
+  Constant get value;
   Element annotatedElement;
   int resolutionState;
 
diff --git a/lib/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
similarity index 100%
rename from lib/compiler/implementation/enqueue.dart
rename to sdk/lib/_internal/compiler/implementation/enqueue.dart
diff --git a/lib/compiler/implementation/filenames.dart b/sdk/lib/_internal/compiler/implementation/filenames.dart
similarity index 92%
rename from lib/compiler/implementation/filenames.dart
rename to sdk/lib/_internal/compiler/implementation/filenames.dart
index d3f4e7b..ddfe506 100644
--- a/lib/compiler/implementation/filenames.dart
+++ b/sdk/lib/_internal/compiler/implementation/filenames.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('filenames');
+library filenames;
 
-#import('dart:io');
-#import('dart:uri');
+import 'dart:io';
+import 'dart:uri';
 
 // TODO(ahe): This library should be replaced by a general
 // path-munging library.
diff --git a/lib/compiler/implementation/js/js.dart b/sdk/lib/_internal/compiler/implementation/js/js.dart
similarity index 100%
rename from lib/compiler/implementation/js/js.dart
rename to sdk/lib/_internal/compiler/implementation/js/js.dart
diff --git a/lib/compiler/implementation/js/nodes.dart b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
similarity index 98%
rename from lib/compiler/implementation/js/nodes.dart
rename to sdk/lib/_internal/compiler/implementation/js/nodes.dart
index ae0ae14..18139b2 100644
--- a/lib/compiler/implementation/js/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
@@ -147,8 +147,8 @@
   var sourcePosition;
   var endSourcePosition;
 
-  abstract accept(NodeVisitor visitor);
-  abstract void visitChildren(NodeVisitor visitor);
+  accept(NodeVisitor visitor);
+  void visitChildren(NodeVisitor visitor);
 }
 
 class Program extends Node {
@@ -428,7 +428,7 @@
 }
 
 abstract class Expression extends Node {
-  abstract int get precedenceLevel;
+  int get precedenceLevel;
 }
 
 class LiteralExpression extends Expression {
@@ -645,7 +645,7 @@
   // referenced like other variables.
   VariableReference(this.name);
 
-  abstract accept(NodeVisitor visitor);
+  accept(NodeVisitor visitor);
   int get precedenceLevel => PRIMARY;
   void visitChildren(NodeVisitor visitor) {}
 }
diff --git a/lib/compiler/implementation/js/precedence.dart b/sdk/lib/_internal/compiler/implementation/js/precedence.dart
similarity index 97%
rename from lib/compiler/implementation/js/precedence.dart
rename to sdk/lib/_internal/compiler/implementation/js/precedence.dart
index 0a548f1..6d66f1f 100644
--- a/lib/compiler/implementation/js/precedence.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/precedence.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library("precedence");
+library precedence;
 
 const EXPRESSION = 0;
 const ASSIGNMENT = EXPRESSION + 1;
diff --git a/lib/compiler/implementation/js/printer.dart b/sdk/lib/_internal/compiler/implementation/js/printer.dart
similarity index 87%
rename from lib/compiler/implementation/js/printer.dart
rename to sdk/lib/_internal/compiler/implementation/js/printer.dart
index eaa8579..5bdbfd9 100644
--- a/lib/compiler/implementation/js/printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/printer.dart
@@ -16,16 +16,18 @@
   bool pendingSemicolon = false;
   bool pendingSpace = false;
 
-  Printer(leg.Compiler compiler)
+  Printer(leg.Compiler compiler, { allowVariableMinification: true })
       : shouldCompressOutput = compiler.enableMinification,
         this.compiler = compiler,
         outBuffer = new leg.CodeBuffer(),
         danglingElseVisitor = new DanglingElseVisitor(compiler),
-        namer = determineRenamer(compiler.enableMinification);
+        namer = determineRenamer(compiler.enableMinification,
+                                 allowVariableMinification);
 
-  static Namer determineRenamer(bool shouldCompressOutput) {
-    // TODO(erikcorry): Re-enable the MinifyRenamer after M1.
-    return new IdentityNamer();
+  static Namer determineRenamer(bool shouldCompressOutput,
+                                bool allowVariableMinification) {
+    return (shouldCompressOutput && allowVariableMinification)
+        ? new MinifyRenamer() : new IdentityNamer();
   }
 
   void spaceOut() {
@@ -277,25 +279,25 @@
 
   visitContinue(Continue node) {
     if (node.targetLabel == null) {
-      outIndentLn("continue");
+      outIndent("continue");
     } else {
-      outIndentLn("continue ${node.targetLabel}");
+      outIndent("continue ${node.targetLabel}");
     }
-    pendingSemicolon = true;
+    outSemicolonLn();
   }
 
   visitBreak(Break node) {
     if (node.targetLabel == null) {
-      outIndentLn("break");
+      outIndent("break");
     } else {
-      outIndentLn("break ${node.targetLabel}");
+      outIndent("break ${node.targetLabel}");
     }
-    pendingSemicolon = true;
+    outSemicolonLn();
   }
 
   visitReturn(Return node) {
     if (node.value == null) {
-      outIndentLn("return");
+      outIndent("return");
     } else {
       outIndent("return");
       pendingSpace = true;
@@ -815,23 +817,44 @@
 }
 
 
+class OrderedSet<T> {
+  final Set<T> set;
+  final List<T> list;
+
+  OrderedSet() : set = new Set<T>(), list = <T>[];
+
+  void add(T x) {
+    if (!set.contains(x)) {
+      set.add(x);
+      list.add(x);
+    }
+  }
+
+  void forEach(void fun(T x)) {
+    list.forEach(fun);
+  }
+}
+
 // Collects all the var declarations in the function.  We need to do this in a
 // separate pass because JS vars are lifted to the top of the function.
 class VarCollector extends BaseVisitor {
   bool nested;
-  final Set<String> vars;
-  final List<String> ordered_vars;
+  final OrderedSet<String> vars;
+  final OrderedSet<String> params;
 
-  VarCollector() : nested = false, vars = new Set<String>(), ordered_vars = [];
+  VarCollector() : nested = false,
+                   vars = new OrderedSet<String>(),
+                   params = new OrderedSet<String>();
 
-  void forEach(void fn(String)) => ordered_vars.forEach(fn);
+  void forEachVar(void fn(String v)) => vars.forEach(fn);
+  void forEachParam(void fn(String p)) => params.forEach(fn);
 
   void collectVarsInFunction(Fun fun) {
     if (!nested) {
       nested = true;
       if (fun.params != null) {
         for (int i = 0; i < fun.params.length; i++) {
-          add(fun.params[i].name);
+          params.add(fun.params[i].name);
         }
       }
       visitBlock(fun.body);
@@ -839,13 +862,6 @@
     }
   }
 
-  void add(String name) {
-    if (!vars.contains(name)) {
-      vars.add(name);
-      ordered_vars.add(name);
-    }
-  }
-
   void visitFunctionDeclaration(FunctionDeclaration declaration) {
     // Note that we don't bother collecting the name of the function.
     collectVarsInFunction(declaration.function);
@@ -860,8 +876,10 @@
     collectVarsInFunction(fun);
   }
 
+  void visitThis(This node) {}
+
   void visitVariableDeclaration(VariableDeclaration decl) {
-    add(decl.name);
+    vars.add(decl.name);
   }
 }
 
@@ -916,9 +934,11 @@
 }
 
 
-leg.CodeBuffer prettyPrint(Node node,
-                           leg.Compiler compiler) {
-  Printer printer = new Printer(compiler);
+leg.CodeBuffer prettyPrint(Node node, leg.Compiler compiler,
+                           { allowVariableMinification: true }) {
+  Printer printer =
+      new Printer(compiler,
+                  allowVariableMinification: allowVariableMinification);
   printer.visit(node);
   return printer.outBuffer;
 }
@@ -926,7 +946,8 @@
 
 abstract class Namer {
   String getName(String oldName);
-  String declareName(String oldName);
+  String declareVariable(String oldName);
+  String declareParameter(String oldName);
   void enterScope(VarCollector vars);
   void leaveScope();
 }
@@ -934,7 +955,8 @@
 
 class IdentityNamer implements Namer {
   String getName(String oldName) => oldName;
-  String declareName(String oldName) => oldName;
+  String declareVariable(String oldName) => oldName;
+  String declareParameter(String oldName) => oldName;
   void enterScope(VarCollector vars) {}
   void leaveScope() {}
 }
@@ -942,23 +964,29 @@
 
 class MinifyRenamer implements Namer {
   final List<Map<String, String>> maps = [];
-  final List<int> nameNumberStack = [];
-  int nameNumber = 0;
+  final List<int> parameterNumberStack = [];
+  final List<int> variableNumberStack = [];
+  int parameterNumber = 0;
+  int variableNumber = 0;
 
   MinifyRenamer();
 
   void enterScope(VarCollector vars) {
     maps.add(new Map<String, String>());
-    nameNumberStack.add(nameNumber);
-    vars.forEach(declareName);
+    variableNumberStack.add(variableNumber);
+    parameterNumberStack.add(parameterNumber);
+    vars.forEachVar(declareVariable);
+    vars.forEachParam(declareParameter);
   }
 
   void leaveScope() {
     maps.removeLast();
-    nameNumber = nameNumberStack.removeLast();
+    variableNumber = variableNumberStack.removeLast();
+    parameterNumber = parameterNumberStack.removeLast();
   }
 
   String getName(String oldName) {
+    // Go from inner scope to outer looking for mapping of name.
     for (int i = maps.length - 1; i >= 0; i--) {
       var map = maps[i];
       var replacement = map[oldName];
@@ -967,17 +995,51 @@
     return oldName;
   }
 
+  static const LOWER_CASE_LETTERS = 26;
+  static const LETTERS = 52;
+  static const DIGITS = 10;
+
   static int nthLetter(int n) {
-    return (n < 26) ? charCodes.$a + n : charCodes.$A + n - 26;
+    return (n < LOWER_CASE_LETTERS) ?
+           charCodes.$a + n :
+           charCodes.$A + n - LOWER_CASE_LETTERS;
   }
 
-  String declareName(String oldName) {
-    const LETTERS = 52;
-    const DIGITS = 10;
+  // Parameters go from a to z and variables go from z to a.  This makes each
+  // argument list and each top-of-function var declaration look similar and
+  // helps gzip compress the file.  If we have more than 26 arguments and
+  // variables then we meet somewhere in the middle of the alphabet.  After
+  // that we give up trying to be nice to the compression algorithm and just
+  // use the same namespace for arguments and variables, starting with A, and
+  // moving on to a0, a1, etc.
+  String declareVariable(String oldName) {
+    var newName;
+    if (variableNumber + parameterNumber < LOWER_CASE_LETTERS) {
+      // Variables start from z and go backwards, for better gzipability.
+      newName = getNameNumber(oldName, LOWER_CASE_LETTERS - 1 - variableNumber);
+    } else {
+      // After 26 variables and parameters we allocate them in the same order.
+      newName = getNameNumber(oldName, variableNumber + parameterNumber);
+    }
+    variableNumber++;
+    return newName;
+  }
+
+  String declareParameter(String oldName) {
+    var newName;
+    if (variableNumber + parameterNumber < LOWER_CASE_LETTERS) {
+      newName = getNameNumber(oldName, parameterNumber);
+    } else {
+      newName = getNameNumber(oldName, variableNumber + parameterNumber);
+    }
+    parameterNumber++;
+    return newName;
+  }
+
+  String getNameNumber(String oldName, int n) {
     if (maps.isEmpty) return oldName;
 
     String newName;
-    int n = nameNumber;
     if (n < LETTERS) {
       // Start naming variables a, b, c, ..., z, A, B, C, ..., Z.
       newName = new String.fromCharCodes([nthLetter(n)]);
@@ -1006,7 +1068,6 @@
       newName = new String.fromCharCodes(codes);
     }
     assert(const RegExp(r'[a-zA-Z][a-zA-Z0-9]*').hasMatch(newName));
-    nameNumber++;
     maps.last[oldName] = newName;
     return newName;
   }
diff --git a/lib/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
similarity index 99%
rename from lib/compiler/implementation/js_backend/backend.dart
rename to sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index 672e4ab..9cedefb 100644
--- a/lib/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -907,7 +907,9 @@
     Element element = type.element;
     bool nativeCheck =
           emitter.nativeEmitter.requiresNativeIsCheck(element);
-    if (element == compiler.stringClass) {
+    if (type == compiler.types.voidType) {
+      return const SourceString('voidTypeCheck');
+    } else if (element == compiler.stringClass) {
       return const SourceString('stringTypeCheck');
     } else if (element == compiler.doubleClass) {
       return const SourceString('doubleTypeCheck');
diff --git a/lib/compiler/implementation/js_backend/constant_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
similarity index 100%
rename from lib/compiler/implementation/js_backend/constant_emitter.dart
rename to sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
diff --git a/lib/compiler/implementation/js_backend/constant_system_javascript.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
similarity index 100%
rename from lib/compiler/implementation/js_backend/constant_system_javascript.dart
rename to sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
diff --git a/lib/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
similarity index 99%
rename from lib/compiler/implementation/js_backend/emitter.dart
rename to sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index aecbea0..6972a0e 100644
--- a/lib/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -1286,8 +1286,12 @@
       int type = METHOD;
       if (selector.isGetter()) {
         type = GETTER;
+        assert(methodName.startsWith("get:"));
+        methodName = methodName.substring(4);
       } else if (selector.isSetter()) {
         type = SETTER;
+        assert(methodName.startsWith("set:"));
+        methodName = "${methodName.substring(4)}=";
       }
       CodeBuffer args = new CodeBuffer();
       for (int i = 0; i < selector.argumentCount; i++) {
@@ -1442,7 +1446,6 @@
       String invocationName = "${namer.closureInvocationName(selector)}";
       mainEnsureGetter = "$mainAccess.$invocationName = $mainAccess";
     }
-
     // TODO(ngeoffray): These globals are currently required by the isolate
     // library. They should be removed.
     buffer.add("""
diff --git a/lib/compiler/implementation/js_backend/emitter_no_eval.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart
similarity index 100%
rename from lib/compiler/implementation/js_backend/emitter_no_eval.dart
rename to sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart
diff --git a/lib/compiler/implementation/js_backend/js_backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
similarity index 100%
rename from lib/compiler/implementation/js_backend/js_backend.dart
rename to sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
diff --git a/lib/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
similarity index 100%
rename from lib/compiler/implementation/js_backend/namer.dart
rename to sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
diff --git a/lib/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
similarity index 100%
rename from lib/compiler/implementation/js_backend/native_emitter.dart
rename to sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
diff --git a/lib/compiler/implementation/lib/constant_map.dart b/sdk/lib/_internal/compiler/implementation/lib/constant_map.dart
similarity index 100%
rename from lib/compiler/implementation/lib/constant_map.dart
rename to sdk/lib/_internal/compiler/implementation/lib/constant_map.dart
diff --git a/lib/compiler/implementation/lib/core_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/core_patch.dart
similarity index 100%
rename from lib/compiler/implementation/lib/core_patch.dart
rename to sdk/lib/_internal/compiler/implementation/lib/core_patch.dart
diff --git a/lib/compiler/implementation/lib/coreimpl_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/coreimpl_patch.dart
similarity index 100%
rename from lib/compiler/implementation/lib/coreimpl_patch.dart
rename to sdk/lib/_internal/compiler/implementation/lib/coreimpl_patch.dart
diff --git a/lib/compiler/implementation/lib/interceptors.dart b/sdk/lib/_internal/compiler/implementation/lib/interceptors.dart
similarity index 100%
rename from lib/compiler/implementation/lib/interceptors.dart
rename to sdk/lib/_internal/compiler/implementation/lib/interceptors.dart
diff --git a/lib/compiler/implementation/lib/io_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
similarity index 100%
rename from lib/compiler/implementation/lib/io_patch.dart
rename to sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
diff --git a/lib/compiler/implementation/lib/isolate_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/isolate_patch.dart
similarity index 98%
rename from lib/compiler/implementation/lib/isolate_patch.dart
rename to sdk/lib/_internal/compiler/implementation/lib/isolate_patch.dart
index 58b8093..1eeec4e 100644
--- a/lib/compiler/implementation/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/isolate_patch.dart
@@ -18,7 +18,7 @@
 /**
  * Called by the compiler to fetch the current isolate context.
  */
-void _currentIsolate() => _globalState.currentContext;
+_IsolateContext _currentIsolate() => _globalState.currentContext;
 
 /********************************************************
   Inserted from lib/isolate/dart2js/compiler_hooks.dart
@@ -378,7 +378,7 @@
 /** A stub for interacting with the main manager. */
 class _MainManagerStub implements _ManagerStub {
   get id => 0;
-  void set id(int i) { throw new NotImplementedException(); }
+  void set id(int i) { throw new UnimplementedError(); }
   void set onmessage(f) {
     throw new Exception("onmessage should not be set on MainManagerStub");
   }
@@ -398,7 +398,7 @@
   void set onmessage(f) { JS("void", "#.onmessage = #", this, f); }
   void postMessage(msg) => JS("Object", "#.postMessage(#)", this, msg);
   // terminate() is implemented by Worker.
-  abstract void terminate();
+  void terminate();
 }
 
 const String _SPAWNED_SIGNAL = "spawned";
@@ -648,9 +648,9 @@
     return completer.future;
   }
 
-  abstract void send(var message, [SendPort replyTo]);
-  abstract bool operator ==(var other);
-  abstract int get hashCode;
+  void send(var message, [SendPort replyTo]);
+  bool operator ==(var other);
+  int get hashCode;
 }
 
 /** A send port that delivers messages in-memory via native JavaScript calls. */
@@ -1078,11 +1078,11 @@
     return visitObject(x);
   }
 
-  abstract visitPrimitive(x);
-  abstract visitList(List x);
-  abstract visitMap(Map x);
-  abstract visitSendPort(SendPort x);
-  abstract visitSendPortSync(SendPortSync x);
+  visitPrimitive(x);
+  visitList(List x);
+  visitMap(Map x);
+  visitSendPort(SendPort x);
+  visitSendPortSync(SendPortSync x);
 
   visitObject(Object x) {
     // TODO(floitsch): make this a real exception. (which one)?
@@ -1233,7 +1233,7 @@
     return result;
   }
 
-  abstract deserializeSendPort(List x);
+  deserializeSendPort(List x);
 
   deserializeObject(List x) {
     // TODO(floitsch): Use real exception (which one?).
diff --git a/lib/compiler/implementation/lib/js_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
similarity index 98%
rename from lib/compiler/implementation/lib/js_helper.dart
rename to sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
index 56807be..5b4f36a6 100644
--- a/lib/compiler/implementation/lib/js_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_helper.dart
@@ -11,6 +11,7 @@
 #source('native_helper.dart');
 #source('regexp_helper.dart');
 #source('string_helper.dart');
+#source('mirror_opt_in_message.dart');
 
 // Performance critical helper methods.
 add(var a, var b) => (a is num && b is num)
@@ -413,6 +414,8 @@
 class Primitives {
   static int hashCodeSeed = 0;
 
+  static bool mirrorsEnabled = false;
+
   static int objectHashCode(object) {
     int hash = JS('var', r'#.$identityHash', object);
     if (hash == null) {
@@ -429,8 +432,12 @@
    * by defining a function in JavaScript called "dartPrint".
    */
   static void printString(String string) {
-    // Support overriding print from JavaScript.
-    if (JS('bool', r'typeof dartPrint == "function"')) {
+    if ((MIRROR_OPT_IN_MESSAGE == string)) {
+      // Turn on mirrors. Also, make sure that this message isn't easy
+      // to suppress by not calling dartPrint.
+      mirrorsEnabled = true;
+    } else if (JS('bool', r'typeof dartPrint == "function"')) {
+      // Support overriding print from JavaScript.
       JS('void', r'dartPrint(#)', string);
       return;
     }
@@ -712,6 +719,11 @@
     // [function].
     return JS('var', '#.apply(#, #)', jsFunction, function, arguments);
   }
+
+  static getConstructor(String className) {
+    // TODO(ahe): How to safely access $?
+    return JS('var', r'$[#]', className);
+  }
 }
 
 /**
@@ -1375,6 +1387,11 @@
   propertyTypeCastError(value, property);
 }
 
+voidTypeCheck(value) {
+  if (value == null) return value;
+  throw new TypeErrorImplementation(value, 'void');
+}
+
 /**
  * Special interface recognized by the compiler and implemented by DOM
  * objects that support integer indexing. This interface is not
diff --git a/lib/compiler/implementation/lib/math_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/math_patch.dart
similarity index 100%
rename from lib/compiler/implementation/lib/math_patch.dart
rename to sdk/lib/_internal/compiler/implementation/lib/math_patch.dart
diff --git a/sdk/lib/_internal/compiler/implementation/lib/mirror_opt_in_message.dart b/sdk/lib/_internal/compiler/implementation/lib/mirror_opt_in_message.dart
new file mode 100644
index 0000000..df196a2
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/lib/mirror_opt_in_message.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Yeah, seriously: mirrors in dart2js are experimental...
+const String MIRROR_OPT_IN_MESSAGE = """
+
+This program is using an experimental feature called \"mirrors\".  As
+currently implemented, mirrors do not work with minification, and will
+cause spurious errors depending on how code was optimized.
+
+The authors of this program are aware of these problems and have
+decided the thrill of using an experimental feature is outweighing the
+risks.  Furthermore, the authors of this program understand that
+long-term, to fix the problems mentioned above, mirrors may have
+negative impact on size and performance of Dart programs compiled to
+JavaScript.
+""";
diff --git a/sdk/lib/_internal/compiler/implementation/lib/mirrors.dart b/sdk/lib/_internal/compiler/implementation/lib/mirrors.dart
new file mode 100644
index 0000000..6728d47
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/lib/mirrors.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart_mirrors;
+
+import 'dart:isolate';
+
+part '../../../../mirrors/mirrors.dart';
+
+/**
+ * Stub class for the mirror system.
+ */
+class _Mirrors {
+  static MirrorSystem currentMirrorSystem() {
+    _ensureEnabled();
+    throw new UnsupportedError("MirrorSystem not implemented");
+  }
+
+  static Future<MirrorSystem> mirrorSystemOf(SendPort port) {
+    _ensureEnabled();
+    throw new UnsupportedError("MirrorSystem not implemented");
+  }
+
+  static InstanceMirror reflect(Object reflectee) {
+    _ensureEnabled();
+    return new _InstanceMirror(reflectee);
+  }
+}
+
+class _InstanceMirror extends InstanceMirror {
+  static final Expando<ClassMirror> classMirrors = new Expando<ClassMirror>();
+
+  final reflectee;
+
+  _InstanceMirror(this.reflectee) {
+    _ensureEnabled();
+  }
+
+  bool get hasReflectee => true;
+
+  ClassMirror get type {
+    String className = Primitives.objectTypeName(reflectee);
+    var constructor = Primitives.getConstructor(className);
+    var mirror = classMirrors[constructor];
+    if (mirror == null) {
+      mirror = new _ClassMirror(className, constructor);
+      classMirrors[constructor] = mirror;
+    }
+    return mirror;
+  }
+
+  Future<InstanceMirror> invoke(String memberName,
+                                List<Object> positionalArguments,
+                                [Map<String,Object> namedArguments]) {
+    if (namedArguments != null && !namedArguments.isEmpty) {
+      throw new UnsupportedError('Named arguments are not implemented');
+    }
+    // Copy the list to ensure that it can safely be passed to
+    // JavaScript.
+    var jsList = new List.from(positionalArguments);
+    var mangledName = '${memberName}\$${positionalArguments.length}';
+    var method = JS('var', '#[#]', reflectee, mangledName);
+    var completer = new Completer<InstanceMirror>();
+    // TODO(ahe): [Completer] or [Future] should have API to create a
+    // delayed action.  Simulating with a [Timer].
+    new Timer(0, (timer) {
+      if (JS('String', 'typeof #', method) == 'function') {
+        var result =
+            JS('var', '#.apply(#, #)', method, reflectee, jsList);
+        completer.complete(new _InstanceMirror(result));
+      } else {
+        completer.completeException('not a method $memberName');
+      }
+    });
+    return completer.future;
+  }
+
+  String toString() => 'InstanceMirror($reflectee)';
+}
+
+class _ClassMirror extends ClassMirror {
+  final String _name;
+  final _jsConstructor;
+
+  _ClassMirror(this._name, this._jsConstructor) {
+    _ensureEnabled();
+  }
+
+  String toString() => 'ClassMirror($_name)';
+}
+
+_ensureEnabled() {
+  if (Primitives.mirrorsEnabled) return;
+  throw new UnsupportedError('dart:mirrors is an experimental feature');
+}
diff --git a/lib/compiler/implementation/lib/native_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
similarity index 99%
rename from lib/compiler/implementation/lib/native_helper.dart
rename to sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
index 3f79e26..196136d 100644
--- a/lib/compiler/implementation/lib/native_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/native_helper.dart
@@ -175,7 +175,7 @@
   return 'Instance of $name';
 }
 
-String hashCodeForNativeObject(object) => Primitives.objectHashCode(object);
+int hashCodeForNativeObject(object) => Primitives.objectHashCode(object);
 
 /**
  * Sets a JavaScript property on an object.
diff --git a/lib/compiler/implementation/lib/regexp_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart
similarity index 100%
rename from lib/compiler/implementation/lib/regexp_helper.dart
rename to sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart
diff --git a/lib/compiler/implementation/lib/scalarlist_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/scalarlist_patch.dart
similarity index 100%
rename from lib/compiler/implementation/lib/scalarlist_patch.dart
rename to sdk/lib/_internal/compiler/implementation/lib/scalarlist_patch.dart
diff --git a/lib/compiler/implementation/lib/string_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/string_helper.dart
similarity index 100%
rename from lib/compiler/implementation/lib/string_helper.dart
rename to sdk/lib/_internal/compiler/implementation/lib/string_helper.dart
diff --git a/lib/compiler/implementation/library_loader.dart b/sdk/lib/_internal/compiler/implementation/library_loader.dart
similarity index 97%
rename from lib/compiler/implementation/library_loader.dart
rename to sdk/lib/_internal/compiler/implementation/library_loader.dart
index 9b56a38..359aa43 100644
--- a/lib/compiler/implementation/library_loader.dart
+++ b/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -20,12 +20,12 @@
    *
    * This is the main entry point for [LibraryLoader].
    */
-  abstract LibraryElement loadLibrary(Uri uri, Node node, Uri canonicalUri);
+  LibraryElement loadLibrary(Uri uri, Node node, Uri canonicalUri);
 
   // TODO(johnniwinther): Remove this when patches don't need special parsing.
-  abstract void registerLibraryFromTag(LibraryDependencyHandler handler,
-                                       LibraryElement library,
-                                       LibraryDependency tag);
+  void registerLibraryFromTag(LibraryDependencyHandler handler,
+                              LibraryElement library,
+                              LibraryDependency tag);
 
   /**
    * Adds the elements in the export scope of [importedLibrary] to the import
@@ -33,9 +33,9 @@
    */
   // TODO(johnniwinther): Move handling of 'js_helper' to the library loader
   // to remove this method from the [LibraryLoader] interface.
-  abstract void importLibrary(LibraryElement importingLibrary,
-                              LibraryElement importedLibrary,
-                              Import tag);
+  void importLibrary(LibraryElement importingLibrary,
+                     LibraryElement importedLibrary,
+                     Import tag);
 }
 
 /**
diff --git a/pkg/dartdoc/lib/src/mirrors/dart2js_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
similarity index 88%
rename from pkg/dartdoc/lib/src/mirrors/dart2js_mirror.dart
rename to sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
index 7523ad6..fe4e6da 100644
--- a/pkg/dartdoc/lib/src/mirrors/dart2js_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart
@@ -7,23 +7,22 @@
 import 'dart:io';
 import 'dart:uri';
 
-import '../../../../../lib/compiler/compiler.dart' as diagnostics;
-import '../../../../../lib/compiler/implementation/elements/elements.dart';
-import '../../../../../lib/compiler/implementation/resolution/resolution.dart'
-    show ResolverTask, ResolverVisitor;
-import '../../../../../lib/compiler/implementation/apiimpl.dart' as api;
-import '../../../../../lib/compiler/implementation/scanner/scannerlib.dart';
-import '../../../../../lib/compiler/implementation/ssa/ssa.dart';
-import '../../../../../lib/compiler/implementation/dart2jslib.dart';
-import '../../../../../lib/compiler/implementation/filenames.dart';
-import '../../../../../lib/compiler/implementation/source_file.dart';
-import '../../../../../lib/compiler/implementation/tree/tree.dart';
-import '../../../../../lib/compiler/implementation/util/util.dart';
-import '../../../../../lib/compiler/implementation/util/uri_extras.dart';
-import '../../../../../lib/compiler/implementation/dart2js.dart';
+import '../../compiler.dart' as diagnostics;
+import '../elements/elements.dart';
+import '../resolution/resolution.dart' show ResolverTask, ResolverVisitor;
+import '../apiimpl.dart' as api;
+import '../scanner/scannerlib.dart';
+import '../ssa/ssa.dart';
+import '../dart2jslib.dart';
+import '../filenames.dart';
+import '../source_file.dart';
+import '../tree/tree.dart';
+import '../util/util.dart';
+import '../util/uri_extras.dart';
+import '../dart2js.dart';
+import '../util/characters.dart';
 
-// TODO(rnystrom): Use "package:" URL (#4968).
-import '../../mirrors.dart';
+import 'mirrors.dart';
 import 'util.dart';
 
 //------------------------------------------------------------------------------
@@ -403,11 +402,13 @@
 
   bool get isConstructor => false;
 
-  bool get isField => false;
+  bool get isVariable => false;
 
   bool get isMethod => false;
 
   bool get isStatic => false;
+
+  bool get isParameter => false;
 }
 
 abstract class Dart2JsTypeMirror extends Dart2JsDeclarationMirror
@@ -428,7 +429,7 @@
 
   String get displayName => simpleName;
 
-  SourceLocation get location => new Dart2JsLocation(
+  SourceLocation get location => new Dart2JsSourceLocation(
       _element.getCompilationUnit().script,
       mirrors.compiler.spanFromElement(_element));
 
@@ -617,35 +618,82 @@
 
   SourceLocation get location {
     var script = _library.getCompilationUnit().script;
-    return new Dart2JsLocation(
-        script,
-        new SourceSpan(script.uri, 0, script.text.length));
+    SourceSpan span;
+    if (_library.libraryTag != null) {
+      span = mirrors.compiler.spanFromNode(_library.libraryTag, script.uri);
+    } else {
+      span = new SourceSpan(script.uri, 0, 0);
+    }
+    return new Dart2JsSourceLocation(script, span);
   }
 }
 
-class Dart2JsLocation implements SourceLocation {
-  Script _script;
-  SourceSpan _span;
+class Dart2JsSourceLocation implements SourceLocation {
+  final Script _script;
+  final SourceSpan _span;
+  int _line;
+  int _column;
 
-  Dart2JsLocation(this._script, this._span);
+  Dart2JsSourceLocation(this._script, this._span);
 
-  int get start => _span.begin;
+  int _computeLine() {
+    var sourceFile = _script.file as SourceFile;
+    if (sourceFile != null) {
+      return sourceFile.getLine(offset) + 1;
+    }
+    var index = 0;
+    var lineNumber = 0;
+    while (index <= offset && index < sourceText.length) {
+      index = sourceText.indexOf('\n', index) + 1;
+      if (index <= 0) break;
+      lineNumber++;
+    }
+    return lineNumber;
+  }
 
-  int get end => _span.end;
+  int get line {
+    if (_line == null) {
+      _line = _computeLine();
+    }
+    return _line;
+  }
 
-  Source get source => new Dart2JsSource(_script);
+  int _computeColumn() {
+    if (length == 0) return 0;
 
-  String get text => _script.text.substring(start, end);
-}
+    var sourceFile = _script.file as SourceFile;
+    if (sourceFile != null) {
+      return sourceFile.getColumn(sourceFile.getLine(offset), offset) + 1;
+    }
+    int index = offset - 1;
+    var columnNumber = 0;
+    while (0 <= index && index < sourceText.length) {
+      columnNumber++;
+      var charCode = sourceText.charCodeAt(index);
+      if (charCode == $CR || charCode == $LF) {
+        break;
+      }
+      index--;
+    }
+    return columnNumber;
+  }
 
-class Dart2JsSource implements Source {
-  Script _script;
+  int get column {
+    if (_column == null) {
+      _column = _computeColumn();
+    }
+    return _column;
+  }
 
-  Dart2JsSource(this._script);
+  int get offset => _span.begin;
 
-  Uri get uri => _script.uri;
+  int get length => _span.end - _span.begin;
 
-  String get text => _script.text;
+  String get text => _script.text.substring(_span.begin, _span.end);
+
+  Uri get sourceUri => _script.uri;
+
+  String get sourceText => _script.text;
 }
 
 class Dart2JsParameterMirror extends Dart2JsMemberMirror
@@ -764,7 +812,7 @@
       if (node != null) {
         var script = _class.getCompilationUnit().script;
         var span = mirrors.compiler.spanFromNode(node, script.uri);
-        return new Dart2JsLocation(script, span);
+        return new Dart2JsSourceLocation(script, span);
       }
     }
     return super.location;
@@ -899,7 +947,7 @@
     if (node != null) {
       var script = _typedef.element.getCompilationUnit().script;
       var span = mirrors.compiler.spanFromNode(node, script.uri);
-      return new Dart2JsLocation(script, span);
+      return new Dart2JsSourceLocation(script, span);
     }
     return super.location;
   }
@@ -1023,8 +1071,8 @@
 
   SourceLocation get location {
     var script = _type.element.getCompilationUnit().script;
-    return new Dart2JsLocation(script,
-                               mirrors.compiler.spanFromElement(_type.element));
+    return new Dart2JsSourceLocation(script,
+        mirrors.compiler.spanFromElement(_type.element));
   }
 
   DeclarationMirror get owner => library;
@@ -1305,81 +1353,91 @@
 class Dart2JsMethodMirror extends Dart2JsMemberMirror
     implements MethodMirror {
   final Dart2JsContainerMirror _objectMirror;
-  String _simpleName;
-  String _displayName;
-  String _constructorName;
-  String _operatorName;
-  Dart2JsMethodKind _kind;
+  final String simpleName;
+  final String displayName;
+  final String constructorName;
+  final String operatorName;
+  final Dart2JsMethodKind _kind;
 
-  Dart2JsMethodMirror(Dart2JsContainerMirror objectMirror,
-                      FunctionElement function)
+  Dart2JsMethodMirror._internal(Dart2JsContainerMirror objectMirror,
+      FunctionElement function,
+      String this.simpleName,
+      String this.displayName,
+      String this.constructorName,
+      String this.operatorName,
+      Dart2JsMethodKind this._kind)
       : this._objectMirror = objectMirror,
-        super(objectMirror.mirrors, function) {
-    _simpleName = _element.name.slowToString();
-    if (_function.kind == ElementKind.GETTER) {
-      _kind = Dart2JsMethodKind.GETTER;
-      _displayName = _simpleName;
-    } else if (_function.kind == ElementKind.SETTER) {
-      _kind = Dart2JsMethodKind.SETTER;
-      _displayName = _simpleName;
-      _simpleName = '$_simpleName=';
-    } else if (_function.kind == ElementKind.GENERATIVE_CONSTRUCTOR) {
+        super(objectMirror.mirrors, function);
+
+  factory Dart2JsMethodMirror(Dart2JsContainerMirror objectMirror,
+                              FunctionElement function) {
+    String simpleName = function.name.slowToString();
+    String displayName;
+    String constructorName = null;
+    String operatorName = null;
+    Dart2JsMethodKind kind;
+    if (function.kind == ElementKind.GETTER) {
+      kind = Dart2JsMethodKind.GETTER;
+      displayName = simpleName;
+    } else if (function.kind == ElementKind.SETTER) {
+      kind = Dart2JsMethodKind.SETTER;
+      displayName = simpleName;
+      simpleName = '$simpleName=';
+    } else if (function.kind == ElementKind.GENERATIVE_CONSTRUCTOR) {
       // TODO(johnniwinther): Support detection of redirecting constructors.
-      _constructorName = '';
-      int dollarPos = _simpleName.indexOf('\$');
+      constructorName = '';
+      int dollarPos = simpleName.indexOf('\$');
       if (dollarPos != -1) {
-        _constructorName = _simpleName.substring(dollarPos + 1);
-        _simpleName = _simpleName.substring(0, dollarPos);
+        constructorName = simpleName.substring(dollarPos + 1);
+        simpleName = simpleName.substring(0, dollarPos);
         // Simple name is TypeName.constructorName.
-        _simpleName = '$_simpleName.$_constructorName';
+        simpleName = '$simpleName.$constructorName';
       } else {
         // Simple name is TypeName.
       }
-      if (_function.modifiers.isConst()) {
-        _kind = Dart2JsMethodKind.CONST;
+      if (function.modifiers.isConst()) {
+        kind = Dart2JsMethodKind.CONST;
       } else {
-        _kind = Dart2JsMethodKind.GENERATIVE;
+        kind = Dart2JsMethodKind.GENERATIVE;
       }
-      _displayName = _simpleName;
-    } else if (_function.modifiers.isFactory()) {
-      _kind = Dart2JsMethodKind.FACTORY;
-      _constructorName = '';
-      int dollarPos = _simpleName.indexOf('\$');
+      displayName = simpleName;
+    } else if (function.modifiers.isFactory()) {
+      kind = Dart2JsMethodKind.FACTORY;
+      constructorName = '';
+      int dollarPos = simpleName.indexOf('\$');
       if (dollarPos != -1) {
-        _constructorName = _simpleName.substring(dollarPos+1);
-        _simpleName = _simpleName.substring(0, dollarPos);
-        _simpleName = '$_simpleName.$_constructorName';
+        constructorName = simpleName.substring(dollarPos+1);
+        simpleName = simpleName.substring(0, dollarPos);
+        simpleName = '$simpleName.$constructorName';
       }
       // Simple name is TypeName.constructorName.
-      _displayName = _simpleName;
-    } else if (_simpleName == 'negate') {
-      _kind = Dart2JsMethodKind.OPERATOR;
-      _operatorName = '-';
+      displayName = simpleName;
+    } else if (simpleName == 'negate') {
+      kind = Dart2JsMethodKind.OPERATOR;
+      operatorName = '-';
       // Simple name is 'unary-'.
-      _simpleName = Mirror.UNARY_MINUS;
+      simpleName = Mirror.UNARY_MINUS;
       // Display name is 'operator operatorName'.
-      _displayName = 'operator -';
-    } else if (_simpleName.startsWith('operator\$')) {
-      String str = _simpleName.substring(9);
-      _simpleName = 'operator';
-      _kind = Dart2JsMethodKind.OPERATOR;
-      _operatorName = _getOperatorFromOperatorName(str);
+      displayName = 'operator -';
+    } else if (simpleName.startsWith('operator\$')) {
+      String str = simpleName.substring(9);
+      simpleName = 'operator';
+      kind = Dart2JsMethodKind.OPERATOR;
+      operatorName = _getOperatorFromOperatorName(str);
       // Simple name is 'operator operatorName'.
-      _simpleName = _operatorName;
+      simpleName = operatorName;
       // Display name is 'operator operatorName'.
-      _displayName = 'operator $_operatorName';
+      displayName = 'operator $operatorName';
     } else {
-      _kind = Dart2JsMethodKind.REGULAR;
-      _displayName = _simpleName;
+      kind = Dart2JsMethodKind.REGULAR;
+      displayName = simpleName;
     }
+    return new Dart2JsMethodMirror._internal(objectMirror, function,
+        simpleName, displayName, constructorName, operatorName, kind);
   }
 
   FunctionElement get _function => _element;
 
-  String get simpleName => _simpleName;
-
-  String get displayName => _displayName;
-
   String get qualifiedName
       => '${owner.qualifiedName}.$simpleName';
 
@@ -1419,22 +1477,18 @@
 
   bool get isFactoryConstructor => _kind == Dart2JsMethodKind.FACTORY;
 
-  String get constructorName => _constructorName;
-
   bool get isGetter => _kind == Dart2JsMethodKind.GETTER;
 
   bool get isSetter => _kind == Dart2JsMethodKind.SETTER;
 
   bool get isOperator => _kind == Dart2JsMethodKind.OPERATOR;
 
-  String get operatorName => _operatorName;
-
   SourceLocation get location {
     var node = _function.parseNode(_diagnosticListener);
     if (node != null) {
       var script = _function.getCompilationUnit().script;
       var span = mirrors.compiler.spanFromNode(node, script.uri);
-      return new Dart2JsLocation(script, span);
+      return new Dart2JsSourceLocation(script, span);
     }
     return super.location;
   }
@@ -1458,7 +1512,7 @@
 
   bool get isTopLevel => _objectMirror is LibraryMirror;
 
-  bool get isField => true;
+  bool get isVariable => true;
 
   bool get isStatic => _variable.modifiers.isStatic();
 
@@ -1475,10 +1529,10 @@
     var node = _variable.variables.parseNode(_diagnosticListener);
     if (node != null) {
       var span = mirrors.compiler.spanFromNode(node, script.uri);
-      return new Dart2JsLocation(script, span);
+      return new Dart2JsSourceLocation(script, span);
     } else {
       var span = mirrors.compiler.spanFromElement(_variable);
-      return new Dart2JsLocation(script, span);
+      return new Dart2JsSourceLocation(script, span);
     }
   }
 }
diff --git a/pkg/dartdoc/lib/mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
similarity index 91%
rename from pkg/dartdoc/lib/mirrors.dart
rename to sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
index 6f49c95..9b7384b 100644
--- a/pkg/dartdoc/lib/mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart
@@ -8,7 +8,7 @@
 import 'dart:uri';
 
 // TODO(rnystrom): Use "package:" URL (#4968).
-import 'src/mirrors/dart2js_mirror.dart';
+import 'dart2js_mirror.dart';
 
 /**
  * [Compilation] encapsulates the compilation of a program.
@@ -401,24 +401,33 @@
  */
 abstract class MemberMirror implements DeclarationMirror {
   /**
-   * Returns true if this member is a constructor.
+   * Is this member a constructor?
    */
   bool get isConstructor;
 
   /**
-   * Returns true if this member is a field.
+   * Is this member a variable?
+   *
+   * This is [:false:] for locals.
    */
-  bool get isField;
+  bool get isVariable;
 
   /**
-   * Returns true if this member is a method.
+   * Is this member a method?.
+   *
+   * This is [:false:] for constructors.
    */
   bool get isMethod;
 
   /**
-   * Returns true if this member is static.
+   * Is this member declared static?
    */
   bool get isStatic;
+
+  /**
+   * Is this member a parameter?
+   */
+  bool get isParameter;
 }
 
 /**
@@ -563,45 +572,51 @@
 
 /**
  * A [SourceLocation] describes the span of an entity in Dart source code.
- * A [SourceLocation] should be the minimum span that encloses the declaration
- * of the mirrored entity.
+ * A [SourceLocation] with a non-zero [length] should be the minimum span that
+ * encloses the declaration of the mirrored entity.
  */
 abstract class SourceLocation {
   /**
-   * The character position where the location begins.
+   * The 1-based line number for this source location.
+   *
+   * A value of 0 means that the line number is unknown.
    */
-  int get start;
+  int get line;
 
   /**
-   * The character position where the location ends.
+   * The 1-based column number for this source location.
+   *
+   * A value of 0 means that the column number is unknown.
    */
-  int get end;
+  int get column;
 
   /**
-   * Returns the [Source] in which this [SourceLocation] indexes.
-   * If [:loc:] is a location, [:loc.source().text()[loc.start]:] is where it
-   * starts, and [:loc.source().text()[loc.end]:] is where it ends.
+   * The 0-based character offset into the [sourceText] where this source
+   * location begins.
+   *
+   * A value of -1 means that the offset is unknown.
    */
-  Source get source;
+  int get offset;
+
+  /**
+   * The number of characters in this source location.
+   *
+   * A value of 0 means that the [offset] is approximate.
+   */
+  int get length;
 
   /**
    * The text of the location span.
    */
   String get text;
-}
 
-/**
- * A [Source] describes the source code of a compilation unit in Dart source
- * code.
- */
-abstract class Source {
   /**
    * Returns the URI where the source originated.
    */
-  Uri get uri;
+  Uri get sourceUri;
 
   /**
    * Returns the text of this source.
    */
-  String get text;
+  String get sourceText;
 }
diff --git a/pkg/dartdoc/lib/mirrors_util.dart b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
similarity index 86%
rename from pkg/dartdoc/lib/mirrors_util.dart
rename to sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
index 35fc16d..cede225 100644
--- a/pkg/dartdoc/lib/mirrors_util.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart
@@ -6,7 +6,6 @@
 
 // TODO(rnystrom): Use "package:" URL (#4968).
 import 'mirrors.dart';
-import '../../../lib/compiler/implementation/util/characters.dart';
 
 //------------------------------------------------------------------------------
 // Utility functions for using the Mirror API
@@ -45,7 +44,7 @@
 }
 
 LibraryMirror findLibrary(MemberMirror member) {
-  ContainerMirror owner = member.owner;
+  DeclarationMirror owner = member.owner;
   if (owner is LibraryMirror) {
     return owner;
   } else if (owner is TypeMirror) {
@@ -54,25 +53,6 @@
   throw new Exception('Unexpected owner: ${owner}');
 }
 
-
-/**
- * Returns the column of the start of a location.
- */
-int getLocationColumn(SourceLocation location) {
-  String text = location.source.text;
-  int index = location.start-1;
-  var column = 0;
-  while (0 <= index && index < text.length) {
-    var charCode = text.charCodeAt(index);
-    if (charCode == $CR || charCode == $LF) {
-      break;
-    }
-    index--;
-    column++;
-  }
-  return column;
-}
-
 class HierarchyIterable implements Iterable<ClassMirror> {
   final bool includeType;
   final ClassMirror type;
diff --git a/pkg/dartdoc/lib/src/mirrors/util.dart b/sdk/lib/_internal/compiler/implementation/mirrors/util.dart
similarity index 100%
rename from pkg/dartdoc/lib/src/mirrors/util.dart
rename to sdk/lib/_internal/compiler/implementation/mirrors/util.dart
diff --git a/lib/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
similarity index 100%
rename from lib/compiler/implementation/native_handler.dart
rename to sdk/lib/_internal/compiler/implementation/native_handler.dart
diff --git a/lib/compiler/implementation/patch_parser.dart b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
similarity index 100%
rename from lib/compiler/implementation/patch_parser.dart
rename to sdk/lib/_internal/compiler/implementation/patch_parser.dart
diff --git a/lib/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
similarity index 95%
rename from lib/compiler/implementation/resolution/members.dart
rename to sdk/lib/_internal/compiler/implementation/resolution/members.dart
index f96bf11..1ebc710 100644
--- a/lib/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -1083,9 +1083,9 @@
     DartType type;
     if (element == null) {
       onFailure(node, MessageKind.CANNOT_RESOLVE_TYPE, [node.typeName]);
-    } else if (element.isErroneous()) {
-      ErroneousElement error = element;
-      onFailure(node, error.messageKind, error.messageArguments);
+    } else if (element.isAmbiguous()) {
+      AmbiguousElement ambiguous = element;
+      onFailure(node, ambiguous.messageKind, ambiguous.messageArguments);
     } else if (!element.impliesType()) {
       onFailure(node, MessageKind.NOT_A_TYPE, [node.typeName]);
     } else {
@@ -1176,7 +1176,8 @@
   ExpressionStatement currentExpressionStatement;
   bool typeRequired = false;
   StatementScope statementScope;
-  int allowedCategory = ElementCategory.VARIABLE | ElementCategory.FUNCTION;
+  int allowedCategory = ElementCategory.VARIABLE | ElementCategory.FUNCTION
+      | ElementCategory.IMPLIES_TYPE;
 
   ResolverVisitor(Compiler compiler, Element element, this.mapping)
     : this.enclosingElement = element,
@@ -1198,8 +1199,19 @@
 
   Element lookup(Node node, SourceString name) {
     Element result = scope.lookup(name);
-    if (!inInstanceContext && result != null && result.isInstanceMember()) {
-      error(node, MessageKind.NO_INSTANCE_AVAILABLE, [node]);
+    if (!Elements.isUnresolved(result)) {
+      if (!inInstanceContext && result.isInstanceMember()) {
+        error(node, MessageKind.NO_INSTANCE_AVAILABLE, [node]);
+        // TODO(johnniwinther): Create an ErroneousElement.
+      } else if (result.isAmbiguous()) {
+        AmbiguousElement ambiguous = result;
+        compiler.reportMessage(compiler.spanFromNode(node),
+            ambiguous.messageKind.error(ambiguous.messageArguments),
+            Diagnostic.ERROR);
+        return new ErroneousElement(ambiguous.messageKind,
+                                    ambiguous.messageArguments,
+                                    name, enclosingElement);
+      }
     }
     return result;
   }
@@ -1240,17 +1252,9 @@
                                                  SourceString name,
                                                  MessageKind kind,
                                                  List<Node> arguments) {
-    return warnOnErroneousElement(node,
-        new ErroneousElement(kind, arguments, name, enclosingElement));
-  }
-
-  ErroneousElement warnOnErroneousElement(Node node,
-                                          ErroneousElement erroneousElement) {
-    ResolutionWarning warning =
-        new ResolutionWarning(erroneousElement.messageKind,
-                              erroneousElement.messageArguments);
+    ResolutionWarning warning = new ResolutionWarning(kind, arguments);
     compiler.reportWarning(node, warning);
-    return erroneousElement;
+    return new ErroneousElement(kind, arguments, name, enclosingElement);
   }
 
   Element visitIdentifier(Identifier node) {
@@ -1274,13 +1278,18 @@
                                                   [node]);
         }
       } else if (element.isErroneous()) {
-        element = warnOnErroneousElement(node, element);
+        // Use the erroneous element.
       } else {
         if ((element.kind.category & allowedCategory) == 0) {
           // TODO(ahe): Improve error message. Need UX input.
           error(node, MessageKind.GENERIC, ["is not an expression $element"]);
         }
       }
+      if (!Elements.isUnresolved(element)
+          && element.kind == ElementKind.CLASS) {
+        ClassElement classElement = element;
+        classElement.ensureResolved(compiler);
+      }
       return useElement(node, element);
     }
   }
@@ -1506,12 +1515,12 @@
         }
         return compiler.assertMethod;
       }
+
       return node.selector.accept(this);
     }
 
     var oldCategory = allowedCategory;
-    allowedCategory |=
-      ElementCategory.CLASS | ElementCategory.PREFIX | ElementCategory.SUPER;
+    allowedCategory |= ElementCategory.PREFIX | ElementCategory.SUPER;
     Element resolvedReceiver = visit(node.receiver);
     allowedCategory = oldCategory;
 
@@ -1546,6 +1555,15 @@
     } else if (identical(resolvedReceiver.kind, ElementKind.CLASS)) {
       ClassElement receiverClass = resolvedReceiver;
       receiverClass.ensureResolved(compiler);
+      if (node.isOperator) {
+        // When the resolved receiver is a class, we can have two cases:
+        //  1) a static send: C.foo, or
+        //  2) an operator send, where the receiver is a class literal: 'C + 1'.
+        // The following code that looks up the selector on the resolved
+        // receiver will treat the second as the invocation of a static operator
+        // if the resolved receiver is not null.
+        return null;
+      }
       target = receiverClass.lookupLocalMember(name);
       if (target == null) {
         // TODO(johnniwinther): With the simplified [TreeElements] invariant,
@@ -1564,10 +1582,13 @@
     } else if (identical(resolvedReceiver.kind, ElementKind.PREFIX)) {
       PrefixElement prefix = resolvedReceiver;
       target = prefix.lookupLocalMember(name);
-      if (target == null) {
+      if (Elements.isUnresolved(target)) {
         return warnAndCreateErroneousElement(
             node, name, MessageKind.NO_SUCH_LIBRARY_MEMBER,
             [prefix.name, name]);
+      } else if (target.kind == ElementKind.CLASS) {
+        ClassElement classElement = target;
+        classElement.ensureResolved(compiler);
       }
     }
     return target;
@@ -1707,6 +1728,10 @@
         // with the same arguments.
         Selector call = new Selector.callClosureFrom(selector);
         world.registerDynamicInvocation(call.name, call);
+      } else if (target.impliesType()) {
+        // We call 'call()' on a Type instance returned from the reference to a
+        // class or typedef literal. We do not need to register this call as a
+        // dynamic invocation, because we statically know what the target is.
       } else if (!selector.applies(target, compiler)) {
         warnArgumentMismatch(node, target);
       }
@@ -1853,9 +1878,38 @@
 
   visitReturn(Return node) {
     if (node.isRedirectingFactoryBody) {
-      unimplemented(node, 'redirecting constructors');
+      handleRedirectingFactoryBody(node);
+    } else {
+      visit(node.expression);
     }
-    visit(node.expression);
+  }
+
+  void handleRedirectingFactoryBody(Return node) {
+    Element redirectionTarget = resolveRedirectingFactory(node);
+    var type = mapping.getType(node.expression);
+    if (type is InterfaceType && !type.arguments.isEmpty) {
+      unimplemented(node.expression, 'type arguments on redirecting factory');
+    }
+    useElement(node.expression, redirectionTarget);
+    assert(invariant(node, enclosingElement.isFactoryConstructor()));
+    FunctionElement constructor = enclosingElement;
+    if (constructor.modifiers.isConst() &&
+        !redirectionTarget.modifiers.isConst()) {
+      error(node, MessageKind.CONSTRUCTOR_IS_NOT_CONST);
+    }
+    // TODO(ahe): Check that this doesn't lead to a cycle.  For now,
+    // just make sure that the redirection target isn't itself a
+    // redirecting factory.
+    { // This entire block is temporary code per the above TODO.
+      FunctionElement targetImplementation = redirectionTarget.implementation;
+      FunctionExpression function = targetImplementation.parseNode(compiler);
+      if (function.body != null && function.body.asReturn() != null
+          && function.body.asReturn().isRedirectingFactoryBody) {
+        unimplemented(node.expression, 'redirecing to redirecting factory');
+      }
+    }
+    constructor.defaultImplementation = redirectionTarget;
+    world.registerStaticUse(redirectionTarget);
   }
 
   visitThrow(Throw node) {
@@ -1929,6 +1983,10 @@
     return node.accept(new ConstructorResolver(compiler, this));
   }
 
+  FunctionElement resolveRedirectingFactory(Return node) {
+    return node.accept(new ConstructorResolver(compiler, this));
+  }
+
   DartType resolveTypeRequired(TypeAnnotation node) {
     bool old = typeRequired;
     typeRequired = true;
@@ -2881,8 +2939,7 @@
     } else {
       ResolutionWarning warning  = new ResolutionWarning(kind, arguments);
       compiler.reportWarning(diagnosticNode, warning);
-      return new ErroneousFunctionElement(kind, arguments, targetName,
-                                          enclosing);
+      return new ErroneousElement(kind, arguments, targetName, enclosing);
     }
   }
 
@@ -2923,13 +2980,27 @@
     inConstContext = node.isConst();
     Node selector = node.send.selector;
     Element e = visit(selector);
-    if (!Elements.isUnresolved(e) && identical(e.kind, ElementKind.CLASS)) {
+    return finishConstructorReference(e, node.send.selector, node);
+  }
+
+  /// Finishes resolution of a constructor reference and records the
+  /// type of the constructed instance on [expression].
+  FunctionElement finishConstructorReference(Element e,
+                                             Node diagnosticNode,
+                                             Node expression) {
+    // Find the unnamed constructor if the reference resolved to a
+    // class.
+    if (!Elements.isUnresolved(e) && e.isClass()) {
       ClassElement cls = e;
       cls.ensureResolved(compiler);
       if (cls.isInterface() && (cls.defaultClass == null)) {
-        error(selector, MessageKind.CANNOT_INSTANTIATE_INTERFACE, [cls.name]);
+        // TODO(ahe): Remove this check and error message when we
+        // don't have interfaces anymore.
+        error(diagnosticNode,
+              MessageKind.CANNOT_INSTANTIATE_INTERFACE, [cls.name]);
       }
-      e = lookupConstructor(cls, selector, const SourceString(''));
+      // The unnamed constructor may not exist, so [e] may become unresolved.
+      e = lookupConstructor(cls, diagnosticNode, const SourceString(''));
     }
     if (type == null) {
       if (Elements.isUnresolved(e)) {
@@ -2938,7 +3009,7 @@
         type = e.getEnclosingClass().computeType(compiler).asRaw();
       }
     }
-    resolver.mapping.setType(node, type);
+    resolver.mapping.setType(expression, type);
     return e;
   }
 
@@ -2986,6 +3057,8 @@
     if (e == null) {
       return failOrReturnErroneousElement(resolver.enclosingElement, node, name,
                                           MessageKind.CANNOT_RESOLVE, [name]);
+    } else if (e.isErroneous()) {
+      return e;
     } else if (identical(e.kind, ElementKind.TYPEDEF)) {
       error(node, MessageKind.CANNOT_INSTANTIATE_TYPEDEF, [name]);
     } else if (identical(e.kind, ElementKind.TYPE_VARIABLE)) {
@@ -2996,4 +3069,11 @@
     }
     return e;
   }
+
+  /// Assumed to be called by [resolveRedirectingFactory].
+  Element visitReturn(Return node) {
+    Node expression = node.expression;
+    return finishConstructorReference(visit(expression),
+                                      expression, expression);
+  }
 }
diff --git a/lib/compiler/implementation/resolution/resolution.dart b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
similarity index 100%
rename from lib/compiler/implementation/resolution/resolution.dart
rename to sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
diff --git a/lib/compiler/implementation/resolution/scope.dart b/sdk/lib/_internal/compiler/implementation/resolution/scope.dart
similarity index 96%
rename from lib/compiler/implementation/resolution/scope.dart
rename to sdk/lib/_internal/compiler/implementation/resolution/scope.dart
index 519cb66..af5b0e7 100644
--- a/lib/compiler/implementation/resolution/scope.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/scope.dart
@@ -9,12 +9,12 @@
    * Adds [element] to this scope. This operation is only allowed on mutable
    * scopes such as [MethodScope] and [BlockScope].
    */
-  abstract Element add(Element element);
+  Element add(Element element);
 
   /**
    * Looks up the [Element] for [name] in this scope.
    */
-  abstract Element lookup(SourceString name);
+  Element lookup(SourceString name);
 
   static Scope buildEnclosingScope(Element element) {
     return element.enclosingElement != null
@@ -33,7 +33,7 @@
     return parent.lookup(name);
   }
 
-  abstract Element localLookup(SourceString name);
+  Element localLookup(SourceString name);
 
   static Scope buildEnclosingScope(Element element) {
     return element.enclosingElement != null
diff --git a/lib/compiler/implementation/resolution/secret_tree_element.dart b/sdk/lib/_internal/compiler/implementation/resolution/secret_tree_element.dart
similarity index 100%
rename from lib/compiler/implementation/resolution/secret_tree_element.dart
rename to sdk/lib/_internal/compiler/implementation/resolution/secret_tree_element.dart
diff --git a/lib/compiler/implementation/resolved_visitor.dart b/sdk/lib/_internal/compiler/implementation/resolved_visitor.dart
similarity index 68%
rename from lib/compiler/implementation/resolved_visitor.dart
rename to sdk/lib/_internal/compiler/implementation/resolved_visitor.dart
index 8120ac4..e53a3ff 100644
--- a/lib/compiler/implementation/resolved_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolved_visitor.dart
@@ -15,7 +15,13 @@
     } else if (node.isOperator) {
       return visitOperatorSend(node);
     } else if (node.isPropertyAccess) {
-      return visitGetterSend(node);
+      Element element = elements[node];
+      if (!Elements.isUnresolved(element) && element.impliesType()) {
+        // A reference to a class literal, typedef or type variable.
+        return visitTypeReferenceSend(node);
+      } else {
+        return visitGetterSend(node);
+      }
     } else if (Elements.isClosureSend(node, elements[node])) {
       return visitClosureSend(node);
     } else {
@@ -28,8 +34,9 @@
         } else {
           return visitStaticSend(node);
         }
-      } else if (element.kind == ElementKind.CLASS) {
-        internalError("Cannot generate code for send", node: node);
+      } else if (element.impliesType()) {
+        // A reference to a class literal, typedef or type variable.
+        return visitTypeReferenceSend(node);
       } else if (element.isInstanceMember()) {
         // Example: f() with 'f' bound to instance method.
         return visitDynamicSend(node);
@@ -46,15 +53,16 @@
     }
   }
 
-  abstract R visitSuperSend(Send node);
-  abstract R visitOperatorSend(Send node);
-  abstract R visitGetterSend(Send node);
-  abstract R visitClosureSend(Send node);
-  abstract R visitDynamicSend(Send node);
-  abstract R visitForeignSend(Send node);
-  abstract R visitStaticSend(Send node);
+  R visitSuperSend(Send node);
+  R visitOperatorSend(Send node);
+  R visitGetterSend(Send node);
+  R visitClosureSend(Send node);
+  R visitDynamicSend(Send node);
+  R visitForeignSend(Send node);
+  R visitStaticSend(Send node);
+  abstract R visitTypeReferenceSend(Send node);
 
-  abstract void internalError(String reason, {Node node});
+  void internalError(String reason, {Node node});
 
   R visitNode(Node node) {
     internalError("Unhandled node", node: node);
diff --git a/lib/compiler/implementation/runtime_types.dart b/sdk/lib/_internal/compiler/implementation/runtime_types.dart
similarity index 91%
rename from lib/compiler/implementation/runtime_types.dart
rename to sdk/lib/_internal/compiler/implementation/runtime_types.dart
index 9b0820f..c583cb1 100644
--- a/lib/compiler/implementation/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/runtime_types.dart
@@ -11,6 +11,10 @@
 import 'util/util.dart';
 
 class RuntimeTypeInformation {
+
+  static final SourceString CACHE_HELPER_NAME =
+      const SourceString('getOrCreateCachedRuntimeType');
+
   /**
    * Names used for elements in runtime type information. This map is kept to
    * detect elements with the same name and use a different name instead.
@@ -64,17 +68,17 @@
   /**
    * Generate a string representation template for this element, using '#' to
    * denote the place for the type argument input. If there are more type
-   * variables than [numberOfInputs], 'Dynamic' is used as the value for these
+   * variables than [numberOfInputs], 'dynamic' is used as the value for these
    * arguments.
    */
   String generateRuntimeTypeString(ClassElement element, int numberOfInputs) {
     String elementName = getName(element);
-    if (element.typeVariables.isEmpty) return "'$elementName'";
-    String stringify(_, bool hasValue) => hasValue ? "' + # + '" : "Dynamic";
+    if (element.typeVariables.isEmpty) return "$elementName";
+    String stringify(_, bool hasValue) => hasValue ? "' + # + '" : "dynamic";
     String arguments = stringifyTypeVariables(element.typeVariables,
                                               numberOfInputs,
                                               stringify);
-    return "'$elementName<$arguments>'";
+    return "$elementName<$arguments>";
   }
 
   /**
diff --git a/lib/compiler/implementation/scanner/array_based_scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
similarity index 99%
rename from lib/compiler/implementation/scanner/array_based_scanner.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
index f0cb22f..d1e0099 100644
--- a/lib/compiler/implementation/scanner/array_based_scanner.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart
@@ -181,5 +181,5 @@
   }
 
   // TODO(ahe): make class abstract instead of adding an abstract method.
-  abstract peek();
+  peek();
 }
diff --git a/lib/compiler/implementation/scanner/byte_array_scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/byte_array_scanner.dart
similarity index 100%
rename from lib/compiler/implementation/scanner/byte_array_scanner.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/byte_array_scanner.dart
diff --git a/lib/compiler/implementation/scanner/byte_strings.dart b/sdk/lib/_internal/compiler/implementation/scanner/byte_strings.dart
similarity index 98%
rename from lib/compiler/implementation/scanner/byte_strings.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/byte_strings.dart
index 6a89fb2..f6c220f 100644
--- a/lib/compiler/implementation/scanner/byte_strings.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/byte_strings.dart
@@ -13,7 +13,7 @@
 
   ByteString(List<int> this.bytes, int this.offset, int this.length);
 
-  abstract String get charset;
+  String get charset;
 
   String slowToString() => new String.fromCharCodes(
       new Utf8Decoder(bytes, offset, length).decodeRest());
diff --git a/lib/compiler/implementation/scanner/class_element_parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
similarity index 100%
rename from lib/compiler/implementation/scanner/class_element_parser.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
diff --git a/lib/compiler/implementation/scanner/keyword.dart b/sdk/lib/_internal/compiler/implementation/scanner/keyword.dart
similarity index 98%
rename from lib/compiler/implementation/scanner/keyword.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/keyword.dart
index 335951c..4a23d73 100644
--- a/lib/compiler/implementation/scanner/keyword.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/keyword.dart
@@ -125,9 +125,9 @@
  * Abstract state in a state machine for scanning keywords.
  */
 abstract class KeywordState {
-  abstract bool isLeaf();
-  abstract KeywordState next(int c);
-  abstract Keyword get keyword;
+  bool isLeaf();
+  KeywordState next(int c);
+  Keyword get keyword;
 
   static KeywordState _KEYWORD_STATE;
   static KeywordState get KEYWORD_STATE {
diff --git a/lib/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
similarity index 100%
rename from lib/compiler/implementation/scanner/listener.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/listener.dart
diff --git a/lib/compiler/implementation/scanner/parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
similarity index 100%
rename from lib/compiler/implementation/scanner/parser.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/parser.dart
diff --git a/lib/compiler/implementation/scanner/parser_task.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser_task.dart
similarity index 100%
rename from lib/compiler/implementation/scanner/parser_task.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/parser_task.dart
diff --git a/lib/compiler/implementation/scanner/partial_parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
similarity index 100%
rename from lib/compiler/implementation/scanner/partial_parser.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
diff --git a/lib/compiler/implementation/scanner/scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
similarity index 94%
rename from lib/compiler/implementation/scanner/scanner.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
index 647880b..123b650 100644
--- a/lib/compiler/implementation/scanner/scanner.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
@@ -12,8 +12,8 @@
  * Common base class for a Dart scanner.
  */
 abstract class AbstractScanner<T extends SourceString> implements Scanner {
-  abstract int advance();
-  abstract int nextByte();
+  int advance();
+  int nextByte();
 
   /**
    * Returns the current character or byte depending on the underlying input
@@ -21,7 +21,7 @@
    * characters (Unicode codepoints represented as int) whereas
    * [ByteArrayScanner] operates on byte arrays and thus returns bytes.
    */
-  abstract int peek();
+  int peek();
 
   /**
    * Appends a fixed token based on whether the current char is [choice] or not.
@@ -29,30 +29,30 @@
    * is determined by [yes] is appended, otherwise a fixed token whose kind
    * and content is determined by [no] is appended.
    */
-  abstract int select(int choice, PrecedenceInfo yes, PrecedenceInfo no);
+  int select(int choice, PrecedenceInfo yes, PrecedenceInfo no);
 
   /**
    * Appends a fixed token whose kind and content is determined by [info].
    */
-  abstract void appendPrecedenceToken(PrecedenceInfo info);
+  void appendPrecedenceToken(PrecedenceInfo info);
 
   /**
    * Appends a token whose kind is determined by [info] and content is [value].
    */
-  abstract void appendStringToken(PrecedenceInfo info, String value);
+  void appendStringToken(PrecedenceInfo info, String value);
 
   /**
    * Appends a token whose kind is determined by [info] and content is defined
    * by the SourceString [value].
    */
-  abstract void appendByteStringToken(PrecedenceInfo info, T value);
+  void appendByteStringToken(PrecedenceInfo info, T value);
 
   /**
    * Appends a keyword token whose kind is determined by [keyword].
    */
-  abstract void appendKeywordToken(Keyword keyword);
-  abstract void appendWhiteSpace(int next);
-  abstract void appendEofToken();
+  void appendKeywordToken(Keyword keyword);
+  void appendWhiteSpace(int next);
+  void appendEofToken();
 
   /**
    * Creates an ASCII SourceString whose content begins at the source byte
@@ -61,20 +61,20 @@
    * [:asciiString(0,-1):] creates an ASCII SourceString whose content is found
    * at the [0,9[ byte interval of the source text.
    */
-  abstract T asciiString(int start, int offset);
-  abstract T utf8String(int start, int offset);
-  abstract Token firstToken();
-  abstract Token previousToken();
-  abstract void beginToken();
-  abstract void addToCharOffset(int offset);
-  abstract int get charOffset;
-  abstract int get byteOffset;
-  abstract void appendBeginGroup(PrecedenceInfo info, String value);
-  abstract int appendEndGroup(PrecedenceInfo info, String value, int openKind);
-  abstract void appendGt(PrecedenceInfo info, String value);
-  abstract void appendGtGt(PrecedenceInfo info, String value);
-  abstract void appendGtGtGt(PrecedenceInfo info, String value);
-  abstract void appendComment();
+  T asciiString(int start, int offset);
+  T utf8String(int start, int offset);
+  Token firstToken();
+  Token previousToken();
+  void beginToken();
+  void addToCharOffset(int offset);
+  int get charOffset;
+  int get byteOffset;
+  void appendBeginGroup(PrecedenceInfo info, String value);
+  int appendEndGroup(PrecedenceInfo info, String value, int openKind);
+  void appendGt(PrecedenceInfo info, String value);
+  void appendGtGt(PrecedenceInfo info, String value);
+  void appendGtGtGt(PrecedenceInfo info, String value);
+  void appendComment();
 
   /**
    * We call this method to discard '<' from the "grouping" stack
@@ -88,7 +88,7 @@
    * something which cannot possibly be part of a type
    * parameter/argument list.
    */
-  abstract void discardOpenLt();
+  void discardOpenLt();
 
   // TODO(ahe): Move this class to implementation.
 
diff --git a/lib/compiler/implementation/scanner/scanner_implementation.dart b/sdk/lib/_internal/compiler/implementation/scanner/scanner_implementation.dart
similarity index 100%
rename from lib/compiler/implementation/scanner/scanner_implementation.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/scanner_implementation.dart
diff --git a/lib/compiler/implementation/scanner/scanner_task.dart b/sdk/lib/_internal/compiler/implementation/scanner/scanner_task.dart
similarity index 100%
rename from lib/compiler/implementation/scanner/scanner_task.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/scanner_task.dart
diff --git a/lib/compiler/implementation/scanner/scannerlib.dart b/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
similarity index 100%
rename from lib/compiler/implementation/scanner/scannerlib.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
diff --git a/lib/compiler/implementation/scanner/string_scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart
similarity index 100%
rename from lib/compiler/implementation/scanner/string_scanner.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart
diff --git a/lib/compiler/implementation/scanner/token.dart b/sdk/lib/_internal/compiler/implementation/scanner/token.dart
similarity index 100%
rename from lib/compiler/implementation/scanner/token.dart
rename to sdk/lib/_internal/compiler/implementation/scanner/token.dart
diff --git a/lib/compiler/implementation/script.dart b/sdk/lib/_internal/compiler/implementation/script.dart
similarity index 100%
rename from lib/compiler/implementation/script.dart
rename to sdk/lib/_internal/compiler/implementation/script.dart
diff --git a/lib/compiler/implementation/source_file.dart b/sdk/lib/_internal/compiler/implementation/source_file.dart
similarity index 96%
rename from lib/compiler/implementation/source_file.dart
rename to sdk/lib/_internal/compiler/implementation/source_file.dart
index d517e76..14a4175 100644
--- a/lib/compiler/implementation/source_file.dart
+++ b/sdk/lib/_internal/compiler/implementation/source_file.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('source_file');
+library source_file;
 
-#import('dart:math');
+import 'dart:math';
 
-#import('colors.dart', prefix: 'colors');
+import 'colors.dart' as colors;
 
 /**
  * Represents a file of source code.
diff --git a/lib/compiler/implementation/source_map_builder.dart b/sdk/lib/_internal/compiler/implementation/source_map_builder.dart
similarity index 97%
rename from lib/compiler/implementation/source_map_builder.dart
rename to sdk/lib/_internal/compiler/implementation/source_map_builder.dart
index a29b0fe..0670ee2 100644
--- a/lib/compiler/implementation/source_map_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/source_map_builder.dart
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('source_map_builder');
+library source_map_builder;
 
-#import('dart:json');
+import 'dart:json';
 
-#import('scanner/scannerlib.dart');
-#import('source_file.dart');
+import 'scanner/scannerlib.dart';
+import 'source_file.dart';
 
 class SourceMapBuilder {
   static const int VLQ_BASE_SHIFT = 5;
diff --git a/lib/compiler/implementation/ssa/bailout.dart b/sdk/lib/_internal/compiler/implementation/ssa/bailout.dart
similarity index 100%
rename from lib/compiler/implementation/ssa/bailout.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/bailout.dart
diff --git a/lib/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
similarity index 93%
rename from lib/compiler/implementation/ssa/builder.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 50b8006..cab86dd 100644
--- a/lib/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -332,8 +332,7 @@
       if (element != null && element.isGenerativeConstructorBody()) {
         // The box is passed as a parameter to a generative
         // constructor body.
-        box = new HParameterValue(scopeData.boxElement);
-        builder.add(box);
+        box = builder.addParameter(scopeData.boxElement);
       } else {
         box = createBox();
       }
@@ -394,8 +393,7 @@
       FunctionElement functionElement = element;
       FunctionSignature params = functionElement.computeSignature(compiler);
       params.orderedForEachParameter((Element parameterElement) {
-        HInstruction parameter = new HParameterValue(parameterElement);
-        builder.add(parameter);
+        HInstruction parameter = builder.addParameter(parameterElement);
         builder.parameters[parameterElement] = parameter;
         directLocals[parameterElement] = parameter;
         parameter.guaranteedType =
@@ -665,6 +663,9 @@
   }
 
   void endLoop(HBasicBlock loopEntry) {
+    // If the loop has an aborting body, we don't update the loop
+    // phis.
+    if (loopEntry.predecessors.length == 1) return;
     loopEntry.forEachPhi((HPhi phi) {
       Element element = phi.sourceElement;
       HInstruction postLoopDefinition = directLocals[element];
@@ -767,6 +768,8 @@
   void forEachBreak(void action(HBreak instruction, LocalsHandler locals));
   void forEachContinue(void action(HContinue instruction,
                                    LocalsHandler locals));
+  bool hasAnyContinue();
+  bool hasAnyBreak();
   void close();
   final TargetElement target;
   List<LabelElement> labels();
@@ -791,6 +794,8 @@
   void forEachBreak(Function ignored) { }
   void forEachContinue(Function ignored) { }
   void close() { }
+  bool hasAnyContinue() => false;
+  bool hasAnyBreak() => false;
 
   List<LabelElement> labels() => const <LabelElement>[];
   TargetElement get target => null;
@@ -848,6 +853,20 @@
     }
   }
 
+  bool hasAnyContinue() {
+    for (JumpHandlerEntry entry in jumps) {
+      if (entry.isContinue()) return true;
+    }
+    return false;
+  }
+
+  bool hasAnyBreak() {
+    for (JumpHandlerEntry entry in jumps) {
+      if (entry.isBreak()) return true;
+    }
+    return false;
+  }
+
   void close() {
     // The mapping from TargetElement to JumpHandler is no longer needed.
     builder.jumpTargets.remove(target);
@@ -875,6 +894,7 @@
   HInstruction rethrowableException;
   Map<Element, HInstruction> parameters;
   final RuntimeTypeInformation rti;
+  HParameterValue lastAddedParameter;
 
   Map<TargetElement, JumpHandler> jumpTargets;
 
@@ -924,7 +944,9 @@
   static const MAX_INLINING_DEPTH = 3;
   static const MAX_INLINING_SOURCE_SIZE = 128;
   List<InliningState> inliningStack;
-  Element returnElement = null;
+  Element returnElement;
+  DartType returnType;
+  bool inTryStatement = false;
 
   void disableMethodInterception() {
     assert(methodInterceptionEnabled);
@@ -959,7 +981,7 @@
     assert(!link.isEmpty && link.tail.isEmpty);
     visit(link.head);
     HInstruction value = pop();
-    value = potentiallyCheckType(value, variable);
+    value = potentiallyCheckType(value, variable.computeType(compiler));
     close(new HReturn(value)).addSuccessor(graph.exit);
     return closeFunction();
   }
@@ -1016,6 +1038,17 @@
     return bodyElement;
   }
 
+  HParameterValue addParameter(Element element) {
+    HParameterValue result = new HParameterValue(element);
+    if (lastAddedParameter == null) {
+      graph.entry.addBefore(graph.entry.first, result);
+    } else {
+      graph.entry.addAfter(lastAddedParameter, result);
+    }
+    lastAddedParameter = result;
+    return result;
+  }
+
   /**
    * Documentation wanted -- johnniwinther
    *
@@ -1036,7 +1069,7 @@
     assert(succeeded);
 
     InliningState state =
-        new InliningState(function, returnElement, elements, stack);
+        new InliningState(function, returnElement, returnType, elements, stack);
     inliningStack.add(state);
     sourceElementStack.add(function);
     stack = <HInstruction>[];
@@ -1048,11 +1081,12 @@
     elements = compiler.enqueuer.resolution.getCachedElements(function);
     assert(elements != null);
     FunctionSignature signature = function.computeSignature(compiler);
+    returnType = signature.returnType;
     int index = 0;
     signature.orderedForEachParameter((Element parameter) {
       HInstruction argument = compiledArguments[index++];
       localsHandler.updateLocal(parameter, argument);
-      potentiallyCheckType(argument, parameter);
+      potentiallyCheckType(argument, parameter.computeType(compiler));
     });
     return state;
   }
@@ -1065,6 +1099,7 @@
     elements = state.oldElements;
     stack.add(localsHandler.readLocal(returnElement));
     returnElement = state.oldReturnElement;
+    returnType = state.oldReturnType;
     assert(stack.length == 1);
     state.oldStack.add(stack[0]);
     stack = state.oldStack;
@@ -1346,8 +1381,8 @@
     List<HInstruction> constructorArguments = <HInstruction>[];
     classElement.forEachInstanceField(
         (ClassElement enclosingClass, Element member) {
-          constructorArguments.add(
-              potentiallyCheckType(fieldValues[member], member));
+          constructorArguments.add(potentiallyCheckType(
+              fieldValues[member], member.computeType(compiler)));
         },
         includeBackendMembers: true,
         includeSuperMembers: true);
@@ -1432,8 +1467,7 @@
     if (currentElement.isGenerativeConstructorBody()) {
       // A generative constructor body receives extra parameters that
       // indicate if a parameter was passed to the factory.
-      check = new HParameterValue(checkResultElement);
-      add(check);
+      check = addParameter(checkResultElement);
     } else {
       // This is the code we emit for a parameter that is being checked
       // on whether it was given at value at the call site:
@@ -1496,8 +1530,8 @@
 
     if (element is FunctionElement) {
       FunctionElement functionElement = element;
-      FunctionSignature params = functionElement.computeSignature(compiler);
-      params.orderedForEachParameter((Element parameterElement) {
+      FunctionSignature signature = functionElement.computeSignature(compiler);
+      signature.orderedForEachParameter((Element parameterElement) {
         if (elements.isParameterChecked(parameterElement)) {
           addParameterCheckInstruction(parameterElement);
         }
@@ -1507,11 +1541,14 @@
       // because that is where the type guards will also be inserted.
       // This way we ensure that a type guard will dominate the type
       // check.
-      params.orderedForEachParameter((Element element) {
+      signature.orderedForEachParameter((Element element) {
         HInstruction newParameter = potentiallyCheckType(
-            localsHandler.directLocals[element], element);
+            localsHandler.directLocals[element],
+            element.computeType(compiler));
         localsHandler.directLocals[element] = newParameter;
       });
+
+      returnType = signature.returnType;
     } else {
       // Otherwise it is a lazy initializer which does not have parameters.
       assert(element is VariableElement);
@@ -1522,18 +1559,17 @@
     var enclosing = element.enclosingElement;
     if (element.isConstructor() && compiler.world.needsRti(enclosing)) {
       enclosing.typeVariables.forEach((TypeVariableType typeVariable) {
-        HParameterValue param = new HParameterValue(typeVariable.element);
-        add(param);
+        HParameterValue param = addParameter(typeVariable.element);
         localsHandler.directLocals[typeVariable.element] = param;
       });
     }
   }
 
   HInstruction potentiallyCheckType(
-      HInstruction original, Element sourceElement,
+      HInstruction original, DartType type,
       { int kind: HTypeConversion.CHECKED_MODE_CHECK }) {
     if (!compiler.enableTypeAssertions) return original;
-    HInstruction other = original.convertType(compiler, sourceElement, kind);
+    HInstruction other = original.convertType(compiler, type, kind);
     if (other != original) add(other);
     return other;
   }
@@ -1615,7 +1651,7 @@
     if (compiler.enableTypeAssertions) {
       return potentiallyCheckType(
           value,
-          compiler.boolClass,
+          compiler.boolClass.computeType(compiler),
           kind: HTypeConversion.BOOLEAN_CONVERSION_CHECK);
     }
     HInstruction result = new HBoolify(value);
@@ -1709,14 +1745,18 @@
                HBasicBlock branchBlock,
                JumpHandler jumpHandler,
                LocalsHandler savedLocals) {
+    if (branchBlock == null && !jumpHandler.hasAnyBreak()) return;
+
     HBasicBlock loopExitBlock = addNewBlock();
-    assert(branchBlock.successors.length == 1);
+    assert(branchBlock == null || branchBlock.successors.length == 1);
     List<LocalsHandler> breakLocals = <LocalsHandler>[];
     jumpHandler.forEachBreak((HBreak breakInstruction, LocalsHandler locals) {
       breakInstruction.block.addSuccessor(loopExitBlock);
       breakLocals.add(locals);
     });
-    branchBlock.addSuccessor(loopExitBlock);
+    if (branchBlock != null) {
+      branchBlock.addSuccessor(loopExitBlock);
+    }
     open(loopExitBlock);
     localsHandler.endLoop(loopEntry);
     if (!breakLocals.isEmpty) {
@@ -1787,57 +1827,69 @@
     open(beginBodyBlock);
 
     localsHandler.enterLoopBody(loop);
-    hackAroundPossiblyAbortingBody(loop, body);
+    body();
 
-    SubGraph bodyGraph = new SubGraph(beginBodyBlock, current);
-    HBasicBlock bodyBlock = close(new HGoto());
+    SubGraph bodyGraph = new SubGraph(beginBodyBlock, lastOpenedBlock);
+    HBasicBlock bodyBlock = current;
+    if (current != null) close(new HGoto());
 
-    // Update.
-    // We create an update block, even when we are in a while loop. There the
-    // update block is the jump-target for continue statements. We could avoid
-    // the creation if there is no continue, but for now we always create it.
-    HBasicBlock updateBlock = addNewBlock();
+    SubExpression updateGraph;
 
-    List<LocalsHandler> continueLocals = <LocalsHandler>[];
-    jumpHandler.forEachContinue((HContinue instruction, LocalsHandler locals) {
-      instruction.block.addSuccessor(updateBlock);
-      continueLocals.add(locals);
-    });
-    bodyBlock.addSuccessor(updateBlock);
-    continueLocals.add(localsHandler);
+    // Check that the loop has at least one back-edge.
+    if (jumpHandler.hasAnyContinue() || bodyBlock != null) {
+      // Update.
+      // We create an update block, even when we are in a while loop. There the
+      // update block is the jump-target for continue statements. We could avoid
+      // the creation if there is no continue, but for now we always create it.
+      HBasicBlock updateBlock = addNewBlock();
 
-    open(updateBlock);
+      List<LocalsHandler> continueLocals = <LocalsHandler>[];
+      jumpHandler.forEachContinue((HContinue instruction,
+                                   LocalsHandler locals) {
+        instruction.block.addSuccessor(updateBlock);
+        continueLocals.add(locals);
+      });
 
-    localsHandler = localsHandler.mergeMultiple(continueLocals, updateBlock);
 
-    HLabeledBlockInformation labelInfo;
-    List<LabelElement> labels = jumpHandler.labels();
-    TargetElement target = elements[loop];
-    if (!labels.isEmpty) {
-      beginBodyBlock.setBlockFlow(
-          new HLabeledBlockInformation(
-              new HSubGraphBlockInformation(bodyGraph),
-              jumpHandler.labels(),
-              isContinue: true),
-          updateBlock);
-    } else if (target != null && target.isContinueTarget) {
-      beginBodyBlock.setBlockFlow(
-          new HLabeledBlockInformation.implicit(
-              new HSubGraphBlockInformation(bodyGraph),
-              target,
-              isContinue: true),
-          updateBlock);
+      if (bodyBlock != null) {
+        continueLocals.add(localsHandler);
+        bodyBlock.addSuccessor(updateBlock);
+      }
+
+      open(updateBlock);
+      localsHandler =
+          continueLocals[0].mergeMultiple(continueLocals, updateBlock);
+
+      HLabeledBlockInformation labelInfo;
+      List<LabelElement> labels = jumpHandler.labels();
+      TargetElement target = elements[loop];
+      if (!labels.isEmpty) {
+        beginBodyBlock.setBlockFlow(
+            new HLabeledBlockInformation(
+                new HSubGraphBlockInformation(bodyGraph),
+                jumpHandler.labels(),
+                isContinue: true),
+            updateBlock);
+      } else if (target != null && target.isContinueTarget) {
+        beginBodyBlock.setBlockFlow(
+            new HLabeledBlockInformation.implicit(
+                new HSubGraphBlockInformation(bodyGraph),
+                target,
+                isContinue: true),
+            updateBlock);
+      }
+
+      localsHandler.enterLoopUpdates(loop);
+
+      update();
+
+      HBasicBlock updateEndBlock = close(new HGoto());
+      // The back-edge completing the cycle.
+      updateEndBlock.addSuccessor(conditionBlock);
+      updateGraph = new SubExpression(updateBlock, updateEndBlock);
     }
 
-    localsHandler.enterLoopUpdates(loop);
-
-    update();
-
-    HBasicBlock updateEndBlock = close(new HGoto());
-    // The back-edge completing the cycle.
-    updateEndBlock.addSuccessor(conditionBlock);
     conditionBlock.postProcessLoopHeader();
-    SubExpression updateGraph = new SubExpression(updateBlock, updateEndBlock);
 
     endLoop(conditionBlock, conditionExitBlock, jumpHandler, savedLocals);
     HLoopBlockInformation info =
@@ -1922,51 +1974,71 @@
       bodyEntryBlock = openNewBlock();
     }
     localsHandler.enterLoopBody(node);
-    hackAroundPossiblyAbortingBody(node, () { visit(node.body); });
+    visit(node.body);
 
     // If there are no continues we could avoid the creation of the condition
     // block. This could also lead to a block having multiple entries and exits.
-    HBasicBlock bodyExitBlock = close(new HGoto());
-    HBasicBlock conditionBlock = addNewBlock();
-
-    List<LocalsHandler> continueLocals = <LocalsHandler>[];
-    jumpHandler.forEachContinue((HContinue instruction, LocalsHandler locals) {
-      instruction.block.addSuccessor(conditionBlock);
-      continueLocals.add(locals);
-    });
-    bodyExitBlock.addSuccessor(conditionBlock);
-    if (!continueLocals.isEmpty) {
-      continueLocals.add(localsHandler);
-      localsHandler = savedLocals.mergeMultiple(continueLocals, conditionBlock);
-      SubGraph bodyGraph = new SubGraph(bodyEntryBlock, bodyExitBlock);
-      List<LabelElement> labels = jumpHandler.labels();
-      HSubGraphBlockInformation bodyInfo =
-          new HSubGraphBlockInformation(bodyGraph);
-      HLabeledBlockInformation info;
-      if (!labels.isEmpty) {
-        info = new HLabeledBlockInformation(bodyInfo, labels, isContinue: true);
-      } else {
-        info = new HLabeledBlockInformation.implicit(bodyInfo, target,
-                                                     isContinue: true);
-      }
-      bodyEntryBlock.setBlockFlow(info, conditionBlock);
+    HBasicBlock bodyExitBlock;
+    bool isAbortingBody = false;
+    if (current != null) {
+      bodyExitBlock = close(new HGoto());
+    } else {
+      isAbortingBody = true;
+      bodyExitBlock = lastOpenedBlock;
     }
-    open(conditionBlock);
 
-    visit(node.condition);
-    assert(!isAborted());
-    HInstruction conditionInstruction = popBoolified();
-    HBasicBlock conditionEndBlock =
-        close(new HLoopBranch(conditionInstruction, HLoopBranch.DO_WHILE_LOOP));
+    SubExpression conditionExpression;
+    HBasicBlock conditionEndBlock;
+    if (!isAbortingBody || hasContinues) {
+      HBasicBlock conditionBlock = addNewBlock();
 
-    conditionEndBlock.addSuccessor(loopEntryBlock);  // The back-edge.
+      List<LocalsHandler> continueLocals = <LocalsHandler>[];
+      jumpHandler.forEachContinue((HContinue instruction,
+                                   LocalsHandler locals) {
+        instruction.block.addSuccessor(conditionBlock);
+        continueLocals.add(locals);
+      });
+
+      if (!isAbortingBody) {
+        bodyExitBlock.addSuccessor(conditionBlock);
+      }
+
+      if (!continueLocals.isEmpty) {
+        if (!isAbortingBody) continueLocals.add(localsHandler);
+        localsHandler =
+            savedLocals.mergeMultiple(continueLocals, conditionBlock);
+        SubGraph bodyGraph = new SubGraph(bodyEntryBlock, bodyExitBlock);
+        List<LabelElement> labels = jumpHandler.labels();
+        HSubGraphBlockInformation bodyInfo =
+            new HSubGraphBlockInformation(bodyGraph);
+        HLabeledBlockInformation info;
+        if (!labels.isEmpty) {
+          info = new HLabeledBlockInformation(bodyInfo, labels,
+                                              isContinue: true);
+        } else {
+          info = new HLabeledBlockInformation.implicit(bodyInfo, target,
+                                                       isContinue: true);
+        }
+        bodyEntryBlock.setBlockFlow(info, conditionBlock);
+      }
+      open(conditionBlock);
+
+      visit(node.condition);
+      assert(!isAborted());
+      HInstruction conditionInstruction = popBoolified();
+      conditionEndBlock = close(
+          new HLoopBranch(conditionInstruction, HLoopBranch.DO_WHILE_LOOP));
+
+      conditionEndBlock.addSuccessor(loopEntryBlock);  // The back-edge.
+      conditionExpression =
+          new SubExpression(conditionBlock, conditionEndBlock);
+    }
+
     loopEntryBlock.postProcessLoopHeader();
 
     endLoop(loopEntryBlock, conditionEndBlock, jumpHandler, localsHandler);
     jumpHandler.close();
 
-    SubExpression conditionExpression =
-        new SubExpression(conditionBlock, conditionEndBlock);
     SubGraph bodyGraph = new SubGraph(bodyEntryBlock, bodyExitBlock);
 
     HLoopBlockInformation loopBlockInfo =
@@ -2192,7 +2264,7 @@
   }
 
   String getTargetName(ErroneousElement error, [String prefix]) {
-    String result = error.targetName.slowToString();
+    String result = error.name.slowToString();
     if (?prefix) {
       result = '$prefix $result';
     }
@@ -2298,7 +2370,7 @@
         add(target);
         addWithPosition(new HInvokeStatic(<HInstruction>[target, value]), send);
       } else {
-        value = potentiallyCheckType(value, element);
+        value = potentiallyCheckType(value, element.computeType(compiler));
         addWithPosition(new HStaticStore(element, value), send);
       }
       stack.add(value);
@@ -2316,7 +2388,8 @@
       if (value.sourceElement == null) {
         value.sourceElement = element;
       }
-      HInstruction checked = potentiallyCheckType(value, element);
+      HInstruction checked = potentiallyCheckType(
+          value, element.computeType(compiler));
       if (!identical(checked, value)) {
         pop();
         stack.add(checked);
@@ -2434,7 +2507,7 @@
       TypeAnnotation typeAnnotation = argument.asTypeAnnotation();
       DartType type = elements.getType(typeAnnotation);
       HInstruction converted = expression.convertType(
-          compiler, type.element, HTypeConversion.CAST_TYPE_CHECK);
+          compiler, type, HTypeConversion.CAST_TYPE_CHECK);
       if (converted != expression) add(converted);
       stack.add(converted);
     } else {
@@ -2573,6 +2646,7 @@
     }
 
     addDynamicSendArgumentsToList(node, inputs);
+
     // The first entry in the inputs list is the receiver.
     pushWithPosition(new HInvokeDynamicMethod(selector, inputs), node);
 
@@ -2950,7 +3024,7 @@
       HInstruction runtimeType = createForeign(runtimeTypeString, rtiInputs);
       add(runtimeType);
       runtimeCodeInputs.add(runtimeType);
-      runtimeCode.add('runtimeType: #');
+      runtimeCode.add("runtimeType: '#'");
     }
     if (needsRti) {
       if (runtimeTypeIsUsed) runtimeCode.add(', ');
@@ -2999,7 +3073,7 @@
       compiler.internalError("Unresolved element: $constructor", node: node);
     }
     FunctionElement functionElement = constructor;
-    constructor = functionElement.defaultImplementation;
+    constructor = functionElement.redirectionTarget;
     // TODO(5346): Try to avoid the need for calling [declaration] before
     // creating an [HStatic].
     HInstruction target = new HStatic(constructor.declaration);
@@ -3022,9 +3096,23 @@
       return;
     }
     if (compiler.world.needsRti(constructor.enclosingElement)) {
-      type.arguments.forEach((DartType argument) {
-        inputs.add(analyzeTypeArgument(argument, node));
-      });
+      if (!type.arguments.isEmpty) {
+        type.arguments.forEach((DartType argument) {
+          inputs.add(analyzeTypeArgument(argument, node));
+        });
+      } else if (compiler.enabledRuntimeType) {
+        Link<DartType> variables =
+            constructor.getEnclosingClass().typeVariables;
+        if (!variables.isEmpty) {
+          // If the class has type variables but no type arguments have been
+          // provided, add [:dynamic:] as argument for all type variables.
+          DartString stringDynamic = new DartString.literal('dynamic');
+          HInstruction input = graph.addConstantString(stringDynamic,
+                                                       node,
+                                                       constantSystem);
+          variables.forEach((_) => inputs.add(input));
+        }
+      }
     }
 
     HType elementType = computeType(constructor);
@@ -3096,6 +3184,43 @@
     }
   }
 
+  HConstant addConstantString(Node node, String string) {
+    DartString dartString = new DartString.literal(string);
+    Constant constant = constantSystem.createString(dartString, node);
+    return graph.addConstant(constant);
+  }
+
+  visitTypeReferenceSend(Send node) {
+    Element element = elements[node];
+    HInstruction name;
+    Element helper =
+        compiler.findHelper(RuntimeTypeInformation.CACHE_HELPER_NAME);
+    if (element.isClass()) {
+      String string = rti.generateRuntimeTypeString(element, 0);
+      name = addConstantString(node.selector, string);
+    } else if (element.isTypedef()) {
+      // TODO(karlklose): implement support for type variables in typedefs.
+      name = addConstantString(node.selector, rti.getName(element));
+    } else if (element.isTypeVariable()) {
+      // TODO(6248): implement support for type variables.
+      compiler.unimplemented('first class type for type variable', node: node);
+    } else {
+      internalError('unexpected element $element', node: node);
+    }
+    pushInvokeHelper1(helper, name);
+    if (node.isCall) {
+      // This send is of the form 'e(...)', where e is resolved to a type
+      // reference. We create a regular closure call on the result of the type
+      // reference instead of creating a NoSuchMethodError to avoid pulling it
+      // in if it is not used (e.g., in a try/catch).
+      HInstruction target = pop();
+      Selector selector = elements.getSelector(node);
+      List<HInstruction> inputs = <HInstruction>[target];
+      addDynamicSendArgumentsToList(node, inputs);
+      push(new HInvokeClosure(selector, inputs));
+    }
+  }
+
   visitGetterSend(Send node) {
     generateGetter(node, elements[node]);
   }
@@ -3106,10 +3231,7 @@
   }
 
   void generateError(Node node, String message, Element helper) {
-    DartString messageObject = new DartString.literal(message);
-    Constant messageConstant =
-        constantSystem.createString(messageObject, node);
-    HInstruction errorMessage = graph.addConstant(messageConstant);
+    HInstruction errorMessage = addConstantString(node, message);
     pushInvokeHelper1(helper, errorMessage);
   }
 
@@ -3185,6 +3307,9 @@
 
   visitNewExpression(NewExpression node) {
     Element element = elements[node.send];
+    if (!Elements.isErroneousElement(element)) {
+      element = element.redirectionTarget;
+    }
     if (Elements.isErroneousElement(element)) {
       ErroneousElement error = element;
       if (error.messageKind == MessageKind.CANNOT_FIND_CONSTRUCTOR) {
@@ -3209,9 +3334,15 @@
   }
 
   visitSendSet(SendSet node) {
+    Element element = elements[node];
+    if (!Elements.isUnresolved(element) && element.impliesType()) {
+      Identifier selector = node.selector;
+      generateThrowNoSuchMethod(node, selector.source.slowToString(),
+                                argumentNodes: node.arguments);
+      return;
+    }
     Operator op = node.assignmentOperator;
     if (node.isSuperCall) {
-      Element element = elements[node];
       if (element == null) return generateSuperNoSuchMethodSend(node);
       HInstruction target = new HStatic(element);
       HInstruction context = localsHandler.readThis();
@@ -3289,6 +3420,7 @@
 
       // [receiver] is only used if the node is an instance send.
       HInstruction receiver = null;
+      Element selectorElement = elements[node];
       if (Elements.isInstanceSend(node, elements)) {
         receiver = generateInstanceSendReceiver(node);
         generateInstanceGetterWithCompiledReceiver(node, receiver);
@@ -3381,22 +3513,35 @@
     dup();
   }
 
+  void handleInTryStatement() {
+    if (!inTryStatement) return;
+    HBasicBlock block = close(new HExitTry());
+    HBasicBlock newBlock = graph.addNewBlock();
+    block.addSuccessor(newBlock);
+    open(newBlock);
+  }
+
   visitReturn(Return node) {
     if (identical(node.getBeginToken().stringValue, 'native')) {
       native.handleSsaNative(this, node.expression);
       return;
     }
-    if (node.isRedirectingFactoryBody) {
-      compiler.internalError("Unimplemented: Redirecting factory constructor",
-                             node: node);
-    }
+    assert(invariant(node, !node.isRedirectingFactoryBody));
     HInstruction value;
     if (node.expression == null) {
       value = graph.addConstantNull(constantSystem);
     } else {
       visit(node.expression);
       value = pop();
+      if (value is HForeign) {
+        // TODO(6530, 6534): remove this check.
+      } else {
+        value = potentiallyCheckType(value, returnType);
+      }
     }
+
+    handleInTryStatement();
+
     if (!inliningStack.isEmpty) {
       localsHandler.updateLocal(returnElement, value);
     } else {
@@ -3487,6 +3632,7 @@
 
   visitBreakStatement(BreakStatement node) {
     assert(!isAborted());
+    handleInTryStatement();
     TargetElement target = elements[node];
     assert(target != null);
     JumpHandler handler = jumpTargets[target];
@@ -3500,6 +3646,7 @@
   }
 
   visitContinueStatement(ContinueStatement node) {
+    handleInTryStatement();
     TargetElement target = elements[node];
     assert(target != null);
     JumpHandler handler = jumpTargets[target];
@@ -3610,7 +3757,7 @@
     JumpHandler handler = new JumpHandler(this, targetElement);
     // Introduce a new basic block.
     HBasicBlock entryBlock = openNewBlock();
-    hackAroundPossiblyAbortingBody(node, () { visit(body); });
+    visit(body);
     SubGraph bodyGraph = new SubGraph(entryBlock, lastOpenedBlock);
 
     HBasicBlock joinBlock = graph.addNewBlock();
@@ -4039,6 +4186,8 @@
     HBasicBlock enterBlock = openNewBlock();
     HTry tryInstruction = new HTry();
     close(tryInstruction);
+    bool oldInTryStatement = inTryStatement;
+    inTryStatement = true;
 
     HBasicBlock startTryBlock;
     HBasicBlock endTryBlock;
@@ -4153,6 +4302,22 @@
     HBasicBlock exitBlock = graph.addNewBlock();
 
     addOptionalSuccessor(b1, b2) { if (b2 != null) b1.addSuccessor(b2); }
+    addExitTrySuccessor(successor) {
+      if (successor == null) return;
+      // Iterate over all blocks created inside this try/catch, and
+      // attach successor information to blocks that end with
+      // [HExitTry].
+      for (int i = startTryBlock.id; i < successor.id; i++) {
+        HBasicBlock block = graph.blocks[i];
+        var last = block.last;
+        if (last is HExitTry) {
+          block.addSuccessor(successor);
+        } else if (last is HTry) {
+          // Skip all blocks inside this nested try/catch.
+          i = last.joinBlock.id;
+        }
+      }
+    }
 
     // Setup all successors. The entry block that contains the [HTry]
     // has 1) the body, 2) the catch, 3) the finally, and 4) the exit
@@ -4181,6 +4346,12 @@
       endFinallyBlock.addSuccessor(exitBlock);
     }
 
+    // If a block inside try/catch aborts (eg with a return statement),
+    // we explicitely mark this block a predecessor of the catch
+    // block and the finally block.
+    addExitTrySuccessor(startCatchBlock);
+    addExitTrySuccessor(startFinallyBlock);
+
     // Use the locals handler not altered by the catch and finally
     // blocks.
     localsHandler = savedLocals;
@@ -4192,6 +4363,7 @@
           wrapStatementGraph(catchGraph),
           wrapStatementGraph(finallyGraph)),
         exitBlock);
+    inTryStatement = oldInTryStatement;
   }
 
   visitScriptTag(ScriptTag node) {
@@ -4222,18 +4394,6 @@
     if (element == builder.compiler.stringClass) return HType.STRING;
     return HType.UNKNOWN;
   }
-
-  /** HACK HACK HACK */
-  void hackAroundPossiblyAbortingBody(Node statement, void body()) {
-    visitCondition() {
-      stack.add(graph.addConstantBool(true, constantSystem));
-    }
-    buildBody() {
-      // TODO(lrn): Make sure to take continue into account.
-      body();
-    }
-    handleIf(statement, visitCondition, buildBody, null);
-  }
 }
 
 /**
@@ -4370,11 +4530,13 @@
    */
   final PartialFunctionElement function;
   final Element oldReturnElement;
+  final DartType oldReturnType;
   final TreeElements oldElements;
   final List<HInstruction> oldStack;
 
   InliningState(this.function,
                 this.oldReturnElement,
+                this.oldReturnType,
                 this.oldElements,
                 this.oldStack) {
     assert(function.isImplementation);
diff --git a/lib/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
similarity index 91%
rename from lib/compiler/implementation/ssa/codegen.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index 2bf0d51..040337d 100644
--- a/lib/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -37,8 +37,10 @@
     return result;
   }
 
-  CodeBuffer prettyPrint(js.Node node) {
-    return js.prettyPrint(node, compiler);
+  CodeBuffer prettyPrint(js.Node node, {bool allowVariableMinification: true}) {
+    var code = js.prettyPrint(
+        node, compiler, allowVariableMinification: allowVariableMinification);
+    return code;
   }
 
   CodeBuffer generateCode(WorkItem work, HGraph graph) {
@@ -52,12 +54,11 @@
   CodeBuffer generateLazyInitializer(work, graph) {
     return measure(() {
       compiler.tracer.traceGraph("codegen", graph);
-      List<js.Parameter> parameters = <js.Parameter>[];
-      SsaOptimizedCodeGenerator codegen = new SsaOptimizedCodeGenerator(
-          backend, work, parameters, new Map<Element, String>());
+      SsaOptimizedCodeGenerator codegen =
+          new SsaOptimizedCodeGenerator(backend, work);
       codegen.visitGraph(graph);
       js.Block body = codegen.body;
-      js.Fun fun = new js.Fun(parameters, body);
+      js.Fun fun = new js.Fun(codegen.parameters, body);
       return prettyPrint(fun);
     });
   }
@@ -75,26 +76,14 @@
         }
       });
       compiler.tracer.traceGraph("codegen", graph);
-      Map<Element, String> parameterNames = getParameterNames(work);
-      // Use [work.element] to ensure that the parameter element come from
-      // the declaration.
-      FunctionElement function = work.element;
-      function.computeSignature(compiler).forEachParameter((element) {
-        compiler.enqueuer.codegen.addToWorkList(element, work.resolutionTree);
-      });
-      List<js.Parameter> parameters = <js.Parameter>[];
-      parameterNames.forEach((element, name) {
-        parameters.add(new js.Parameter(name));
-      });
-      addBackendParameters(work.element, parameters, parameterNames);
-      String parametersString = Strings.join(parameterNames.values, ", ");
-      SsaOptimizedCodeGenerator codegen = new SsaOptimizedCodeGenerator(
-          backend, work, parameters, parameterNames);
+      SsaOptimizedCodeGenerator codegen =
+          new SsaOptimizedCodeGenerator(backend, work);
       codegen.visitGraph(graph);
 
       FunctionElement element = work.element;
       js.Block body;
       ClassElement enclosingClass = element.getEnclosingClass();
+      bool allowVariableMinification;
       if (element.isInstanceMember()
           && enclosingClass.isNative()
           && native.isOverriddenMethod(
@@ -105,81 +94,29 @@
         nativeEmitter.overriddenMethods.add(element);
         StringBuffer buffer = new StringBuffer();
         String codeString = prettyPrint(codegen.body).toString();
+        String parametersString =
+            Strings.join(codegen.parameterNames.values, ", ");
         native.generateMethodWithPrototypeCheckForElement(
             compiler, buffer, element, codeString, parametersString);
         js.Node nativeCode = new js.LiteralStatement(buffer.toString());
         body = new js.Block(<js.Statement>[nativeCode]);
+        allowVariableMinification = false;
       } else {
         body = codegen.body;
+        allowVariableMinification = !codegen.visitedForeignCode;
       }
-      js.Fun fun = buildJavaScriptFunction(element, parameters, body);
-      return prettyPrint(fun);
+      js.Fun fun = buildJavaScriptFunction(element, codegen.parameters, body);
+      return prettyPrint(fun,
+                         allowVariableMinification: allowVariableMinification);
     });
   }
 
-  void addBackendParameter(Element element,
-                           List<js.Parameter> parameters,
-                           Map<Element, String> parameterNames) {
-    String name = element.name.slowToString();
-    String prefix = '';
-    // Avoid collisions with real parameters of the method.
-    do {
-      name = JsNames.getValid('$prefix$name');
-      prefix = '\$$prefix';
-    } while (parameterNames.containsValue(name));
-    parameterNames[element] = name;
-    parameters.add(new js.Parameter(name));
-  }
-
-  void addBackendParameters(Element element,
-                            List<js.Parameter> parameters,
-                            Map<Element, String> parameterNames) {
-    // TODO(ngeoffray): We should infer this information from the
-    // graph, instead of recomputing what the builder did.
-    if (element.isConstructor()) {
-      // Put the type parameters.
-      ClassElement cls = element.enclosingElement;
-      if (!compiler.world.needsRti(cls)) return;
-      cls.typeVariables.forEach((TypeVariableType typeVariable) {
-        addBackendParameter(typeVariable.element, parameters, parameterNames);
-      });
-    } else if (element.isGenerativeConstructorBody()) {
-      // Put the parameter checks parameters.
-      Node node = element.implementation.parseNode(compiler);
-      ClosureClassMap closureData =
-          compiler.closureToClassMapper.getMappingForNestedFunction(node);
-      FunctionElement functionElement = element;
-      FunctionSignature params = functionElement.computeSignature(compiler);
-      TreeElements elements =
-          compiler.enqueuer.resolution.getCachedElements(element);
-      params.orderedForEachParameter((Element element) {
-        if (elements.isParameterChecked(element)) {
-          Element checkResultElement =
-              closureData.parametersWithSentinel[element];
-          addBackendParameter(checkResultElement, parameters, parameterNames);
-        }
-      });
-      // Put the box parameter.
-      ClosureScope scopeData = closureData.capturingScopes[node];
-      if (scopeData != null) {
-        addBackendParameter(scopeData.boxElement, parameters, parameterNames);
-      }
-    }
-  }
-
   CodeBuffer generateBailoutMethod(WorkItem work, HGraph graph) {
     return measure(() {
       compiler.tracer.traceGraph("codegen-bailout", graph);
 
-      Map<Element, String> parameterNames = getParameterNames(work);
-      List<js.Parameter> parameters = <js.Parameter>[];
-      parameterNames.forEach((element, name) {
-        parameters.add(new js.Parameter(name));
-      });
-      addBackendParameters(work.element, parameters, parameterNames);
-
-      SsaUnoptimizedCodeGenerator codegen = new SsaUnoptimizedCodeGenerator(
-          backend, work, parameters, parameterNames);
+      SsaUnoptimizedCodeGenerator codegen =
+          new SsaUnoptimizedCodeGenerator(backend, work);
       codegen.visitGraph(graph);
 
       js.Block body = new js.Block(<js.Statement>[]);
@@ -190,24 +127,29 @@
       return prettyPrint(fun);
     });
   }
+}
 
-  Map<Element, String> getParameterNames(WorkItem work) {
-    // Make sure the map preserves insertion order, so that fetching
-    // the values will keep the order of parameters.
-    Map<Element, String> parameterNames = new LinkedHashMap<Element, String>();
-    FunctionElement function = work.element.implementation;
+// Stop-gap until the core classes have such a class.
+class OrderedSet<T> {
+  final LinkedHashMap<T, bool> map = new LinkedHashMap<T, bool>();
 
-    // The dom/html libraries have inline JS code that reference
-    // parameter names directly. Long-term such code will be rejected.
-    // Now, just don't mangle the parameter name.
-    FunctionSignature signature = function.computeSignature(compiler);
-    signature.orderedForEachParameter((Element element) {
-      parameterNames[element] = function.isNative()
-          ? element.name.slowToString()
-          : JsNames.getValid('${element.name.slowToString()}');
-    });
-    return parameterNames;
+  void add(T x) {
+    if (!map.containsKey(x)) {
+      map[x] = true;
+    }
   }
+
+  bool contains(T x) => map.containsKey(x);
+
+  bool remove(T x) => map.remove(x) != null;
+
+  bool get isEmpty => map.isEmpty;
+
+  void forEach(f) => map.keys.forEach(f);
+
+  T get first => map.keys.iterator().next();
+
+  get length => map.length;
 }
 
 typedef void ElementAction(Element element);
@@ -235,6 +177,8 @@
    */
   bool isGeneratingExpression = false;
 
+  bool visitedForeignCode = false;
+
   final JavaScriptBackend backend;
   final WorkItem work;
   final HTypeMap types;
@@ -244,6 +188,7 @@
   final Map<Element, ElementAction> breakAction;
   final Map<Element, ElementAction> continueAction;
   final Map<Element, String> parameterNames;
+  final List<js.Parameter> parameters;
 
   js.Block currentContainer;
   js.Block get body => currentContainer;
@@ -255,17 +200,20 @@
    * copies to perform on block transitioning.
    */
   VariableNames variableNames;
+  bool shouldGroupVarDeclarations = false;
 
   /**
    * While generating expressions, we can't insert variable declarations.
-   * Instead we declare them at the end of the function
+   * Instead we declare them at the start of the function.  When minifying
+   * we do this most of the time, because it reduces the size unless there
+   * is only one variable.
    */
-  final Set<String> delayedVariableDeclarations;
+  final OrderedSet<String> collectedVariableDeclarations;
 
   /**
-   * Set of variables that have already been declared.
+   * Set of variables and parameters that have already been declared.
    */
-  final Set<String> declaredVariables;
+  final Set<String> declaredLocals;
 
   Element equalsNullElement;
   Element boolifiedEqualsNullElement;
@@ -280,15 +228,15 @@
   // if branches.
   SubGraph subGraph;
 
-  SsaCodeGenerator(this.backend,
-                   WorkItem work,
-                   this.parameterNames)
+  SsaCodeGenerator(this.backend, WorkItem work)
     : this.work = work,
       this.types =
           (work.compilationContext as JavaScriptItemCompilationContext).types,
-      declaredVariables = new Set<String>(),
-      delayedVariableDeclarations = new Set<String>(),
+      parameterNames = new LinkedHashMap<Element, String>(),
+      declaredLocals = new Set<String>(),
+      collectedVariableDeclarations = new OrderedSet<String>(),
       currentContainer = new js.Block.empty(),
+      parameters = <js.Parameter>[],
       expressionStack = <js.Expression>[],
       oldContainerStack = <js.Block>[],
       generateAtUseSite = new Set<HInstruction>(),
@@ -359,6 +307,10 @@
     currentContainer.statements.add(statement);
   }
 
+  void insertStatementAtStart(js.Statement statement) {
+    currentContainer.statements.insertRange(0, 1, statement);
+  }
+
   /**
    * If the [instruction] is not `null` it will be used to attach the position
    * to the [expression].
@@ -400,19 +352,19 @@
     return jsNode;
   }
 
-  abstract visitTypeGuard(HTypeGuard node);
-  abstract visitBailoutTarget(HBailoutTarget node);
+  visitTypeGuard(HTypeGuard node);
+  visitBailoutTarget(HBailoutTarget node);
 
-  abstract beginGraph(HGraph graph);
-  abstract endGraph(HGraph graph);
+  beginGraph(HGraph graph);
+  endGraph(HGraph graph);
 
-  abstract beginLoop(HBasicBlock block);
-  abstract endLoop(HBasicBlock block);
-  abstract handleLoopCondition(HLoopBranch node);
+  beginLoop(HBasicBlock block);
+  endLoop(HBasicBlock block);
+  handleLoopCondition(HLoopBranch node);
 
-  abstract preLabeledBlock(HLabeledBlockInformation labeledBlockInfo);
-  abstract startLabeledBlock(HLabeledBlockInformation labeledBlockInfo);
-  abstract endLabeledBlock(HLabeledBlockInformation labeledBlockInfo);
+  preLabeledBlock(HLabeledBlockInformation labeledBlockInfo);
+  startLabeledBlock(HLabeledBlockInformation labeledBlockInfo);
+  endLabeledBlock(HLabeledBlockInformation labeledBlockInfo);
 
   void preGenerateMethod(HGraph graph) {
     new SsaInstructionMerger(types, generateAtUseSite).visitGraph(graph);
@@ -429,6 +381,48 @@
         parameterNames);
     allocator.visitGraph(graph);
     variableNames = allocator.names;
+    shouldGroupVarDeclarations = allocator.names.numberOfVariables > 1;
+  }
+
+  void handleDelayedVariableDeclarations() {
+    // If we have only one variable declaration and the first statement is an
+    // assignment to that variable then we can merge the two.  We count the
+    // number of variables in the variable allocator to try to avoid this issue,
+    // but it sometimes happens that the variable allocator introduces a
+    // temporary variable that it later eliminates.
+    if (!collectedVariableDeclarations.isEmpty) {
+      if (collectedVariableDeclarations.length == 1 &&
+          currentContainer.statements.length >= 1 &&
+          currentContainer.statements[0] is js.ExpressionStatement) {
+        String name = collectedVariableDeclarations.first;
+        js.ExpressionStatement statement = currentContainer.statements[0];
+        if (statement.expression is js.Assignment) {
+          js.Assignment assignment = statement.expression;
+          if (!assignment.isCompound &&
+              assignment.leftHandSide is js.VariableReference) {
+            js.VariableReference variableReference = assignment.leftHandSide;
+            if (variableReference.name == name) {
+              js.VariableDeclaration decl = new js.VariableDeclaration(name);
+              js.VariableInitialization initialization =
+                  new js.VariableInitialization(decl, assignment.value);
+              currentContainer.statements[0] = new js.ExpressionStatement(
+                  new js.VariableDeclarationList([initialization]));
+              return;
+            }
+          }
+        }
+      }
+      // If we can't merge the declaration with the first assignment then we
+      // just do it with a new var z,y,x; statement.
+      List<js.VariableInitialization> declarations =
+          <js.VariableInitialization>[];
+      collectedVariableDeclarations.forEach((String name) {
+        declarations.add(new js.VariableInitialization(
+            new js.VariableDeclaration(name), null));
+      });
+      var declarationList = new js.VariableDeclarationList(declarations);
+      insertStatementAtStart(new js.ExpressionStatement(declarationList));
+    }
   }
 
   visitGraph(HGraph graph) {
@@ -438,15 +432,7 @@
     subGraph = new SubGraph(graph.entry, graph.exit);
     HBasicBlock start = beginGraph(graph);
     visitBasicBlock(start);
-    if (!delayedVariableDeclarations.isEmpty) {
-      List<js.VariableInitialization> declarations =
-          <js.VariableInitialization>[];
-      delayedVariableDeclarations.forEach((String name) {
-        declarations.add(new js.VariableInitialization(
-            new js.VariableDeclaration(name), null));
-      });
-      pushExpressionAsStatement(new js.VariableDeclarationList(declarations));
-    }
+    handleDelayedVariableDeclarations();
     endGraph(graph);
   }
 
@@ -616,7 +602,8 @@
   }
 
   bool isVariableDeclared(String variableName) {
-    return declaredVariables.contains(variableName);
+    return declaredLocals.contains(variableName) ||
+        collectedVariableDeclarations.contains(variableName);
   }
 
   js.Expression generateExpressionAssignment(String variableName,
@@ -644,16 +631,19 @@
 
   void assignVariable(String variableName, js.Expression value) {
     if (isGeneratingExpression) {
+      // If we are in an expression then we can't declare the variable here.
+      // We have no choice, but to use it and then declare it separately.
       if (!isVariableDeclared(variableName)) {
-        delayedVariableDeclarations.add(variableName);
-        // We can treat the variable as being declared from this point on.
-        declaredVariables.add(variableName);
+        collectedVariableDeclarations.add(variableName);
       }
       push(generateExpressionAssignment(variableName, value));
-    } else if (!isVariableDeclared(variableName) ||
-               delayedVariableDeclarations.contains(variableName)) {
-      declaredVariables.add(variableName);
-      delayedVariableDeclarations.remove(variableName);
+      // Otherwise if we are trying to declare inline and we are in a statement
+      // then we declare (unless it was already declared).
+    } else if (!shouldGroupVarDeclarations &&
+               !declaredLocals.contains(variableName)) {
+      // It may be necessary to remove it from the ones to be declared later.
+      collectedVariableDeclarations.remove(variableName);
+      declaredLocals.add(variableName);
       js.VariableDeclaration decl = new js.VariableDeclaration(variableName);
       js.VariableInitialization initialization =
           new js.VariableInitialization(decl, value);
@@ -661,6 +651,11 @@
       pushExpressionAsStatement(new js.VariableDeclarationList(
           <js.VariableInitialization>[initialization]));
     } else {
+      // Otherwise we are just going to use it.  If we have not already declared
+      // it then we make sure we will declare it later.
+      if (!declaredLocals.contains(variableName)) {
+        collectedVariableDeclarations.add(variableName);
+      }
       pushExpressionAsStatement(
           generateExpressionAssignment(variableName, value));
     }
@@ -836,7 +831,7 @@
 
   bool visitLoopInfo(HLoopBlockInformation info) {
     HExpressionInformation condition = info.condition;
-    bool isConditionExpression = isJSCondition(condition);
+    bool isConditionExpression = condition == null || isJSCondition(condition);
 
     js.Loop loop;
 
@@ -860,9 +855,10 @@
           // expression, generate a for-loop.
           js.Expression jsInitialization = null;
           if (initialization != null) {
-            int delayedVariablesCount = delayedVariableDeclarations.length;
+            int delayedVariablesCount = collectedVariableDeclarations.length;
             jsInitialization = generateExpression(initialization);
-            if (delayedVariablesCount < delayedVariableDeclarations.length) {
+            if (!shouldGroupVarDeclarations &&
+                delayedVariablesCount < collectedVariableDeclarations.length) {
               // We just added a new delayed variable-declaration. See if we
               // can put in a 'var' in front of the initialization to make it
               // go away.
@@ -895,7 +891,7 @@
                   js.Node declaration = new js.VariableDeclaration(id);
                   inits.add(new js.VariableInitialization(declaration,
                                                           assignment.value));
-                  delayedVariableDeclarations.remove(id);
+                  collectedVariableDeclarations.remove(id);
                 }
                 jsInitialization = new js.VariableDeclarationList(inits);
               }
@@ -947,7 +943,11 @@
         }
         break;
       case HLoopBlockInformation.DO_WHILE_LOOP:
-        // Generate do-while loop in all cases.
+        // If there are phi copies after the condition, we cannot emit
+        // a pretty do/while loop, se we fallback to the generic
+        // emission of a loop.
+        CopyHandler handler = variableNames.getCopyHandler(info.end);
+        if (handler != null && !handler.isEmpty) return false;
         if (info.initializer != null) {
           generateStatements(info.initializer);
         }
@@ -962,7 +962,9 @@
         if (info.updates != null) {
           generateStatements(info.updates);
         }
-        if (isConditionExpression) {
+        if (condition == null) {
+          push(newLiteralBool(false));
+        } else if (isConditionExpression) {
           push(generateExpression(condition));
         } else {
           generateStatements(condition);
@@ -1135,7 +1137,9 @@
    * Sequentialize a list of conceptually parallel copies. Parallel
    * copies may contain cycles, that this method breaks.
    */
-  void sequentializeCopies(List<Copy> copies) {
+  void sequentializeCopies(List<Copy> copies,
+                           String tempName,
+                           void doAssignment(String target, String source)) {
     // Map to keep track of the current location (ie the variable that
     // holds the initial value) of a variable.
     Map<String, String> currentLocation = new Map<String, String>();
@@ -1153,10 +1157,8 @@
     // Prune [copies] by removing self-copies.
     List<Copy> prunedCopies = <Copy>[];
     for (Copy copy in copies) {
-      String sourceName = variableNames.getName(copy.source);
-      String destinationName = variableNames.getName(copy.destination);
-      if (sourceName != destinationName) {
-        prunedCopies.add(new Copy(sourceName, destinationName));
+      if (copy.source != copy.destination) {
+        prunedCopies.add(copy);
       }
     }
     copies = prunedCopies;
@@ -1186,7 +1188,7 @@
         // Since [source] might have been updated, use the current
         // location of [source]
         String copy = currentLocation[source];
-        emitAssignment(destination, copy);
+        doAssignment(destination, copy);
         // Now [destination] is the current location of [source].
         currentLocation[source] = destination;
         // If [source] hasn't been updated and needs to have a value,
@@ -1204,8 +1206,7 @@
       // cycle that we break by using a temporary name.
       if (currentLocation[current] != null
           && current != currentLocation[initialValue[current]]) {
-        String tempName = variableNames.swapTemp;
-        emitAssignment(tempName, current);
+        doAssignment(tempName, current);
         currentLocation[current] = tempName;
         // [current] can now be safely updated. Copies of [current]
         // will now use [tempName].
@@ -1218,7 +1219,13 @@
     CopyHandler handler = variableNames.getCopyHandler(node);
     if (handler == null) return;
 
-    sequentializeCopies(handler.copies);
+    // Map the instructions to strings.
+    List<Copy> copies = handler.copies.map((Copy copy) {
+      return new Copy(variableNames.getName(copy.source),
+                      variableNames.getName(copy.destination));
+    });
+
+    sequentializeCopies(copies, variableNames.getSwapTemp(), emitAssignment);
 
     for (Copy copy in handler.assignments) {
       String name = variableNames.getName(copy.destination);
@@ -1237,7 +1244,16 @@
       }
       instruction = instruction.next;
     }
-    assignPhisOfSuccessors(node);
+    if (instruction is HLoopBranch) {
+      HLoopBranch branch = instruction;
+      // If the loop is a do/while loop, the phi updates must happen
+      // after the evaluation of the condition.
+      if (!branch.isDoWhile()) {
+        assignPhisOfSuccessors(node);
+      }
+    } else {
+      assignPhisOfSuccessors(node);
+    }
     visit(instruction);
   }
 
@@ -1413,6 +1429,15 @@
     }
   }
 
+  visitExitTry(HExitTry node) {
+    // An [HExitTry] is used to represent the control flow graph of a
+    // try/catch block, ie the try body is always a predecessor
+    // of the catch and finally. Here, we continue visiting the try
+    // body by visiting the block that contains the user-level control
+    // flow instruction.
+    visitBasicBlock(node.bodyTrySuccessor);
+  }
+
   visitTry(HTry node) {
     // We should never get here. Try/catch/finally is always handled using block
     // information in [visitTryInfo], or not at all, in the case of the bailout
@@ -1713,6 +1738,7 @@
   }
 
   visitForeign(HForeign node) {
+    visitedForeignCode = true;
     String code = node.code.slowToString();
     List<HInstruction> inputs = node.inputs;
     if (node.isJsStatement(types)) {
@@ -1732,6 +1758,7 @@
   }
 
   visitForeignNew(HForeignNew node) {
+    visitedForeignCode = true;
     String jsClassReference = backend.namer.isolateAccess(node.element);
     List<HInstruction> inputs = node.inputs;
     // We can't use 'visitArguments', since our arguments start at input[0].
@@ -1759,7 +1786,8 @@
     // TODO(floitsch): should we use the ConstantVisitor here?
     if (!constant.isObject()) {
       if (constant.isBool()) {
-        push(newLiteralBool(constant.value));
+        BoolConstant boolConstant = constant;
+        push(newLiteralBool(boolConstant.value));
       } else if (constant.isNum()) {
         // TODO(floitsch): get rid of the code buffer.
         CodeBuffer buffer = new CodeBuffer();
@@ -1817,8 +1845,12 @@
     HBasicBlock branchBlock = currentBlock;
     handleLoopCondition(node);
     List<HBasicBlock> dominated = currentBlock.dominatedBlocks;
-    // For a do while loop, the body has already been visited.
-    if (!node.isDoWhile()) {
+    if (node.isDoWhile()) {
+      // Now that the condition has been evaluated, we can update the
+      // phis of a do/while loop.
+      assignPhisOfSuccessors(node.block);
+    } else {
+      // For a do while loop, the body has already been visited.
       visitBasicBlock(dominated[0]);
     }
     endLoop(node.block);
@@ -2524,18 +2556,20 @@
 }
 
 class SsaOptimizedCodeGenerator extends SsaCodeGenerator {
-  SsaOptimizedCodeGenerator(backend, work, parameters, parameterNames)
-    : super(backend, work, parameterNames) {
-    // Declare the parameter names only for the optimized version. The
-    // unoptimized version has different parameters.
-    parameterNames.forEach((Element element, String name) {
-      declaredVariables.add(name);
-    });
-  }
+  SsaOptimizedCodeGenerator(backend, work) : super(backend, work);
 
   int maxBailoutParameters;
 
-  HBasicBlock beginGraph(HGraph graph) => graph.entry;
+  HBasicBlock beginGraph(HGraph graph) {
+    // Declare the parameter names only for the optimized version. The
+    // unoptimized version has different parameters.
+    parameterNames.forEach((Element element, String name) {
+      parameters.add(new js.Parameter(name));
+      declaredLocals.add(name);
+    });
+    return graph.entry;
+  }
+
   void endGraph(HGraph graph) {}
 
   js.Statement bailout(HTypeGuard guard, String reason) {
@@ -2564,12 +2598,6 @@
       use(target.inputs[i]);
       arguments.add(pop());
     }
-    // Make sure we call the bailout method with the number of
-    // arguments it expects. This avoids having the underlying
-    // JS engine fill them in for us.
-    for (; i < maxBailoutParameters; i++) {
-      arguments.add(new js.LiteralNumber('0'));
-    }
 
     js.Expression bailoutTarget;
     if (element.isInstanceMember()) {
@@ -2686,7 +2714,8 @@
     body = unwrapStatement(body);
     js.While loop = new js.While(newLiteralBool(true), body);
 
-    HLoopInformation info = block.loopInformation;
+    HBasicBlock header = block.isLoopHeader() ? block : block.parentLoopHeader;
+    HLoopInformation info = header.loopInformation;
     attachLocationRange(loop,
                         info.loopBlockInformation.sourcePosition,
                         info.loopBlockInformation.endSourcePosition);
@@ -2695,7 +2724,9 @@
 
   void handleLoopCondition(HLoopBranch node) {
     use(node.inputs[0]);
-    pushStatement(new js.If.noElse(pop(), new js.Break(null)), node);
+    js.Expression test = new js.Prefix('!', pop());
+    js.Statement then = new js.Break(null);
+    pushStatement(new js.If.noElse(test, then), node);
   }
 
 
@@ -2727,8 +2758,8 @@
   SsaBailoutPropagator propagator;
   HInstruction savedFirstInstruction;
 
-  SsaUnoptimizedCodeGenerator(backend, work, parameters, parameterNames)
-    : super(backend, work, parameterNames),
+  SsaUnoptimizedCodeGenerator(backend, work)
+    : super(backend, work),
       oldBailoutSwitches = <js.Switch>[],
       newParameters = <js.Parameter>[],
       labels = <String>[],
@@ -2763,7 +2794,7 @@
       // the right variables in the setup phase.
       for (int i = 0; i < propagator.maxBailoutParameters; i++) {
         String name = 'env$i';
-        declaredVariables.add(name);
+        declaredLocals.add(name);
         newParameters.add(new js.Parameter(name));
       }
 
@@ -2780,7 +2811,7 @@
       for (HInstruction input in propagator.firstBailoutTarget.inputs) {
         input = unwrap(input);
         String name = variableNames.getName(input);
-        declaredVariables.add(name);
+        declaredLocals.add(name);
         newParameters.add(new js.Parameter(name));
       }
 
@@ -2846,26 +2877,33 @@
     pushExpressionAsStatement(new js.Assignment(generateStateUse(),
                                                 new js.LiteralNumber('0')));
     js.Block setupBlock = new js.Block.empty();
-    int i = 0;
-    for (HInstruction input in node.inputs) {
+    List<Copy> copies = <Copy>[];
+    for (int i = 0; i < node.inputs.length; i++) {
+      HInstruction input = node.inputs[i];
       input = unwrap(input);
       String name = variableNames.getName(input);
-      if (!isVariableDeclared(name)) {
-        declaredVariables.add(name);
+      String source = "env$i";
+      copies.add(new Copy(source, name));
+    }
+    sequentializeCopies(copies,
+                        variableNames.getSwapTemp(),
+                        (String target, String source) {
+      if (!isVariableDeclared(target) && !shouldGroupVarDeclarations) {
         js.VariableInitialization init =
-            new js.VariableInitialization(new js.VariableDeclaration(name),
-                                          new js.VariableUse('env$i'));
+            new js.VariableInitialization(new js.VariableDeclaration(target),
+                                          new js.VariableUse(source));
         js.Expression varList =
             new js.VariableDeclarationList(<js.VariableInitialization>[init]);
         setupBlock.statements.add(new js.ExpressionStatement(varList));
       } else {
-        js.Expression target = new js.VariableUse(name);
-        js.Expression source = new js.VariableUse('env$i');
-        js.Expression assignment = new js.Assignment(target, source);
+        collectedVariableDeclarations.add(target);
+        js.Expression jsTarget = new js.VariableUse(target);
+        js.Expression jsSource = new js.VariableUse(source);
+        js.Expression assignment = new js.Assignment(jsTarget, jsSource);
         setupBlock.statements.add(new js.ExpressionStatement(assignment));
       }
-      i++;
-    }
+      declaredLocals.add(target);
+    });
     setupBlock.statements.add(new js.Break(null));
     js.Case setupClause =
         new js.Case(new js.LiteralNumber('${node.state}'), setupBlock);
diff --git a/lib/compiler/implementation/ssa/codegen_helpers.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
similarity index 100%
rename from lib/compiler/implementation/ssa/codegen_helpers.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
diff --git a/lib/compiler/implementation/ssa/js_names.dart b/sdk/lib/_internal/compiler/implementation/ssa/js_names.dart
similarity index 100%
rename from lib/compiler/implementation/ssa/js_names.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/js_names.dart
diff --git a/lib/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
similarity index 98%
rename from lib/compiler/implementation/ssa/nodes.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index 5e416d1..ac51d42 100644
--- a/lib/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -19,6 +19,7 @@
   R visitDivide(HDivide node);
   R visitEquals(HEquals node);
   R visitExit(HExit node);
+  R visitExitTry(HExitTry node);
   R visitFieldGet(HFieldGet node);
   R visitFieldSet(HFieldSet node);
   R visitForeign(HForeign node);
@@ -95,13 +96,13 @@
     visitBasicBlockAndSuccessors(graph.entry);
   }
 
-  abstract visitBasicBlock(HBasicBlock block);
+  visitBasicBlock(HBasicBlock block);
 }
 
 abstract class HInstructionVisitor extends HGraphVisitor {
   HBasicBlock currentBlock;
 
-  abstract visitInstruction(HInstruction node);
+  visitInstruction(HInstruction node);
 
   visitBasicBlock(HBasicBlock node) {
     void visitInstructionList(HInstructionList list) {
@@ -220,7 +221,6 @@
       HBasicBlock block = blocks[i];
       List<HBasicBlock> predecessors = block.predecessors;
       if (block.isLoopHeader()) {
-        assert(predecessors.length >= 2);
         block.assignCommonDominator(predecessors[0]);
       } else {
         for (int j = predecessors.length - 1; j >= 0; j--) {
@@ -279,6 +279,7 @@
   visitDivide(HDivide node) => visitBinaryArithmetic(node);
   visitEquals(HEquals node) => visitRelational(node);
   visitExit(HExit node) => visitControlFlow(node);
+  visitExitTry(HExitTry node) => visitControlFlow(node);
   visitFieldGet(HFieldGet node) => visitFieldAccess(node);
   visitFieldSet(HFieldSet node) => visitFieldAccess(node);
   visitForeign(HForeign node) => visitInstruction(node);
@@ -871,6 +872,7 @@
   bool isInteger(HTypeMap types) => types[this].isInteger();
   bool isDouble(HTypeMap types) => types[this].isDouble();
   bool isNumber(HTypeMap types) => types[this].isNumber();
+  bool isNumberOrNull(HTypeMap types) => types[this].isNumberOrNull();
   bool isString(HTypeMap types) => types[this].isString();
   bool isTypeUnknown(HTypeMap types) => types[this].isUnknown();
   bool isIndexablePrimitive(HTypeMap types)
@@ -975,7 +977,7 @@
   bool typeEquals(HInstruction other) => false;
   bool dataEquals(HInstruction other) => false;
 
-  abstract accept(HVisitor visitor);
+  accept(HVisitor visitor);
 
   void notifyAddedToBlock(HBasicBlock targetBlock) {
     assert(!isInBasicBlock());
@@ -1128,10 +1130,7 @@
   }
 
 
-  HInstruction convertType(Compiler compiler,
-                           Element sourceElement,
-                           int kind) {
-    DartType type = sourceElement.computeType(compiler);
+  HInstruction convertType(Compiler compiler, DartType type, int kind) {
     if (type == null) return this;
     if (identical(type.element, compiler.dynamicClass)) return this;
     if (identical(type.element, compiler.objectClass)) return this;
@@ -1286,12 +1285,12 @@
   HInstruction get condition => inputs[0];
   HBasicBlock get trueBranch => block.successors[0];
   HBasicBlock get falseBranch => block.successors[1];
-  abstract toString();
+  toString();
 }
 
 abstract class HControlFlow extends HInstruction {
   HControlFlow(inputs) : super(inputs);
-  abstract toString();
+  toString();
   void prepareGvn(HTypeMap types) {
     // Control flow does not have side-effects.
   }
@@ -1309,7 +1308,7 @@
   static const int ARGUMENTS_OFFSET = 1;
 
   // TODO(floitsch): make class abstract instead of adding an abstract method.
-  abstract accept(HVisitor visitor);
+  accept(HVisitor visitor);
 }
 
 abstract class HInvokeDynamic extends HInvoke {
@@ -1322,7 +1321,7 @@
   HInstruction get receiver => inputs[0];
 
   // TODO(floitsch): make class abstract instead of adding an abstract method.
-  abstract accept(HVisitor visitor);
+  accept(HVisitor visitor);
 }
 
 class HInvokeClosure extends HInvokeDynamic {
@@ -1347,7 +1346,7 @@
   toString() => 'invoke dynamic field: $selector';
 
   // TODO(floitsch): make class abstract instead of adding an abstract method.
-  abstract accept(HVisitor visitor);
+  accept(HVisitor visitor);
 }
 
 class HInvokeDynamicGetter extends HInvokeDynamicField {
@@ -1626,8 +1625,8 @@
   HInstruction get left => inputs[1];
   HInstruction get right => inputs[2];
 
-  abstract BinaryOperation operation(ConstantSystem constantSystem);
-  abstract isBuiltin(HTypeMap types);
+  BinaryOperation operation(ConstantSystem constantSystem);
+  isBuiltin(HTypeMap types);
 }
 
 abstract class HBinaryArithmetic extends HInvokeBinary {
@@ -1687,7 +1686,7 @@
     return HType.UNKNOWN;
   }
 
-  abstract BinaryOperation operation(ConstantSystem constantSystem);
+  BinaryOperation operation(ConstantSystem constantSystem);
 }
 
 class HAdd extends HBinaryArithmetic {
@@ -1831,7 +1830,7 @@
   }
 
   // TODO(floitsch): make class abstract instead of adding an abstract method.
-  abstract accept(HVisitor visitor);
+  accept(HVisitor visitor);
 }
 
 class HShiftLeft extends HBinaryBitOp {
@@ -1947,7 +1946,7 @@
 
   HType computeLikelyType(HTypeMap types, Compiler compiler) => HType.NUMBER;
 
-  abstract UnaryOperation operation(ConstantSystem constantSystem);
+  UnaryOperation operation(ConstantSystem constantSystem);
 }
 
 class HNegate extends HInvokeUnary {
@@ -2035,6 +2034,18 @@
   HBasicBlock get joinBlock => this.block.successors.last;
 }
 
+// An [HExitTry] control flow node is used when the body of a try or
+// the body of a catch contains a return, break or continue. To build
+// the control flow graph, we explicitely mark the body that
+// leads to one of this instruction a predecessor of catch and
+// finally.
+class HExitTry extends HControlFlow {
+  HExitTry() : super(const <HInstruction>[]);
+  toString() => 'exit try';
+  accept(HVisitor visitor) => visitor.visitExitTry(this);
+  HBasicBlock get bodyTrySuccessor => block.successors[0];
+}
+
 class HIf extends HConditionalBranch {
   HBlockFlow blockInformation = null;
   HIf(HInstruction condition) : super(<HInstruction>[condition]);
@@ -2292,7 +2303,7 @@
   bool isBuiltin(HTypeMap types)
       => left.isNumber(types) && right.isNumber(types);
   // TODO(1603): the class should be marked as abstract.
-  abstract BinaryOperation operation(ConstantSystem constantSystem);
+  BinaryOperation operation(ConstantSystem constantSystem);
 }
 
 class HEquals extends HRelational {
@@ -2916,7 +2927,7 @@
 
   HBasicBlock get end {
     if (updates != null) return updates.end;
-    if (kind == DO_WHILE_LOOP) {
+    if (kind == DO_WHILE_LOOP && condition != null) {
       return condition.end;
     }
     return body.end;
diff --git a/lib/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
similarity index 98%
rename from lib/compiler/implementation/ssa/optimize.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index 30da6c5..26f990d 100644
--- a/lib/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -142,12 +142,15 @@
         }
         block.rewrite(instruction, replacement);
         block.remove(instruction);
-        // If the replacement instruction does not know its type or
-        // source element yet, use the type and source element of the
+
+        // If we can replace [instruction] with [replacement], then
+        // [replacement]'s type can be narrowed.
+        types[replacement] =
+            types[replacement].intersection(types[instruction], compiler);
+
+        // If the replacement instruction does not know its
+        // source element, use the source element of the
         // instruction.
-        if (!types[replacement].isUseful()) {
-          types[replacement] = types[instruction];
-        }
         if (replacement.sourceElement == null) {
           replacement.sourceElement = instruction.sourceElement;
         }
@@ -395,10 +398,9 @@
     HInstruction right = node.right;
     HType leftType = types[left];
     HType rightType = types[right];
-    assert(!leftType.isConflicting() && !rightType.isConflicting());
 
     // We don't optimize on numbers to preserve the runtime semantics.
-    if (!(left.isNumber(types) && right.isNumber(types)) &&
+    if (!(left.isNumberOrNull(types) && right.isNumberOrNull(types)) &&
         leftType.intersection(rightType, compiler).isConflicting()) {
       return graph.addConstantBool(false, constantSystem);
     }
@@ -620,7 +622,9 @@
     HInstruction value = node.inputs[1];
     if (compiler.enableTypeAssertions) {
       HInstruction other = value.convertType(
-          compiler, field, HTypeConversion.CHECKED_MODE_CHECK);
+          compiler,
+          field.computeType(compiler),
+          HTypeConversion.CHECKED_MODE_CHECK);
       if (other != value) {
         node.block.addBefore(node, other);
         value = other;
@@ -747,6 +751,7 @@
            && instruction is !HInvokeDynamicGetter
            && instruction is !HCheck
            && instruction is !HTypeGuard
+           && instruction is !HParameterValue
            && !instruction.isControlFlow();
   }
 
diff --git a/lib/compiler/implementation/ssa/ssa.dart b/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
similarity index 100%
rename from lib/compiler/implementation/ssa/ssa.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
diff --git a/lib/compiler/implementation/ssa/tracer.dart b/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
similarity index 99%
rename from lib/compiler/implementation/ssa/tracer.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
index b08bfd0..e38fe7c 100644
--- a/lib/compiler/implementation/ssa/tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
@@ -458,6 +458,10 @@
     return visitInvokeStatic(node);
   }
 
+  String visitExitTry(HExitTry node) {
+    return "Exit try";
+  }
+
   String visitTry(HTry node) {
     List<HBasicBlock> successors = currentBlock.successors;
     String tryBlock = 'B${successors[0].id}';
diff --git a/lib/compiler/implementation/ssa/types.dart b/sdk/lib/_internal/compiler/implementation/ssa/types.dart
similarity index 98%
rename from lib/compiler/implementation/ssa/types.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/types.dart
index da534d583..597ccf1 100644
--- a/lib/compiler/implementation/ssa/types.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types.dart
@@ -94,7 +94,7 @@
   /** Alias for isReadableArray. */
   bool isArray() => isReadableArray();
 
-  abstract DartType computeType(Compiler compiler);
+  DartType computeType(Compiler compiler);
 
   /**
    * The intersection of two types is the intersection of its values. For
@@ -109,7 +109,7 @@
    * An intersection with [UNKNOWN] returns the non-UNKNOWN type. An
    * intersection with [CONFLICTING] returns [CONFLICTING].
    */
-  abstract HType intersection(HType other, Compiler compiler);
+  HType intersection(HType other, Compiler compiler);
 
   /**
    * The union of two types is the union of its values. For example:
@@ -123,7 +123,7 @@
    * A union with [UNKNOWN] returns [UNKNOWN].
    * A union of [CONFLICTING] with any other types returns the other type.
    */
-  abstract HType union(HType other, Compiler compiler);
+  HType union(HType other, Compiler compiler);
 }
 
 /** Used to represent [HType.UNKNOWN] and [HType.CONFLICTING]. */
@@ -216,8 +216,8 @@
   HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.BOOLEAN_OR_NULL;
-    if (other.isBooleanOrNull()) return HType.BOOLEAN_OR_NULL;
     if (other.isBoolean()) return HType.BOOLEAN;
+    if (other.isBooleanOrNull()) return HType.BOOLEAN_OR_NULL;
     if (other.canBeNull()) return HType.NULL;
     return HType.CONFLICTING;
   }
@@ -226,6 +226,7 @@
 class HBooleanType extends HPrimitiveType {
   const HBooleanType();
   bool isBoolean() => true;
+  bool isBooleanOrNull() => true;
   String toString() => "boolean";
 
   DartType computeType(Compiler compiler) {
@@ -285,6 +286,7 @@
 class HNumberType extends HPrimitiveType {
   const HNumberType();
   bool isNumber() => true;
+  bool isNumberOrNull() => true;
   String toString() => "number";
 
   DartType computeType(Compiler compiler) {
@@ -334,8 +336,8 @@
   HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.INTEGER_OR_NULL;
-    if (other.isIntegerOrNull()) return HType.INTEGER_OR_NULL;
     if (other.isInteger()) return HType.INTEGER;
+    if (other.isIntegerOrNull()) return HType.INTEGER_OR_NULL;
     if (other.isDouble()) return HType.CONFLICTING;
     if (other.isDoubleOrNull()) return HType.NULL;
     if (other.isNumber()) return HType.INTEGER;
@@ -348,6 +350,7 @@
 class HIntegerType extends HNumberType {
   const HIntegerType();
   bool isInteger() => true;
+  bool isIntegerOrNull() => true;
   String toString() => "integer";
 
   DartType computeType(Compiler compiler) {
@@ -401,8 +404,8 @@
   HType intersection(HType other, Compiler compiler) {
     if (other.isConflicting()) return HType.CONFLICTING;
     if (other.isUnknown()) return HType.DOUBLE_OR_NULL;
-    if (other.isIntegerOrNull()) return HType.NULL;
     if (other.isInteger()) return HType.CONFLICTING;
+    if (other.isIntegerOrNull()) return HType.NULL;
     if (other.isDouble()) return HType.DOUBLE;
     if (other.isDoubleOrNull()) return HType.DOUBLE_OR_NULL;
     if (other.isNumber()) return HType.DOUBLE;
@@ -415,6 +418,7 @@
 class HDoubleType extends HNumberType {
   const HDoubleType();
   bool isDouble() => true;
+  bool isDoubleOrNull() => true;
   String toString() => "double";
 
   DartType computeType(Compiler compiler) {
@@ -529,6 +533,7 @@
 class HStringType extends HIndexablePrimitiveType {
   const HStringType();
   bool isString() => true;
+  bool isStringOrNull() => true;
   String toString() => "String";
 
   DartType computeType(Compiler compiler) {
diff --git a/lib/compiler/implementation/ssa/types_propagation.dart b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
similarity index 100%
rename from lib/compiler/implementation/ssa/types_propagation.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
diff --git a/lib/compiler/implementation/ssa/validate.dart b/sdk/lib/_internal/compiler/implementation/ssa/validate.dart
similarity index 100%
rename from lib/compiler/implementation/ssa/validate.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/validate.dart
diff --git a/lib/compiler/implementation/ssa/value_range_analyzer.dart b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
similarity index 100%
rename from lib/compiler/implementation/ssa/value_range_analyzer.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
diff --git a/lib/compiler/implementation/ssa/value_set.dart b/sdk/lib/_internal/compiler/implementation/ssa/value_set.dart
similarity index 100%
rename from lib/compiler/implementation/ssa/value_set.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/value_set.dart
diff --git a/lib/compiler/implementation/ssa/variable_allocator.dart b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
similarity index 93%
rename from lib/compiler/implementation/ssa/variable_allocator.dart
rename to sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
index 50f308c..b416c3f 100644
--- a/lib/compiler/implementation/ssa/variable_allocator.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
@@ -287,7 +287,9 @@
 
     // If the block is a loop header, we can remove the loop marker,
     // because it will just recompute the loop phis.
-    if (block.isLoopHeader()) {
+    // We also check if this loop header has any back edges. If not,
+    // we know there is no loop marker for it.
+    if (block.isLoopHeader() && block.predecessors.length > 1) {
       updateLoopMarker(block);
     }
   }
@@ -370,6 +372,9 @@
 class VariableNames {
   final Map<HInstruction, String> ownName;
   final Map<HBasicBlock, CopyHandler> copyHandlers;
+
+  // Used to control heuristic that determines how local variables are declared.
+  final Set<String> allUsedNames;
   /**
    * Name that is used as a temporary to break cycles in
    * parallel copies. We make sure this name is not being used
@@ -382,12 +387,20 @@
    */
   final String stateName;
 
+  String getSwapTemp() {
+    allUsedNames.add(swapTemp);
+    return swapTemp;
+  }
+
   VariableNames(Map<Element, String> parameterNames)
     : ownName = new Map<HInstruction, String>(),
       copyHandlers = new Map<HBasicBlock, CopyHandler>(),
+      allUsedNames = new Set<String>(),
       swapTemp = computeFreshWithPrefix("t", parameterNames),
       stateName = computeFreshWithPrefix("state", parameterNames);
 
+  int get numberOfVariables => allUsedNames.length;
+
   /** Returns a fresh variable with the given prefix. */
   static String computeFreshWithPrefix(String prefix,
                                        Map<Element, String> parameterNames) {
@@ -406,6 +419,8 @@
     return copyHandlers[block];
   }
 
+  void addNameUsed(String name) => allUsedNames.add(name);
+
   bool hasName(HInstruction instruction) => ownName.containsKey(instruction);
 
   void addCopy(HBasicBlock block, HInstruction source, HPhi destination) {
@@ -434,10 +449,14 @@
   VariableNamer(LiveEnvironment environment, this.names, this.parameterNames)
     : usedNames = new Set<String>(),
       freeTemporaryNames = new List<String>() {
-    // [VariableNames.swapTemp] and [VariableNames.stateName] are being used
-    // throughout the function. Therefore we make sure no one uses it at any
-    // time.
+    // [VariableNames.swapTemp] is used when there is a cycle in a copy handler.
+    // Therefore we make sure no one uses it.
     usedNames.add(names.swapTemp);
+    // [VariableNames.stateName] is being used throughout a bailout function.
+    // Whenever a bailout-target is reached we set the state-variable to 0. We
+    // must therefore not have any local variable that could clash with the
+    // state variable.
+    // Therefore we make sure no one uses it at any time.
     usedNames.add(names.stateName);
 
     // All liveIns instructions must have a name at this point, so we
@@ -446,6 +465,7 @@
       String name = names.getName(instruction);
       if (name != null) {
         usedNames.add(name);
+        names.addNameUsed(name);
       }
     });
   }
@@ -489,16 +509,15 @@
         name = names.ownName[temp];
       } while (name == null && temp is HCheck);
       if (name != null) return addAllocatedName(instruction, name);
-    } else if (instruction is HParameterValue) {
-      HParameterValue parameter = instruction;
-      name = parameterNames[parameter.sourceElement];
-      if (name == null) {
-        name = allocateWithHint(parameter.sourceElement.name.slowToString());
-      }
-      return addAllocatedName(instruction, name);
     }
 
-    if (instruction.sourceElement != null) {
+    // The dom/html libraries have inline JS code that reference	
+    // parameter names directly. Long-term such code will be rejected.
+    // Now, just don't mangle the parameter name.
+    if (instruction is HParameterValue
+        && instruction.sourceElement.enclosingElement.isNative()) {
+      name = instruction.sourceElement.name.slowToString();
+    } else if (instruction.sourceElement != null) {
       name = allocateWithHint(instruction.sourceElement.name.slowToString());
     } else {
       // We could not find an element for the instruction. If the
@@ -516,7 +535,11 @@
   }
 
   String addAllocatedName(HInstruction instruction, String name) {
+    if (instruction is HParameterValue) {
+      parameterNames[instruction.sourceElement] = name;
+    }
     usedNames.add(name);
+    names.addNameUsed(name);
     names.ownName[instruction] = name;
     return name;
   }
@@ -592,11 +615,11 @@
    * have no users or that are generated at use site does not need a name.
    */
   bool needsName(HInstruction instruction) {
-    if (instruction.usedBy.isEmpty) return false;
     // TODO(ngeoffray): locals/parameters are being generated at use site,
     // but we need a name for them. We should probably not make
     // them generate at use site to make things simpler.
     if (instruction is HLocalValue && instruction is !HThis) return true;
+    if (instruction.usedBy.isEmpty) return false;
     if (generateAtUseSite.contains(instruction)) return false;
     // A [HCheck] instruction that has control flow needs a name only if its
     // checked input needs a name (e.g. a check [HConstant] does not
diff --git a/lib/compiler/implementation/string_validator.dart b/sdk/lib/_internal/compiler/implementation/string_validator.dart
similarity index 100%
rename from lib/compiler/implementation/string_validator.dart
rename to sdk/lib/_internal/compiler/implementation/string_validator.dart
diff --git a/lib/compiler/implementation/tools/find_file_to_parse.sh b/sdk/lib/_internal/compiler/implementation/tools/find_file_to_parse.sh
similarity index 100%
rename from lib/compiler/implementation/tools/find_file_to_parse.sh
rename to sdk/lib/_internal/compiler/implementation/tools/find_file_to_parse.sh
diff --git a/lib/compiler/implementation/tools/mini_parser.dart b/sdk/lib/_internal/compiler/implementation/tools/mini_parser.dart
similarity index 93%
rename from lib/compiler/implementation/tools/mini_parser.dart
rename to sdk/lib/_internal/compiler/implementation/tools/mini_parser.dart
index 356e6f0..ea56771 100644
--- a/lib/compiler/implementation/tools/mini_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/tools/mini_parser.dart
@@ -2,26 +2,26 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('parser');
+library parser;
 
-#import('dart:io');
-#import('dart:scalarlist');
+import 'dart:io';
+import 'dart:scalarlist';
 
-#import('../../../utf/utf.dart');
+import 'dart:utf';
 
-#import('../elements/elements.dart');
-#import('../scanner/scanner_implementation.dart');
-#import('../scanner/scannerlib.dart');
-#import('../tree/tree.dart');
-#import('../util/characters.dart');
-#import('../source_file.dart');
-#import('../ssa/ssa.dart');
+import '../elements/elements.dart';
+import '../scanner/scanner_implementation.dart';
+import '../scanner/scannerlib.dart';
+import '../tree/tree.dart';
+import '../util/characters.dart';
+import '../source_file.dart';
+import '../ssa/ssa.dart';
 
-#import('../../compiler.dart', prefix: 'api');
+import '../../compiler.dart' as api;
 
-#source('../diagnostic_listener.dart');
-#source('../scanner/byte_array_scanner.dart');
-#source('../scanner/byte_strings.dart');
+part '../diagnostic_listener.dart';
+part '../scanner/byte_array_scanner.dart';
+part '../scanner/byte_strings.dart';
 
 int charCount = 0;
 Stopwatch stopwatch;
diff --git a/lib/compiler/implementation/tree/dartstring.dart b/sdk/lib/_internal/compiler/implementation/tree/dartstring.dart
similarity index 97%
rename from lib/compiler/implementation/tree/dartstring.dart
rename to sdk/lib/_internal/compiler/implementation/tree/dartstring.dart
index ac50e27..08ed05a 100644
--- a/lib/compiler/implementation/tree/dartstring.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/dartstring.dart
@@ -26,10 +26,10 @@
     return new ConsDartString(first, second);
   }
   const DartString();
-  abstract int get length;
+  int get length;
   bool get isEmpty => length == 0;
-  abstract Iterator<int> iterator();
-  abstract String slowToString();
+  Iterator<int> iterator();
+  String slowToString();
 
   bool operator ==(var other) {
     if (other is !DartString) return false;
@@ -43,7 +43,7 @@
     return true;
   }
   String toString() => "DartString#${length}:${slowToString()}";
-  abstract SourceString get source;
+  SourceString get source;
 }
 
 
@@ -67,7 +67,7 @@
   final SourceString source;
   final int length;
   SourceBasedDartString(this.source, this.length);
-  abstract Iterator<int> iterator();
+  Iterator<int> iterator();
 }
 
 /**
diff --git a/lib/compiler/implementation/tree/nodes.dart b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
similarity index 98%
rename from lib/compiler/implementation/tree/nodes.dart
rename to sdk/lib/_internal/compiler/implementation/tree/nodes.dart
index 9d0be9eb..99d3a88 100644
--- a/lib/compiler/implementation/tree/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
@@ -7,7 +7,7 @@
 abstract class Visitor<R> {
   const Visitor();
 
-  abstract R visitNode(Node node);
+  R visitNode(Node node);
 
   R visitBlock(Block node) => visitStatement(node);
   R visitBreakStatement(BreakStatement node) => visitGotoStatement(node);
@@ -110,9 +110,9 @@
 
   Node() : hashCode = ++_HASH_COUNTER;
 
-  abstract accept(Visitor visitor);
+  accept(Visitor visitor);
 
-  abstract visitChildren(Visitor visitor);
+  visitChildren(Visitor visitor);
 
   /**
    * Returns this node unparsed to Dart source string.
@@ -128,9 +128,9 @@
 
   String getObjectDescription() => super.toString();
 
-  abstract Token getBeginToken();
+  Token getBeginToken();
 
-  abstract Token getEndToken();
+  Token getEndToken();
 
   Block asBlock() => null;
   BreakStatement asBreakStatement() => null;
@@ -241,7 +241,7 @@
   Expression asExpression() => this;
 
   // TODO(ahe): make class abstract instead of adding an abstract method.
-  abstract accept(Visitor visitor);
+  accept(Visitor visitor);
 }
 
 abstract class Statement extends Node {
@@ -250,7 +250,7 @@
   Statement asStatement() => this;
 
   // TODO(ahe): make class abstract instead of adding an abstract method.
-  abstract accept(Visitor visitor);
+  accept(Visitor visitor);
 
   bool isValidBreakTarget() => true;
 }
@@ -665,7 +665,7 @@
 
   Literal(Token this.token, DecodeErrorHandler this.handler);
 
-  abstract T get value;
+  T get value;
 
   visitChildren(Visitor visitor) {}
 
@@ -799,8 +799,8 @@
   * Superclass for classes representing string literals.
   */
 abstract class StringNode extends Expression {
-  abstract DartString get dartString;
-  abstract bool get isInterpolation;
+  DartString get dartString;
+  bool get isInterpolation;
 
   StringNode asStringNode() => this;
 }
@@ -1032,7 +1032,7 @@
 }
 
 abstract class Loop extends Statement {
-  abstract Expression get condition;
+  Expression get condition;
   final Statement body;
 
   Loop(this.body);
@@ -1502,7 +1502,7 @@
   Token getEndToken() => semicolonToken;
 
   // TODO(ahe): make class abstract instead of adding an abstract method.
-  abstract accept(Visitor visitor);
+  accept(Visitor visitor);
 }
 
 class BreakStatement extends GotoStatement {
diff --git a/lib/compiler/implementation/tree/prettyprint.dart b/sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart
similarity index 100%
rename from lib/compiler/implementation/tree/prettyprint.dart
rename to sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart
diff --git a/lib/compiler/implementation/tree/tree.dart b/sdk/lib/_internal/compiler/implementation/tree/tree.dart
similarity index 100%
rename from lib/compiler/implementation/tree/tree.dart
rename to sdk/lib/_internal/compiler/implementation/tree/tree.dart
diff --git a/lib/compiler/implementation/tree/unparser.dart b/sdk/lib/_internal/compiler/implementation/tree/unparser.dart
similarity index 100%
rename from lib/compiler/implementation/tree/unparser.dart
rename to sdk/lib/_internal/compiler/implementation/tree/unparser.dart
diff --git a/lib/compiler/implementation/tree/visitors.dart b/sdk/lib/_internal/compiler/implementation/tree/visitors.dart
similarity index 100%
rename from lib/compiler/implementation/tree/visitors.dart
rename to sdk/lib/_internal/compiler/implementation/tree/visitors.dart
diff --git a/lib/compiler/implementation/tree_validator.dart b/sdk/lib/_internal/compiler/implementation/tree_validator.dart
similarity index 100%
rename from lib/compiler/implementation/tree_validator.dart
rename to sdk/lib/_internal/compiler/implementation/tree_validator.dart
diff --git a/lib/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
similarity index 98%
rename from lib/compiler/implementation/typechecker.dart
rename to sdk/lib/_internal/compiler/implementation/typechecker.dart
index d9c27ff..d4889b6 100644
--- a/lib/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -42,9 +42,9 @@
 }
 
 abstract class DartType {
-  abstract SourceString get name;
+  SourceString get name;
 
-  abstract TypeKind get kind;
+  TypeKind get kind;
 
   const DartType();
 
@@ -57,7 +57,7 @@
    *
    * Invariant: [element] must be a declaration element.
    */
-  abstract Element get element;
+  Element get element;
 
   /**
    * Returns the unaliased type of this type.
@@ -69,9 +69,9 @@
    * function type [: (B) -> A :] and the unaliased type of
    * [: Func<int,String> :] is the function type [: (String) -> int :].
    */
-  abstract DartType unalias(Compiler compiler);
+  DartType unalias(Compiler compiler);
 
-  abstract bool operator ==(other);
+  bool operator ==(other);
 
   DartType asRaw() => this;
 }
@@ -796,7 +796,7 @@
     if (node.isRedirectingFactoryBody) {
       // TODO(lrn): Typecheck the body. It must refer to the constructor
       // of a subtype.
-      return elements.getType(node);
+      return StatementType.RETURNING;
     }
 
     final expression = node.expression;
diff --git a/lib/compiler/implementation/types/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
similarity index 98%
rename from lib/compiler/implementation/types/concrete_types_inferrer.dart
rename to sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
index dd66e61..ec025ea 100644
--- a/lib/compiler/implementation/types/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
@@ -92,15 +92,15 @@
 
   factory ConcreteType.unknown() => const UnknownConcreteType();
 
-  abstract ConcreteType union(ConcreteType other);
-  abstract bool isUnkown();
-  abstract Set<BaseType> get baseTypes;
+  ConcreteType union(ConcreteType other);
+  bool isUnkown();
+  Set<BaseType> get baseTypes;
 
   /**
    * Returns the unique element of [: this :] if [: this :] is a singleton,
    * null otherwise.
    */
-  abstract ClassElement getUniqueType();
+  ClassElement getUniqueType();
 }
 
 /**
@@ -261,6 +261,7 @@
   final BaseType listBaseType;
   final BaseType mapBaseType;
   final BaseType objectBaseType;
+  final BaseType typeBaseType;
 
   BaseTypes(Compiler compiler) :
     intBaseType = new ClassBaseType(compiler.intClass),
@@ -270,7 +271,8 @@
     stringBaseType = new ClassBaseType(compiler.stringClass),
     listBaseType = new ClassBaseType(compiler.listClass),
     mapBaseType = new ClassBaseType(compiler.mapClass),
-    objectBaseType = new ClassBaseType(compiler.objectClass);
+    objectBaseType = new ClassBaseType(compiler.objectClass),
+    typeBaseType = new ClassBaseType(compiler.typeClass);
 }
 
 /**
@@ -1390,4 +1392,8 @@
   void internalError(String reason, {Node node}) {
     inferrer.fail(node, reason);
   }
+
+  ConcreteType visitTypeReferenceSend(Send) {
+    return new ConcreteType.singleton(inferrer.baseTypes.typeBaseType);
+  }
 }
diff --git a/lib/compiler/implementation/types/types.dart b/sdk/lib/_internal/compiler/implementation/types/types.dart
similarity index 100%
rename from lib/compiler/implementation/types/types.dart
rename to sdk/lib/_internal/compiler/implementation/types/types.dart
diff --git a/lib/compiler/implementation/universe/function_set.dart b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
similarity index 100%
rename from lib/compiler/implementation/universe/function_set.dart
rename to sdk/lib/_internal/compiler/implementation/universe/function_set.dart
diff --git a/lib/compiler/implementation/universe/partial_type_tree.dart b/sdk/lib/_internal/compiler/implementation/universe/partial_type_tree.dart
similarity index 95%
rename from lib/compiler/implementation/universe/partial_type_tree.dart
rename to sdk/lib/_internal/compiler/implementation/universe/partial_type_tree.dart
index cbe1be0..a3d74bb 100644
--- a/lib/compiler/implementation/universe/partial_type_tree.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/partial_type_tree.dart
@@ -26,7 +26,7 @@
 
   PartialTypeTree(this.compiler);
 
-  abstract PartialTypeTreeNode newSpecializedNode(ClassElement type);
+  PartialTypeTreeNode newSpecializedNode(ClassElement type);
 
   PartialTypeTreeNode newNode(ClassElement type) {
     PartialTypeTreeNode node = newSpecializedNode(type);
@@ -62,8 +62,11 @@
 
   // TODO(kasperl): Move this to the Selector class?
   ClassElement selectorType(Selector selector) {
+    // TODO(ngeoffray): Should the tree be specialized with DartType?
     DartType type = selector.receiverType;
-    return (type != null) ? type.element : compiler.objectClass;
+    if (type == null) return compiler.objectClass;
+    if (type.element.isTypedef()) return compiler.functionClass;
+    return type.element;
   }
 
   /**
diff --git a/lib/compiler/implementation/universe/selector_map.dart b/sdk/lib/_internal/compiler/implementation/universe/selector_map.dart
similarity index 100%
rename from lib/compiler/implementation/universe/selector_map.dart
rename to sdk/lib/_internal/compiler/implementation/universe/selector_map.dart
diff --git a/lib/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
similarity index 97%
rename from lib/compiler/implementation/universe/universe.dart
rename to sdk/lib/_internal/compiler/implementation/universe/universe.dart
index d4a01a5..596a85a 100644
--- a/lib/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -422,7 +422,12 @@
       return appliesUntyped(element, compiler);
     }
 
-    ClassElement self = receiverType.element;
+    Element self = receiverType.element;
+    if (self.isTypedef()) {
+      // A typedef is a function type that doesn't have any
+      // user-defined members.
+      return false;
+    }
 
     if (other.implementsInterface(self)
         || other.isSubclassOf(self)
@@ -430,7 +435,9 @@
       return appliesUntyped(element, compiler);
     }
 
-    if (!self.isInterface() && self.isSubclassOf(other)) {
+    // If [self] is a subclass of [other], it inherits the
+    // implementation of [element].
+    if (self.isSubclassOf(other)) {
       // Resolve an invocation of [element.name] on [self]. If it
       // is found, this selector is a candidate.
       return hasElementIn(self, element) && appliesUntyped(element, compiler);
diff --git a/lib/compiler/implementation/util/characters.dart b/sdk/lib/_internal/compiler/implementation/util/characters.dart
similarity index 100%
rename from lib/compiler/implementation/util/characters.dart
rename to sdk/lib/_internal/compiler/implementation/util/characters.dart
diff --git a/lib/compiler/implementation/util/link.dart b/sdk/lib/_internal/compiler/implementation/util/link.dart
similarity index 100%
rename from lib/compiler/implementation/util/link.dart
rename to sdk/lib/_internal/compiler/implementation/util/link.dart
diff --git a/lib/compiler/implementation/util/link_implementation.dart b/sdk/lib/_internal/compiler/implementation/util/link_implementation.dart
similarity index 100%
rename from lib/compiler/implementation/util/link_implementation.dart
rename to sdk/lib/_internal/compiler/implementation/util/link_implementation.dart
diff --git a/lib/compiler/implementation/util/uri_extras.dart b/sdk/lib/_internal/compiler/implementation/util/uri_extras.dart
similarity index 96%
rename from lib/compiler/implementation/util/uri_extras.dart
rename to sdk/lib/_internal/compiler/implementation/util/uri_extras.dart
index aa2f93a..fed5f15 100644
--- a/lib/compiler/implementation/util/uri_extras.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/uri_extras.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('uri_extras');
+library uri_extras;
 
-#import('dart:math');
-#import('dart:uri');
+import 'dart:math';
+import 'dart:uri';
 
 String relativize(Uri base, Uri uri, bool isWindows) {
   if (!base.path.startsWith('/')) {
diff --git a/lib/compiler/implementation/util/util.dart b/sdk/lib/_internal/compiler/implementation/util/util.dart
similarity index 100%
rename from lib/compiler/implementation/util/util.dart
rename to sdk/lib/_internal/compiler/implementation/util/util.dart
diff --git a/lib/compiler/implementation/util/util_implementation.dart b/sdk/lib/_internal/compiler/implementation/util/util_implementation.dart
similarity index 100%
rename from lib/compiler/implementation/util/util_implementation.dart
rename to sdk/lib/_internal/compiler/implementation/util/util_implementation.dart
diff --git a/lib/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
similarity index 100%
rename from lib/compiler/implementation/warnings.dart
rename to sdk/lib/_internal/compiler/implementation/warnings.dart
diff --git a/lib/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
similarity index 100%
rename from lib/compiler/implementation/world.dart
rename to sdk/lib/_internal/compiler/implementation/world.dart
diff --git a/lib/compiler/samples/leap/index.html b/sdk/lib/_internal/compiler/samples/leap/index.html
similarity index 100%
rename from lib/compiler/samples/leap/index.html
rename to sdk/lib/_internal/compiler/samples/leap/index.html
diff --git a/lib/compiler/samples/leap/isolate.html b/sdk/lib/_internal/compiler/samples/leap/isolate.html
similarity index 100%
rename from lib/compiler/samples/leap/isolate.html
rename to sdk/lib/_internal/compiler/samples/leap/isolate.html
diff --git a/lib/compiler/samples/leap/leap.css b/sdk/lib/_internal/compiler/samples/leap/leap.css
similarity index 100%
rename from lib/compiler/samples/leap/leap.css
rename to sdk/lib/_internal/compiler/samples/leap/leap.css
diff --git a/lib/compiler/samples/leap/leap.dart b/sdk/lib/_internal/compiler/samples/leap/leap.dart
similarity index 100%
rename from lib/compiler/samples/leap/leap.dart
rename to sdk/lib/_internal/compiler/samples/leap/leap.dart
diff --git a/lib/compiler/samples/leap/leap_leg.dart b/sdk/lib/_internal/compiler/samples/leap/leap_leg.dart
similarity index 100%
rename from lib/compiler/samples/leap/leap_leg.dart
rename to sdk/lib/_internal/compiler/samples/leap/leap_leg.dart
diff --git a/lib/compiler/samples/leap/leap_script.dart b/sdk/lib/_internal/compiler/samples/leap/leap_script.dart
similarity index 100%
rename from lib/compiler/samples/leap/leap_script.dart
rename to sdk/lib/_internal/compiler/samples/leap/leap_script.dart
diff --git a/lib/compiler/samples/leap/leap_server.dart b/sdk/lib/_internal/compiler/samples/leap/leap_server.dart
similarity index 96%
rename from lib/compiler/samples/leap/leap_server.dart
rename to sdk/lib/_internal/compiler/samples/leap/leap_server.dart
index 357e9fa..95fad72 100644
--- a/lib/compiler/samples/leap/leap_server.dart
+++ b/sdk/lib/_internal/compiler/samples/leap/leap_server.dart
@@ -39,7 +39,7 @@
     String path = request.path;
     if (path == '/') return redirect('/$landingPage');
     if (path == '/favicon.ico') {
-      path = '/pkg/dartdoc/static/favicon.ico';
+      path = '/lib/_internal/dartdoc/static/favicon.ico';
     }
     if (path.contains('..') || path.contains('%')) return notFound();
     var f = new File("./$path");
diff --git a/lib/compiler/samples/leap/request_cache.dart b/sdk/lib/_internal/compiler/samples/leap/request_cache.dart
similarity index 100%
rename from lib/compiler/samples/leap/request_cache.dart
rename to sdk/lib/_internal/compiler/samples/leap/request_cache.dart
diff --git a/pkg/dartdoc/.gitignore b/sdk/lib/_internal/dartdoc/.gitignore
similarity index 100%
rename from pkg/dartdoc/.gitignore
rename to sdk/lib/_internal/dartdoc/.gitignore
diff --git a/pkg/dartdoc/README.txt b/sdk/lib/_internal/dartdoc/README.txt
similarity index 100%
rename from pkg/dartdoc/README.txt
rename to sdk/lib/_internal/dartdoc/README.txt
diff --git a/pkg/dartdoc/bin/dartdoc.dart b/sdk/lib/_internal/dartdoc/bin/dartdoc.dart
similarity index 95%
rename from pkg/dartdoc/bin/dartdoc.dart
rename to sdk/lib/_internal/dartdoc/bin/dartdoc.dart
index 25fc655..1b45e3c 100755
--- a/pkg/dartdoc/bin/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/bin/dartdoc.dart
@@ -20,10 +20,10 @@
 
 // TODO(rnystrom): Use "package:" URL (#4968).
 import '../lib/dartdoc.dart';
-import '../../args/lib/args.dart';
+import '../../../../../pkg/args/lib/args.dart';
 
 /**
- * Run this from the `pkg/dartdoc` directory.
+ * Run this from the `lib/_internal/dartdoc` directory.
  */
 main() {
   // Need this because ArgParser.getUsage doesn't show command invocation.
@@ -35,8 +35,8 @@
 
   final argParser = new ArgParser();
 
-  final Path libPath = scriptDir.append('../../../');
-  Path pkgPath = scriptDir.append('../../../pkg/');
+  final Path libPath = scriptDir.append('../../../../');
+  Path pkgPath = scriptDir.append('../../../../pkg/');
 
   argParser.addFlag('no-code',
       help: 'Do not include source code in the documentation.',
@@ -166,7 +166,7 @@
         }
       });
 
-  dartdoc.dartdocPath = libPath.append('pkg/dartdoc');
+  dartdoc.dartdocPath = libPath.append('lib/_internal/dartdoc');
 
   if (args.isEmpty) {
     print('No arguments provided.');
diff --git a/pkg/dartdoc/lib/classify.dart b/sdk/lib/_internal/dartdoc/lib/classify.dart
similarity index 98%
rename from pkg/dartdoc/lib/classify.dart
rename to sdk/lib/_internal/dartdoc/lib/classify.dart
index 0532a1e..de7697d 100644
--- a/pkg/dartdoc/lib/classify.dart
+++ b/sdk/lib/_internal/dartdoc/lib/classify.dart
@@ -4,7 +4,7 @@
 
 library classify;
 
-import '../../../lib/compiler/implementation/scanner/scannerlib.dart';
+import '../../compiler/implementation/scanner/scannerlib.dart';
 // TODO(rnystrom): Use "package:" URL (#4968).
 import 'markdown.dart' as md;
 
diff --git a/pkg/dartdoc/lib/dartdoc.dart b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
similarity index 98%
rename from pkg/dartdoc/lib/dartdoc.dart
rename to sdk/lib/_internal/dartdoc/lib/dartdoc.dart
index b4bdecb..fb116a1 100644
--- a/pkg/dartdoc/lib/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
@@ -21,14 +21,13 @@
 import 'dart:uri';
 import 'dart:json';
 
-// TODO(rnystrom): Use "package:" URL (#4968).
-import 'mirrors.dart';
-import 'mirrors_util.dart';
-import 'src/mirrors/dart2js_mirror.dart' as dart2js;
+import '../../compiler/implementation/mirrors/mirrors.dart';
+import '../../compiler/implementation/mirrors/mirrors_util.dart';
+import '../../compiler/implementation/mirrors/dart2js_mirror.dart' as dart2js;
 import 'classify.dart';
 import 'markdown.dart' as md;
-import '../../../lib/compiler/implementation/scanner/scannerlib.dart' as dart2js;
-import '../../../lib/_internal/libraries.dart';
+import '../../compiler/implementation/scanner/scannerlib.dart' as dart2js;
+import '../../libraries.dart';
 
 // TODO(rnystrom): Use "package:" URL (#4968).
 part 'src/dartdoc/comment_map.dart';
@@ -75,7 +74,7 @@
 void cleanOutputDirectory(Path path) {
   final outputDir = new Directory.fromPath(path);
   if (outputDir.existsSync()) {
-    outputDir.deleteRecursivelySync();
+    outputDir.deleteSync(recursive: true);
   }
 
   try {
@@ -128,7 +127,7 @@
 Future<bool> compileScript(int mode, Path outputDir, Path libPath) {
   var clientScript = (mode == MODE_STATIC) ? 'static' : 'live-nav';
   var dartPath = libPath.append(
-      'pkg/dartdoc/lib/src/client/client-$clientScript.dart');
+      'lib/_internal/dartdoc/lib/src/client/client-$clientScript.dart');
   var jsPath = outputDir.append('client-$clientScript.js');
 
   var completer = new Completer<bool>();
@@ -564,7 +563,7 @@
   void cleanup() {
     final dir = new Directory.fromPath(tmpPath);
     if (dir.existsSync()) {
-      dir.deleteRecursivelySync();
+      dir.deleteSync(recursive: true);
     }
   }
 
@@ -625,7 +624,7 @@
       if (!showPrivate && member.isPrivate) continue;
 
       var memberInfo = {};
-      if (member.isField) {
+      if (member.isVariable) {
         memberInfo[KIND] = FIELD;
       } else {
         MethodMirror method = member;
@@ -895,6 +894,9 @@
     listTypes(types, header) {
       if (types == null) return;
 
+      // Filter out injected types. (JavaScriptIndexingBehavior)
+      types = new List.from(types.filter((t) => t.library != null));
+
       var publicTypes;
       if (showPrivate) {
         publicTypes = types;
@@ -1068,7 +1070,7 @@
           }
           if (!inherit) return;
 
-          if (member.isField) {
+          if (member.isVariable) {
             // Fields override both getters and setters.
             memberMap.putIfAbsent(member.simpleName, () => member);
             memberMap.putIfAbsent('${member.simpleName}=', () => member);
@@ -1463,7 +1465,7 @@
   /** Get the doc comment associated with the given library. */
   DocComment getLibraryComment(LibraryMirror library) {
     // Look for a comment for the entire library.
-    final comment = _comments.findLibrary(library.location.source);
+    final comment = _comments.findLibrary(library.location);
     if (comment == null) return null;
     return createDocComment(comment);
   }
@@ -1538,7 +1540,9 @@
     if (type is LibraryMirror) {
       return '${sanitize(type.simpleName)}.html';
     }
-    assert (type is TypeMirror);
+    if (type.library == null) {
+      return '';
+    }
     // Always get the generic type to strip off any type parameters or
     // arguments. If the type isn't generic, genericType returns `this`, so it
     // works for non-generic types too.
@@ -1698,7 +1702,7 @@
    * Remove leading indentation to line up with first line.
    */
   unindentCode(SourceLocation span) {
-    final column = getLocationColumn(span);
+    final column = span.column;
     final lines = span.text.split('\n');
     // TODO(rnystrom): Dirty hack.
     for (var i = 1; i < lines.length; i++) {
diff --git a/pkg/dartdoc/lib/markdown.dart b/sdk/lib/_internal/dartdoc/lib/markdown.dart
similarity index 100%
rename from pkg/dartdoc/lib/markdown.dart
rename to sdk/lib/_internal/dartdoc/lib/markdown.dart
diff --git a/pkg/dartdoc/lib/src/client/client-live-nav.dart b/sdk/lib/_internal/dartdoc/lib/src/client/client-live-nav.dart
similarity index 97%
rename from pkg/dartdoc/lib/src/client/client-live-nav.dart
rename to sdk/lib/_internal/dartdoc/lib/src/client/client-live-nav.dart
index e1e8bfc..4405bab 100644
--- a/pkg/dartdoc/lib/src/client/client-live-nav.dart
+++ b/sdk/lib/_internal/dartdoc/lib/src/client/client-live-nav.dart
@@ -7,7 +7,7 @@
 
 import 'dart:html';
 import 'dart:json';
-import '../../../../../lib/compiler/implementation/source_file.dart';
+import '../../../../compiler/implementation/source_file.dart';
 // TODO(rnystrom): Use "package:" URL (#4968).
 import '../../classify.dart';
 import '../../markdown.dart' as md;
diff --git a/pkg/dartdoc/lib/src/client/client-shared.dart b/sdk/lib/_internal/dartdoc/lib/src/client/client-shared.dart
similarity index 100%
rename from pkg/dartdoc/lib/src/client/client-shared.dart
rename to sdk/lib/_internal/dartdoc/lib/src/client/client-shared.dart
diff --git a/pkg/dartdoc/lib/src/client/client-static.dart b/sdk/lib/_internal/dartdoc/lib/src/client/client-static.dart
similarity index 90%
rename from pkg/dartdoc/lib/src/client/client-static.dart
rename to sdk/lib/_internal/dartdoc/lib/src/client/client-static.dart
index 5bca3b2..ee47dc6 100644
--- a/pkg/dartdoc/lib/src/client/client-static.dart
+++ b/sdk/lib/_internal/dartdoc/lib/src/client/client-static.dart
@@ -7,7 +7,7 @@
 
 import 'dart:html';
 import 'dart:json';
-import '../../../../../lib/compiler/implementation/source_file.dart';
+import '../../../../compiler/implementation/source_file.dart';
 // TODO(rnystrom): Use "package:" URL (#4968).
 import '../../classify.dart';
 
diff --git a/pkg/dartdoc/lib/src/client/dropdown.dart b/sdk/lib/_internal/dartdoc/lib/src/client/dropdown.dart
similarity index 100%
rename from pkg/dartdoc/lib/src/client/dropdown.dart
rename to sdk/lib/_internal/dartdoc/lib/src/client/dropdown.dart
diff --git a/pkg/dartdoc/lib/src/client/search.dart b/sdk/lib/_internal/dartdoc/lib/src/client/search.dart
similarity index 100%
rename from pkg/dartdoc/lib/src/client/search.dart
rename to sdk/lib/_internal/dartdoc/lib/src/client/search.dart
diff --git a/pkg/dartdoc/lib/src/dartdoc/comment_map.dart b/sdk/lib/_internal/dartdoc/lib/src/dartdoc/comment_map.dart
similarity index 83%
rename from pkg/dartdoc/lib/src/dartdoc/comment_map.dart
rename to sdk/lib/_internal/dartdoc/lib/src/dartdoc/comment_map.dart
index 25240d4..77b7e07 100644
--- a/pkg/dartdoc/lib/src/dartdoc/comment_map.dart
+++ b/sdk/lib/_internal/dartdoc/lib/src/dartdoc/comment_map.dart
@@ -18,7 +18,7 @@
    */
   Map<String, Map<int, String>> _comments;
 
-  /** Doc comments before #library() directives. */
+  /** Doc comments before `library` directives. */
   Map<String, String> _libraryComments;
 
   CommentMap()
@@ -33,34 +33,34 @@
   String find(SourceLocation span) {
     if (span == null) return null;
 
-    _ensureFileParsed(span.source);
-    String comment = _comments[span.source.uri.toString()][span.start];
+    _ensureFileParsed(span);
+    String comment = _comments[span.sourceUri.toString()][span.offset];
     assert(comment == null || !comment.trim().isEmpty);
     return comment;
   }
 
   /**
-   * Finds the doc comment associated with the `#library` directive for the
+   * Finds the doc comment associated with the `library` directive for the
    * given file.
    *
    * If a comment is returned, it is guaranteed to be non-empty.
    */
-  String findLibrary(Source source) {
+  String findLibrary(SourceLocation source) {
     _ensureFileParsed(source);
-    String comment = _libraryComments[source.uri.toString()];
+    String comment = _libraryComments[source.sourceUri.toString()];
     assert(comment == null || !comment.trim().isEmpty);
     return comment;
   }
 
-  _ensureFileParsed(Source source) {
-    _comments.putIfAbsent(source.uri.toString(), () =>
+  _ensureFileParsed(SourceLocation source) {
+    _comments.putIfAbsent(source.sourceUri.toString(), () =>
         _parseComments(source));
   }
 
-  _parseComments(Source source) {
+  _parseComments(SourceLocation source) {
     final comments = new Map<int, String>();
 
-    final scanner = new dart2js.StringScanner(source.text,
+    final scanner = new dart2js.StringScanner(source.sourceText,
                                               includeComments: true);
     var lastComment = null;
 
@@ -82,10 +82,10 @@
           }
         }
       } else if (token.kind == dart2js.HASH_TOKEN) {
-        // Look for #library() to find the library comment.
+        // Look for `library` to find the library comment.
         final next = token.next;
         if ((lastComment != null) && (next.stringValue == 'library')) {
-          _libraryComments[source.uri.toString()] = lastComment;
+          _libraryComments[source.sourceUri.toString()] = lastComment;
           lastComment = null;
         }
       } else if (lastComment != null) {
diff --git a/pkg/dartdoc/lib/src/dartdoc/nav.dart b/sdk/lib/_internal/dartdoc/lib/src/dartdoc/nav.dart
similarity index 100%
rename from pkg/dartdoc/lib/src/dartdoc/nav.dart
rename to sdk/lib/_internal/dartdoc/lib/src/dartdoc/nav.dart
diff --git a/pkg/dartdoc/lib/src/dartdoc/utils.dart b/sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart
similarity index 100%
rename from pkg/dartdoc/lib/src/dartdoc/utils.dart
rename to sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart
diff --git a/pkg/dartdoc/lib/src/markdown/ast.dart b/sdk/lib/_internal/dartdoc/lib/src/markdown/ast.dart
similarity index 100%
rename from pkg/dartdoc/lib/src/markdown/ast.dart
rename to sdk/lib/_internal/dartdoc/lib/src/markdown/ast.dart
diff --git a/pkg/dartdoc/lib/src/markdown/block_parser.dart b/sdk/lib/_internal/dartdoc/lib/src/markdown/block_parser.dart
similarity index 100%
rename from pkg/dartdoc/lib/src/markdown/block_parser.dart
rename to sdk/lib/_internal/dartdoc/lib/src/markdown/block_parser.dart
diff --git a/pkg/dartdoc/lib/src/markdown/html_renderer.dart b/sdk/lib/_internal/dartdoc/lib/src/markdown/html_renderer.dart
similarity index 100%
rename from pkg/dartdoc/lib/src/markdown/html_renderer.dart
rename to sdk/lib/_internal/dartdoc/lib/src/markdown/html_renderer.dart
diff --git a/pkg/dartdoc/lib/src/markdown/inline_parser.dart b/sdk/lib/_internal/dartdoc/lib/src/markdown/inline_parser.dart
similarity index 100%
rename from pkg/dartdoc/lib/src/markdown/inline_parser.dart
rename to sdk/lib/_internal/dartdoc/lib/src/markdown/inline_parser.dart
diff --git a/pkg/dartdoc/pubspec.yaml b/sdk/lib/_internal/dartdoc/pubspec.yaml
similarity index 100%
rename from pkg/dartdoc/pubspec.yaml
rename to sdk/lib/_internal/dartdoc/pubspec.yaml
diff --git a/pkg/dartdoc/static/body-bg.png b/sdk/lib/_internal/dartdoc/static/body-bg.png
similarity index 100%
rename from pkg/dartdoc/static/body-bg.png
rename to sdk/lib/_internal/dartdoc/static/body-bg.png
Binary files differ
diff --git a/pkg/dartdoc/static/class.png b/sdk/lib/_internal/dartdoc/static/class.png
similarity index 100%
rename from pkg/dartdoc/static/class.png
rename to sdk/lib/_internal/dartdoc/static/class.png
Binary files differ
diff --git a/pkg/dartdoc/static/content-bg.png b/sdk/lib/_internal/dartdoc/static/content-bg.png
similarity index 100%
rename from pkg/dartdoc/static/content-bg.png
rename to sdk/lib/_internal/dartdoc/static/content-bg.png
Binary files differ
diff --git a/pkg/dartdoc/static/dart-logo-small.png b/sdk/lib/_internal/dartdoc/static/dart-logo-small.png
similarity index 100%
rename from pkg/dartdoc/static/dart-logo-small.png
rename to sdk/lib/_internal/dartdoc/static/dart-logo-small.png
Binary files differ
diff --git a/pkg/dartdoc/static/exception.png b/sdk/lib/_internal/dartdoc/static/exception.png
similarity index 100%
rename from pkg/dartdoc/static/exception.png
rename to sdk/lib/_internal/dartdoc/static/exception.png
Binary files differ
diff --git a/pkg/dartdoc/static/external-link.png b/sdk/lib/_internal/dartdoc/static/external-link.png
similarity index 100%
rename from pkg/dartdoc/static/external-link.png
rename to sdk/lib/_internal/dartdoc/static/external-link.png
Binary files differ
diff --git a/pkg/dartdoc/static/favicon.ico b/sdk/lib/_internal/dartdoc/static/favicon.ico
similarity index 100%
rename from pkg/dartdoc/static/favicon.ico
rename to sdk/lib/_internal/dartdoc/static/favicon.ico
Binary files differ
diff --git a/pkg/dartdoc/static/header-bg.png b/sdk/lib/_internal/dartdoc/static/header-bg.png
similarity index 100%
rename from pkg/dartdoc/static/header-bg.png
rename to sdk/lib/_internal/dartdoc/static/header-bg.png
Binary files differ
diff --git a/pkg/dartdoc/static/interface.png b/sdk/lib/_internal/dartdoc/static/interface.png
similarity index 100%
rename from pkg/dartdoc/static/interface.png
rename to sdk/lib/_internal/dartdoc/static/interface.png
Binary files differ
diff --git a/pkg/dartdoc/static/library.png b/sdk/lib/_internal/dartdoc/static/library.png
similarity index 100%
rename from pkg/dartdoc/static/library.png
rename to sdk/lib/_internal/dartdoc/static/library.png
Binary files differ
diff --git a/pkg/dartdoc/static/styles.css b/sdk/lib/_internal/dartdoc/static/styles.css
similarity index 100%
rename from pkg/dartdoc/static/styles.css
rename to sdk/lib/_internal/dartdoc/static/styles.css
diff --git a/pkg/dartdoc/test/dartdoc_search_test.dart b/sdk/lib/_internal/dartdoc/test/dartdoc_search_test.dart
similarity index 99%
rename from pkg/dartdoc/test/dartdoc_search_test.dart
rename to sdk/lib/_internal/dartdoc/test/dartdoc_search_test.dart
index 0395687..fff9349 100644
--- a/pkg/dartdoc/test/dartdoc_search_test.dart
+++ b/sdk/lib/_internal/dartdoc/test/dartdoc_search_test.dart
@@ -49,4 +49,4 @@
 	testTopLevelVsMembers();
 	testTopLevelFullVsPrefix();
 	testMemberFullVsPrefix();
-}
\ No newline at end of file
+}
diff --git a/pkg/dartdoc/test/dartdoc_test.dart b/sdk/lib/_internal/dartdoc/test/dartdoc_test.dart
similarity index 95%
rename from pkg/dartdoc/test/dartdoc_test.dart
rename to sdk/lib/_internal/dartdoc/test/dartdoc_test.dart
index 9b176ee..27fc89a 100644
--- a/pkg/dartdoc/test/dartdoc_test.dart
+++ b/sdk/lib/_internal/dartdoc/test/dartdoc_test.dart
@@ -3,14 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Unit tests for doc.
-#library('dartdoc_tests');
+library dartdocTests;
 
 // TODO(rnystrom): Use "package:" URL (#4968).
-#import('../lib/dartdoc.dart', prefix: 'dd');
-#import('../lib/markdown.dart', prefix: 'md');
+import '../lib/dartdoc.dart' as dd;
+import '../lib/markdown.dart' as md;
 
 // TODO(rnystrom): Better path to unittest.
-#import('../../unittest/unittest.dart');
+import '../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   group('countOccurrences', () {
diff --git a/pkg/dartdoc/test/markdown_test.dart b/sdk/lib/_internal/dartdoc/test/markdown_test.dart
similarity index 99%
rename from pkg/dartdoc/test/markdown_test.dart
rename to sdk/lib/_internal/dartdoc/test/markdown_test.dart
index 0dbef79..ceb6813 100644
--- a/pkg/dartdoc/test/markdown_test.dart
+++ b/sdk/lib/_internal/dartdoc/test/markdown_test.dart
@@ -3,13 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Unit tests for markdown.
-#library('markdown_tests');
+library markdownTests;
 
 // TODO(rnystrom): Use "package:" URL (#4968).
-#import('../lib/markdown.dart');
+import '../lib/markdown.dart';
 
 // TODO(rnystrom): Better path to unittest.
-#import('../../unittest/unittest.dart');
+import '../../../pkg/unittest/lib/unittest.dart';
 
 /// Most of these tests are based on observing how showdown behaves:
 /// http://softwaremaniacs.org/playground/showdown-highlight/
diff --git a/lib/_internal/libraries.dart b/sdk/lib/_internal/libraries.dart
similarity index 85%
rename from lib/_internal/libraries.dart
rename to sdk/lib/_internal/libraries.dart
index bcd7386..6669eaa4 100644
--- a/lib/_internal/libraries.dart
+++ b/sdk/lib/_internal/libraries.dart
@@ -28,12 +28,12 @@
 
   "core": const LibraryInfo(
       "core/core.dart",
-      dart2jsPatchPath: "compiler/implementation/lib/core_patch.dart"),
+      dart2jsPatchPath: "_internal/compiler/implementation/lib/core_patch.dart"),
 
   "coreimpl": const LibraryInfo(
       "coreimpl/coreimpl.dart",
       implementation: true,
-      dart2jsPatchPath: "compiler/implementation/lib/coreimpl_patch.dart"),
+      dart2jsPatchPath: "_internal/compiler/implementation/lib/coreimpl_patch.dart"),
 
   "crypto": const LibraryInfo(
       "crypto/crypto.dart"),
@@ -46,22 +46,22 @@
   "io": const LibraryInfo(
       "io/io.dart",
       category: "Server",
-      dart2jsPatchPath: "compiler/implementation/lib/io_patch.dart"),
+      dart2jsPatchPath: "_internal/compiler/implementation/lib/io_patch.dart"),
 
   "isolate": const LibraryInfo(
       "isolate/isolate.dart",
-      dart2jsPatchPath: "compiler/implementation/lib/isolate_patch.dart"),
+      dart2jsPatchPath: "_internal/compiler/implementation/lib/isolate_patch.dart"),
 
   "json": const LibraryInfo(
       "json/json.dart"),
 
   "math": const LibraryInfo(
       "math/math.dart",
-      dart2jsPatchPath: "compiler/implementation/lib/math_patch.dart"),
+      dart2jsPatchPath: "_internal/compiler/implementation/lib/math_patch.dart"),
 
   "mirrors": const LibraryInfo(
       "mirrors/mirrors.dart",
-      dart2jsPath: "compiler/implementation/lib/mirrors.dart"),
+      dart2jsPath: "_internal/compiler/implementation/lib/mirrors.dart"),
 
   "nativewrappers": const LibraryInfo(
       "html/dartium/nativewrappers.dart",
@@ -73,7 +73,7 @@
   "scalarlist": const LibraryInfo(
       "scalarlist/scalarlist.dart",
       category: "Server",
-      dart2jsPatchPath: "compiler/implementation/lib/scalarlist_patch.dart"),
+      dart2jsPatchPath: "_internal/compiler/implementation/lib/scalarlist_patch.dart"),
 
   "uri": const LibraryInfo(
       "uri/uri.dart"),
@@ -82,13 +82,13 @@
       "utf/utf.dart"),
 
   "_js_helper": const LibraryInfo(
-      "compiler/implementation/lib/js_helper.dart",
+      "_internal/compiler/implementation/lib/js_helper.dart",
       category: "Internal",
       documented: false,
       platforms: DART2JS_PLATFORM),
 
   "_interceptors": const LibraryInfo(
-      "compiler/implementation/lib/interceptors.dart",
+      "_internal/compiler/implementation/lib/interceptors.dart",
       category: "Internal",
       documented: false,
       platforms: DART2JS_PLATFORM),
diff --git a/lib/collection/arrays.dart b/sdk/lib/collection/arrays.dart
similarity index 100%
rename from lib/collection/arrays.dart
rename to sdk/lib/collection/arrays.dart
diff --git a/lib/collection/collection.dart b/sdk/lib/collection/collection.dart
similarity index 100%
rename from lib/collection/collection.dart
rename to sdk/lib/collection/collection.dart
diff --git a/lib/collection/collection_sources.gypi b/sdk/lib/collection/collection_sources.gypi
similarity index 100%
rename from lib/collection/collection_sources.gypi
rename to sdk/lib/collection/collection_sources.gypi
diff --git a/lib/collection/collections.dart b/sdk/lib/collection/collections.dart
similarity index 100%
rename from lib/collection/collections.dart
rename to sdk/lib/collection/collections.dart
diff --git a/lib/collection/maps.dart b/sdk/lib/collection/maps.dart
similarity index 100%
rename from lib/collection/maps.dart
rename to sdk/lib/collection/maps.dart
diff --git a/lib/collection/splay_tree.dart b/sdk/lib/collection/splay_tree.dart
similarity index 100%
rename from lib/collection/splay_tree.dart
rename to sdk/lib/collection/splay_tree.dart
diff --git a/lib/core/bool.dart b/sdk/lib/core/bool.dart
similarity index 100%
rename from lib/core/bool.dart
rename to sdk/lib/core/bool.dart
diff --git a/lib/core/collection.dart b/sdk/lib/core/collection.dart
similarity index 100%
rename from lib/core/collection.dart
rename to sdk/lib/core/collection.dart
diff --git a/lib/core/comparable.dart b/sdk/lib/core/comparable.dart
similarity index 100%
rename from lib/core/comparable.dart
rename to sdk/lib/core/comparable.dart
diff --git a/lib/core/core.dart b/sdk/lib/core/core.dart
similarity index 100%
rename from lib/core/core.dart
rename to sdk/lib/core/core.dart
diff --git a/lib/core/corelib_sources.gypi b/sdk/lib/core/corelib_sources.gypi
similarity index 100%
rename from lib/core/corelib_sources.gypi
rename to sdk/lib/core/corelib_sources.gypi
diff --git a/lib/core/date.dart b/sdk/lib/core/date.dart
similarity index 100%
rename from lib/core/date.dart
rename to sdk/lib/core/date.dart
diff --git a/lib/core/double.dart b/sdk/lib/core/double.dart
similarity index 100%
rename from lib/core/double.dart
rename to sdk/lib/core/double.dart
diff --git a/lib/core/duration.dart b/sdk/lib/core/duration.dart
similarity index 100%
rename from lib/core/duration.dart
rename to sdk/lib/core/duration.dart
diff --git a/lib/core/errors.dart b/sdk/lib/core/errors.dart
similarity index 79%
rename from lib/core/errors.dart
rename to sdk/lib/core/errors.dart
index c516426..fec2de5 100644
--- a/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -27,11 +27,11 @@
 /**
  * Error thrown when a function is passed an unacceptable argument.
  */
- class ArgumentError implements Error {
+class ArgumentError implements Error {
   final message;
 
   /** The [message] describes the erroneous argument. */
-  const ArgumentError([this.message = ""]);
+  const ArgumentError([this.message]);
 
   String toString() {
     if (message != null) {
@@ -44,13 +44,17 @@
 /**
  * Exception thrown because of an index outside of the valid range.
  *
- * Temporarily extends [Exception] for backwards compatiblity.
+ * Temporarily implements [IndexOutOfRangeException] for backwards compatiblity.
  */
-class RangeError extends ArgumentError implements Exception {
+class RangeError extends ArgumentError implements IndexOutOfRangeException {
   // TODO(lrn): This constructor should be called only with string values.
   // It currently isn't in all cases.
-  /** Create a new [RangeError] with the given [message]. */
-  RangeError(var message) : super("$message");
+  /**
+   * Create a new [RangeError] with the given [message].
+   *
+   * Temporarily made const for backwards compatibilty.
+   */
+  const RangeError(var message) : super(message);
 
   /** Create a new [RangeError] with a message for the given [value]. */
   RangeError.value(num value) : super("value $value");
@@ -63,11 +67,10 @@
  *
  * This class allows code throwing the old [IndexOutOfRangeException] to
  * work until they change to the new [RangeError] name.
- * Code **catching** IndexOutOfRangeException will fail to catch
- * the [RangeError] objects that are now thrown.
+ * Constructor of [RangeError] is const only to support this interface.
  */
-class IndexOutOfRangeException extends ArgumentError {
-  IndexOutOfRangeException(var message) : super(message);
+interface IndexOutOfRangeException extends Exception default RangeError {
+  const IndexOutOfRangeException(var message);
 }
 
 
@@ -206,6 +209,35 @@
   String toString() => "Unsupported operation: $message";
 }
 
+
+/**
+ * Thrown by operations that have not been implemented yet.
+ *
+ * This [Error] is thrown by unfinished code that hasn't yet implemented
+ * all the features it needs.
+ *
+ * If a class is not intending to implement the feature, it should throw
+ * an [UnsupportedError] instead. This error is only intended for
+ * use during development.
+ *
+ * This class temporarily implements [Exception] for backwards compatibility.
+ * The constructor is temporarily const to support [NotImplementedException].
+ */
+class UnimplementedError implements UnsupportedError, NotImplementedException {
+  final String message;
+  const UnimplementedError([String this.message]);
+  String toString() => (this.message !== null
+                        ? "UnimplementedError: $message"
+                        : "UnimplementedError");
+}
+
+
+/** Temporary class added for backwards compatibility. Will be removed. */
+interface NotImplementedException extends Exception default UnimplementedError {
+  const NotImplementedException([String message]);
+}
+
+
 /**
  * The operation was not allowed by the current state of the object.
  *
diff --git a/lib/core/exceptions.dart b/sdk/lib/core/exceptions.dart
similarity index 88%
rename from lib/core/exceptions.dart
rename to sdk/lib/core/exceptions.dart
index e498567..2d2bc43 100644
--- a/lib/core/exceptions.dart
+++ b/sdk/lib/core/exceptions.dart
@@ -61,15 +61,6 @@
 }
 
 
-class NotImplementedException implements Exception {
-  const NotImplementedException([String message]) : this._message = message;
-  String toString() => (this._message !== null
-                        ? "NotImplementedException: $_message"
-                        : "NotImplementedException");
-  final String _message;
-}
-
-
 class IllegalJSRegExpException implements Exception {
   const IllegalJSRegExpException(String this._pattern, String this._errmsg);
   String toString() => "IllegalJSRegExpException: '$_pattern' '$_errmsg'";
diff --git a/lib/core/expando.dart b/sdk/lib/core/expando.dart
similarity index 100%
rename from lib/core/expando.dart
rename to sdk/lib/core/expando.dart
diff --git a/lib/core/expect.dart b/sdk/lib/core/expect.dart
similarity index 100%
rename from lib/core/expect.dart
rename to sdk/lib/core/expect.dart
diff --git a/lib/core/function.dart b/sdk/lib/core/function.dart
similarity index 100%
rename from lib/core/function.dart
rename to sdk/lib/core/function.dart
diff --git a/lib/core/future.dart b/sdk/lib/core/future.dart
similarity index 100%
rename from lib/core/future.dart
rename to sdk/lib/core/future.dart
diff --git a/lib/core/future_impl.dart b/sdk/lib/core/future_impl.dart
similarity index 100%
rename from lib/core/future_impl.dart
rename to sdk/lib/core/future_impl.dart
diff --git a/lib/core/hashable.dart b/sdk/lib/core/hashable.dart
similarity index 100%
rename from lib/core/hashable.dart
rename to sdk/lib/core/hashable.dart
diff --git a/lib/core/identical.dart b/sdk/lib/core/identical.dart
similarity index 100%
rename from lib/core/identical.dart
rename to sdk/lib/core/identical.dart
diff --git a/lib/core/int.dart b/sdk/lib/core/int.dart
similarity index 100%
rename from lib/core/int.dart
rename to sdk/lib/core/int.dart
diff --git a/lib/core/invocation_mirror.dart b/sdk/lib/core/invocation_mirror.dart
similarity index 100%
rename from lib/core/invocation_mirror.dart
rename to sdk/lib/core/invocation_mirror.dart
diff --git a/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
similarity index 100%
rename from lib/core/iterable.dart
rename to sdk/lib/core/iterable.dart
diff --git a/lib/core/iterator.dart b/sdk/lib/core/iterator.dart
similarity index 97%
rename from lib/core/iterator.dart
rename to sdk/lib/core/iterator.dart
index 2e324f6..5d5e979 100644
--- a/lib/core/iterator.dart
+++ b/sdk/lib/core/iterator.dart
@@ -20,5 +20,5 @@
   /**
    * Returns whether the [Iterator] has elements left.
    */
-  bool hasNext;
+  bool get hasNext;
 }
diff --git a/lib/core/list.dart b/sdk/lib/core/list.dart
similarity index 100%
rename from lib/core/list.dart
rename to sdk/lib/core/list.dart
diff --git a/lib/coreimpl/hash_map_set.dart b/sdk/lib/core/map.dart
similarity index 60%
rename from lib/coreimpl/hash_map_set.dart
rename to sdk/lib/core/map.dart
index d696150..60db6ce 100644
--- a/lib/coreimpl/hash_map_set.dart
+++ b/sdk/lib/core/map.dart
@@ -1,9 +1,129 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/**
+ * A [Map] is an associative container, mapping a key to a value.
+ * Null values are supported, but null keys are not.
+ */
+abstract class Map<K, V> {
+  /**
+   * Creates a map with the default implementation.
+   */
+  factory Map() => new _HashMapImpl<K, V>();
+
+  /**
+   * Creates a [Map] that contains all key value pairs of [other].
+   */
+  factory Map.from(Map<K, V> other) => new _HashMapImpl<K, V>.from(other);
+
+
+  /**
+   * Returns whether this map contains the given [value].
+   */
+  bool containsValue(V value);
+
+  /**
+   * Returns whether this map contains the given [key].
+   */
+  bool containsKey(K key);
+
+  /**
+   * Returns the value for the given [key] or null if [key] is not
+   * in the map. Because null values are supported, one should either
+   * use containsKey to distinguish between an absent key and a null
+   * value, or use the [putIfAbsent] method.
+   */
+  V operator [](K key);
+
+  /**
+   * Associates the [key] with the given [value].
+   */
+  void operator []=(K key, V value);
+
+  /**
+   * If [key] is not associated to a value, calls [ifAbsent] and
+   * updates the map by mapping [key] to the value returned by
+   * [ifAbsent]. Returns the value in the map.
+   */
+  V putIfAbsent(K key, V ifAbsent());
+
+  /**
+   * Removes the association for the given [key]. Returns the value for
+   * [key] in the map or null if [key] is not in the map. Note that values
+   * can be null and a returned null value does not always imply that the
+   * key is absent.
+   */
+  V remove(K key);
+
+  /**
+   * Removes all pairs from the map.
+   */
+  void clear();
+
+  /**
+   * Applies [f] to each {key, value} pair of the map.
+   */
+  void forEach(void f(K key, V value));
+
+  /**
+   * Returns a collection containing all the keys in the map.
+   */
+  Collection<K> get keys;
+
+  /**
+   * Returns a collection containing all the values in the map.
+   */
+  Collection<V> get values;
+
+  /**
+   * The number of {key, value} pairs in the map.
+   */
+  int get length;
+
+  /**
+   * Returns true if there is no {key, value} pair in the map.
+   */
+  bool get isEmpty;
+}
+
+/**
+ * Hash map version of the [Map] interface. A [HashMap] does not
+ * provide any guarantees on the order of keys and values in [keys]
+ * and [values].
+ */
+abstract class HashMap<K, V> extends Map<K, V> {
+  /**
+   * Creates a map with the default implementation.
+   */
+  factory HashMap() => new _HashMapImpl<K, V>();
+
+  /**
+   * Creates a [HashMap] that contains all key value pairs of [other].
+   */
+  factory HashMap.from(Map<K, V> other) => new _HashMapImpl<K, V>.from(other);
+}
+
+/**
+ * Hash map version of the [Map] interface that preserves insertion
+ * order.
+ */
+abstract class LinkedHashMap<K, V> extends HashMap<K, V> {
+  /**
+   * Creates a map with the default implementation.
+   */
+  factory LinkedHashMap() => new _LinkedHashMapImpl<K, V>();
+
+  /**
+   * Creates a [LinkedHashMap] that contains all key value pairs of [other].
+   */
+  factory LinkedHashMap.from(Map<K, V> other)
+    => new _LinkedHashMapImpl<K, V>.from(other);
+}
+
+
 // Hash map implementation with open addressing and quadratic probing.
-class HashMapImplementation<K, V> implements HashMap<K, V> {
+class _HashMapImpl<K, V> implements HashMap<K, V> {
 
   // The [_keys] list contains the keys inserted in the map.
   // The [_keys] list must be a raw list because it
@@ -42,7 +162,7 @@
   // The initial capacity of a hash map.
   static const int _INITIAL_CAPACITY = 8;  // must be power of 2
 
-  HashMapImplementation() {
+  _HashMapImpl() {
     _numberOfEntries = 0;
     _numberOfDeleted = 0;
     _loadLimit = _computeLoadLimit(_INITIAL_CAPACITY);
@@ -50,8 +170,8 @@
     _values = new List<V>(_INITIAL_CAPACITY);
   }
 
-  factory HashMapImplementation.from(Map<K, V> other) {
-    Map<K, V> result = new HashMapImplementation<K, V>();
+  factory _HashMapImpl.from(Map<K, V> other) {
+    Map<K, V> result = new _HashMapImpl<K, V>();
     other.forEach((K key, V value) { result[key] = value; });
     return result;
   }
@@ -276,174 +396,6 @@
   }
 }
 
-class HashSetImplementation<E > implements HashSet<E> {
-
-  HashSetImplementation() {
-    _backingMap = new HashMapImplementation<E, E>();
-  }
-
-  factory HashSetImplementation.from(Iterable<E> other) {
-    Set<E> set = new HashSetImplementation<E>();
-    for (final e in other) {
-      set.add(e);
-    }
-    return set;
-  }
-
-  void clear() {
-    _backingMap.clear();
-  }
-
-  void add(E value) {
-    _backingMap[value] = value;
-  }
-
-  bool contains(E value) {
-    return _backingMap.containsKey(value);
-  }
-
-  bool remove(E value) {
-    if (!_backingMap.containsKey(value)) return false;
-    _backingMap.remove(value);
-    return true;
-  }
-
-  void addAll(Collection<E> collection) {
-    collection.forEach(void _(E value) {
-      add(value);
-    });
-  }
-
-  Set<E> intersection(Collection<E> collection) {
-    Set<E> result = new Set<E>();
-    collection.forEach(void _(E value) {
-      if (contains(value)) result.add(value);
-    });
-    return result;
-  }
-
-  bool isSubsetOf(Collection<E> other) {
-    return new Set<E>.from(other).containsAll(this);
-  }
-
-  void removeAll(Collection<E> collection) {
-    collection.forEach(void _(E value) {
-      remove(value);
-    });
-  }
-
-  bool containsAll(Collection<E> collection) {
-    return collection.every(bool _(E value) {
-      return contains(value);
-    });
-  }
-
-  void forEach(void f(E element)) {
-    _backingMap.forEach(void _(E key, E value) {
-      f(key);
-    });
-  }
-
-  Set map(f(E element)) {
-    Set result = new Set();
-    _backingMap.forEach(void _(E key, E value) {
-      result.add(f(key));
-    });
-    return result;
-  }
-
-  Dynamic reduce(Dynamic initialValue,
-                 Dynamic combine(Dynamic previousValue, E element)) {
-    return Collections.reduce(this, initialValue, combine);
-  }
-
-  Set<E> filter(bool f(E element)) {
-    Set<E> result = new Set<E>();
-    _backingMap.forEach(void _(E key, E value) {
-      if (f(key)) result.add(key);
-    });
-    return result;
-  }
-
-  bool every(bool f(E element)) {
-    Collection<E> keys = _backingMap.keys;
-    return keys.every(f);
-  }
-
-  bool some(bool f(E element)) {
-    Collection<E> keys = _backingMap.keys;
-    return keys.some(f);
-  }
-
-  bool get isEmpty {
-    return _backingMap.isEmpty;
-  }
-
-  int get length {
-    return _backingMap.length;
-  }
-
-  Iterator<E> iterator() {
-    return new HashSetIterator<E>(this);
-  }
-
-  String toString() {
-    return Collections.collectionToString(this);
-  }
-
-  // The map backing this set. The associations in this map are all
-  // of the form element -> element. If a value is not in the map,
-  // then it is not in the set.
-  HashMapImplementation<E, E> _backingMap;
-}
-
-class HashSetIterator<E> implements Iterator<E> {
-
-  // TODO(4504458): Replace set_ with set.
-  HashSetIterator(HashSetImplementation<E> set_)
-    : _nextValidIndex = -1,
-      _entries = set_._backingMap._keys {
-    _advance();
-  }
-
-  bool get hasNext {
-    if (_nextValidIndex >= _entries.length) return false;
-    if (_entries[_nextValidIndex] === HashMapImplementation._DELETED_KEY) {
-      // This happens in case the set was modified in the meantime.
-      // A modification on the set may make this iterator misbehave,
-      // but we should never return the sentinel.
-      _advance();
-    }
-    return _nextValidIndex < _entries.length;
-  }
-
-  E next() {
-    if (!hasNext) {
-      throw new StateError("No more elements");
-    }
-    E res = _entries[_nextValidIndex];
-    _advance();
-    return res;
-  }
-
-  void _advance() {
-    int length = _entries.length;
-    var entry;
-    final deletedKey = HashMapImplementation._DELETED_KEY;
-    do {
-      if (++_nextValidIndex >= length) break;
-      entry = _entries[_nextValidIndex];
-    } while ((entry === null) || (entry === deletedKey));
-  }
-
-  // The entries in the set. May contain null or the sentinel value.
-  List<E> _entries;
-
-  // The next valid index in [_entries] or the length of [entries_].
-  // If it is the length of [_entries], calling [hasNext] on the
-  // iterator will return false.
-  int _nextValidIndex;
-}
 
 /**
  * A singleton sentinel used to represent when a key is deleted from the map.
@@ -454,3 +406,121 @@
 class _DeletedKeySentinel {
   const _DeletedKeySentinel();
 }
+
+
+/**
+ * This class represents a pair of two objects, used by LinkedHashMap
+ * to store a {key, value} in a list.
+ */
+class _KeyValuePair<K, V> {
+  _KeyValuePair(this.key, this.value) {}
+
+  final K key;
+  V value;
+}
+
+/**
+ * A LinkedHashMap is a hash map that preserves the insertion order
+ * when iterating over the keys or the values. Updating the value of a
+ * key does not change the order.
+ */
+class _LinkedHashMapImpl<K, V> implements LinkedHashMap<K, V> {
+  DoubleLinkedQueue<_KeyValuePair<K, V>> _list;
+  HashMap<K, DoubleLinkedQueueEntry<_KeyValuePair<K, V>>> _map;
+
+  _LinkedHashMapImpl() {
+    _map = new HashMap<K, DoubleLinkedQueueEntry<_KeyValuePair<K, V>>>();
+    _list = new DoubleLinkedQueue<_KeyValuePair<K, V>>();
+  }
+
+  factory _LinkedHashMapImpl.from(Map<K, V> other) {
+    Map<K, V> result = new _LinkedHashMapImpl<K, V>();
+    other.forEach((K key, V value) { result[key] = value; });
+    return result;
+  }
+
+  void operator []=(K key, V value) {
+    if (_map.containsKey(key)) {
+      _map[key].element.value = value;
+    } else {
+      _list.addLast(new _KeyValuePair<K, V>(key, value));
+      _map[key] = _list.lastEntry();
+    }
+  }
+
+  V operator [](K key) {
+    DoubleLinkedQueueEntry<_KeyValuePair<K, V>> entry = _map[key];
+    if (entry === null) return null;
+    return entry.element.value;
+  }
+
+  V remove(K key) {
+    DoubleLinkedQueueEntry<_KeyValuePair<K, V>> entry = _map.remove(key);
+    if (entry === null) return null;
+    entry.remove();
+    return entry.element.value;
+  }
+
+  V putIfAbsent(K key, V ifAbsent()) {
+    V value = this[key];
+    if ((this[key] === null) && !(containsKey(key))) {
+      value = ifAbsent();
+      this[key] = value;
+    }
+    return value;
+  }
+
+  Collection<K> get keys {
+    List<K> list = new List<K>(length);
+    int index = 0;
+    _list.forEach(void _(_KeyValuePair<K, V> entry) {
+      list[index++] = entry.key;
+    });
+    assert(index == length);
+    return list;
+  }
+
+
+  Collection<V> get values {
+    List<V> list = new List<V>(length);
+    int index = 0;
+    _list.forEach(void _(_KeyValuePair<K, V> entry) {
+      list[index++] = entry.value;
+    });
+    assert(index == length);
+    return list;
+  }
+
+  void forEach(void f(K key, V value)) {
+    _list.forEach(void _(_KeyValuePair<K, V> entry) {
+      f(entry.key, entry.value);
+    });
+  }
+
+  bool containsKey(K key) {
+    return _map.containsKey(key);
+  }
+
+  bool containsValue(V value) {
+    return _list.some(bool _(_KeyValuePair<K, V> entry) {
+      return (entry.value == value);
+    });
+  }
+
+  int get length {
+    return _map.length;
+  }
+
+  bool get isEmpty {
+    return length == 0;
+  }
+
+  void clear() {
+    _map.clear();
+    _list.clear();
+  }
+
+  String toString() {
+    return Maps.mapToString(this);
+  }
+}
diff --git a/lib/core/num.dart b/sdk/lib/core/num.dart
similarity index 100%
rename from lib/core/num.dart
rename to sdk/lib/core/num.dart
diff --git a/lib/core/object.dart b/sdk/lib/core/object.dart
similarity index 100%
rename from lib/core/object.dart
rename to sdk/lib/core/object.dart
diff --git a/lib/core/options.dart b/sdk/lib/core/options.dart
similarity index 100%
rename from lib/core/options.dart
rename to sdk/lib/core/options.dart
diff --git a/lib/core/pattern.dart b/sdk/lib/core/pattern.dart
similarity index 100%
rename from lib/core/pattern.dart
rename to sdk/lib/core/pattern.dart
diff --git a/lib/core/print.dart b/sdk/lib/core/print.dart
similarity index 100%
rename from lib/core/print.dart
rename to sdk/lib/core/print.dart
diff --git a/lib/core/queue.dart b/sdk/lib/core/queue.dart
similarity index 100%
rename from lib/core/queue.dart
rename to sdk/lib/core/queue.dart
diff --git a/lib/core/regexp.dart b/sdk/lib/core/regexp.dart
similarity index 100%
rename from lib/core/regexp.dart
rename to sdk/lib/core/regexp.dart
diff --git a/lib/core/sequences.dart b/sdk/lib/core/sequences.dart
similarity index 100%
rename from lib/core/sequences.dart
rename to sdk/lib/core/sequences.dart
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart
new file mode 100644
index 0000000..7c1f2a7
--- /dev/null
+++ b/sdk/lib/core/set.dart
@@ -0,0 +1,247 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * This class is the public interface of a set. A set is a collection
+ * without duplicates.
+ */
+abstract class Set<E> extends Collection<E> {
+  factory Set() => new _HashSetImpl<E>();
+
+  /**
+   * Creates a [Set] that contains all elements of [other].
+   */
+  factory Set.from(Iterable<E> other) => new _HashSetImpl<E>.from(other);
+
+  /**
+   * Returns true if [value] is in the set.
+   */
+  bool contains(E value);
+
+  /**
+   * Adds [value] into the set. The method has no effect if
+   * [value] was already in the set.
+   */
+  void add(E value);
+
+  /**
+   * Removes [value] from the set. Returns true if [value] was
+   * in the set. Returns false otherwise. The method has no effect
+   * if [value] value was not in the set.
+   */
+  bool remove(E value);
+
+  /**
+   * Adds all the elements of the given collection to the set.
+   */
+  void addAll(Collection<E> collection);
+
+  /**
+   * Removes all the elements of the given collection from the set.
+   */
+  void removeAll(Collection<E> collection);
+
+  /**
+   * Returns true if [collection] contains all the elements of this
+   * collection.
+   */
+  bool isSubsetOf(Collection<E> collection);
+
+  /**
+   * Returns true if this collection contains all the elements of
+   * [collection].
+   */
+  bool containsAll(Collection<E> collection);
+
+  /**
+   * Returns a new set which is the intersection between this set and
+   * the given collection.
+   */
+  Set<E> intersection(Collection<E> other);
+
+  /**
+   * Removes all elements in the set.
+   */
+  void clear();
+
+}
+
+abstract class HashSet<E> extends Set<E> {
+  factory HashSet() => new _HashSetImpl<E>();
+
+  /**
+   * Creates a [Set] that contains all elements of [other].
+   */
+  factory HashSet.from(Iterable<E> other) => new _HashSetImpl<E>.from(other);
+}
+
+
+class _HashSetImpl<E> implements HashSet<E> {
+
+  _HashSetImpl() {
+    _backingMap = new _HashMapImpl<E, E>();
+  }
+
+  factory _HashSetImpl.from(Iterable<E> other) {
+    Set<E> set = new _HashSetImpl<E>();
+    for (final e in other) {
+      set.add(e);
+    }
+    return set;
+  }
+
+  void clear() {
+    _backingMap.clear();
+  }
+
+  void add(E value) {
+    _backingMap[value] = value;
+  }
+
+  bool contains(E value) {
+    return _backingMap.containsKey(value);
+  }
+
+  bool remove(E value) {
+    if (!_backingMap.containsKey(value)) return false;
+    _backingMap.remove(value);
+    return true;
+  }
+
+  void addAll(Collection<E> collection) {
+    collection.forEach(void _(E value) {
+      add(value);
+    });
+  }
+
+  Set<E> intersection(Collection<E> collection) {
+    Set<E> result = new Set<E>();
+    collection.forEach(void _(E value) {
+      if (contains(value)) result.add(value);
+    });
+    return result;
+  }
+
+  bool isSubsetOf(Collection<E> other) {
+    return new Set<E>.from(other).containsAll(this);
+  }
+
+  void removeAll(Collection<E> collection) {
+    collection.forEach(void _(E value) {
+      remove(value);
+    });
+  }
+
+  bool containsAll(Collection<E> collection) {
+    return collection.every(bool _(E value) {
+      return contains(value);
+    });
+  }
+
+  void forEach(void f(E element)) {
+    _backingMap.forEach(void _(E key, E value) {
+      f(key);
+    });
+  }
+
+  Set map(f(E element)) {
+    Set result = new Set();
+    _backingMap.forEach(void _(E key, E value) {
+      result.add(f(key));
+    });
+    return result;
+  }
+
+  Dynamic reduce(Dynamic initialValue,
+                 Dynamic combine(Dynamic previousValue, E element)) {
+    return Collections.reduce(this, initialValue, combine);
+  }
+
+  Set<E> filter(bool f(E element)) {
+    Set<E> result = new Set<E>();
+    _backingMap.forEach(void _(E key, E value) {
+      if (f(key)) result.add(key);
+    });
+    return result;
+  }
+
+  bool every(bool f(E element)) {
+    Collection<E> keys = _backingMap.keys;
+    return keys.every(f);
+  }
+
+  bool some(bool f(E element)) {
+    Collection<E> keys = _backingMap.keys;
+    return keys.some(f);
+  }
+
+  bool get isEmpty {
+    return _backingMap.isEmpty;
+  }
+
+  int get length {
+    return _backingMap.length;
+  }
+
+  Iterator<E> iterator() {
+    return new _HashSetIterator<E>(this);
+  }
+
+  String toString() {
+    return Collections.collectionToString(this);
+  }
+
+  // The map backing this set. The associations in this map are all
+  // of the form element -> element. If a value is not in the map,
+  // then it is not in the set.
+  _HashMapImpl<E, E> _backingMap;
+}
+
+class _HashSetIterator<E> implements Iterator<E> {
+
+  // TODO(4504458): Replace set_ with set.
+  _HashSetIterator(_HashSetImpl<E> set_)
+    : _nextValidIndex = -1,
+      _entries = set_._backingMap._keys {
+    _advance();
+  }
+
+  bool get hasNext {
+    if (_nextValidIndex >= _entries.length) return false;
+    if (identical(_entries[_nextValidIndex], _HashMapImpl._DELETED_KEY)) {
+      // This happens in case the set was modified in the meantime.
+      // A modification on the set may make this iterator misbehave,
+      // but we should never return the sentinel.
+      _advance();
+    }
+    return _nextValidIndex < _entries.length;
+  }
+
+  E next() {
+    if (!hasNext) {
+      throw new StateError("No more elements");
+    }
+    E res = _entries[_nextValidIndex];
+    _advance();
+    return res;
+  }
+
+  void _advance() {
+    int length = _entries.length;
+    var entry;
+    final deletedKey = _HashMapImpl._DELETED_KEY;
+    do {
+      if (++_nextValidIndex >= length) break;
+      entry = _entries[_nextValidIndex];
+    } while ((entry === null) || (entry === deletedKey));
+  }
+
+  // The entries in the set. May contain null or the sentinel value.
+  List<E> _entries;
+
+  // The next valid index in [_entries] or the length of [entries_].
+  // If it is the length of [_entries], calling [hasNext] on the
+  // iterator will return false.
+  int _nextValidIndex;
+}
diff --git a/lib/core/sort.dart b/sdk/lib/core/sort.dart
similarity index 100%
rename from lib/core/sort.dart
rename to sdk/lib/core/sort.dart
diff --git a/lib/core/stopwatch.dart b/sdk/lib/core/stopwatch.dart
similarity index 100%
rename from lib/core/stopwatch.dart
rename to sdk/lib/core/stopwatch.dart
diff --git a/lib/core/string.dart b/sdk/lib/core/string.dart
similarity index 100%
rename from lib/core/string.dart
rename to sdk/lib/core/string.dart
diff --git a/lib/core/string_buffer.dart b/sdk/lib/core/string_buffer.dart
similarity index 100%
rename from lib/core/string_buffer.dart
rename to sdk/lib/core/string_buffer.dart
diff --git a/lib/core/strings.dart b/sdk/lib/core/strings.dart
similarity index 100%
rename from lib/core/strings.dart
rename to sdk/lib/core/strings.dart
diff --git a/lib/core/type.dart b/sdk/lib/core/type.dart
similarity index 100%
rename from lib/core/type.dart
rename to sdk/lib/core/type.dart
diff --git a/lib/coreimpl/coreimpl.dart b/sdk/lib/coreimpl/coreimpl.dart
similarity index 82%
rename from lib/coreimpl/coreimpl.dart
rename to sdk/lib/coreimpl/coreimpl.dart
index c28a72b..067ea2f 100644
--- a/lib/coreimpl/coreimpl.dart
+++ b/sdk/lib/coreimpl/coreimpl.dart
@@ -6,6 +6,4 @@
 
 #import("dart:collection");
 
-#source("hash_map_set.dart");
-#source("linked_hash_map.dart");
 #source("regexp.dart");
diff --git a/lib/coreimpl/corelib_impl_sources.gypi b/sdk/lib/coreimpl/corelib_impl_sources.gypi
similarity index 82%
rename from lib/coreimpl/corelib_impl_sources.gypi
rename to sdk/lib/coreimpl/corelib_impl_sources.gypi
index 82531db..7f6bcbf 100644
--- a/lib/coreimpl/corelib_impl_sources.gypi
+++ b/sdk/lib/coreimpl/corelib_impl_sources.gypi
@@ -4,8 +4,6 @@
 
 {
   'sources': [
-    'hash_map_set.dart',
-    'linked_hash_map.dart',
     'regexp.dart',
   ],
 }
diff --git a/lib/coreimpl/regexp.dart b/sdk/lib/coreimpl/regexp.dart
similarity index 100%
rename from lib/coreimpl/regexp.dart
rename to sdk/lib/coreimpl/regexp.dart
diff --git a/lib/crypto/crypto.dart b/sdk/lib/crypto/crypto.dart
similarity index 100%
rename from lib/crypto/crypto.dart
rename to sdk/lib/crypto/crypto.dart
diff --git a/lib/crypto/crypto_utils.dart b/sdk/lib/crypto/crypto_utils.dart
similarity index 100%
rename from lib/crypto/crypto_utils.dart
rename to sdk/lib/crypto/crypto_utils.dart
diff --git a/lib/crypto/hash_utils.dart b/sdk/lib/crypto/hash_utils.dart
similarity index 100%
rename from lib/crypto/hash_utils.dart
rename to sdk/lib/crypto/hash_utils.dart
diff --git a/lib/crypto/hmac.dart b/sdk/lib/crypto/hmac.dart
similarity index 100%
rename from lib/crypto/hmac.dart
rename to sdk/lib/crypto/hmac.dart
diff --git a/lib/crypto/md5.dart b/sdk/lib/crypto/md5.dart
similarity index 100%
rename from lib/crypto/md5.dart
rename to sdk/lib/crypto/md5.dart
diff --git a/lib/crypto/sha1.dart b/sdk/lib/crypto/sha1.dart
similarity index 100%
rename from lib/crypto/sha1.dart
rename to sdk/lib/crypto/sha1.dart
diff --git a/lib/crypto/sha256.dart b/sdk/lib/crypto/sha256.dart
similarity index 100%
rename from lib/crypto/sha256.dart
rename to sdk/lib/crypto/sha256.dart
diff --git a/lib/html/.gitignore b/sdk/lib/html/.gitignore
similarity index 100%
rename from lib/html/.gitignore
rename to sdk/lib/html/.gitignore
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
new file mode 100644
index 0000000..5c2265e4
--- /dev/null
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -0,0 +1,28811 @@
+library html;
+
+import 'dart:isolate';
+import 'dart:json';
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// DO NOT EDIT
+// Auto-generated dart:html library.
+
+
+
+
+
+
+
+LocalWindow get window => JS('LocalWindow', 'window');
+
+Document get document => JS('Document', 'document');
+
+Element query(String selector) => document.query(selector);
+List<Element> queryAll(String selector) => document.queryAll(selector);
+
+// Workaround for tags like <cite> that lack their own Element subclass --
+// Dart issue 1990.
+class HTMLElement extends Element native "*HTMLElement" {
+}
+
+// Support for Send/ReceivePortSync.
+int _getNewIsolateId() {
+  if (JS('bool', r'!window.$dart$isolate$counter')) {
+    JS('void', r'window.$dart$isolate$counter = 1');
+  }
+  return JS('int', r'window.$dart$isolate$counter++');
+}
+
+// Fast path to invoke JS send port.
+_callPortSync(int id, message) {
+  return JS('var', r'ReceivePortSync.dispatchCall(#, #)', id, message);
+}
+
+// TODO(vsm): Plumb this properly.
+spawnDomFunction(f) => spawnFunction(f);
+
+/// @domName AbstractWorker
+class AbstractWorker extends EventTarget native "*AbstractWorker" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  AbstractWorkerEvents get on =>
+    new AbstractWorkerEvents(this);
+
+  /** @domName AbstractWorker.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName AbstractWorker.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName AbstractWorker.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+class AbstractWorkerEvents extends Events {
+  AbstractWorkerEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get error => this['error'];
+}
+
+/// @domName AnalyserNode
+class AnalyserNode extends AudioNode native "*AnalyserNode" {
+
+  /** @domName AnalyserNode.fftSize */
+  int fftSize;
+
+  /** @domName AnalyserNode.frequencyBinCount */
+  final int frequencyBinCount;
+
+  /** @domName AnalyserNode.maxDecibels */
+  num maxDecibels;
+
+  /** @domName AnalyserNode.minDecibels */
+  num minDecibels;
+
+  /** @domName AnalyserNode.smoothingTimeConstant */
+  num smoothingTimeConstant;
+
+  /** @domName AnalyserNode.getByteFrequencyData */
+  void getByteFrequencyData(Uint8Array array) native;
+
+  /** @domName AnalyserNode.getByteTimeDomainData */
+  void getByteTimeDomainData(Uint8Array array) native;
+
+  /** @domName AnalyserNode.getFloatFrequencyData */
+  void getFloatFrequencyData(Float32Array array) native;
+}
+
+/// @domName HTMLAnchorElement
+class AnchorElement extends Element implements Element native "*HTMLAnchorElement" {
+
+  factory AnchorElement({String href}) {
+    if (!?href) {
+      return _Elements.createAnchorElement();
+    }
+    return _Elements.createAnchorElement(href);
+  }
+
+  /** @domName HTMLAnchorElement.charset */
+  String charset;
+
+  /** @domName HTMLAnchorElement.coords */
+  String coords;
+
+  /** @domName HTMLAnchorElement.download */
+  String download;
+
+  /** @domName HTMLAnchorElement.hash */
+  String hash;
+
+  /** @domName HTMLAnchorElement.host */
+  String host;
+
+  /** @domName HTMLAnchorElement.hostname */
+  String hostname;
+
+  /** @domName HTMLAnchorElement.href */
+  String href;
+
+  /** @domName HTMLAnchorElement.hreflang */
+  String hreflang;
+
+  /** @domName HTMLAnchorElement.name */
+  String name;
+
+  /** @domName HTMLAnchorElement.origin */
+  final String origin;
+
+  /** @domName HTMLAnchorElement.pathname */
+  String pathname;
+
+  /** @domName HTMLAnchorElement.ping */
+  String ping;
+
+  /** @domName HTMLAnchorElement.port */
+  String port;
+
+  /** @domName HTMLAnchorElement.protocol */
+  String protocol;
+
+  /** @domName HTMLAnchorElement.rel */
+  String rel;
+
+  /** @domName HTMLAnchorElement.rev */
+  String rev;
+
+  /** @domName HTMLAnchorElement.search */
+  String search;
+
+  /** @domName HTMLAnchorElement.shape */
+  String shape;
+
+  /** @domName HTMLAnchorElement.target */
+  String target;
+
+  /** @domName HTMLAnchorElement.type */
+  String type;
+
+  /** @domName HTMLAnchorElement.toString */
+  String toString() native;
+}
+
+/// @domName WebKitAnimation
+class Animation native "*WebKitAnimation" {
+
+  static const int DIRECTION_ALTERNATE = 1;
+
+  static const int DIRECTION_NORMAL = 0;
+
+  static const int FILL_BACKWARDS = 1;
+
+  static const int FILL_BOTH = 3;
+
+  static const int FILL_FORWARDS = 2;
+
+  static const int FILL_NONE = 0;
+
+  /** @domName WebKitAnimation.delay */
+  final num delay;
+
+  /** @domName WebKitAnimation.direction */
+  final int direction;
+
+  /** @domName WebKitAnimation.duration */
+  final num duration;
+
+  /** @domName WebKitAnimation.elapsedTime */
+  num elapsedTime;
+
+  /** @domName WebKitAnimation.ended */
+  final bool ended;
+
+  /** @domName WebKitAnimation.fillMode */
+  final int fillMode;
+
+  /** @domName WebKitAnimation.iterationCount */
+  final int iterationCount;
+
+  /** @domName WebKitAnimation.name */
+  final String name;
+
+  /** @domName WebKitAnimation.paused */
+  final bool paused;
+
+  /** @domName WebKitAnimation.pause */
+  void pause() native;
+
+  /** @domName WebKitAnimation.play */
+  void play() native;
+}
+
+/// @domName WebKitAnimationEvent
+class AnimationEvent extends Event native "*WebKitAnimationEvent" {
+
+  /** @domName WebKitAnimationEvent.animationName */
+  final String animationName;
+
+  /** @domName WebKitAnimationEvent.elapsedTime */
+  final num elapsedTime;
+}
+
+/// @domName HTMLAppletElement
+class AppletElement extends Element implements Element native "*HTMLAppletElement" {
+
+  /** @domName HTMLAppletElement.align */
+  String align;
+
+  /** @domName HTMLAppletElement.alt */
+  String alt;
+
+  /** @domName HTMLAppletElement.archive */
+  String archive;
+
+  /** @domName HTMLAppletElement.code */
+  String code;
+
+  /** @domName HTMLAppletElement.codeBase */
+  String codeBase;
+
+  /** @domName HTMLAppletElement.height */
+  String height;
+
+  /** @domName HTMLAppletElement.hspace */
+  String hspace;
+
+  /** @domName HTMLAppletElement.name */
+  String name;
+
+  /** @domName HTMLAppletElement.object */
+  String object;
+
+  /** @domName HTMLAppletElement.vspace */
+  String vspace;
+
+  /** @domName HTMLAppletElement.width */
+  String width;
+}
+
+/// @domName HTMLAreaElement
+class AreaElement extends Element implements Element native "*HTMLAreaElement" {
+
+  factory AreaElement() => _Elements.createAreaElement();
+
+  /** @domName HTMLAreaElement.alt */
+  String alt;
+
+  /** @domName HTMLAreaElement.coords */
+  String coords;
+
+  /** @domName HTMLAreaElement.hash */
+  final String hash;
+
+  /** @domName HTMLAreaElement.host */
+  final String host;
+
+  /** @domName HTMLAreaElement.hostname */
+  final String hostname;
+
+  /** @domName HTMLAreaElement.href */
+  String href;
+
+  /** @domName HTMLAreaElement.noHref */
+  bool noHref;
+
+  /** @domName HTMLAreaElement.pathname */
+  final String pathname;
+
+  /** @domName HTMLAreaElement.ping */
+  String ping;
+
+  /** @domName HTMLAreaElement.port */
+  final String port;
+
+  /** @domName HTMLAreaElement.protocol */
+  final String protocol;
+
+  /** @domName HTMLAreaElement.search */
+  final String search;
+
+  /** @domName HTMLAreaElement.shape */
+  String shape;
+
+  /** @domName HTMLAreaElement.target */
+  String target;
+}
+
+/// @domName ArrayBuffer
+class ArrayBuffer native "*ArrayBuffer" {
+
+  factory ArrayBuffer(int length) => _ArrayBufferFactoryProvider.createArrayBuffer(length);
+
+  /** @domName ArrayBuffer.byteLength */
+  final int byteLength;
+
+  /** @domName ArrayBuffer.slice */
+  ArrayBuffer slice(int begin, [int end]) native;
+}
+
+/// @domName ArrayBufferView
+class ArrayBufferView native "*ArrayBufferView" {
+
+  /** @domName ArrayBufferView.buffer */
+  final ArrayBuffer buffer;
+
+  /** @domName ArrayBufferView.byteLength */
+  final int byteLength;
+
+  /** @domName ArrayBufferView.byteOffset */
+  final int byteOffset;
+}
+
+/// @domName Attr
+class Attr extends Node native "*Attr" {
+
+  /** @domName Attr.isId */
+  final bool isId;
+
+  /** @domName Attr.name */
+  final String name;
+
+  /** @domName Attr.ownerElement */
+  final Element ownerElement;
+
+  /** @domName Attr.specified */
+  final bool specified;
+
+  /** @domName Attr.value */
+  String value;
+}
+
+/// @domName AudioBuffer
+class AudioBuffer native "*AudioBuffer" {
+
+  /** @domName AudioBuffer.duration */
+  final num duration;
+
+  /** @domName AudioBuffer.gain */
+  num gain;
+
+  /** @domName AudioBuffer.length */
+  final int length;
+
+  /** @domName AudioBuffer.numberOfChannels */
+  final int numberOfChannels;
+
+  /** @domName AudioBuffer.sampleRate */
+  final num sampleRate;
+
+  /** @domName AudioBuffer.getChannelData */
+  Float32Array getChannelData(int channelIndex) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void AudioBufferCallback(AudioBuffer audioBuffer);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class AudioBufferSourceNode extends AudioSourceNode native "*AudioBufferSourceNode" {
+
+  // TODO(efortuna): Remove these methods when Chrome stable also uses start
+  // instead of noteOn.
+  void start(num when, [num grainOffset, num grainDuration]) {
+    if (JS('bool', '!!#.start', this)) {
+      if (?grainDuration) {
+        JS('void', '#.start(#, #, #)', this, when, grainOffset, grainDuration);
+      } else if (?grainOffset) {
+        JS('void', '#.start(#, #)', this, when, grainOffset);
+      } else {
+        JS('void', '#.start(#)', this, when);
+      }
+    } else {
+      if (?grainDuration) {
+        JS('void', '#.noteOn(#, #, #)', this, when, grainOffset, grainDuration);
+      } else if (?grainOffset) {
+        JS('void', '#.noteOn(#, #)', this, when, grainOffset);
+      } else {
+        JS('void', '#.noteOn(#)', this, when);
+      }
+    }
+  }
+
+  void stop(num when) {
+    if (JS('bool', '!!#.stop', this)) {
+      JS('void', '#.stop(#)', this, when);
+    } else {
+      JS('void', '#.noteOff(#)', this, when);
+    }
+  }
+
+  static const int FINISHED_STATE = 3;
+
+  static const int PLAYING_STATE = 2;
+
+  static const int SCHEDULED_STATE = 1;
+
+  static const int UNSCHEDULED_STATE = 0;
+
+  /** @domName AudioBufferSourceNode.buffer */
+  AudioBuffer buffer;
+
+  /** @domName AudioBufferSourceNode.gain */
+  final AudioGain gain;
+
+  /** @domName AudioBufferSourceNode.loop */
+  bool loop;
+
+  /** @domName AudioBufferSourceNode.loopEnd */
+  num loopEnd;
+
+  /** @domName AudioBufferSourceNode.loopStart */
+  num loopStart;
+
+  /** @domName AudioBufferSourceNode.playbackRate */
+  final AudioParam playbackRate;
+
+  /** @domName AudioBufferSourceNode.playbackState */
+  final int playbackState;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class AudioContext extends EventTarget native "*AudioContext" {
+  factory AudioContext() => _AudioContextFactoryProvider.createAudioContext();
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  AudioContextEvents get on =>
+    new AudioContextEvents(this);
+
+  /** @domName AudioContext.activeSourceCount */
+  final int activeSourceCount;
+
+  /** @domName AudioContext.currentTime */
+  final num currentTime;
+
+  /** @domName AudioContext.destination */
+  final AudioDestinationNode destination;
+
+  /** @domName AudioContext.listener */
+  final AudioListener listener;
+
+  /** @domName AudioContext.sampleRate */
+  final num sampleRate;
+
+  /** @domName AudioContext.createAnalyser */
+  AnalyserNode createAnalyser() native;
+
+  /** @domName AudioContext.createBiquadFilter */
+  BiquadFilterNode createBiquadFilter() native;
+
+  /** @domName AudioContext.createBuffer */
+  AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [num sampleRate]) native;
+
+  /** @domName AudioContext.createBufferSource */
+  AudioBufferSourceNode createBufferSource() native;
+
+  /** @domName AudioContext.createChannelMerger */
+  ChannelMergerNode createChannelMerger([int numberOfInputs]) native;
+
+  /** @domName AudioContext.createChannelSplitter */
+  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) native;
+
+  /** @domName AudioContext.createConvolver */
+  ConvolverNode createConvolver() native;
+
+  /** @domName AudioContext.createDelay */
+  DelayNode createDelay([num maxDelayTime]) native;
+
+  /** @domName AudioContext.createDynamicsCompressor */
+  DynamicsCompressorNode createDynamicsCompressor() native;
+
+  /** @domName AudioContext.createMediaElementSource */
+  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) native;
+
+  /** @domName AudioContext.createMediaStreamSource */
+  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) native;
+
+  /** @domName AudioContext.createOscillator */
+  OscillatorNode createOscillator() native;
+
+  /** @domName AudioContext.createPanner */
+  PannerNode createPanner() native;
+
+  /** @domName AudioContext.createWaveShaper */
+  WaveShaperNode createWaveShaper() native;
+
+  /** @domName AudioContext.createWaveTable */
+  WaveTable createWaveTable(Float32Array real, Float32Array imag) native;
+
+  /** @domName AudioContext.decodeAudioData */
+  void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native;
+
+  /** @domName AudioContext.startRendering */
+  void startRendering() native;
+
+  GainNode createGain() {
+    if (JS('bool', '#.createGain !== undefined', this)) {
+      return JS('GainNode', '#.createGain()', this);
+    } else {
+      return JS('GainNode', '#.createGainNode()', this);
+    }
+  }
+
+  ScriptProcessorNode createScriptProcessor(int bufferSize,
+      [int numberOfInputChannels, int numberOfOutputChannels]) {
+    var function = JS('dynamic', '#.createScriptProcessor || '
+        '#.createJavaScriptNode', this, this);
+    if (?numberOfOutputChannels) {
+      return JS('ScriptProcessorNode', '#.call(#, #, #, #)', function, this,
+          bufferSize, numberOfInputChannels, numberOfOutputChannels);
+    } else if (?numberOfInputChannels) {
+      return JS('ScriptProcessorNode', '#.call(#, #, #)', function, this,
+          bufferSize, numberOfInputChannels);
+    } else {
+      return JS('ScriptProcessorNode', '#.call(#, #)', function, this,
+          bufferSize);
+    }
+  }
+}
+
+class AudioContextEvents extends Events {
+  AudioContextEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get complete => this['complete'];
+}
+
+/// @domName AudioDestinationNode
+class AudioDestinationNode extends AudioNode native "*AudioDestinationNode" {
+
+  /** @domName AudioDestinationNode.numberOfChannels */
+  final int numberOfChannels;
+}
+
+/// @domName HTMLAudioElement
+class AudioElement extends MediaElement native "*HTMLAudioElement" {
+
+  factory AudioElement([String src]) {
+    if (!?src) {
+      return _AudioElementFactoryProvider.createAudioElement();
+    }
+    return _AudioElementFactoryProvider.createAudioElement(src);
+  }
+}
+
+/// @domName AudioGain
+class AudioGain extends AudioParam native "*AudioGain" {
+}
+
+/// @domName AudioListener
+class AudioListener native "*AudioListener" {
+
+  /** @domName AudioListener.dopplerFactor */
+  num dopplerFactor;
+
+  /** @domName AudioListener.speedOfSound */
+  num speedOfSound;
+
+  /** @domName AudioListener.setOrientation */
+  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native;
+
+  /** @domName AudioListener.setPosition */
+  void setPosition(num x, num y, num z) native;
+
+  /** @domName AudioListener.setVelocity */
+  void setVelocity(num x, num y, num z) native;
+}
+
+/// @domName AudioNode
+class AudioNode native "*AudioNode" {
+
+  /** @domName AudioNode.context */
+  final AudioContext context;
+
+  /** @domName AudioNode.numberOfInputs */
+  final int numberOfInputs;
+
+  /** @domName AudioNode.numberOfOutputs */
+  final int numberOfOutputs;
+
+  /** @domName AudioNode.connect */
+  void connect(destination, int output, [int input]) native;
+
+  /** @domName AudioNode.disconnect */
+  void disconnect(int output) native;
+}
+
+/// @domName AudioParam
+class AudioParam native "*AudioParam" {
+
+  /** @domName AudioParam.defaultValue */
+  final num defaultValue;
+
+  /** @domName AudioParam.maxValue */
+  final num maxValue;
+
+  /** @domName AudioParam.minValue */
+  final num minValue;
+
+  /** @domName AudioParam.name */
+  final String name;
+
+  /** @domName AudioParam.units */
+  final int units;
+
+  /** @domName AudioParam.value */
+  num value;
+
+  /** @domName AudioParam.cancelScheduledValues */
+  void cancelScheduledValues(num startTime) native;
+
+  /** @domName AudioParam.exponentialRampToValueAtTime */
+  void exponentialRampToValueAtTime(num value, num time) native;
+
+  /** @domName AudioParam.linearRampToValueAtTime */
+  void linearRampToValueAtTime(num value, num time) native;
+
+  /** @domName AudioParam.setTargetAtTime */
+  void setTargetAtTime(num target, num time, num timeConstant) native;
+
+  /** @domName AudioParam.setValueAtTime */
+  void setValueAtTime(num value, num time) native;
+
+  /** @domName AudioParam.setValueCurveAtTime */
+  void setValueCurveAtTime(Float32Array values, num time, num duration) native;
+}
+
+/// @domName AudioProcessingEvent
+class AudioProcessingEvent extends Event native "*AudioProcessingEvent" {
+
+  /** @domName AudioProcessingEvent.inputBuffer */
+  final AudioBuffer inputBuffer;
+
+  /** @domName AudioProcessingEvent.outputBuffer */
+  final AudioBuffer outputBuffer;
+}
+
+/// @domName AudioSourceNode
+class AudioSourceNode extends AudioNode native "*AudioSourceNode" {
+}
+
+/// @domName HTMLBRElement
+class BRElement extends Element implements Element native "*HTMLBRElement" {
+
+  factory BRElement() => _Elements.createBRElement();
+
+  /** @domName HTMLBRElement.clear */
+  String clear;
+}
+
+/// @domName BarInfo
+class BarInfo native "*BarInfo" {
+
+  /** @domName BarInfo.visible */
+  final bool visible;
+}
+
+/// @domName HTMLBaseElement
+class BaseElement extends Element implements Element native "*HTMLBaseElement" {
+
+  factory BaseElement() => _Elements.createBaseElement();
+
+  /** @domName HTMLBaseElement.href */
+  String href;
+
+  /** @domName HTMLBaseElement.target */
+  String target;
+}
+
+/// @domName HTMLBaseFontElement
+class BaseFontElement extends Element implements Element native "*HTMLBaseFontElement" {
+
+  /** @domName HTMLBaseFontElement.color */
+  String color;
+
+  /** @domName HTMLBaseFontElement.face */
+  String face;
+
+  /** @domName HTMLBaseFontElement.size */
+  int size;
+}
+
+/// @domName BatteryManager
+class BatteryManager extends EventTarget native "*BatteryManager" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  BatteryManagerEvents get on =>
+    new BatteryManagerEvents(this);
+
+  /** @domName BatteryManager.charging */
+  final bool charging;
+
+  /** @domName BatteryManager.chargingTime */
+  final num chargingTime;
+
+  /** @domName BatteryManager.dischargingTime */
+  final num dischargingTime;
+
+  /** @domName BatteryManager.level */
+  final num level;
+
+  /** @domName BatteryManager.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName BatteryManager.dispatchEvent */
+  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+
+  /** @domName BatteryManager.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+class BatteryManagerEvents extends Events {
+  BatteryManagerEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get chargingChange => this['chargingchange'];
+
+  EventListenerList get chargingTimeChange => this['chargingtimechange'];
+
+  EventListenerList get dischargingTimeChange => this['dischargingtimechange'];
+
+  EventListenerList get levelChange => this['levelchange'];
+}
+
+/// @domName BeforeLoadEvent
+class BeforeLoadEvent extends Event native "*BeforeLoadEvent" {
+
+  /** @domName BeforeLoadEvent.url */
+  final String url;
+}
+
+/// @domName BiquadFilterNode
+class BiquadFilterNode extends AudioNode native "*BiquadFilterNode" {
+
+  static const int ALLPASS = 7;
+
+  static const int BANDPASS = 2;
+
+  static const int HIGHPASS = 1;
+
+  static const int HIGHSHELF = 4;
+
+  static const int LOWPASS = 0;
+
+  static const int LOWSHELF = 3;
+
+  static const int NOTCH = 6;
+
+  static const int PEAKING = 5;
+
+  /** @domName BiquadFilterNode.Q */
+  final AudioParam Q;
+
+  /** @domName BiquadFilterNode.frequency */
+  final AudioParam frequency;
+
+  /** @domName BiquadFilterNode.gain */
+  final AudioParam gain;
+
+  /** @domName BiquadFilterNode.type */
+  int type;
+
+  /** @domName BiquadFilterNode.getFrequencyResponse */
+  void getFrequencyResponse(Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse) native;
+}
+
+/// @domName Blob
+class Blob native "*Blob" {
+
+  factory Blob(List blobParts, [String type, String endings]) {
+    if (!?type) {
+      return _BlobFactoryProvider.createBlob(blobParts);
+    }
+    if (!?endings) {
+      return _BlobFactoryProvider.createBlob(blobParts, type);
+    }
+    return _BlobFactoryProvider.createBlob(blobParts, type, endings);
+  }
+
+  /** @domName Blob.size */
+  final int size;
+
+  /** @domName Blob.type */
+  final String type;
+
+  /** @domName Blob.slice */
+  Blob slice([int start, int end, String contentType]) native;
+}
+
+/// @domName HTMLBodyElement
+class BodyElement extends Element implements Element native "*HTMLBodyElement" {
+
+  factory BodyElement() => _Elements.createBodyElement();
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  BodyElementEvents get on =>
+    new BodyElementEvents(this);
+
+  /** @domName HTMLBodyElement.aLink */
+  String aLink;
+
+  /** @domName HTMLBodyElement.background */
+  String background;
+
+  /** @domName HTMLBodyElement.bgColor */
+  String bgColor;
+
+  /** @domName HTMLBodyElement.link */
+  String link;
+
+  /** @domName HTMLBodyElement.vLink */
+  String vLink;
+}
+
+class BodyElementEvents extends ElementEvents {
+  BodyElementEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get beforeUnload => this['beforeunload'];
+
+  EventListenerList get blur => this['blur'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get focus => this['focus'];
+
+  EventListenerList get hashChange => this['hashchange'];
+
+  EventListenerList get load => this['load'];
+
+  EventListenerList get message => this['message'];
+
+  EventListenerList get offline => this['offline'];
+
+  EventListenerList get online => this['online'];
+
+  EventListenerList get popState => this['popstate'];
+
+  EventListenerList get resize => this['resize'];
+
+  EventListenerList get storage => this['storage'];
+
+  EventListenerList get unload => this['unload'];
+}
+
+/// @domName HTMLButtonElement
+class ButtonElement extends Element implements Element native "*HTMLButtonElement" {
+
+  factory ButtonElement() => _Elements.createButtonElement();
+
+  /** @domName HTMLButtonElement.autofocus */
+  bool autofocus;
+
+  /** @domName HTMLButtonElement.disabled */
+  bool disabled;
+
+  /** @domName HTMLButtonElement.form */
+  final FormElement form;
+
+  /** @domName HTMLButtonElement.formAction */
+  String formAction;
+
+  /** @domName HTMLButtonElement.formEnctype */
+  String formEnctype;
+
+  /** @domName HTMLButtonElement.formMethod */
+  String formMethod;
+
+  /** @domName HTMLButtonElement.formNoValidate */
+  bool formNoValidate;
+
+  /** @domName HTMLButtonElement.formTarget */
+  String formTarget;
+
+  /** @domName HTMLButtonElement.labels */
+  final List<Node> labels;
+
+  /** @domName HTMLButtonElement.name */
+  String name;
+
+  /** @domName HTMLButtonElement.type */
+  String type;
+
+  /** @domName HTMLButtonElement.validationMessage */
+  final String validationMessage;
+
+  /** @domName HTMLButtonElement.validity */
+  final ValidityState validity;
+
+  /** @domName HTMLButtonElement.value */
+  String value;
+
+  /** @domName HTMLButtonElement.willValidate */
+  final bool willValidate;
+
+  /** @domName HTMLButtonElement.checkValidity */
+  bool checkValidity() native;
+
+  /** @domName HTMLButtonElement.setCustomValidity */
+  void setCustomValidity(String error) native;
+}
+
+/// @domName CDATASection
+class CDATASection extends Text native "*CDATASection" {
+}
+
+/// @domName CSSCharsetRule
+class CSSCharsetRule extends CSSRule native "*CSSCharsetRule" {
+
+  /** @domName CSSCharsetRule.encoding */
+  String encoding;
+}
+
+/// @domName CSSFontFaceRule
+class CSSFontFaceRule extends CSSRule native "*CSSFontFaceRule" {
+
+  /** @domName CSSFontFaceRule.style */
+  final CSSStyleDeclaration style;
+}
+
+/// @domName CSSImportRule
+class CSSImportRule extends CSSRule native "*CSSImportRule" {
+
+  /** @domName CSSImportRule.href */
+  final String href;
+
+  /** @domName CSSImportRule.media */
+  final MediaList media;
+
+  /** @domName CSSImportRule.styleSheet */
+  final CSSStyleSheet styleSheet;
+}
+
+/// @domName WebKitCSSKeyframeRule
+class CSSKeyframeRule extends CSSRule native "*WebKitCSSKeyframeRule" {
+
+  /** @domName WebKitCSSKeyframeRule.keyText */
+  String keyText;
+
+  /** @domName WebKitCSSKeyframeRule.style */
+  final CSSStyleDeclaration style;
+}
+
+/// @domName WebKitCSSKeyframesRule
+class CSSKeyframesRule extends CSSRule native "*WebKitCSSKeyframesRule" {
+
+  /** @domName WebKitCSSKeyframesRule.cssRules */
+  final List<CSSRule> cssRules;
+
+  /** @domName WebKitCSSKeyframesRule.name */
+  String name;
+
+  /** @domName WebKitCSSKeyframesRule.deleteRule */
+  void deleteRule(String key) native;
+
+  /** @domName WebKitCSSKeyframesRule.findRule */
+  CSSKeyframeRule findRule(String key) native;
+
+  /** @domName WebKitCSSKeyframesRule.insertRule */
+  void insertRule(String rule) native;
+}
+
+/// @domName WebKitCSSMatrix
+class CSSMatrix native "*WebKitCSSMatrix" {
+
+  factory CSSMatrix([String cssValue]) {
+    if (!?cssValue) {
+      return _CSSMatrixFactoryProvider.createCSSMatrix();
+    }
+    return _CSSMatrixFactoryProvider.createCSSMatrix(cssValue);
+  }
+
+  /** @domName WebKitCSSMatrix.a */
+  num a;
+
+  /** @domName WebKitCSSMatrix.b */
+  num b;
+
+  /** @domName WebKitCSSMatrix.c */
+  num c;
+
+  /** @domName WebKitCSSMatrix.d */
+  num d;
+
+  /** @domName WebKitCSSMatrix.e */
+  num e;
+
+  /** @domName WebKitCSSMatrix.f */
+  num f;
+
+  /** @domName WebKitCSSMatrix.m11 */
+  num m11;
+
+  /** @domName WebKitCSSMatrix.m12 */
+  num m12;
+
+  /** @domName WebKitCSSMatrix.m13 */
+  num m13;
+
+  /** @domName WebKitCSSMatrix.m14 */
+  num m14;
+
+  /** @domName WebKitCSSMatrix.m21 */
+  num m21;
+
+  /** @domName WebKitCSSMatrix.m22 */
+  num m22;
+
+  /** @domName WebKitCSSMatrix.m23 */
+  num m23;
+
+  /** @domName WebKitCSSMatrix.m24 */
+  num m24;
+
+  /** @domName WebKitCSSMatrix.m31 */
+  num m31;
+
+  /** @domName WebKitCSSMatrix.m32 */
+  num m32;
+
+  /** @domName WebKitCSSMatrix.m33 */
+  num m33;
+
+  /** @domName WebKitCSSMatrix.m34 */
+  num m34;
+
+  /** @domName WebKitCSSMatrix.m41 */
+  num m41;
+
+  /** @domName WebKitCSSMatrix.m42 */
+  num m42;
+
+  /** @domName WebKitCSSMatrix.m43 */
+  num m43;
+
+  /** @domName WebKitCSSMatrix.m44 */
+  num m44;
+
+  /** @domName WebKitCSSMatrix.inverse */
+  CSSMatrix inverse() native;
+
+  /** @domName WebKitCSSMatrix.multiply */
+  CSSMatrix multiply(CSSMatrix secondMatrix) native;
+
+  /** @domName WebKitCSSMatrix.rotate */
+  CSSMatrix rotate(num rotX, num rotY, num rotZ) native;
+
+  /** @domName WebKitCSSMatrix.rotateAxisAngle */
+  CSSMatrix rotateAxisAngle(num x, num y, num z, num angle) native;
+
+  /** @domName WebKitCSSMatrix.scale */
+  CSSMatrix scale(num scaleX, num scaleY, num scaleZ) native;
+
+  /** @domName WebKitCSSMatrix.setMatrixValue */
+  void setMatrixValue(String string) native;
+
+  /** @domName WebKitCSSMatrix.skewX */
+  CSSMatrix skewX(num angle) native;
+
+  /** @domName WebKitCSSMatrix.skewY */
+  CSSMatrix skewY(num angle) native;
+
+  /** @domName WebKitCSSMatrix.toString */
+  String toString() native;
+
+  /** @domName WebKitCSSMatrix.translate */
+  CSSMatrix translate(num x, num y, num z) native;
+}
+
+/// @domName CSSMediaRule
+class CSSMediaRule extends CSSRule native "*CSSMediaRule" {
+
+  /** @domName CSSMediaRule.cssRules */
+  final List<CSSRule> cssRules;
+
+  /** @domName CSSMediaRule.media */
+  final MediaList media;
+
+  /** @domName CSSMediaRule.deleteRule */
+  void deleteRule(int index) native;
+
+  /** @domName CSSMediaRule.insertRule */
+  int insertRule(String rule, int index) native;
+}
+
+/// @domName CSSPageRule
+class CSSPageRule extends CSSRule native "*CSSPageRule" {
+
+  /** @domName CSSPageRule.selectorText */
+  String selectorText;
+
+  /** @domName CSSPageRule.style */
+  final CSSStyleDeclaration style;
+}
+
+/// @domName CSSPrimitiveValue
+class CSSPrimitiveValue extends CSSValue native "*CSSPrimitiveValue" {
+
+  static const int CSS_ATTR = 22;
+
+  static const int CSS_CM = 6;
+
+  static const int CSS_COUNTER = 23;
+
+  static const int CSS_DEG = 11;
+
+  static const int CSS_DIMENSION = 18;
+
+  static const int CSS_EMS = 3;
+
+  static const int CSS_EXS = 4;
+
+  static const int CSS_GRAD = 13;
+
+  static const int CSS_HZ = 16;
+
+  static const int CSS_IDENT = 21;
+
+  static const int CSS_IN = 8;
+
+  static const int CSS_KHZ = 17;
+
+  static const int CSS_MM = 7;
+
+  static const int CSS_MS = 14;
+
+  static const int CSS_NUMBER = 1;
+
+  static const int CSS_PC = 10;
+
+  static const int CSS_PERCENTAGE = 2;
+
+  static const int CSS_PT = 9;
+
+  static const int CSS_PX = 5;
+
+  static const int CSS_RAD = 12;
+
+  static const int CSS_RECT = 24;
+
+  static const int CSS_RGBCOLOR = 25;
+
+  static const int CSS_S = 15;
+
+  static const int CSS_STRING = 19;
+
+  static const int CSS_UNKNOWN = 0;
+
+  static const int CSS_URI = 20;
+
+  static const int CSS_VH = 27;
+
+  static const int CSS_VMIN = 28;
+
+  static const int CSS_VW = 26;
+
+  /** @domName CSSPrimitiveValue.primitiveType */
+  final int primitiveType;
+
+  /** @domName CSSPrimitiveValue.getCounterValue */
+  Counter getCounterValue() native;
+
+  /** @domName CSSPrimitiveValue.getFloatValue */
+  num getFloatValue(int unitType) native;
+
+  /** @domName CSSPrimitiveValue.getRGBColorValue */
+  RGBColor getRGBColorValue() native;
+
+  /** @domName CSSPrimitiveValue.getRectValue */
+  Rect getRectValue() native;
+
+  /** @domName CSSPrimitiveValue.getStringValue */
+  String getStringValue() native;
+
+  /** @domName CSSPrimitiveValue.setFloatValue */
+  void setFloatValue(int unitType, num floatValue) native;
+
+  /** @domName CSSPrimitiveValue.setStringValue */
+  void setStringValue(int stringType, String stringValue) native;
+}
+
+/// @domName CSSRule
+class CSSRule native "*CSSRule" {
+
+  static const int CHARSET_RULE = 2;
+
+  static const int FONT_FACE_RULE = 5;
+
+  static const int IMPORT_RULE = 3;
+
+  static const int MEDIA_RULE = 4;
+
+  static const int PAGE_RULE = 6;
+
+  static const int STYLE_RULE = 1;
+
+  static const int UNKNOWN_RULE = 0;
+
+  static const int WEBKIT_KEYFRAMES_RULE = 7;
+
+  static const int WEBKIT_KEYFRAME_RULE = 8;
+
+  /** @domName CSSRule.cssText */
+  String cssText;
+
+  /** @domName CSSRule.parentRule */
+  final CSSRule parentRule;
+
+  /** @domName CSSRule.parentStyleSheet */
+  final CSSStyleSheet parentStyleSheet;
+
+  /** @domName CSSRule.type */
+  final int type;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+String _cachedBrowserPrefix;
+
+String get _browserPrefix {
+  if (_cachedBrowserPrefix == null) {
+    if (_Device.isFirefox) {
+      _cachedBrowserPrefix = '-moz-';
+    } else if (_Device.isIE) {
+      _cachedBrowserPrefix = '-ms-';
+    } else if (_Device.isOpera) {
+      _cachedBrowserPrefix = '-o-';
+    } else {
+      _cachedBrowserPrefix = '-webkit-';
+    }
+  }
+  return _cachedBrowserPrefix;
+}
+
+class CSSStyleDeclaration native "*CSSStyleDeclaration" {
+  factory CSSStyleDeclaration() => _CSSStyleDeclarationFactoryProvider.createCSSStyleDeclaration();
+  factory CSSStyleDeclaration.css(String css) =>
+      _CSSStyleDeclarationFactoryProvider.createCSSStyleDeclaration_css(css);
+
+
+  /** @domName CSSStyleDeclaration.cssText */
+  String cssText;
+
+  /** @domName CSSStyleDeclaration.length */
+  final int length;
+
+  /** @domName CSSStyleDeclaration.parentRule */
+  final CSSRule parentRule;
+
+  /** @domName CSSStyleDeclaration.getPropertyCSSValue */
+  CSSValue getPropertyCSSValue(String propertyName) native;
+
+  /** @domName CSSStyleDeclaration.getPropertyPriority */
+  String getPropertyPriority(String propertyName) native;
+
+  /** @domName CSSStyleDeclaration.getPropertyShorthand */
+  String getPropertyShorthand(String propertyName) native;
+
+  /** @domName CSSStyleDeclaration._getPropertyValue */
+  String _getPropertyValue(String propertyName) native "getPropertyValue";
+
+  /** @domName CSSStyleDeclaration.isPropertyImplicit */
+  bool isPropertyImplicit(String propertyName) native;
+
+  /** @domName CSSStyleDeclaration.item */
+  String item(int index) native;
+
+  /** @domName CSSStyleDeclaration.removeProperty */
+  String removeProperty(String propertyName) native;
+
+
+  String getPropertyValue(String propertyName) {
+    var propValue = _getPropertyValue(propertyName);
+    return propValue != null ? propValue : '';
+  }
+
+  void setProperty(String propertyName, String value, [String priority]) {
+    JS('void', '#.setProperty(#, #, #)', this, propertyName, value, priority);
+    // Bug #2772, IE9 requires a poke to actually apply the value.
+    if (JS('bool', '!!#.setAttribute', this)) {
+      JS('void', '#.setAttribute(#, #)', this, propertyName, value);
+    }
+  }
+
+  // TODO(jacobr): generate this list of properties using the existing script.
+    /** Gets the value of "animation" */
+  String get animation =>
+    getPropertyValue('${_browserPrefix}animation');
+
+  /** Sets the value of "animation" */
+  void set animation(var value) {
+    setProperty('${_browserPrefix}animation', value, '');
+  }
+
+  /** Gets the value of "animation-delay" */
+  String get animationDelay =>
+    getPropertyValue('${_browserPrefix}animation-delay');
+
+  /** Sets the value of "animation-delay" */
+  void set animationDelay(var value) {
+    setProperty('${_browserPrefix}animation-delay', value, '');
+  }
+
+  /** Gets the value of "animation-direction" */
+  String get animationDirection =>
+    getPropertyValue('${_browserPrefix}animation-direction');
+
+  /** Sets the value of "animation-direction" */
+  void set animationDirection(var value) {
+    setProperty('${_browserPrefix}animation-direction', value, '');
+  }
+
+  /** Gets the value of "animation-duration" */
+  String get animationDuration =>
+    getPropertyValue('${_browserPrefix}animation-duration');
+
+  /** Sets the value of "animation-duration" */
+  void set animationDuration(var value) {
+    setProperty('${_browserPrefix}animation-duration', value, '');
+  }
+
+  /** Gets the value of "animation-fill-mode" */
+  String get animationFillMode =>
+    getPropertyValue('${_browserPrefix}animation-fill-mode');
+
+  /** Sets the value of "animation-fill-mode" */
+  void set animationFillMode(var value) {
+    setProperty('${_browserPrefix}animation-fill-mode', value, '');
+  }
+
+  /** Gets the value of "animation-iteration-count" */
+  String get animationIterationCount =>
+    getPropertyValue('${_browserPrefix}animation-iteration-count');
+
+  /** Sets the value of "animation-iteration-count" */
+  void set animationIterationCount(var value) {
+    setProperty('${_browserPrefix}animation-iteration-count', value, '');
+  }
+
+  /** Gets the value of "animation-name" */
+  String get animationName =>
+    getPropertyValue('${_browserPrefix}animation-name');
+
+  /** Sets the value of "animation-name" */
+  void set animationName(var value) {
+    setProperty('${_browserPrefix}animation-name', value, '');
+  }
+
+  /** Gets the value of "animation-play-state" */
+  String get animationPlayState =>
+    getPropertyValue('${_browserPrefix}animation-play-state');
+
+  /** Sets the value of "animation-play-state" */
+  void set animationPlayState(var value) {
+    setProperty('${_browserPrefix}animation-play-state', value, '');
+  }
+
+  /** Gets the value of "animation-timing-function" */
+  String get animationTimingFunction =>
+    getPropertyValue('${_browserPrefix}animation-timing-function');
+
+  /** Sets the value of "animation-timing-function" */
+  void set animationTimingFunction(var value) {
+    setProperty('${_browserPrefix}animation-timing-function', value, '');
+  }
+
+  /** Gets the value of "appearance" */
+  String get appearance =>
+    getPropertyValue('${_browserPrefix}appearance');
+
+  /** Sets the value of "appearance" */
+  void set appearance(var value) {
+    setProperty('${_browserPrefix}appearance', value, '');
+  }
+
+  /** Gets the value of "backface-visibility" */
+  String get backfaceVisibility =>
+    getPropertyValue('${_browserPrefix}backface-visibility');
+
+  /** Sets the value of "backface-visibility" */
+  void set backfaceVisibility(var value) {
+    setProperty('${_browserPrefix}backface-visibility', value, '');
+  }
+
+  /** Gets the value of "background" */
+  String get background =>
+    getPropertyValue('background');
+
+  /** Sets the value of "background" */
+  void set background(var value) {
+    setProperty('background', value, '');
+  }
+
+  /** Gets the value of "background-attachment" */
+  String get backgroundAttachment =>
+    getPropertyValue('background-attachment');
+
+  /** Sets the value of "background-attachment" */
+  void set backgroundAttachment(var value) {
+    setProperty('background-attachment', value, '');
+  }
+
+  /** Gets the value of "background-clip" */
+  String get backgroundClip =>
+    getPropertyValue('background-clip');
+
+  /** Sets the value of "background-clip" */
+  void set backgroundClip(var value) {
+    setProperty('background-clip', value, '');
+  }
+
+  /** Gets the value of "background-color" */
+  String get backgroundColor =>
+    getPropertyValue('background-color');
+
+  /** Sets the value of "background-color" */
+  void set backgroundColor(var value) {
+    setProperty('background-color', value, '');
+  }
+
+  /** Gets the value of "background-composite" */
+  String get backgroundComposite =>
+    getPropertyValue('${_browserPrefix}background-composite');
+
+  /** Sets the value of "background-composite" */
+  void set backgroundComposite(var value) {
+    setProperty('${_browserPrefix}background-composite', value, '');
+  }
+
+  /** Gets the value of "background-image" */
+  String get backgroundImage =>
+    getPropertyValue('background-image');
+
+  /** Sets the value of "background-image" */
+  void set backgroundImage(var value) {
+    setProperty('background-image', value, '');
+  }
+
+  /** Gets the value of "background-origin" */
+  String get backgroundOrigin =>
+    getPropertyValue('background-origin');
+
+  /** Sets the value of "background-origin" */
+  void set backgroundOrigin(var value) {
+    setProperty('background-origin', value, '');
+  }
+
+  /** Gets the value of "background-position" */
+  String get backgroundPosition =>
+    getPropertyValue('background-position');
+
+  /** Sets the value of "background-position" */
+  void set backgroundPosition(var value) {
+    setProperty('background-position', value, '');
+  }
+
+  /** Gets the value of "background-position-x" */
+  String get backgroundPositionX =>
+    getPropertyValue('background-position-x');
+
+  /** Sets the value of "background-position-x" */
+  void set backgroundPositionX(var value) {
+    setProperty('background-position-x', value, '');
+  }
+
+  /** Gets the value of "background-position-y" */
+  String get backgroundPositionY =>
+    getPropertyValue('background-position-y');
+
+  /** Sets the value of "background-position-y" */
+  void set backgroundPositionY(var value) {
+    setProperty('background-position-y', value, '');
+  }
+
+  /** Gets the value of "background-repeat" */
+  String get backgroundRepeat =>
+    getPropertyValue('background-repeat');
+
+  /** Sets the value of "background-repeat" */
+  void set backgroundRepeat(var value) {
+    setProperty('background-repeat', value, '');
+  }
+
+  /** Gets the value of "background-repeat-x" */
+  String get backgroundRepeatX =>
+    getPropertyValue('background-repeat-x');
+
+  /** Sets the value of "background-repeat-x" */
+  void set backgroundRepeatX(var value) {
+    setProperty('background-repeat-x', value, '');
+  }
+
+  /** Gets the value of "background-repeat-y" */
+  String get backgroundRepeatY =>
+    getPropertyValue('background-repeat-y');
+
+  /** Sets the value of "background-repeat-y" */
+  void set backgroundRepeatY(var value) {
+    setProperty('background-repeat-y', value, '');
+  }
+
+  /** Gets the value of "background-size" */
+  String get backgroundSize =>
+    getPropertyValue('background-size');
+
+  /** Sets the value of "background-size" */
+  void set backgroundSize(var value) {
+    setProperty('background-size', value, '');
+  }
+
+  /** Gets the value of "border" */
+  String get border =>
+    getPropertyValue('border');
+
+  /** Sets the value of "border" */
+  void set border(var value) {
+    setProperty('border', value, '');
+  }
+
+  /** Gets the value of "border-after" */
+  String get borderAfter =>
+    getPropertyValue('${_browserPrefix}border-after');
+
+  /** Sets the value of "border-after" */
+  void set borderAfter(var value) {
+    setProperty('${_browserPrefix}border-after', value, '');
+  }
+
+  /** Gets the value of "border-after-color" */
+  String get borderAfterColor =>
+    getPropertyValue('${_browserPrefix}border-after-color');
+
+  /** Sets the value of "border-after-color" */
+  void set borderAfterColor(var value) {
+    setProperty('${_browserPrefix}border-after-color', value, '');
+  }
+
+  /** Gets the value of "border-after-style" */
+  String get borderAfterStyle =>
+    getPropertyValue('${_browserPrefix}border-after-style');
+
+  /** Sets the value of "border-after-style" */
+  void set borderAfterStyle(var value) {
+    setProperty('${_browserPrefix}border-after-style', value, '');
+  }
+
+  /** Gets the value of "border-after-width" */
+  String get borderAfterWidth =>
+    getPropertyValue('${_browserPrefix}border-after-width');
+
+  /** Sets the value of "border-after-width" */
+  void set borderAfterWidth(var value) {
+    setProperty('${_browserPrefix}border-after-width', value, '');
+  }
+
+  /** Gets the value of "border-before" */
+  String get borderBefore =>
+    getPropertyValue('${_browserPrefix}border-before');
+
+  /** Sets the value of "border-before" */
+  void set borderBefore(var value) {
+    setProperty('${_browserPrefix}border-before', value, '');
+  }
+
+  /** Gets the value of "border-before-color" */
+  String get borderBeforeColor =>
+    getPropertyValue('${_browserPrefix}border-before-color');
+
+  /** Sets the value of "border-before-color" */
+  void set borderBeforeColor(var value) {
+    setProperty('${_browserPrefix}border-before-color', value, '');
+  }
+
+  /** Gets the value of "border-before-style" */
+  String get borderBeforeStyle =>
+    getPropertyValue('${_browserPrefix}border-before-style');
+
+  /** Sets the value of "border-before-style" */
+  void set borderBeforeStyle(var value) {
+    setProperty('${_browserPrefix}border-before-style', value, '');
+  }
+
+  /** Gets the value of "border-before-width" */
+  String get borderBeforeWidth =>
+    getPropertyValue('${_browserPrefix}border-before-width');
+
+  /** Sets the value of "border-before-width" */
+  void set borderBeforeWidth(var value) {
+    setProperty('${_browserPrefix}border-before-width', value, '');
+  }
+
+  /** Gets the value of "border-bottom" */
+  String get borderBottom =>
+    getPropertyValue('border-bottom');
+
+  /** Sets the value of "border-bottom" */
+  void set borderBottom(var value) {
+    setProperty('border-bottom', value, '');
+  }
+
+  /** Gets the value of "border-bottom-color" */
+  String get borderBottomColor =>
+    getPropertyValue('border-bottom-color');
+
+  /** Sets the value of "border-bottom-color" */
+  void set borderBottomColor(var value) {
+    setProperty('border-bottom-color', value, '');
+  }
+
+  /** Gets the value of "border-bottom-left-radius" */
+  String get borderBottomLeftRadius =>
+    getPropertyValue('border-bottom-left-radius');
+
+  /** Sets the value of "border-bottom-left-radius" */
+  void set borderBottomLeftRadius(var value) {
+    setProperty('border-bottom-left-radius', value, '');
+  }
+
+  /** Gets the value of "border-bottom-right-radius" */
+  String get borderBottomRightRadius =>
+    getPropertyValue('border-bottom-right-radius');
+
+  /** Sets the value of "border-bottom-right-radius" */
+  void set borderBottomRightRadius(var value) {
+    setProperty('border-bottom-right-radius', value, '');
+  }
+
+  /** Gets the value of "border-bottom-style" */
+  String get borderBottomStyle =>
+    getPropertyValue('border-bottom-style');
+
+  /** Sets the value of "border-bottom-style" */
+  void set borderBottomStyle(var value) {
+    setProperty('border-bottom-style', value, '');
+  }
+
+  /** Gets the value of "border-bottom-width" */
+  String get borderBottomWidth =>
+    getPropertyValue('border-bottom-width');
+
+  /** Sets the value of "border-bottom-width" */
+  void set borderBottomWidth(var value) {
+    setProperty('border-bottom-width', value, '');
+  }
+
+  /** Gets the value of "border-collapse" */
+  String get borderCollapse =>
+    getPropertyValue('border-collapse');
+
+  /** Sets the value of "border-collapse" */
+  void set borderCollapse(var value) {
+    setProperty('border-collapse', value, '');
+  }
+
+  /** Gets the value of "border-color" */
+  String get borderColor =>
+    getPropertyValue('border-color');
+
+  /** Sets the value of "border-color" */
+  void set borderColor(var value) {
+    setProperty('border-color', value, '');
+  }
+
+  /** Gets the value of "border-end" */
+  String get borderEnd =>
+    getPropertyValue('${_browserPrefix}border-end');
+
+  /** Sets the value of "border-end" */
+  void set borderEnd(var value) {
+    setProperty('${_browserPrefix}border-end', value, '');
+  }
+
+  /** Gets the value of "border-end-color" */
+  String get borderEndColor =>
+    getPropertyValue('${_browserPrefix}border-end-color');
+
+  /** Sets the value of "border-end-color" */
+  void set borderEndColor(var value) {
+    setProperty('${_browserPrefix}border-end-color', value, '');
+  }
+
+  /** Gets the value of "border-end-style" */
+  String get borderEndStyle =>
+    getPropertyValue('${_browserPrefix}border-end-style');
+
+  /** Sets the value of "border-end-style" */
+  void set borderEndStyle(var value) {
+    setProperty('${_browserPrefix}border-end-style', value, '');
+  }
+
+  /** Gets the value of "border-end-width" */
+  String get borderEndWidth =>
+    getPropertyValue('${_browserPrefix}border-end-width');
+
+  /** Sets the value of "border-end-width" */
+  void set borderEndWidth(var value) {
+    setProperty('${_browserPrefix}border-end-width', value, '');
+  }
+
+  /** Gets the value of "border-fit" */
+  String get borderFit =>
+    getPropertyValue('${_browserPrefix}border-fit');
+
+  /** Sets the value of "border-fit" */
+  void set borderFit(var value) {
+    setProperty('${_browserPrefix}border-fit', value, '');
+  }
+
+  /** Gets the value of "border-horizontal-spacing" */
+  String get borderHorizontalSpacing =>
+    getPropertyValue('${_browserPrefix}border-horizontal-spacing');
+
+  /** Sets the value of "border-horizontal-spacing" */
+  void set borderHorizontalSpacing(var value) {
+    setProperty('${_browserPrefix}border-horizontal-spacing', value, '');
+  }
+
+  /** Gets the value of "border-image" */
+  String get borderImage =>
+    getPropertyValue('border-image');
+
+  /** Sets the value of "border-image" */
+  void set borderImage(var value) {
+    setProperty('border-image', value, '');
+  }
+
+  /** Gets the value of "border-image-outset" */
+  String get borderImageOutset =>
+    getPropertyValue('border-image-outset');
+
+  /** Sets the value of "border-image-outset" */
+  void set borderImageOutset(var value) {
+    setProperty('border-image-outset', value, '');
+  }
+
+  /** Gets the value of "border-image-repeat" */
+  String get borderImageRepeat =>
+    getPropertyValue('border-image-repeat');
+
+  /** Sets the value of "border-image-repeat" */
+  void set borderImageRepeat(var value) {
+    setProperty('border-image-repeat', value, '');
+  }
+
+  /** Gets the value of "border-image-slice" */
+  String get borderImageSlice =>
+    getPropertyValue('border-image-slice');
+
+  /** Sets the value of "border-image-slice" */
+  void set borderImageSlice(var value) {
+    setProperty('border-image-slice', value, '');
+  }
+
+  /** Gets the value of "border-image-source" */
+  String get borderImageSource =>
+    getPropertyValue('border-image-source');
+
+  /** Sets the value of "border-image-source" */
+  void set borderImageSource(var value) {
+    setProperty('border-image-source', value, '');
+  }
+
+  /** Gets the value of "border-image-width" */
+  String get borderImageWidth =>
+    getPropertyValue('border-image-width');
+
+  /** Sets the value of "border-image-width" */
+  void set borderImageWidth(var value) {
+    setProperty('border-image-width', value, '');
+  }
+
+  /** Gets the value of "border-left" */
+  String get borderLeft =>
+    getPropertyValue('border-left');
+
+  /** Sets the value of "border-left" */
+  void set borderLeft(var value) {
+    setProperty('border-left', value, '');
+  }
+
+  /** Gets the value of "border-left-color" */
+  String get borderLeftColor =>
+    getPropertyValue('border-left-color');
+
+  /** Sets the value of "border-left-color" */
+  void set borderLeftColor(var value) {
+    setProperty('border-left-color', value, '');
+  }
+
+  /** Gets the value of "border-left-style" */
+  String get borderLeftStyle =>
+    getPropertyValue('border-left-style');
+
+  /** Sets the value of "border-left-style" */
+  void set borderLeftStyle(var value) {
+    setProperty('border-left-style', value, '');
+  }
+
+  /** Gets the value of "border-left-width" */
+  String get borderLeftWidth =>
+    getPropertyValue('border-left-width');
+
+  /** Sets the value of "border-left-width" */
+  void set borderLeftWidth(var value) {
+    setProperty('border-left-width', value, '');
+  }
+
+  /** Gets the value of "border-radius" */
+  String get borderRadius =>
+    getPropertyValue('border-radius');
+
+  /** Sets the value of "border-radius" */
+  void set borderRadius(var value) {
+    setProperty('border-radius', value, '');
+  }
+
+  /** Gets the value of "border-right" */
+  String get borderRight =>
+    getPropertyValue('border-right');
+
+  /** Sets the value of "border-right" */
+  void set borderRight(var value) {
+    setProperty('border-right', value, '');
+  }
+
+  /** Gets the value of "border-right-color" */
+  String get borderRightColor =>
+    getPropertyValue('border-right-color');
+
+  /** Sets the value of "border-right-color" */
+  void set borderRightColor(var value) {
+    setProperty('border-right-color', value, '');
+  }
+
+  /** Gets the value of "border-right-style" */
+  String get borderRightStyle =>
+    getPropertyValue('border-right-style');
+
+  /** Sets the value of "border-right-style" */
+  void set borderRightStyle(var value) {
+    setProperty('border-right-style', value, '');
+  }
+
+  /** Gets the value of "border-right-width" */
+  String get borderRightWidth =>
+    getPropertyValue('border-right-width');
+
+  /** Sets the value of "border-right-width" */
+  void set borderRightWidth(var value) {
+    setProperty('border-right-width', value, '');
+  }
+
+  /** Gets the value of "border-spacing" */
+  String get borderSpacing =>
+    getPropertyValue('border-spacing');
+
+  /** Sets the value of "border-spacing" */
+  void set borderSpacing(var value) {
+    setProperty('border-spacing', value, '');
+  }
+
+  /** Gets the value of "border-start" */
+  String get borderStart =>
+    getPropertyValue('${_browserPrefix}border-start');
+
+  /** Sets the value of "border-start" */
+  void set borderStart(var value) {
+    setProperty('${_browserPrefix}border-start', value, '');
+  }
+
+  /** Gets the value of "border-start-color" */
+  String get borderStartColor =>
+    getPropertyValue('${_browserPrefix}border-start-color');
+
+  /** Sets the value of "border-start-color" */
+  void set borderStartColor(var value) {
+    setProperty('${_browserPrefix}border-start-color', value, '');
+  }
+
+  /** Gets the value of "border-start-style" */
+  String get borderStartStyle =>
+    getPropertyValue('${_browserPrefix}border-start-style');
+
+  /** Sets the value of "border-start-style" */
+  void set borderStartStyle(var value) {
+    setProperty('${_browserPrefix}border-start-style', value, '');
+  }
+
+  /** Gets the value of "border-start-width" */
+  String get borderStartWidth =>
+    getPropertyValue('${_browserPrefix}border-start-width');
+
+  /** Sets the value of "border-start-width" */
+  void set borderStartWidth(var value) {
+    setProperty('${_browserPrefix}border-start-width', value, '');
+  }
+
+  /** Gets the value of "border-style" */
+  String get borderStyle =>
+    getPropertyValue('border-style');
+
+  /** Sets the value of "border-style" */
+  void set borderStyle(var value) {
+    setProperty('border-style', value, '');
+  }
+
+  /** Gets the value of "border-top" */
+  String get borderTop =>
+    getPropertyValue('border-top');
+
+  /** Sets the value of "border-top" */
+  void set borderTop(var value) {
+    setProperty('border-top', value, '');
+  }
+
+  /** Gets the value of "border-top-color" */
+  String get borderTopColor =>
+    getPropertyValue('border-top-color');
+
+  /** Sets the value of "border-top-color" */
+  void set borderTopColor(var value) {
+    setProperty('border-top-color', value, '');
+  }
+
+  /** Gets the value of "border-top-left-radius" */
+  String get borderTopLeftRadius =>
+    getPropertyValue('border-top-left-radius');
+
+  /** Sets the value of "border-top-left-radius" */
+  void set borderTopLeftRadius(var value) {
+    setProperty('border-top-left-radius', value, '');
+  }
+
+  /** Gets the value of "border-top-right-radius" */
+  String get borderTopRightRadius =>
+    getPropertyValue('border-top-right-radius');
+
+  /** Sets the value of "border-top-right-radius" */
+  void set borderTopRightRadius(var value) {
+    setProperty('border-top-right-radius', value, '');
+  }
+
+  /** Gets the value of "border-top-style" */
+  String get borderTopStyle =>
+    getPropertyValue('border-top-style');
+
+  /** Sets the value of "border-top-style" */
+  void set borderTopStyle(var value) {
+    setProperty('border-top-style', value, '');
+  }
+
+  /** Gets the value of "border-top-width" */
+  String get borderTopWidth =>
+    getPropertyValue('border-top-width');
+
+  /** Sets the value of "border-top-width" */
+  void set borderTopWidth(var value) {
+    setProperty('border-top-width', value, '');
+  }
+
+  /** Gets the value of "border-vertical-spacing" */
+  String get borderVerticalSpacing =>
+    getPropertyValue('${_browserPrefix}border-vertical-spacing');
+
+  /** Sets the value of "border-vertical-spacing" */
+  void set borderVerticalSpacing(var value) {
+    setProperty('${_browserPrefix}border-vertical-spacing', value, '');
+  }
+
+  /** Gets the value of "border-width" */
+  String get borderWidth =>
+    getPropertyValue('border-width');
+
+  /** Sets the value of "border-width" */
+  void set borderWidth(var value) {
+    setProperty('border-width', value, '');
+  }
+
+  /** Gets the value of "bottom" */
+  String get bottom =>
+    getPropertyValue('bottom');
+
+  /** Sets the value of "bottom" */
+  void set bottom(var value) {
+    setProperty('bottom', value, '');
+  }
+
+  /** Gets the value of "box-align" */
+  String get boxAlign =>
+    getPropertyValue('${_browserPrefix}box-align');
+
+  /** Sets the value of "box-align" */
+  void set boxAlign(var value) {
+    setProperty('${_browserPrefix}box-align', value, '');
+  }
+
+  /** Gets the value of "box-direction" */
+  String get boxDirection =>
+    getPropertyValue('${_browserPrefix}box-direction');
+
+  /** Sets the value of "box-direction" */
+  void set boxDirection(var value) {
+    setProperty('${_browserPrefix}box-direction', value, '');
+  }
+
+  /** Gets the value of "box-flex" */
+  String get boxFlex =>
+    getPropertyValue('${_browserPrefix}box-flex');
+
+  /** Sets the value of "box-flex" */
+  void set boxFlex(var value) {
+    setProperty('${_browserPrefix}box-flex', value, '');
+  }
+
+  /** Gets the value of "box-flex-group" */
+  String get boxFlexGroup =>
+    getPropertyValue('${_browserPrefix}box-flex-group');
+
+  /** Sets the value of "box-flex-group" */
+  void set boxFlexGroup(var value) {
+    setProperty('${_browserPrefix}box-flex-group', value, '');
+  }
+
+  /** Gets the value of "box-lines" */
+  String get boxLines =>
+    getPropertyValue('${_browserPrefix}box-lines');
+
+  /** Sets the value of "box-lines" */
+  void set boxLines(var value) {
+    setProperty('${_browserPrefix}box-lines', value, '');
+  }
+
+  /** Gets the value of "box-ordinal-group" */
+  String get boxOrdinalGroup =>
+    getPropertyValue('${_browserPrefix}box-ordinal-group');
+
+  /** Sets the value of "box-ordinal-group" */
+  void set boxOrdinalGroup(var value) {
+    setProperty('${_browserPrefix}box-ordinal-group', value, '');
+  }
+
+  /** Gets the value of "box-orient" */
+  String get boxOrient =>
+    getPropertyValue('${_browserPrefix}box-orient');
+
+  /** Sets the value of "box-orient" */
+  void set boxOrient(var value) {
+    setProperty('${_browserPrefix}box-orient', value, '');
+  }
+
+  /** Gets the value of "box-pack" */
+  String get boxPack =>
+    getPropertyValue('${_browserPrefix}box-pack');
+
+  /** Sets the value of "box-pack" */
+  void set boxPack(var value) {
+    setProperty('${_browserPrefix}box-pack', value, '');
+  }
+
+  /** Gets the value of "box-reflect" */
+  String get boxReflect =>
+    getPropertyValue('${_browserPrefix}box-reflect');
+
+  /** Sets the value of "box-reflect" */
+  void set boxReflect(var value) {
+    setProperty('${_browserPrefix}box-reflect', value, '');
+  }
+
+  /** Gets the value of "box-shadow" */
+  String get boxShadow =>
+    getPropertyValue('box-shadow');
+
+  /** Sets the value of "box-shadow" */
+  void set boxShadow(var value) {
+    setProperty('box-shadow', value, '');
+  }
+
+  /** Gets the value of "box-sizing" */
+  String get boxSizing =>
+    getPropertyValue('box-sizing');
+
+  /** Sets the value of "box-sizing" */
+  void set boxSizing(var value) {
+    setProperty('box-sizing', value, '');
+  }
+
+  /** Gets the value of "caption-side" */
+  String get captionSide =>
+    getPropertyValue('caption-side');
+
+  /** Sets the value of "caption-side" */
+  void set captionSide(var value) {
+    setProperty('caption-side', value, '');
+  }
+
+  /** Gets the value of "clear" */
+  String get clear =>
+    getPropertyValue('clear');
+
+  /** Sets the value of "clear" */
+  void set clear(var value) {
+    setProperty('clear', value, '');
+  }
+
+  /** Gets the value of "clip" */
+  String get clip =>
+    getPropertyValue('clip');
+
+  /** Sets the value of "clip" */
+  void set clip(var value) {
+    setProperty('clip', value, '');
+  }
+
+  /** Gets the value of "color" */
+  String get color =>
+    getPropertyValue('color');
+
+  /** Sets the value of "color" */
+  void set color(var value) {
+    setProperty('color', value, '');
+  }
+
+  /** Gets the value of "color-correction" */
+  String get colorCorrection =>
+    getPropertyValue('${_browserPrefix}color-correction');
+
+  /** Sets the value of "color-correction" */
+  void set colorCorrection(var value) {
+    setProperty('${_browserPrefix}color-correction', value, '');
+  }
+
+  /** Gets the value of "column-break-after" */
+  String get columnBreakAfter =>
+    getPropertyValue('${_browserPrefix}column-break-after');
+
+  /** Sets the value of "column-break-after" */
+  void set columnBreakAfter(var value) {
+    setProperty('${_browserPrefix}column-break-after', value, '');
+  }
+
+  /** Gets the value of "column-break-before" */
+  String get columnBreakBefore =>
+    getPropertyValue('${_browserPrefix}column-break-before');
+
+  /** Sets the value of "column-break-before" */
+  void set columnBreakBefore(var value) {
+    setProperty('${_browserPrefix}column-break-before', value, '');
+  }
+
+  /** Gets the value of "column-break-inside" */
+  String get columnBreakInside =>
+    getPropertyValue('${_browserPrefix}column-break-inside');
+
+  /** Sets the value of "column-break-inside" */
+  void set columnBreakInside(var value) {
+    setProperty('${_browserPrefix}column-break-inside', value, '');
+  }
+
+  /** Gets the value of "column-count" */
+  String get columnCount =>
+    getPropertyValue('${_browserPrefix}column-count');
+
+  /** Sets the value of "column-count" */
+  void set columnCount(var value) {
+    setProperty('${_browserPrefix}column-count', value, '');
+  }
+
+  /** Gets the value of "column-gap" */
+  String get columnGap =>
+    getPropertyValue('${_browserPrefix}column-gap');
+
+  /** Sets the value of "column-gap" */
+  void set columnGap(var value) {
+    setProperty('${_browserPrefix}column-gap', value, '');
+  }
+
+  /** Gets the value of "column-rule" */
+  String get columnRule =>
+    getPropertyValue('${_browserPrefix}column-rule');
+
+  /** Sets the value of "column-rule" */
+  void set columnRule(var value) {
+    setProperty('${_browserPrefix}column-rule', value, '');
+  }
+
+  /** Gets the value of "column-rule-color" */
+  String get columnRuleColor =>
+    getPropertyValue('${_browserPrefix}column-rule-color');
+
+  /** Sets the value of "column-rule-color" */
+  void set columnRuleColor(var value) {
+    setProperty('${_browserPrefix}column-rule-color', value, '');
+  }
+
+  /** Gets the value of "column-rule-style" */
+  String get columnRuleStyle =>
+    getPropertyValue('${_browserPrefix}column-rule-style');
+
+  /** Sets the value of "column-rule-style" */
+  void set columnRuleStyle(var value) {
+    setProperty('${_browserPrefix}column-rule-style', value, '');
+  }
+
+  /** Gets the value of "column-rule-width" */
+  String get columnRuleWidth =>
+    getPropertyValue('${_browserPrefix}column-rule-width');
+
+  /** Sets the value of "column-rule-width" */
+  void set columnRuleWidth(var value) {
+    setProperty('${_browserPrefix}column-rule-width', value, '');
+  }
+
+  /** Gets the value of "column-span" */
+  String get columnSpan =>
+    getPropertyValue('${_browserPrefix}column-span');
+
+  /** Sets the value of "column-span" */
+  void set columnSpan(var value) {
+    setProperty('${_browserPrefix}column-span', value, '');
+  }
+
+  /** Gets the value of "column-width" */
+  String get columnWidth =>
+    getPropertyValue('${_browserPrefix}column-width');
+
+  /** Sets the value of "column-width" */
+  void set columnWidth(var value) {
+    setProperty('${_browserPrefix}column-width', value, '');
+  }
+
+  /** Gets the value of "columns" */
+  String get columns =>
+    getPropertyValue('${_browserPrefix}columns');
+
+  /** Sets the value of "columns" */
+  void set columns(var value) {
+    setProperty('${_browserPrefix}columns', value, '');
+  }
+
+  /** Gets the value of "content" */
+  String get content =>
+    getPropertyValue('content');
+
+  /** Sets the value of "content" */
+  void set content(var value) {
+    setProperty('content', value, '');
+  }
+
+  /** Gets the value of "counter-increment" */
+  String get counterIncrement =>
+    getPropertyValue('counter-increment');
+
+  /** Sets the value of "counter-increment" */
+  void set counterIncrement(var value) {
+    setProperty('counter-increment', value, '');
+  }
+
+  /** Gets the value of "counter-reset" */
+  String get counterReset =>
+    getPropertyValue('counter-reset');
+
+  /** Sets the value of "counter-reset" */
+  void set counterReset(var value) {
+    setProperty('counter-reset', value, '');
+  }
+
+  /** Gets the value of "cursor" */
+  String get cursor =>
+    getPropertyValue('cursor');
+
+  /** Sets the value of "cursor" */
+  void set cursor(var value) {
+    setProperty('cursor', value, '');
+  }
+
+  /** Gets the value of "direction" */
+  String get direction =>
+    getPropertyValue('direction');
+
+  /** Sets the value of "direction" */
+  void set direction(var value) {
+    setProperty('direction', value, '');
+  }
+
+  /** Gets the value of "display" */
+  String get display =>
+    getPropertyValue('display');
+
+  /** Sets the value of "display" */
+  void set display(var value) {
+    setProperty('display', value, '');
+  }
+
+  /** Gets the value of "empty-cells" */
+  String get emptyCells =>
+    getPropertyValue('empty-cells');
+
+  /** Sets the value of "empty-cells" */
+  void set emptyCells(var value) {
+    setProperty('empty-cells', value, '');
+  }
+
+  /** Gets the value of "filter" */
+  String get filter =>
+    getPropertyValue('${_browserPrefix}filter');
+
+  /** Sets the value of "filter" */
+  void set filter(var value) {
+    setProperty('${_browserPrefix}filter', value, '');
+  }
+
+  /** Gets the value of "flex-align" */
+  String get flexAlign =>
+    getPropertyValue('${_browserPrefix}flex-align');
+
+  /** Sets the value of "flex-align" */
+  void set flexAlign(var value) {
+    setProperty('${_browserPrefix}flex-align', value, '');
+  }
+
+  /** Gets the value of "flex-flow" */
+  String get flexFlow =>
+    getPropertyValue('${_browserPrefix}flex-flow');
+
+  /** Sets the value of "flex-flow" */
+  void set flexFlow(var value) {
+    setProperty('${_browserPrefix}flex-flow', value, '');
+  }
+
+  /** Gets the value of "flex-order" */
+  String get flexOrder =>
+    getPropertyValue('${_browserPrefix}flex-order');
+
+  /** Sets the value of "flex-order" */
+  void set flexOrder(var value) {
+    setProperty('${_browserPrefix}flex-order', value, '');
+  }
+
+  /** Gets the value of "flex-pack" */
+  String get flexPack =>
+    getPropertyValue('${_browserPrefix}flex-pack');
+
+  /** Sets the value of "flex-pack" */
+  void set flexPack(var value) {
+    setProperty('${_browserPrefix}flex-pack', value, '');
+  }
+
+  /** Gets the value of "float" */
+  String get float =>
+    getPropertyValue('float');
+
+  /** Sets the value of "float" */
+  void set float(var value) {
+    setProperty('float', value, '');
+  }
+
+  /** Gets the value of "flow-from" */
+  String get flowFrom =>
+    getPropertyValue('${_browserPrefix}flow-from');
+
+  /** Sets the value of "flow-from" */
+  void set flowFrom(var value) {
+    setProperty('${_browserPrefix}flow-from', value, '');
+  }
+
+  /** Gets the value of "flow-into" */
+  String get flowInto =>
+    getPropertyValue('${_browserPrefix}flow-into');
+
+  /** Sets the value of "flow-into" */
+  void set flowInto(var value) {
+    setProperty('${_browserPrefix}flow-into', value, '');
+  }
+
+  /** Gets the value of "font" */
+  String get font =>
+    getPropertyValue('font');
+
+  /** Sets the value of "font" */
+  void set font(var value) {
+    setProperty('font', value, '');
+  }
+
+  /** Gets the value of "font-family" */
+  String get fontFamily =>
+    getPropertyValue('font-family');
+
+  /** Sets the value of "font-family" */
+  void set fontFamily(var value) {
+    setProperty('font-family', value, '');
+  }
+
+  /** Gets the value of "font-feature-settings" */
+  String get fontFeatureSettings =>
+    getPropertyValue('${_browserPrefix}font-feature-settings');
+
+  /** Sets the value of "font-feature-settings" */
+  void set fontFeatureSettings(var value) {
+    setProperty('${_browserPrefix}font-feature-settings', value, '');
+  }
+
+  /** Gets the value of "font-size" */
+  String get fontSize =>
+    getPropertyValue('font-size');
+
+  /** Sets the value of "font-size" */
+  void set fontSize(var value) {
+    setProperty('font-size', value, '');
+  }
+
+  /** Gets the value of "font-size-delta" */
+  String get fontSizeDelta =>
+    getPropertyValue('${_browserPrefix}font-size-delta');
+
+  /** Sets the value of "font-size-delta" */
+  void set fontSizeDelta(var value) {
+    setProperty('${_browserPrefix}font-size-delta', value, '');
+  }
+
+  /** Gets the value of "font-smoothing" */
+  String get fontSmoothing =>
+    getPropertyValue('${_browserPrefix}font-smoothing');
+
+  /** Sets the value of "font-smoothing" */
+  void set fontSmoothing(var value) {
+    setProperty('${_browserPrefix}font-smoothing', value, '');
+  }
+
+  /** Gets the value of "font-stretch" */
+  String get fontStretch =>
+    getPropertyValue('font-stretch');
+
+  /** Sets the value of "font-stretch" */
+  void set fontStretch(var value) {
+    setProperty('font-stretch', value, '');
+  }
+
+  /** Gets the value of "font-style" */
+  String get fontStyle =>
+    getPropertyValue('font-style');
+
+  /** Sets the value of "font-style" */
+  void set fontStyle(var value) {
+    setProperty('font-style', value, '');
+  }
+
+  /** Gets the value of "font-variant" */
+  String get fontVariant =>
+    getPropertyValue('font-variant');
+
+  /** Sets the value of "font-variant" */
+  void set fontVariant(var value) {
+    setProperty('font-variant', value, '');
+  }
+
+  /** Gets the value of "font-weight" */
+  String get fontWeight =>
+    getPropertyValue('font-weight');
+
+  /** Sets the value of "font-weight" */
+  void set fontWeight(var value) {
+    setProperty('font-weight', value, '');
+  }
+
+  /** Gets the value of "height" */
+  String get height =>
+    getPropertyValue('height');
+
+  /** Sets the value of "height" */
+  void set height(var value) {
+    setProperty('height', value, '');
+  }
+
+  /** Gets the value of "highlight" */
+  String get highlight =>
+    getPropertyValue('${_browserPrefix}highlight');
+
+  /** Sets the value of "highlight" */
+  void set highlight(var value) {
+    setProperty('${_browserPrefix}highlight', value, '');
+  }
+
+  /** Gets the value of "hyphenate-character" */
+  String get hyphenateCharacter =>
+    getPropertyValue('${_browserPrefix}hyphenate-character');
+
+  /** Sets the value of "hyphenate-character" */
+  void set hyphenateCharacter(var value) {
+    setProperty('${_browserPrefix}hyphenate-character', value, '');
+  }
+
+  /** Gets the value of "hyphenate-limit-after" */
+  String get hyphenateLimitAfter =>
+    getPropertyValue('${_browserPrefix}hyphenate-limit-after');
+
+  /** Sets the value of "hyphenate-limit-after" */
+  void set hyphenateLimitAfter(var value) {
+    setProperty('${_browserPrefix}hyphenate-limit-after', value, '');
+  }
+
+  /** Gets the value of "hyphenate-limit-before" */
+  String get hyphenateLimitBefore =>
+    getPropertyValue('${_browserPrefix}hyphenate-limit-before');
+
+  /** Sets the value of "hyphenate-limit-before" */
+  void set hyphenateLimitBefore(var value) {
+    setProperty('${_browserPrefix}hyphenate-limit-before', value, '');
+  }
+
+  /** Gets the value of "hyphenate-limit-lines" */
+  String get hyphenateLimitLines =>
+    getPropertyValue('${_browserPrefix}hyphenate-limit-lines');
+
+  /** Sets the value of "hyphenate-limit-lines" */
+  void set hyphenateLimitLines(var value) {
+    setProperty('${_browserPrefix}hyphenate-limit-lines', value, '');
+  }
+
+  /** Gets the value of "hyphens" */
+  String get hyphens =>
+    getPropertyValue('${_browserPrefix}hyphens');
+
+  /** Sets the value of "hyphens" */
+  void set hyphens(var value) {
+    setProperty('${_browserPrefix}hyphens', value, '');
+  }
+
+  /** Gets the value of "image-rendering" */
+  String get imageRendering =>
+    getPropertyValue('image-rendering');
+
+  /** Sets the value of "image-rendering" */
+  void set imageRendering(var value) {
+    setProperty('image-rendering', value, '');
+  }
+
+  /** Gets the value of "left" */
+  String get left =>
+    getPropertyValue('left');
+
+  /** Sets the value of "left" */
+  void set left(var value) {
+    setProperty('left', value, '');
+  }
+
+  /** Gets the value of "letter-spacing" */
+  String get letterSpacing =>
+    getPropertyValue('letter-spacing');
+
+  /** Sets the value of "letter-spacing" */
+  void set letterSpacing(var value) {
+    setProperty('letter-spacing', value, '');
+  }
+
+  /** Gets the value of "line-box-contain" */
+  String get lineBoxContain =>
+    getPropertyValue('${_browserPrefix}line-box-contain');
+
+  /** Sets the value of "line-box-contain" */
+  void set lineBoxContain(var value) {
+    setProperty('${_browserPrefix}line-box-contain', value, '');
+  }
+
+  /** Gets the value of "line-break" */
+  String get lineBreak =>
+    getPropertyValue('${_browserPrefix}line-break');
+
+  /** Sets the value of "line-break" */
+  void set lineBreak(var value) {
+    setProperty('${_browserPrefix}line-break', value, '');
+  }
+
+  /** Gets the value of "line-clamp" */
+  String get lineClamp =>
+    getPropertyValue('${_browserPrefix}line-clamp');
+
+  /** Sets the value of "line-clamp" */
+  void set lineClamp(var value) {
+    setProperty('${_browserPrefix}line-clamp', value, '');
+  }
+
+  /** Gets the value of "line-height" */
+  String get lineHeight =>
+    getPropertyValue('line-height');
+
+  /** Sets the value of "line-height" */
+  void set lineHeight(var value) {
+    setProperty('line-height', value, '');
+  }
+
+  /** Gets the value of "list-style" */
+  String get listStyle =>
+    getPropertyValue('list-style');
+
+  /** Sets the value of "list-style" */
+  void set listStyle(var value) {
+    setProperty('list-style', value, '');
+  }
+
+  /** Gets the value of "list-style-image" */
+  String get listStyleImage =>
+    getPropertyValue('list-style-image');
+
+  /** Sets the value of "list-style-image" */
+  void set listStyleImage(var value) {
+    setProperty('list-style-image', value, '');
+  }
+
+  /** Gets the value of "list-style-position" */
+  String get listStylePosition =>
+    getPropertyValue('list-style-position');
+
+  /** Sets the value of "list-style-position" */
+  void set listStylePosition(var value) {
+    setProperty('list-style-position', value, '');
+  }
+
+  /** Gets the value of "list-style-type" */
+  String get listStyleType =>
+    getPropertyValue('list-style-type');
+
+  /** Sets the value of "list-style-type" */
+  void set listStyleType(var value) {
+    setProperty('list-style-type', value, '');
+  }
+
+  /** Gets the value of "locale" */
+  String get locale =>
+    getPropertyValue('${_browserPrefix}locale');
+
+  /** Sets the value of "locale" */
+  void set locale(var value) {
+    setProperty('${_browserPrefix}locale', value, '');
+  }
+
+  /** Gets the value of "logical-height" */
+  String get logicalHeight =>
+    getPropertyValue('${_browserPrefix}logical-height');
+
+  /** Sets the value of "logical-height" */
+  void set logicalHeight(var value) {
+    setProperty('${_browserPrefix}logical-height', value, '');
+  }
+
+  /** Gets the value of "logical-width" */
+  String get logicalWidth =>
+    getPropertyValue('${_browserPrefix}logical-width');
+
+  /** Sets the value of "logical-width" */
+  void set logicalWidth(var value) {
+    setProperty('${_browserPrefix}logical-width', value, '');
+  }
+
+  /** Gets the value of "margin" */
+  String get margin =>
+    getPropertyValue('margin');
+
+  /** Sets the value of "margin" */
+  void set margin(var value) {
+    setProperty('margin', value, '');
+  }
+
+  /** Gets the value of "margin-after" */
+  String get marginAfter =>
+    getPropertyValue('${_browserPrefix}margin-after');
+
+  /** Sets the value of "margin-after" */
+  void set marginAfter(var value) {
+    setProperty('${_browserPrefix}margin-after', value, '');
+  }
+
+  /** Gets the value of "margin-after-collapse" */
+  String get marginAfterCollapse =>
+    getPropertyValue('${_browserPrefix}margin-after-collapse');
+
+  /** Sets the value of "margin-after-collapse" */
+  void set marginAfterCollapse(var value) {
+    setProperty('${_browserPrefix}margin-after-collapse', value, '');
+  }
+
+  /** Gets the value of "margin-before" */
+  String get marginBefore =>
+    getPropertyValue('${_browserPrefix}margin-before');
+
+  /** Sets the value of "margin-before" */
+  void set marginBefore(var value) {
+    setProperty('${_browserPrefix}margin-before', value, '');
+  }
+
+  /** Gets the value of "margin-before-collapse" */
+  String get marginBeforeCollapse =>
+    getPropertyValue('${_browserPrefix}margin-before-collapse');
+
+  /** Sets the value of "margin-before-collapse" */
+  void set marginBeforeCollapse(var value) {
+    setProperty('${_browserPrefix}margin-before-collapse', value, '');
+  }
+
+  /** Gets the value of "margin-bottom" */
+  String get marginBottom =>
+    getPropertyValue('margin-bottom');
+
+  /** Sets the value of "margin-bottom" */
+  void set marginBottom(var value) {
+    setProperty('margin-bottom', value, '');
+  }
+
+  /** Gets the value of "margin-bottom-collapse" */
+  String get marginBottomCollapse =>
+    getPropertyValue('${_browserPrefix}margin-bottom-collapse');
+
+  /** Sets the value of "margin-bottom-collapse" */
+  void set marginBottomCollapse(var value) {
+    setProperty('${_browserPrefix}margin-bottom-collapse', value, '');
+  }
+
+  /** Gets the value of "margin-collapse" */
+  String get marginCollapse =>
+    getPropertyValue('${_browserPrefix}margin-collapse');
+
+  /** Sets the value of "margin-collapse" */
+  void set marginCollapse(var value) {
+    setProperty('${_browserPrefix}margin-collapse', value, '');
+  }
+
+  /** Gets the value of "margin-end" */
+  String get marginEnd =>
+    getPropertyValue('${_browserPrefix}margin-end');
+
+  /** Sets the value of "margin-end" */
+  void set marginEnd(var value) {
+    setProperty('${_browserPrefix}margin-end', value, '');
+  }
+
+  /** Gets the value of "margin-left" */
+  String get marginLeft =>
+    getPropertyValue('margin-left');
+
+  /** Sets the value of "margin-left" */
+  void set marginLeft(var value) {
+    setProperty('margin-left', value, '');
+  }
+
+  /** Gets the value of "margin-right" */
+  String get marginRight =>
+    getPropertyValue('margin-right');
+
+  /** Sets the value of "margin-right" */
+  void set marginRight(var value) {
+    setProperty('margin-right', value, '');
+  }
+
+  /** Gets the value of "margin-start" */
+  String get marginStart =>
+    getPropertyValue('${_browserPrefix}margin-start');
+
+  /** Sets the value of "margin-start" */
+  void set marginStart(var value) {
+    setProperty('${_browserPrefix}margin-start', value, '');
+  }
+
+  /** Gets the value of "margin-top" */
+  String get marginTop =>
+    getPropertyValue('margin-top');
+
+  /** Sets the value of "margin-top" */
+  void set marginTop(var value) {
+    setProperty('margin-top', value, '');
+  }
+
+  /** Gets the value of "margin-top-collapse" */
+  String get marginTopCollapse =>
+    getPropertyValue('${_browserPrefix}margin-top-collapse');
+
+  /** Sets the value of "margin-top-collapse" */
+  void set marginTopCollapse(var value) {
+    setProperty('${_browserPrefix}margin-top-collapse', value, '');
+  }
+
+  /** Gets the value of "marquee" */
+  String get marquee =>
+    getPropertyValue('${_browserPrefix}marquee');
+
+  /** Sets the value of "marquee" */
+  void set marquee(var value) {
+    setProperty('${_browserPrefix}marquee', value, '');
+  }
+
+  /** Gets the value of "marquee-direction" */
+  String get marqueeDirection =>
+    getPropertyValue('${_browserPrefix}marquee-direction');
+
+  /** Sets the value of "marquee-direction" */
+  void set marqueeDirection(var value) {
+    setProperty('${_browserPrefix}marquee-direction', value, '');
+  }
+
+  /** Gets the value of "marquee-increment" */
+  String get marqueeIncrement =>
+    getPropertyValue('${_browserPrefix}marquee-increment');
+
+  /** Sets the value of "marquee-increment" */
+  void set marqueeIncrement(var value) {
+    setProperty('${_browserPrefix}marquee-increment', value, '');
+  }
+
+  /** Gets the value of "marquee-repetition" */
+  String get marqueeRepetition =>
+    getPropertyValue('${_browserPrefix}marquee-repetition');
+
+  /** Sets the value of "marquee-repetition" */
+  void set marqueeRepetition(var value) {
+    setProperty('${_browserPrefix}marquee-repetition', value, '');
+  }
+
+  /** Gets the value of "marquee-speed" */
+  String get marqueeSpeed =>
+    getPropertyValue('${_browserPrefix}marquee-speed');
+
+  /** Sets the value of "marquee-speed" */
+  void set marqueeSpeed(var value) {
+    setProperty('${_browserPrefix}marquee-speed', value, '');
+  }
+
+  /** Gets the value of "marquee-style" */
+  String get marqueeStyle =>
+    getPropertyValue('${_browserPrefix}marquee-style');
+
+  /** Sets the value of "marquee-style" */
+  void set marqueeStyle(var value) {
+    setProperty('${_browserPrefix}marquee-style', value, '');
+  }
+
+  /** Gets the value of "mask" */
+  String get mask =>
+    getPropertyValue('${_browserPrefix}mask');
+
+  /** Sets the value of "mask" */
+  void set mask(var value) {
+    setProperty('${_browserPrefix}mask', value, '');
+  }
+
+  /** Gets the value of "mask-attachment" */
+  String get maskAttachment =>
+    getPropertyValue('${_browserPrefix}mask-attachment');
+
+  /** Sets the value of "mask-attachment" */
+  void set maskAttachment(var value) {
+    setProperty('${_browserPrefix}mask-attachment', value, '');
+  }
+
+  /** Gets the value of "mask-box-image" */
+  String get maskBoxImage =>
+    getPropertyValue('${_browserPrefix}mask-box-image');
+
+  /** Sets the value of "mask-box-image" */
+  void set maskBoxImage(var value) {
+    setProperty('${_browserPrefix}mask-box-image', value, '');
+  }
+
+  /** Gets the value of "mask-box-image-outset" */
+  String get maskBoxImageOutset =>
+    getPropertyValue('${_browserPrefix}mask-box-image-outset');
+
+  /** Sets the value of "mask-box-image-outset" */
+  void set maskBoxImageOutset(var value) {
+    setProperty('${_browserPrefix}mask-box-image-outset', value, '');
+  }
+
+  /** Gets the value of "mask-box-image-repeat" */
+  String get maskBoxImageRepeat =>
+    getPropertyValue('${_browserPrefix}mask-box-image-repeat');
+
+  /** Sets the value of "mask-box-image-repeat" */
+  void set maskBoxImageRepeat(var value) {
+    setProperty('${_browserPrefix}mask-box-image-repeat', value, '');
+  }
+
+  /** Gets the value of "mask-box-image-slice" */
+  String get maskBoxImageSlice =>
+    getPropertyValue('${_browserPrefix}mask-box-image-slice');
+
+  /** Sets the value of "mask-box-image-slice" */
+  void set maskBoxImageSlice(var value) {
+    setProperty('${_browserPrefix}mask-box-image-slice', value, '');
+  }
+
+  /** Gets the value of "mask-box-image-source" */
+  String get maskBoxImageSource =>
+    getPropertyValue('${_browserPrefix}mask-box-image-source');
+
+  /** Sets the value of "mask-box-image-source" */
+  void set maskBoxImageSource(var value) {
+    setProperty('${_browserPrefix}mask-box-image-source', value, '');
+  }
+
+  /** Gets the value of "mask-box-image-width" */
+  String get maskBoxImageWidth =>
+    getPropertyValue('${_browserPrefix}mask-box-image-width');
+
+  /** Sets the value of "mask-box-image-width" */
+  void set maskBoxImageWidth(var value) {
+    setProperty('${_browserPrefix}mask-box-image-width', value, '');
+  }
+
+  /** Gets the value of "mask-clip" */
+  String get maskClip =>
+    getPropertyValue('${_browserPrefix}mask-clip');
+
+  /** Sets the value of "mask-clip" */
+  void set maskClip(var value) {
+    setProperty('${_browserPrefix}mask-clip', value, '');
+  }
+
+  /** Gets the value of "mask-composite" */
+  String get maskComposite =>
+    getPropertyValue('${_browserPrefix}mask-composite');
+
+  /** Sets the value of "mask-composite" */
+  void set maskComposite(var value) {
+    setProperty('${_browserPrefix}mask-composite', value, '');
+  }
+
+  /** Gets the value of "mask-image" */
+  String get maskImage =>
+    getPropertyValue('${_browserPrefix}mask-image');
+
+  /** Sets the value of "mask-image" */
+  void set maskImage(var value) {
+    setProperty('${_browserPrefix}mask-image', value, '');
+  }
+
+  /** Gets the value of "mask-origin" */
+  String get maskOrigin =>
+    getPropertyValue('${_browserPrefix}mask-origin');
+
+  /** Sets the value of "mask-origin" */
+  void set maskOrigin(var value) {
+    setProperty('${_browserPrefix}mask-origin', value, '');
+  }
+
+  /** Gets the value of "mask-position" */
+  String get maskPosition =>
+    getPropertyValue('${_browserPrefix}mask-position');
+
+  /** Sets the value of "mask-position" */
+  void set maskPosition(var value) {
+    setProperty('${_browserPrefix}mask-position', value, '');
+  }
+
+  /** Gets the value of "mask-position-x" */
+  String get maskPositionX =>
+    getPropertyValue('${_browserPrefix}mask-position-x');
+
+  /** Sets the value of "mask-position-x" */
+  void set maskPositionX(var value) {
+    setProperty('${_browserPrefix}mask-position-x', value, '');
+  }
+
+  /** Gets the value of "mask-position-y" */
+  String get maskPositionY =>
+    getPropertyValue('${_browserPrefix}mask-position-y');
+
+  /** Sets the value of "mask-position-y" */
+  void set maskPositionY(var value) {
+    setProperty('${_browserPrefix}mask-position-y', value, '');
+  }
+
+  /** Gets the value of "mask-repeat" */
+  String get maskRepeat =>
+    getPropertyValue('${_browserPrefix}mask-repeat');
+
+  /** Sets the value of "mask-repeat" */
+  void set maskRepeat(var value) {
+    setProperty('${_browserPrefix}mask-repeat', value, '');
+  }
+
+  /** Gets the value of "mask-repeat-x" */
+  String get maskRepeatX =>
+    getPropertyValue('${_browserPrefix}mask-repeat-x');
+
+  /** Sets the value of "mask-repeat-x" */
+  void set maskRepeatX(var value) {
+    setProperty('${_browserPrefix}mask-repeat-x', value, '');
+  }
+
+  /** Gets the value of "mask-repeat-y" */
+  String get maskRepeatY =>
+    getPropertyValue('${_browserPrefix}mask-repeat-y');
+
+  /** Sets the value of "mask-repeat-y" */
+  void set maskRepeatY(var value) {
+    setProperty('${_browserPrefix}mask-repeat-y', value, '');
+  }
+
+  /** Gets the value of "mask-size" */
+  String get maskSize =>
+    getPropertyValue('${_browserPrefix}mask-size');
+
+  /** Sets the value of "mask-size" */
+  void set maskSize(var value) {
+    setProperty('${_browserPrefix}mask-size', value, '');
+  }
+
+  /** Gets the value of "match-nearest-mail-blockquote-color" */
+  String get matchNearestMailBlockquoteColor =>
+    getPropertyValue('${_browserPrefix}match-nearest-mail-blockquote-color');
+
+  /** Sets the value of "match-nearest-mail-blockquote-color" */
+  void set matchNearestMailBlockquoteColor(var value) {
+    setProperty('${_browserPrefix}match-nearest-mail-blockquote-color', value, '');
+  }
+
+  /** Gets the value of "max-height" */
+  String get maxHeight =>
+    getPropertyValue('max-height');
+
+  /** Sets the value of "max-height" */
+  void set maxHeight(var value) {
+    setProperty('max-height', value, '');
+  }
+
+  /** Gets the value of "max-logical-height" */
+  String get maxLogicalHeight =>
+    getPropertyValue('${_browserPrefix}max-logical-height');
+
+  /** Sets the value of "max-logical-height" */
+  void set maxLogicalHeight(var value) {
+    setProperty('${_browserPrefix}max-logical-height', value, '');
+  }
+
+  /** Gets the value of "max-logical-width" */
+  String get maxLogicalWidth =>
+    getPropertyValue('${_browserPrefix}max-logical-width');
+
+  /** Sets the value of "max-logical-width" */
+  void set maxLogicalWidth(var value) {
+    setProperty('${_browserPrefix}max-logical-width', value, '');
+  }
+
+  /** Gets the value of "max-width" */
+  String get maxWidth =>
+    getPropertyValue('max-width');
+
+  /** Sets the value of "max-width" */
+  void set maxWidth(var value) {
+    setProperty('max-width', value, '');
+  }
+
+  /** Gets the value of "min-height" */
+  String get minHeight =>
+    getPropertyValue('min-height');
+
+  /** Sets the value of "min-height" */
+  void set minHeight(var value) {
+    setProperty('min-height', value, '');
+  }
+
+  /** Gets the value of "min-logical-height" */
+  String get minLogicalHeight =>
+    getPropertyValue('${_browserPrefix}min-logical-height');
+
+  /** Sets the value of "min-logical-height" */
+  void set minLogicalHeight(var value) {
+    setProperty('${_browserPrefix}min-logical-height', value, '');
+  }
+
+  /** Gets the value of "min-logical-width" */
+  String get minLogicalWidth =>
+    getPropertyValue('${_browserPrefix}min-logical-width');
+
+  /** Sets the value of "min-logical-width" */
+  void set minLogicalWidth(var value) {
+    setProperty('${_browserPrefix}min-logical-width', value, '');
+  }
+
+  /** Gets the value of "min-width" */
+  String get minWidth =>
+    getPropertyValue('min-width');
+
+  /** Sets the value of "min-width" */
+  void set minWidth(var value) {
+    setProperty('min-width', value, '');
+  }
+
+  /** Gets the value of "nbsp-mode" */
+  String get nbspMode =>
+    getPropertyValue('${_browserPrefix}nbsp-mode');
+
+  /** Sets the value of "nbsp-mode" */
+  void set nbspMode(var value) {
+    setProperty('${_browserPrefix}nbsp-mode', value, '');
+  }
+
+  /** Gets the value of "opacity" */
+  String get opacity =>
+    getPropertyValue('opacity');
+
+  /** Sets the value of "opacity" */
+  void set opacity(var value) {
+    setProperty('opacity', value, '');
+  }
+
+  /** Gets the value of "orphans" */
+  String get orphans =>
+    getPropertyValue('orphans');
+
+  /** Sets the value of "orphans" */
+  void set orphans(var value) {
+    setProperty('orphans', value, '');
+  }
+
+  /** Gets the value of "outline" */
+  String get outline =>
+    getPropertyValue('outline');
+
+  /** Sets the value of "outline" */
+  void set outline(var value) {
+    setProperty('outline', value, '');
+  }
+
+  /** Gets the value of "outline-color" */
+  String get outlineColor =>
+    getPropertyValue('outline-color');
+
+  /** Sets the value of "outline-color" */
+  void set outlineColor(var value) {
+    setProperty('outline-color', value, '');
+  }
+
+  /** Gets the value of "outline-offset" */
+  String get outlineOffset =>
+    getPropertyValue('outline-offset');
+
+  /** Sets the value of "outline-offset" */
+  void set outlineOffset(var value) {
+    setProperty('outline-offset', value, '');
+  }
+
+  /** Gets the value of "outline-style" */
+  String get outlineStyle =>
+    getPropertyValue('outline-style');
+
+  /** Sets the value of "outline-style" */
+  void set outlineStyle(var value) {
+    setProperty('outline-style', value, '');
+  }
+
+  /** Gets the value of "outline-width" */
+  String get outlineWidth =>
+    getPropertyValue('outline-width');
+
+  /** Sets the value of "outline-width" */
+  void set outlineWidth(var value) {
+    setProperty('outline-width', value, '');
+  }
+
+  /** Gets the value of "overflow" */
+  String get overflow =>
+    getPropertyValue('overflow');
+
+  /** Sets the value of "overflow" */
+  void set overflow(var value) {
+    setProperty('overflow', value, '');
+  }
+
+  /** Gets the value of "overflow-x" */
+  String get overflowX =>
+    getPropertyValue('overflow-x');
+
+  /** Sets the value of "overflow-x" */
+  void set overflowX(var value) {
+    setProperty('overflow-x', value, '');
+  }
+
+  /** Gets the value of "overflow-y" */
+  String get overflowY =>
+    getPropertyValue('overflow-y');
+
+  /** Sets the value of "overflow-y" */
+  void set overflowY(var value) {
+    setProperty('overflow-y', value, '');
+  }
+
+  /** Gets the value of "padding" */
+  String get padding =>
+    getPropertyValue('padding');
+
+  /** Sets the value of "padding" */
+  void set padding(var value) {
+    setProperty('padding', value, '');
+  }
+
+  /** Gets the value of "padding-after" */
+  String get paddingAfter =>
+    getPropertyValue('${_browserPrefix}padding-after');
+
+  /** Sets the value of "padding-after" */
+  void set paddingAfter(var value) {
+    setProperty('${_browserPrefix}padding-after', value, '');
+  }
+
+  /** Gets the value of "padding-before" */
+  String get paddingBefore =>
+    getPropertyValue('${_browserPrefix}padding-before');
+
+  /** Sets the value of "padding-before" */
+  void set paddingBefore(var value) {
+    setProperty('${_browserPrefix}padding-before', value, '');
+  }
+
+  /** Gets the value of "padding-bottom" */
+  String get paddingBottom =>
+    getPropertyValue('padding-bottom');
+
+  /** Sets the value of "padding-bottom" */
+  void set paddingBottom(var value) {
+    setProperty('padding-bottom', value, '');
+  }
+
+  /** Gets the value of "padding-end" */
+  String get paddingEnd =>
+    getPropertyValue('${_browserPrefix}padding-end');
+
+  /** Sets the value of "padding-end" */
+  void set paddingEnd(var value) {
+    setProperty('${_browserPrefix}padding-end', value, '');
+  }
+
+  /** Gets the value of "padding-left" */
+  String get paddingLeft =>
+    getPropertyValue('padding-left');
+
+  /** Sets the value of "padding-left" */
+  void set paddingLeft(var value) {
+    setProperty('padding-left', value, '');
+  }
+
+  /** Gets the value of "padding-right" */
+  String get paddingRight =>
+    getPropertyValue('padding-right');
+
+  /** Sets the value of "padding-right" */
+  void set paddingRight(var value) {
+    setProperty('padding-right', value, '');
+  }
+
+  /** Gets the value of "padding-start" */
+  String get paddingStart =>
+    getPropertyValue('${_browserPrefix}padding-start');
+
+  /** Sets the value of "padding-start" */
+  void set paddingStart(var value) {
+    setProperty('${_browserPrefix}padding-start', value, '');
+  }
+
+  /** Gets the value of "padding-top" */
+  String get paddingTop =>
+    getPropertyValue('padding-top');
+
+  /** Sets the value of "padding-top" */
+  void set paddingTop(var value) {
+    setProperty('padding-top', value, '');
+  }
+
+  /** Gets the value of "page" */
+  String get page =>
+    getPropertyValue('page');
+
+  /** Sets the value of "page" */
+  void set page(var value) {
+    setProperty('page', value, '');
+  }
+
+  /** Gets the value of "page-break-after" */
+  String get pageBreakAfter =>
+    getPropertyValue('page-break-after');
+
+  /** Sets the value of "page-break-after" */
+  void set pageBreakAfter(var value) {
+    setProperty('page-break-after', value, '');
+  }
+
+  /** Gets the value of "page-break-before" */
+  String get pageBreakBefore =>
+    getPropertyValue('page-break-before');
+
+  /** Sets the value of "page-break-before" */
+  void set pageBreakBefore(var value) {
+    setProperty('page-break-before', value, '');
+  }
+
+  /** Gets the value of "page-break-inside" */
+  String get pageBreakInside =>
+    getPropertyValue('page-break-inside');
+
+  /** Sets the value of "page-break-inside" */
+  void set pageBreakInside(var value) {
+    setProperty('page-break-inside', value, '');
+  }
+
+  /** Gets the value of "perspective" */
+  String get perspective =>
+    getPropertyValue('${_browserPrefix}perspective');
+
+  /** Sets the value of "perspective" */
+  void set perspective(var value) {
+    setProperty('${_browserPrefix}perspective', value, '');
+  }
+
+  /** Gets the value of "perspective-origin" */
+  String get perspectiveOrigin =>
+    getPropertyValue('${_browserPrefix}perspective-origin');
+
+  /** Sets the value of "perspective-origin" */
+  void set perspectiveOrigin(var value) {
+    setProperty('${_browserPrefix}perspective-origin', value, '');
+  }
+
+  /** Gets the value of "perspective-origin-x" */
+  String get perspectiveOriginX =>
+    getPropertyValue('${_browserPrefix}perspective-origin-x');
+
+  /** Sets the value of "perspective-origin-x" */
+  void set perspectiveOriginX(var value) {
+    setProperty('${_browserPrefix}perspective-origin-x', value, '');
+  }
+
+  /** Gets the value of "perspective-origin-y" */
+  String get perspectiveOriginY =>
+    getPropertyValue('${_browserPrefix}perspective-origin-y');
+
+  /** Sets the value of "perspective-origin-y" */
+  void set perspectiveOriginY(var value) {
+    setProperty('${_browserPrefix}perspective-origin-y', value, '');
+  }
+
+  /** Gets the value of "pointer-events" */
+  String get pointerEvents =>
+    getPropertyValue('pointer-events');
+
+  /** Sets the value of "pointer-events" */
+  void set pointerEvents(var value) {
+    setProperty('pointer-events', value, '');
+  }
+
+  /** Gets the value of "position" */
+  String get position =>
+    getPropertyValue('position');
+
+  /** Sets the value of "position" */
+  void set position(var value) {
+    setProperty('position', value, '');
+  }
+
+  /** Gets the value of "quotes" */
+  String get quotes =>
+    getPropertyValue('quotes');
+
+  /** Sets the value of "quotes" */
+  void set quotes(var value) {
+    setProperty('quotes', value, '');
+  }
+
+  /** Gets the value of "region-break-after" */
+  String get regionBreakAfter =>
+    getPropertyValue('${_browserPrefix}region-break-after');
+
+  /** Sets the value of "region-break-after" */
+  void set regionBreakAfter(var value) {
+    setProperty('${_browserPrefix}region-break-after', value, '');
+  }
+
+  /** Gets the value of "region-break-before" */
+  String get regionBreakBefore =>
+    getPropertyValue('${_browserPrefix}region-break-before');
+
+  /** Sets the value of "region-break-before" */
+  void set regionBreakBefore(var value) {
+    setProperty('${_browserPrefix}region-break-before', value, '');
+  }
+
+  /** Gets the value of "region-break-inside" */
+  String get regionBreakInside =>
+    getPropertyValue('${_browserPrefix}region-break-inside');
+
+  /** Sets the value of "region-break-inside" */
+  void set regionBreakInside(var value) {
+    setProperty('${_browserPrefix}region-break-inside', value, '');
+  }
+
+  /** Gets the value of "region-overflow" */
+  String get regionOverflow =>
+    getPropertyValue('${_browserPrefix}region-overflow');
+
+  /** Sets the value of "region-overflow" */
+  void set regionOverflow(var value) {
+    setProperty('${_browserPrefix}region-overflow', value, '');
+  }
+
+  /** Gets the value of "resize" */
+  String get resize =>
+    getPropertyValue('resize');
+
+  /** Sets the value of "resize" */
+  void set resize(var value) {
+    setProperty('resize', value, '');
+  }
+
+  /** Gets the value of "right" */
+  String get right =>
+    getPropertyValue('right');
+
+  /** Sets the value of "right" */
+  void set right(var value) {
+    setProperty('right', value, '');
+  }
+
+  /** Gets the value of "rtl-ordering" */
+  String get rtlOrdering =>
+    getPropertyValue('${_browserPrefix}rtl-ordering');
+
+  /** Sets the value of "rtl-ordering" */
+  void set rtlOrdering(var value) {
+    setProperty('${_browserPrefix}rtl-ordering', value, '');
+  }
+
+  /** Gets the value of "size" */
+  String get size =>
+    getPropertyValue('size');
+
+  /** Sets the value of "size" */
+  void set size(var value) {
+    setProperty('size', value, '');
+  }
+
+  /** Gets the value of "speak" */
+  String get speak =>
+    getPropertyValue('speak');
+
+  /** Sets the value of "speak" */
+  void set speak(var value) {
+    setProperty('speak', value, '');
+  }
+
+  /** Gets the value of "src" */
+  String get src =>
+    getPropertyValue('src');
+
+  /** Sets the value of "src" */
+  void set src(var value) {
+    setProperty('src', value, '');
+  }
+
+  /** Gets the value of "table-layout" */
+  String get tableLayout =>
+    getPropertyValue('table-layout');
+
+  /** Sets the value of "table-layout" */
+  void set tableLayout(var value) {
+    setProperty('table-layout', value, '');
+  }
+
+  /** Gets the value of "tap-highlight-color" */
+  String get tapHighlightColor =>
+    getPropertyValue('${_browserPrefix}tap-highlight-color');
+
+  /** Sets the value of "tap-highlight-color" */
+  void set tapHighlightColor(var value) {
+    setProperty('${_browserPrefix}tap-highlight-color', value, '');
+  }
+
+  /** Gets the value of "text-align" */
+  String get textAlign =>
+    getPropertyValue('text-align');
+
+  /** Sets the value of "text-align" */
+  void set textAlign(var value) {
+    setProperty('text-align', value, '');
+  }
+
+  /** Gets the value of "text-combine" */
+  String get textCombine =>
+    getPropertyValue('${_browserPrefix}text-combine');
+
+  /** Sets the value of "text-combine" */
+  void set textCombine(var value) {
+    setProperty('${_browserPrefix}text-combine', value, '');
+  }
+
+  /** Gets the value of "text-decoration" */
+  String get textDecoration =>
+    getPropertyValue('text-decoration');
+
+  /** Sets the value of "text-decoration" */
+  void set textDecoration(var value) {
+    setProperty('text-decoration', value, '');
+  }
+
+  /** Gets the value of "text-decorations-in-effect" */
+  String get textDecorationsInEffect =>
+    getPropertyValue('${_browserPrefix}text-decorations-in-effect');
+
+  /** Sets the value of "text-decorations-in-effect" */
+  void set textDecorationsInEffect(var value) {
+    setProperty('${_browserPrefix}text-decorations-in-effect', value, '');
+  }
+
+  /** Gets the value of "text-emphasis" */
+  String get textEmphasis =>
+    getPropertyValue('${_browserPrefix}text-emphasis');
+
+  /** Sets the value of "text-emphasis" */
+  void set textEmphasis(var value) {
+    setProperty('${_browserPrefix}text-emphasis', value, '');
+  }
+
+  /** Gets the value of "text-emphasis-color" */
+  String get textEmphasisColor =>
+    getPropertyValue('${_browserPrefix}text-emphasis-color');
+
+  /** Sets the value of "text-emphasis-color" */
+  void set textEmphasisColor(var value) {
+    setProperty('${_browserPrefix}text-emphasis-color', value, '');
+  }
+
+  /** Gets the value of "text-emphasis-position" */
+  String get textEmphasisPosition =>
+    getPropertyValue('${_browserPrefix}text-emphasis-position');
+
+  /** Sets the value of "text-emphasis-position" */
+  void set textEmphasisPosition(var value) {
+    setProperty('${_browserPrefix}text-emphasis-position', value, '');
+  }
+
+  /** Gets the value of "text-emphasis-style" */
+  String get textEmphasisStyle =>
+    getPropertyValue('${_browserPrefix}text-emphasis-style');
+
+  /** Sets the value of "text-emphasis-style" */
+  void set textEmphasisStyle(var value) {
+    setProperty('${_browserPrefix}text-emphasis-style', value, '');
+  }
+
+  /** Gets the value of "text-fill-color" */
+  String get textFillColor =>
+    getPropertyValue('${_browserPrefix}text-fill-color');
+
+  /** Sets the value of "text-fill-color" */
+  void set textFillColor(var value) {
+    setProperty('${_browserPrefix}text-fill-color', value, '');
+  }
+
+  /** Gets the value of "text-indent" */
+  String get textIndent =>
+    getPropertyValue('text-indent');
+
+  /** Sets the value of "text-indent" */
+  void set textIndent(var value) {
+    setProperty('text-indent', value, '');
+  }
+
+  /** Gets the value of "text-line-through" */
+  String get textLineThrough =>
+    getPropertyValue('text-line-through');
+
+  /** Sets the value of "text-line-through" */
+  void set textLineThrough(var value) {
+    setProperty('text-line-through', value, '');
+  }
+
+  /** Gets the value of "text-line-through-color" */
+  String get textLineThroughColor =>
+    getPropertyValue('text-line-through-color');
+
+  /** Sets the value of "text-line-through-color" */
+  void set textLineThroughColor(var value) {
+    setProperty('text-line-through-color', value, '');
+  }
+
+  /** Gets the value of "text-line-through-mode" */
+  String get textLineThroughMode =>
+    getPropertyValue('text-line-through-mode');
+
+  /** Sets the value of "text-line-through-mode" */
+  void set textLineThroughMode(var value) {
+    setProperty('text-line-through-mode', value, '');
+  }
+
+  /** Gets the value of "text-line-through-style" */
+  String get textLineThroughStyle =>
+    getPropertyValue('text-line-through-style');
+
+  /** Sets the value of "text-line-through-style" */
+  void set textLineThroughStyle(var value) {
+    setProperty('text-line-through-style', value, '');
+  }
+
+  /** Gets the value of "text-line-through-width" */
+  String get textLineThroughWidth =>
+    getPropertyValue('text-line-through-width');
+
+  /** Sets the value of "text-line-through-width" */
+  void set textLineThroughWidth(var value) {
+    setProperty('text-line-through-width', value, '');
+  }
+
+  /** Gets the value of "text-orientation" */
+  String get textOrientation =>
+    getPropertyValue('${_browserPrefix}text-orientation');
+
+  /** Sets the value of "text-orientation" */
+  void set textOrientation(var value) {
+    setProperty('${_browserPrefix}text-orientation', value, '');
+  }
+
+  /** Gets the value of "text-overflow" */
+  String get textOverflow =>
+    getPropertyValue('text-overflow');
+
+  /** Sets the value of "text-overflow" */
+  void set textOverflow(var value) {
+    setProperty('text-overflow', value, '');
+  }
+
+  /** Gets the value of "text-overline" */
+  String get textOverline =>
+    getPropertyValue('text-overline');
+
+  /** Sets the value of "text-overline" */
+  void set textOverline(var value) {
+    setProperty('text-overline', value, '');
+  }
+
+  /** Gets the value of "text-overline-color" */
+  String get textOverlineColor =>
+    getPropertyValue('text-overline-color');
+
+  /** Sets the value of "text-overline-color" */
+  void set textOverlineColor(var value) {
+    setProperty('text-overline-color', value, '');
+  }
+
+  /** Gets the value of "text-overline-mode" */
+  String get textOverlineMode =>
+    getPropertyValue('text-overline-mode');
+
+  /** Sets the value of "text-overline-mode" */
+  void set textOverlineMode(var value) {
+    setProperty('text-overline-mode', value, '');
+  }
+
+  /** Gets the value of "text-overline-style" */
+  String get textOverlineStyle =>
+    getPropertyValue('text-overline-style');
+
+  /** Sets the value of "text-overline-style" */
+  void set textOverlineStyle(var value) {
+    setProperty('text-overline-style', value, '');
+  }
+
+  /** Gets the value of "text-overline-width" */
+  String get textOverlineWidth =>
+    getPropertyValue('text-overline-width');
+
+  /** Sets the value of "text-overline-width" */
+  void set textOverlineWidth(var value) {
+    setProperty('text-overline-width', value, '');
+  }
+
+  /** Gets the value of "text-rendering" */
+  String get textRendering =>
+    getPropertyValue('text-rendering');
+
+  /** Sets the value of "text-rendering" */
+  void set textRendering(var value) {
+    setProperty('text-rendering', value, '');
+  }
+
+  /** Gets the value of "text-security" */
+  String get textSecurity =>
+    getPropertyValue('${_browserPrefix}text-security');
+
+  /** Sets the value of "text-security" */
+  void set textSecurity(var value) {
+    setProperty('${_browserPrefix}text-security', value, '');
+  }
+
+  /** Gets the value of "text-shadow" */
+  String get textShadow =>
+    getPropertyValue('text-shadow');
+
+  /** Sets the value of "text-shadow" */
+  void set textShadow(var value) {
+    setProperty('text-shadow', value, '');
+  }
+
+  /** Gets the value of "text-size-adjust" */
+  String get textSizeAdjust =>
+    getPropertyValue('${_browserPrefix}text-size-adjust');
+
+  /** Sets the value of "text-size-adjust" */
+  void set textSizeAdjust(var value) {
+    setProperty('${_browserPrefix}text-size-adjust', value, '');
+  }
+
+  /** Gets the value of "text-stroke" */
+  String get textStroke =>
+    getPropertyValue('${_browserPrefix}text-stroke');
+
+  /** Sets the value of "text-stroke" */
+  void set textStroke(var value) {
+    setProperty('${_browserPrefix}text-stroke', value, '');
+  }
+
+  /** Gets the value of "text-stroke-color" */
+  String get textStrokeColor =>
+    getPropertyValue('${_browserPrefix}text-stroke-color');
+
+  /** Sets the value of "text-stroke-color" */
+  void set textStrokeColor(var value) {
+    setProperty('${_browserPrefix}text-stroke-color', value, '');
+  }
+
+  /** Gets the value of "text-stroke-width" */
+  String get textStrokeWidth =>
+    getPropertyValue('${_browserPrefix}text-stroke-width');
+
+  /** Sets the value of "text-stroke-width" */
+  void set textStrokeWidth(var value) {
+    setProperty('${_browserPrefix}text-stroke-width', value, '');
+  }
+
+  /** Gets the value of "text-transform" */
+  String get textTransform =>
+    getPropertyValue('text-transform');
+
+  /** Sets the value of "text-transform" */
+  void set textTransform(var value) {
+    setProperty('text-transform', value, '');
+  }
+
+  /** Gets the value of "text-underline" */
+  String get textUnderline =>
+    getPropertyValue('text-underline');
+
+  /** Sets the value of "text-underline" */
+  void set textUnderline(var value) {
+    setProperty('text-underline', value, '');
+  }
+
+  /** Gets the value of "text-underline-color" */
+  String get textUnderlineColor =>
+    getPropertyValue('text-underline-color');
+
+  /** Sets the value of "text-underline-color" */
+  void set textUnderlineColor(var value) {
+    setProperty('text-underline-color', value, '');
+  }
+
+  /** Gets the value of "text-underline-mode" */
+  String get textUnderlineMode =>
+    getPropertyValue('text-underline-mode');
+
+  /** Sets the value of "text-underline-mode" */
+  void set textUnderlineMode(var value) {
+    setProperty('text-underline-mode', value, '');
+  }
+
+  /** Gets the value of "text-underline-style" */
+  String get textUnderlineStyle =>
+    getPropertyValue('text-underline-style');
+
+  /** Sets the value of "text-underline-style" */
+  void set textUnderlineStyle(var value) {
+    setProperty('text-underline-style', value, '');
+  }
+
+  /** Gets the value of "text-underline-width" */
+  String get textUnderlineWidth =>
+    getPropertyValue('text-underline-width');
+
+  /** Sets the value of "text-underline-width" */
+  void set textUnderlineWidth(var value) {
+    setProperty('text-underline-width', value, '');
+  }
+
+  /** Gets the value of "top" */
+  String get top =>
+    getPropertyValue('top');
+
+  /** Sets the value of "top" */
+  void set top(var value) {
+    setProperty('top', value, '');
+  }
+
+  /** Gets the value of "transform" */
+  String get transform =>
+    getPropertyValue('${_browserPrefix}transform');
+
+  /** Sets the value of "transform" */
+  void set transform(var value) {
+    setProperty('${_browserPrefix}transform', value, '');
+  }
+
+  /** Gets the value of "transform-origin" */
+  String get transformOrigin =>
+    getPropertyValue('${_browserPrefix}transform-origin');
+
+  /** Sets the value of "transform-origin" */
+  void set transformOrigin(var value) {
+    setProperty('${_browserPrefix}transform-origin', value, '');
+  }
+
+  /** Gets the value of "transform-origin-x" */
+  String get transformOriginX =>
+    getPropertyValue('${_browserPrefix}transform-origin-x');
+
+  /** Sets the value of "transform-origin-x" */
+  void set transformOriginX(var value) {
+    setProperty('${_browserPrefix}transform-origin-x', value, '');
+  }
+
+  /** Gets the value of "transform-origin-y" */
+  String get transformOriginY =>
+    getPropertyValue('${_browserPrefix}transform-origin-y');
+
+  /** Sets the value of "transform-origin-y" */
+  void set transformOriginY(var value) {
+    setProperty('${_browserPrefix}transform-origin-y', value, '');
+  }
+
+  /** Gets the value of "transform-origin-z" */
+  String get transformOriginZ =>
+    getPropertyValue('${_browserPrefix}transform-origin-z');
+
+  /** Sets the value of "transform-origin-z" */
+  void set transformOriginZ(var value) {
+    setProperty('${_browserPrefix}transform-origin-z', value, '');
+  }
+
+  /** Gets the value of "transform-style" */
+  String get transformStyle =>
+    getPropertyValue('${_browserPrefix}transform-style');
+
+  /** Sets the value of "transform-style" */
+  void set transformStyle(var value) {
+    setProperty('${_browserPrefix}transform-style', value, '');
+  }
+
+  /** Gets the value of "transition" */
+  String get transition =>
+    getPropertyValue('${_browserPrefix}transition');
+
+  /** Sets the value of "transition" */
+  void set transition(var value) {
+    setProperty('${_browserPrefix}transition', value, '');
+  }
+
+  /** Gets the value of "transition-delay" */
+  String get transitionDelay =>
+    getPropertyValue('${_browserPrefix}transition-delay');
+
+  /** Sets the value of "transition-delay" */
+  void set transitionDelay(var value) {
+    setProperty('${_browserPrefix}transition-delay', value, '');
+  }
+
+  /** Gets the value of "transition-duration" */
+  String get transitionDuration =>
+    getPropertyValue('${_browserPrefix}transition-duration');
+
+  /** Sets the value of "transition-duration" */
+  void set transitionDuration(var value) {
+    setProperty('${_browserPrefix}transition-duration', value, '');
+  }
+
+  /** Gets the value of "transition-property" */
+  String get transitionProperty =>
+    getPropertyValue('${_browserPrefix}transition-property');
+
+  /** Sets the value of "transition-property" */
+  void set transitionProperty(var value) {
+    setProperty('${_browserPrefix}transition-property', value, '');
+  }
+
+  /** Gets the value of "transition-timing-function" */
+  String get transitionTimingFunction =>
+    getPropertyValue('${_browserPrefix}transition-timing-function');
+
+  /** Sets the value of "transition-timing-function" */
+  void set transitionTimingFunction(var value) {
+    setProperty('${_browserPrefix}transition-timing-function', value, '');
+  }
+
+  /** Gets the value of "unicode-bidi" */
+  String get unicodeBidi =>
+    getPropertyValue('unicode-bidi');
+
+  /** Sets the value of "unicode-bidi" */
+  void set unicodeBidi(var value) {
+    setProperty('unicode-bidi', value, '');
+  }
+
+  /** Gets the value of "unicode-range" */
+  String get unicodeRange =>
+    getPropertyValue('unicode-range');
+
+  /** Sets the value of "unicode-range" */
+  void set unicodeRange(var value) {
+    setProperty('unicode-range', value, '');
+  }
+
+  /** Gets the value of "user-drag" */
+  String get userDrag =>
+    getPropertyValue('${_browserPrefix}user-drag');
+
+  /** Sets the value of "user-drag" */
+  void set userDrag(var value) {
+    setProperty('${_browserPrefix}user-drag', value, '');
+  }
+
+  /** Gets the value of "user-modify" */
+  String get userModify =>
+    getPropertyValue('${_browserPrefix}user-modify');
+
+  /** Sets the value of "user-modify" */
+  void set userModify(var value) {
+    setProperty('${_browserPrefix}user-modify', value, '');
+  }
+
+  /** Gets the value of "user-select" */
+  String get userSelect =>
+    getPropertyValue('${_browserPrefix}user-select');
+
+  /** Sets the value of "user-select" */
+  void set userSelect(var value) {
+    setProperty('${_browserPrefix}user-select', value, '');
+  }
+
+  /** Gets the value of "vertical-align" */
+  String get verticalAlign =>
+    getPropertyValue('vertical-align');
+
+  /** Sets the value of "vertical-align" */
+  void set verticalAlign(var value) {
+    setProperty('vertical-align', value, '');
+  }
+
+  /** Gets the value of "visibility" */
+  String get visibility =>
+    getPropertyValue('visibility');
+
+  /** Sets the value of "visibility" */
+  void set visibility(var value) {
+    setProperty('visibility', value, '');
+  }
+
+  /** Gets the value of "white-space" */
+  String get whiteSpace =>
+    getPropertyValue('white-space');
+
+  /** Sets the value of "white-space" */
+  void set whiteSpace(var value) {
+    setProperty('white-space', value, '');
+  }
+
+  /** Gets the value of "widows" */
+  String get widows =>
+    getPropertyValue('widows');
+
+  /** Sets the value of "widows" */
+  void set widows(var value) {
+    setProperty('widows', value, '');
+  }
+
+  /** Gets the value of "width" */
+  String get width =>
+    getPropertyValue('width');
+
+  /** Sets the value of "width" */
+  void set width(var value) {
+    setProperty('width', value, '');
+  }
+
+  /** Gets the value of "word-break" */
+  String get wordBreak =>
+    getPropertyValue('word-break');
+
+  /** Sets the value of "word-break" */
+  void set wordBreak(var value) {
+    setProperty('word-break', value, '');
+  }
+
+  /** Gets the value of "word-spacing" */
+  String get wordSpacing =>
+    getPropertyValue('word-spacing');
+
+  /** Sets the value of "word-spacing" */
+  void set wordSpacing(var value) {
+    setProperty('word-spacing', value, '');
+  }
+
+  /** Gets the value of "word-wrap" */
+  String get wordWrap =>
+    getPropertyValue('word-wrap');
+
+  /** Sets the value of "word-wrap" */
+  void set wordWrap(var value) {
+    setProperty('word-wrap', value, '');
+  }
+
+  /** Gets the value of "wrap-shape" */
+  String get wrapShape =>
+    getPropertyValue('${_browserPrefix}wrap-shape');
+
+  /** Sets the value of "wrap-shape" */
+  void set wrapShape(var value) {
+    setProperty('${_browserPrefix}wrap-shape', value, '');
+  }
+
+  /** Gets the value of "writing-mode" */
+  String get writingMode =>
+    getPropertyValue('${_browserPrefix}writing-mode');
+
+  /** Sets the value of "writing-mode" */
+  void set writingMode(var value) {
+    setProperty('${_browserPrefix}writing-mode', value, '');
+  }
+
+  /** Gets the value of "z-index" */
+  String get zIndex =>
+    getPropertyValue('z-index');
+
+  /** Sets the value of "z-index" */
+  void set zIndex(var value) {
+    setProperty('z-index', value, '');
+  }
+
+  /** Gets the value of "zoom" */
+  String get zoom =>
+    getPropertyValue('zoom');
+
+  /** Sets the value of "zoom" */
+  void set zoom(var value) {
+    setProperty('zoom', value, '');
+  }
+}
+
+/// @domName CSSStyleRule
+class CSSStyleRule extends CSSRule native "*CSSStyleRule" {
+
+  /** @domName CSSStyleRule.selectorText */
+  String selectorText;
+
+  /** @domName CSSStyleRule.style */
+  final CSSStyleDeclaration style;
+}
+
+/// @domName CSSStyleSheet
+class CSSStyleSheet extends StyleSheet native "*CSSStyleSheet" {
+
+  /** @domName CSSStyleSheet.cssRules */
+  final List<CSSRule> cssRules;
+
+  /** @domName CSSStyleSheet.ownerRule */
+  final CSSRule ownerRule;
+
+  /** @domName CSSStyleSheet.rules */
+  final List<CSSRule> rules;
+
+  /** @domName CSSStyleSheet.addRule */
+  int addRule(String selector, String style, [int index]) native;
+
+  /** @domName CSSStyleSheet.deleteRule */
+  void deleteRule(int index) native;
+
+  /** @domName CSSStyleSheet.insertRule */
+  int insertRule(String rule, int index) native;
+
+  /** @domName CSSStyleSheet.removeRule */
+  void removeRule(int index) native;
+}
+
+/// @domName WebKitCSSTransformValue
+class CSSTransformValue extends _CSSValueList native "*WebKitCSSTransformValue" {
+
+  static const int CSS_MATRIX = 11;
+
+  static const int CSS_MATRIX3D = 21;
+
+  static const int CSS_PERSPECTIVE = 20;
+
+  static const int CSS_ROTATE = 4;
+
+  static const int CSS_ROTATE3D = 17;
+
+  static const int CSS_ROTATEX = 14;
+
+  static const int CSS_ROTATEY = 15;
+
+  static const int CSS_ROTATEZ = 16;
+
+  static const int CSS_SCALE = 5;
+
+  static const int CSS_SCALE3D = 19;
+
+  static const int CSS_SCALEX = 6;
+
+  static const int CSS_SCALEY = 7;
+
+  static const int CSS_SCALEZ = 18;
+
+  static const int CSS_SKEW = 8;
+
+  static const int CSS_SKEWX = 9;
+
+  static const int CSS_SKEWY = 10;
+
+  static const int CSS_TRANSLATE = 1;
+
+  static const int CSS_TRANSLATE3D = 13;
+
+  static const int CSS_TRANSLATEX = 2;
+
+  static const int CSS_TRANSLATEY = 3;
+
+  static const int CSS_TRANSLATEZ = 12;
+
+  /** @domName WebKitCSSTransformValue.operationType */
+  final int operationType;
+}
+
+/// @domName CSSUnknownRule
+class CSSUnknownRule extends CSSRule native "*CSSUnknownRule" {
+}
+
+/// @domName CSSValue
+class CSSValue native "*CSSValue" {
+
+  static const int CSS_CUSTOM = 3;
+
+  static const int CSS_INHERIT = 0;
+
+  static const int CSS_PRIMITIVE_VALUE = 1;
+
+  static const int CSS_VALUE_LIST = 2;
+
+  /** @domName CSSValue.cssText */
+  String cssText;
+
+  /** @domName CSSValue.cssValueType */
+  final int cssValueType;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class CanvasElement extends Element implements Element native "*HTMLCanvasElement" {
+
+  factory CanvasElement({int width, int height}) {
+    if (!?width) {
+      return _Elements.createCanvasElement();
+    }
+    if (!?height) {
+      return _Elements.createCanvasElement(width);
+    }
+    return _Elements.createCanvasElement(width, height);
+  }
+
+  /** @domName HTMLCanvasElement.height */
+  int height;
+
+  /** @domName HTMLCanvasElement.width */
+  int width;
+
+  /** @domName HTMLCanvasElement.toDataURL */
+  String toDataURL(String type, [num quality]) native;
+
+
+  CanvasRenderingContext getContext(String contextId) native;
+  CanvasRenderingContext2D get context2d => getContext('2d');
+}
+
+/// @domName CanvasGradient
+class CanvasGradient native "*CanvasGradient" {
+
+  /** @domName CanvasGradient.addColorStop */
+  void addColorStop(num offset, String color) native;
+}
+
+/// @domName CanvasPattern
+class CanvasPattern native "*CanvasPattern" {
+}
+
+/// @domName CanvasRenderingContext
+class CanvasRenderingContext native "*CanvasRenderingContext" {
+
+  /** @domName CanvasRenderingContext.canvas */
+  final CanvasElement canvas;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class CanvasRenderingContext2D extends CanvasRenderingContext native "*CanvasRenderingContext2D" {
+
+  /** @domName CanvasRenderingContext2D.fillStyle */
+  dynamic fillStyle;
+
+  /** @domName CanvasRenderingContext2D.font */
+  String font;
+
+  /** @domName CanvasRenderingContext2D.globalAlpha */
+  num globalAlpha;
+
+  /** @domName CanvasRenderingContext2D.globalCompositeOperation */
+  String globalCompositeOperation;
+
+  /** @domName CanvasRenderingContext2D.lineCap */
+  String lineCap;
+
+  /** @domName CanvasRenderingContext2D.lineDashOffset */
+  num lineDashOffset;
+
+  /** @domName CanvasRenderingContext2D.lineJoin */
+  String lineJoin;
+
+  /** @domName CanvasRenderingContext2D.lineWidth */
+  num lineWidth;
+
+  /** @domName CanvasRenderingContext2D.miterLimit */
+  num miterLimit;
+
+  /** @domName CanvasRenderingContext2D.shadowBlur */
+  num shadowBlur;
+
+  /** @domName CanvasRenderingContext2D.shadowColor */
+  String shadowColor;
+
+  /** @domName CanvasRenderingContext2D.shadowOffsetX */
+  num shadowOffsetX;
+
+  /** @domName CanvasRenderingContext2D.shadowOffsetY */
+  num shadowOffsetY;
+
+  /** @domName CanvasRenderingContext2D.strokeStyle */
+  dynamic strokeStyle;
+
+  /** @domName CanvasRenderingContext2D.textAlign */
+  String textAlign;
+
+  /** @domName CanvasRenderingContext2D.textBaseline */
+  String textBaseline;
+
+  /** @domName CanvasRenderingContext2D.webkitBackingStorePixelRatio */
+  final num webkitBackingStorePixelRatio;
+
+  /** @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled */
+  bool webkitImageSmoothingEnabled;
+
+  /** @domName CanvasRenderingContext2D.webkitLineDash */
+  List webkitLineDash;
+
+  /** @domName CanvasRenderingContext2D.webkitLineDashOffset */
+  num webkitLineDashOffset;
+
+  /** @domName CanvasRenderingContext2D.arc */
+  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native;
+
+  /** @domName CanvasRenderingContext2D.arcTo */
+  void arcTo(num x1, num y1, num x2, num y2, num radius) native;
+
+  /** @domName CanvasRenderingContext2D.beginPath */
+  void beginPath() native;
+
+  /** @domName CanvasRenderingContext2D.bezierCurveTo */
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native;
+
+  /** @domName CanvasRenderingContext2D.clearRect */
+  void clearRect(num x, num y, num width, num height) native;
+
+  /** @domName CanvasRenderingContext2D.clearShadow */
+  void clearShadow() native;
+
+  /** @domName CanvasRenderingContext2D.clip */
+  void clip() native;
+
+  /** @domName CanvasRenderingContext2D.closePath */
+  void closePath() native;
+
+  /** @domName CanvasRenderingContext2D.createImageData */
+  ImageData createImageData(imagedata_OR_sw, [sh]) {
+    if ((imagedata_OR_sw is ImageData || imagedata_OR_sw == null) &&
+        !?sh) {
+      var imagedata_1 = _convertDartToNative_ImageData(imagedata_OR_sw);
+      return _convertNativeToDart_ImageData(_createImageData_1(imagedata_1));
+    }
+    if ((imagedata_OR_sw is num || imagedata_OR_sw == null) &&
+        (sh is num || sh == null)) {
+      return _convertNativeToDart_ImageData(_createImageData_2(imagedata_OR_sw, sh));
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  _createImageData_1(imagedata) native "createImageData";
+  _createImageData_2(num sw, num sh) native "createImageData";
+
+  /** @domName CanvasRenderingContext2D.createLinearGradient */
+  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
+
+  /** @domName CanvasRenderingContext2D.createPattern */
+  CanvasPattern createPattern(canvas_OR_image, String repetitionType) native;
+
+  /** @domName CanvasRenderingContext2D.createRadialGradient */
+  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native;
+
+  /** @domName CanvasRenderingContext2D.drawImage */
+  void drawImage(canvas_OR_image_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) native;
+
+  /** @domName CanvasRenderingContext2D.drawImageFromRect */
+  void drawImageFromRect(ImageElement image, [num sx, num sy, num sw, num sh, num dx, num dy, num dw, num dh, String compositeOperation]) native;
+
+  /** @domName CanvasRenderingContext2D.fill */
+  void fill() native;
+
+  /** @domName CanvasRenderingContext2D.fillRect */
+  void fillRect(num x, num y, num width, num height) native;
+
+  /** @domName CanvasRenderingContext2D.fillText */
+  void fillText(String text, num x, num y, [num maxWidth]) native;
+
+  /** @domName CanvasRenderingContext2D.getImageData */
+  ImageData getImageData(num sx, num sy, num sw, num sh) {
+    return _convertNativeToDart_ImageData(_getImageData_1(sx, sy, sw, sh));
+  }
+  _getImageData_1(sx, sy, sw, sh) native "getImageData";
+
+  /** @domName CanvasRenderingContext2D.getLineDash */
+  List<num> getLineDash() native;
+
+  /** @domName CanvasRenderingContext2D.isPointInPath */
+  bool isPointInPath(num x, num y) native;
+
+  /** @domName CanvasRenderingContext2D.lineTo */
+  void lineTo(num x, num y) native;
+
+  /** @domName CanvasRenderingContext2D.measureText */
+  TextMetrics measureText(String text) native;
+
+  /** @domName CanvasRenderingContext2D.moveTo */
+  void moveTo(num x, num y) native;
+
+  /** @domName CanvasRenderingContext2D.putImageData */
+  void putImageData(ImageData imagedata, num dx, num dy, [dirtyX, dirtyY, dirtyWidth, dirtyHeight]) {
+    if (!?dirtyX &&
+        !?dirtyY &&
+        !?dirtyWidth &&
+        !?dirtyHeight) {
+      var imagedata_1 = _convertDartToNative_ImageData(imagedata);
+      _putImageData_1(imagedata_1, dx, dy);
+      return;
+    }
+    if ((dirtyX is num || dirtyX == null) &&
+        (dirtyY is num || dirtyY == null) &&
+        (dirtyWidth is num || dirtyWidth == null) &&
+        (dirtyHeight is num || dirtyHeight == null)) {
+      var imagedata_2 = _convertDartToNative_ImageData(imagedata);
+      _putImageData_2(imagedata_2, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+      return;
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  void _putImageData_1(imagedata, dx, dy) native "putImageData";
+  void _putImageData_2(imagedata, dx, dy, num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight) native "putImageData";
+
+  /** @domName CanvasRenderingContext2D.quadraticCurveTo */
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
+
+  /** @domName CanvasRenderingContext2D.rect */
+  void rect(num x, num y, num width, num height) native;
+
+  /** @domName CanvasRenderingContext2D.restore */
+  void restore() native;
+
+  /** @domName CanvasRenderingContext2D.rotate */
+  void rotate(num angle) native;
+
+  /** @domName CanvasRenderingContext2D.save */
+  void save() native;
+
+  /** @domName CanvasRenderingContext2D.scale */
+  void scale(num sx, num sy) native;
+
+  /** @domName CanvasRenderingContext2D.setAlpha */
+  void setAlpha(num alpha) native;
+
+  /** @domName CanvasRenderingContext2D.setCompositeOperation */
+  void setCompositeOperation(String compositeOperation) native;
+
+  /** @domName CanvasRenderingContext2D.setLineCap */
+  void setLineCap(String cap) native;
+
+  /** @domName CanvasRenderingContext2D.setLineDash */
+  void setLineDash(List<num> dash) native;
+
+  /** @domName CanvasRenderingContext2D.setLineJoin */
+  void setLineJoin(String join) native;
+
+  /** @domName CanvasRenderingContext2D.setLineWidth */
+  void setLineWidth(num width) native;
+
+  /** @domName CanvasRenderingContext2D.setMiterLimit */
+  void setMiterLimit(num limit) native;
+
+  /** @domName CanvasRenderingContext2D.setShadow */
+  void setShadow(num width, num height, num blur, [c_OR_color_OR_grayLevel_OR_r, num alpha_OR_g_OR_m, num b_OR_y, num a_OR_k, num a]) native;
+
+  /** @domName CanvasRenderingContext2D.setTransform */
+  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) native;
+
+  /** @domName CanvasRenderingContext2D.stroke */
+  void stroke() native;
+
+  /** @domName CanvasRenderingContext2D.strokeRect */
+  void strokeRect(num x, num y, num width, num height, [num lineWidth]) native;
+
+  /** @domName CanvasRenderingContext2D.strokeText */
+  void strokeText(String text, num x, num y, [num maxWidth]) native;
+
+  /** @domName CanvasRenderingContext2D.transform */
+  void transform(num m11, num m12, num m21, num m22, num dx, num dy) native;
+
+  /** @domName CanvasRenderingContext2D.translate */
+  void translate(num tx, num ty) native;
+
+  /** @domName CanvasRenderingContext2D.webkitGetImageDataHD */
+  ImageData webkitGetImageDataHD(num sx, num sy, num sw, num sh) {
+    return _convertNativeToDart_ImageData(_webkitGetImageDataHD_1(sx, sy, sw, sh));
+  }
+  _webkitGetImageDataHD_1(sx, sy, sw, sh) native "webkitGetImageDataHD";
+
+  /** @domName CanvasRenderingContext2D.webkitPutImageDataHD */
+  void webkitPutImageDataHD(ImageData imagedata, num dx, num dy, [dirtyX, dirtyY, dirtyWidth, dirtyHeight]) {
+    if (!?dirtyX &&
+        !?dirtyY &&
+        !?dirtyWidth &&
+        !?dirtyHeight) {
+      var imagedata_1 = _convertDartToNative_ImageData(imagedata);
+      _webkitPutImageDataHD_1(imagedata_1, dx, dy);
+      return;
+    }
+    if ((dirtyX is num || dirtyX == null) &&
+        (dirtyY is num || dirtyY == null) &&
+        (dirtyWidth is num || dirtyWidth == null) &&
+        (dirtyHeight is num || dirtyHeight == null)) {
+      var imagedata_2 = _convertDartToNative_ImageData(imagedata);
+      _webkitPutImageDataHD_2(imagedata_2, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+      return;
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  void _webkitPutImageDataHD_1(imagedata, dx, dy) native "webkitPutImageDataHD";
+  void _webkitPutImageDataHD_2(imagedata, dx, dy, num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight) native "webkitPutImageDataHD";
+
+
+  /**
+   * Sets the color used inside shapes.
+   * [r], [g], [b] are 0-255, [a] is 0-1.
+   */
+  void setFillColorRgb(int r, int g, int b, [num a = 1]) {
+    this.fillStyle = 'rgba($r, $g, $b, $a)';
+  }
+
+  /**
+   * Sets the color used inside shapes.
+   * [h] is in degrees, 0-360.
+   * [s], [l] are in percent, 0-100.
+   * [a] is 0-1.
+   */
+  void setFillColorHsl(int h, num s, num l, [num a = 1]) {
+    this.fillStyle = 'hsla($h, $s%, $l%, $a)';
+  }
+
+  /**
+   * Sets the color used for stroking shapes.
+   * [r], [g], [b] are 0-255, [a] is 0-1.
+   */
+  void setStrokeColorRgb(int r, int g, int b, [num a = 1]) {
+    this.strokeStyle = 'rgba($r, $g, $b, $a)';
+  }
+
+  /**
+   * Sets the color used for stroking shapes.
+   * [h] is in degrees, 0-360.
+   * [s], [l] are in percent, 0-100.
+   * [a] is 0-1.
+   */
+  void setStrokeColorHsl(int h, num s, num l, [num a = 1]) {
+    this.strokeStyle = 'hsla($h, $s%, $l%, $a)';
+  }
+}
+
+/// @domName ChannelMergerNode
+class ChannelMergerNode extends AudioNode native "*ChannelMergerNode" {
+}
+
+/// @domName ChannelSplitterNode
+class ChannelSplitterNode extends AudioNode native "*ChannelSplitterNode" {
+}
+
+/// @domName CharacterData
+class CharacterData extends Node native "*CharacterData" {
+
+  /** @domName CharacterData.data */
+  String data;
+
+  /** @domName CharacterData.length */
+  final int length;
+
+  /** @domName CharacterData.appendData */
+  void appendData(String data) native;
+
+  /** @domName CharacterData.deleteData */
+  void deleteData(int offset, int length) native;
+
+  /** @domName CharacterData.insertData */
+  void insertData(int offset, String data) native;
+
+  /** @domName CharacterData.remove */
+  void remove() native;
+
+  /** @domName CharacterData.replaceData */
+  void replaceData(int offset, int length, String data) native;
+
+  /** @domName CharacterData.substringData */
+  String substringData(int offset, int length) native;
+}
+
+/// @domName ClientRect
+class ClientRect native "*ClientRect" {
+
+  /** @domName ClientRect.bottom */
+  final num bottom;
+
+  /** @domName ClientRect.height */
+  final num height;
+
+  /** @domName ClientRect.left */
+  final num left;
+
+  /** @domName ClientRect.right */
+  final num right;
+
+  /** @domName ClientRect.top */
+  final num top;
+
+  /** @domName ClientRect.width */
+  final num width;
+}
+
+/// @domName Clipboard
+class Clipboard native "*Clipboard" {
+
+  /** @domName Clipboard.dropEffect */
+  String dropEffect;
+
+  /** @domName Clipboard.effectAllowed */
+  String effectAllowed;
+
+  /** @domName Clipboard.files */
+  final List<File> files;
+
+  /** @domName Clipboard.items */
+  final DataTransferItemList items;
+
+  /** @domName Clipboard.types */
+  final List types;
+
+  /** @domName Clipboard.clearData */
+  void clearData([String type]) native;
+
+  /** @domName Clipboard.getData */
+  String getData(String type) native;
+
+  /** @domName Clipboard.setData */
+  bool setData(String type, String data) native;
+
+  /** @domName Clipboard.setDragImage */
+  void setDragImage(ImageElement image, int x, int y) native;
+}
+
+/// @domName CloseEvent
+class CloseEvent extends Event native "*CloseEvent" {
+
+  /** @domName CloseEvent.code */
+  final int code;
+
+  /** @domName CloseEvent.reason */
+  final String reason;
+
+  /** @domName CloseEvent.wasClean */
+  final bool wasClean;
+}
+
+/// @domName Comment
+class Comment extends CharacterData native "*Comment" {
+}
+
+/// @domName CompositionEvent
+class CompositionEvent extends UIEvent native "*CompositionEvent" {
+
+  /** @domName CompositionEvent.data */
+  final String data;
+
+  /** @domName CompositionEvent.initCompositionEvent */
+  void initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Console
+    // Console is sometimes a singleton bag-of-properties without a prototype.
+    native "=(typeof console == 'undefined' ? {} : console)" {
+
+  /** @domName Console.memory */
+  final MemoryInfo memory;
+
+  /** @domName Console.profiles */
+  final List<ScriptProfile> profiles;
+
+  /** @domName Console.assertCondition */
+  void assertCondition(bool condition, Object arg) native;
+
+  /** @domName Console.count */
+  void count(Object arg) native;
+
+  /** @domName Console.debug */
+  void debug(Object arg) native;
+
+  /** @domName Console.dir */
+  void dir(Object arg) native;
+
+  /** @domName Console.dirxml */
+  void dirxml(Object arg) native;
+
+  /** @domName Console.error */
+  void error(Object arg) native;
+
+  /** @domName Console.group */
+  void group(Object arg) native;
+
+  /** @domName Console.groupCollapsed */
+  void groupCollapsed(Object arg) native;
+
+  /** @domName Console.groupEnd */
+  void groupEnd() native;
+
+  /** @domName Console.info */
+  void info(Object arg) native;
+
+  /** @domName Console.log */
+  void log(Object arg) native;
+
+  /** @domName Console.markTimeline */
+  void markTimeline(Object arg) native;
+
+  /** @domName Console.profile */
+  void profile(String title) native;
+
+  /** @domName Console.profileEnd */
+  void profileEnd(String title) native;
+
+  /** @domName Console.time */
+  void time(String title) native;
+
+  /** @domName Console.timeEnd */
+  void timeEnd(String title, Object arg) native;
+
+  /** @domName Console.timeStamp */
+  void timeStamp(Object arg) native;
+
+  /** @domName Console.trace */
+  void trace(Object arg) native;
+
+  /** @domName Console.warn */
+  void warn(Object arg) native;
+
+}
+
+/// @domName HTMLContentElement
+class ContentElement extends Element implements Element native "*HTMLContentElement" {
+
+  factory ContentElement() => _Elements.createContentElement();
+
+  /** @domName HTMLContentElement.resetStyleInheritance */
+  bool resetStyleInheritance;
+
+  /** @domName HTMLContentElement.select */
+  String select;
+
+  /** @domName HTMLContentElement.getDistributedNodes */
+  List<Node> getDistributedNodes() native;
+}
+
+/// @domName ConvolverNode
+class ConvolverNode extends AudioNode native "*ConvolverNode" {
+
+  /** @domName ConvolverNode.buffer */
+  AudioBuffer buffer;
+
+  /** @domName ConvolverNode.normalize */
+  bool normalize;
+}
+
+/// @domName Coordinates
+class Coordinates native "*Coordinates" {
+
+  /** @domName Coordinates.accuracy */
+  final num accuracy;
+
+  /** @domName Coordinates.altitude */
+  final num altitude;
+
+  /** @domName Coordinates.altitudeAccuracy */
+  final num altitudeAccuracy;
+
+  /** @domName Coordinates.heading */
+  final num heading;
+
+  /** @domName Coordinates.latitude */
+  final num latitude;
+
+  /** @domName Coordinates.longitude */
+  final num longitude;
+
+  /** @domName Coordinates.speed */
+  final num speed;
+}
+
+/// @domName Counter
+class Counter native "*Counter" {
+
+  /** @domName Counter.identifier */
+  final String identifier;
+
+  /** @domName Counter.listStyle */
+  final String listStyle;
+
+  /** @domName Counter.separator */
+  final String separator;
+}
+
+/// @domName Crypto
+class Crypto native "*Crypto" {
+
+  /** @domName Crypto.getRandomValues */
+  void getRandomValues(ArrayBufferView array) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+class CustomEvent extends Event native "*CustomEvent" {
+  factory CustomEvent(String type, [bool canBubble = true, bool cancelable = true,
+      Object detail]) => _CustomEventFactoryProvider.createCustomEvent(
+      type, canBubble, cancelable, detail);
+
+  /** @domName CustomEvent.detail */
+  final Object detail;
+
+  /** @domName CustomEvent.initCustomEvent */
+  void $dom_initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) native "initCustomEvent";
+
+}
+
+/// @domName HTMLDListElement
+class DListElement extends Element implements Element native "*HTMLDListElement" {
+
+  factory DListElement() => _Elements.createDListElement();
+
+  /** @domName HTMLDListElement.compact */
+  bool compact;
+}
+
+/// @domName DOMApplicationCache
+class DOMApplicationCache extends EventTarget native "*DOMApplicationCache" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  DOMApplicationCacheEvents get on =>
+    new DOMApplicationCacheEvents(this);
+
+  static const int CHECKING = 2;
+
+  static const int DOWNLOADING = 3;
+
+  static const int IDLE = 1;
+
+  static const int OBSOLETE = 5;
+
+  static const int UNCACHED = 0;
+
+  static const int UPDATEREADY = 4;
+
+  /** @domName DOMApplicationCache.status */
+  final int status;
+
+  /** @domName DOMApplicationCache.abort */
+  void abort() native;
+
+  /** @domName DOMApplicationCache.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName DOMApplicationCache.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName DOMApplicationCache.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName DOMApplicationCache.swapCache */
+  void swapCache() native;
+
+  /** @domName DOMApplicationCache.update */
+  void update() native;
+}
+
+class DOMApplicationCacheEvents extends Events {
+  DOMApplicationCacheEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get cached => this['cached'];
+
+  EventListenerList get checking => this['checking'];
+
+  EventListenerList get downloading => this['downloading'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get noUpdate => this['noupdate'];
+
+  EventListenerList get obsolete => this['obsolete'];
+
+  EventListenerList get progress => this['progress'];
+
+  EventListenerList get updateReady => this['updateready'];
+}
+
+/// @domName DOMError
+class DOMError native "*DOMError" {
+
+  /** @domName DOMError.name */
+  final String name;
+}
+
+/// @domName DOMException
+class DOMException native "*DOMException" {
+
+  static const int ABORT_ERR = 20;
+
+  static const int DATA_CLONE_ERR = 25;
+
+  static const int DOMSTRING_SIZE_ERR = 2;
+
+  static const int HIERARCHY_REQUEST_ERR = 3;
+
+  static const int INDEX_SIZE_ERR = 1;
+
+  static const int INUSE_ATTRIBUTE_ERR = 10;
+
+  static const int INVALID_ACCESS_ERR = 15;
+
+  static const int INVALID_CHARACTER_ERR = 5;
+
+  static const int INVALID_MODIFICATION_ERR = 13;
+
+  static const int INVALID_NODE_TYPE_ERR = 24;
+
+  static const int INVALID_STATE_ERR = 11;
+
+  static const int NAMESPACE_ERR = 14;
+
+  static const int NETWORK_ERR = 19;
+
+  static const int NOT_FOUND_ERR = 8;
+
+  static const int NOT_SUPPORTED_ERR = 9;
+
+  static const int NO_DATA_ALLOWED_ERR = 6;
+
+  static const int NO_MODIFICATION_ALLOWED_ERR = 7;
+
+  static const int QUOTA_EXCEEDED_ERR = 22;
+
+  static const int SECURITY_ERR = 18;
+
+  static const int SYNTAX_ERR = 12;
+
+  static const int TIMEOUT_ERR = 23;
+
+  static const int TYPE_MISMATCH_ERR = 17;
+
+  static const int URL_MISMATCH_ERR = 21;
+
+  static const int VALIDATION_ERR = 16;
+
+  static const int WRONG_DOCUMENT_ERR = 4;
+
+  /** @domName DOMException.code */
+  final int code;
+
+  /** @domName DOMException.message */
+  final String message;
+
+  /** @domName DOMException.name */
+  final String name;
+
+  /** @domName DOMException.toString */
+  String toString() native;
+}
+
+/// @domName DOMFileSystem
+class DOMFileSystem native "*DOMFileSystem" {
+
+  /** @domName DOMFileSystem.name */
+  final String name;
+
+  /** @domName DOMFileSystem.root */
+  final DirectoryEntry root;
+}
+
+/// @domName DOMFileSystemSync
+class DOMFileSystemSync native "*DOMFileSystemSync" {
+
+  /** @domName DOMFileSystemSync.name */
+  final String name;
+
+  /** @domName DOMFileSystemSync.root */
+  final DirectoryEntrySync root;
+}
+
+/// @domName DOMImplementation
+class DOMImplementation native "*DOMImplementation" {
+
+  /** @domName DOMImplementation.createCSSStyleSheet */
+  CSSStyleSheet createCSSStyleSheet(String title, String media) native;
+
+  /** @domName DOMImplementation.createDocument */
+  Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype) native;
+
+  /** @domName DOMImplementation.createDocumentType */
+  DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native;
+
+  /** @domName DOMImplementation.createHTMLDocument */
+  Document createHTMLDocument(String title) native;
+
+  /** @domName DOMImplementation.hasFeature */
+  bool hasFeature(String feature, String version) native;
+}
+
+/// @domName MimeType
+class DOMMimeType native "*MimeType" {
+
+  /** @domName MimeType.description */
+  final String description;
+
+  /** @domName MimeType.enabledPlugin */
+  final DOMPlugin enabledPlugin;
+
+  /** @domName MimeType.suffixes */
+  final String suffixes;
+
+  /** @domName MimeType.type */
+  final String type;
+}
+
+/// @domName MimeTypeArray
+class DOMMimeTypeArray implements JavaScriptIndexingBehavior, List<DOMMimeType> native "*MimeTypeArray" {
+
+  /** @domName MimeTypeArray.length */
+  final int length;
+
+  DOMMimeType operator[](int index) => JS("DOMMimeType", "#[#]", this, index);
+
+  void operator[]=(int index, DOMMimeType value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<DOMMimeType> mixins.
+  // DOMMimeType is the element type.
+
+  // From Iterable<DOMMimeType>:
+
+  Iterator<DOMMimeType> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<DOMMimeType>(this);
+  }
+
+  // From Collection<DOMMimeType>:
+
+  void add(DOMMimeType value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(DOMMimeType value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<DOMMimeType> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(DOMMimeType element) => _Collections.contains(this, element);
+
+  void forEach(void f(DOMMimeType element)) => _Collections.forEach(this, f);
+
+  Collection map(f(DOMMimeType element)) => _Collections.map(this, [], f);
+
+  Collection<DOMMimeType> filter(bool f(DOMMimeType element)) =>
+     _Collections.filter(this, <DOMMimeType>[], f);
+
+  bool every(bool f(DOMMimeType element)) => _Collections.every(this, f);
+
+  bool some(bool f(DOMMimeType element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<DOMMimeType>:
+
+  void sort([Comparator<DOMMimeType> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(DOMMimeType element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(DOMMimeType element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  DOMMimeType get last => this[length - 1];
+
+  DOMMimeType removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<DOMMimeType> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [DOMMimeType initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<DOMMimeType> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <DOMMimeType>[]);
+
+  // -- end List<DOMMimeType> mixins.
+
+  /** @domName MimeTypeArray.item */
+  DOMMimeType item(int index) native;
+
+  /** @domName MimeTypeArray.namedItem */
+  DOMMimeType namedItem(String name) native;
+}
+
+/// @domName DOMParser
+class DOMParser native "*DOMParser" {
+
+  factory DOMParser() => _DOMParserFactoryProvider.createDOMParser();
+
+  /** @domName DOMParser.parseFromString */
+  Document parseFromString(String str, String contentType) native;
+}
+
+/// @domName Plugin
+class DOMPlugin native "*Plugin" {
+
+  /** @domName Plugin.description */
+  final String description;
+
+  /** @domName Plugin.filename */
+  final String filename;
+
+  /** @domName Plugin.length */
+  final int length;
+
+  /** @domName Plugin.name */
+  final String name;
+
+  /** @domName Plugin.item */
+  DOMMimeType item(int index) native;
+
+  /** @domName Plugin.namedItem */
+  DOMMimeType namedItem(String name) native;
+}
+
+/// @domName PluginArray
+class DOMPluginArray implements JavaScriptIndexingBehavior, List<DOMPlugin> native "*PluginArray" {
+
+  /** @domName PluginArray.length */
+  final int length;
+
+  DOMPlugin operator[](int index) => JS("DOMPlugin", "#[#]", this, index);
+
+  void operator[]=(int index, DOMPlugin value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<DOMPlugin> mixins.
+  // DOMPlugin is the element type.
+
+  // From Iterable<DOMPlugin>:
+
+  Iterator<DOMPlugin> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<DOMPlugin>(this);
+  }
+
+  // From Collection<DOMPlugin>:
+
+  void add(DOMPlugin value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(DOMPlugin value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<DOMPlugin> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(DOMPlugin element) => _Collections.contains(this, element);
+
+  void forEach(void f(DOMPlugin element)) => _Collections.forEach(this, f);
+
+  Collection map(f(DOMPlugin element)) => _Collections.map(this, [], f);
+
+  Collection<DOMPlugin> filter(bool f(DOMPlugin element)) =>
+     _Collections.filter(this, <DOMPlugin>[], f);
+
+  bool every(bool f(DOMPlugin element)) => _Collections.every(this, f);
+
+  bool some(bool f(DOMPlugin element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<DOMPlugin>:
+
+  void sort([Comparator<DOMPlugin> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(DOMPlugin element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(DOMPlugin element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  DOMPlugin get last => this[length - 1];
+
+  DOMPlugin removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<DOMPlugin> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [DOMPlugin initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<DOMPlugin> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <DOMPlugin>[]);
+
+  // -- end List<DOMPlugin> mixins.
+
+  /** @domName PluginArray.item */
+  DOMPlugin item(int index) native;
+
+  /** @domName PluginArray.namedItem */
+  DOMPlugin namedItem(String name) native;
+
+  /** @domName PluginArray.refresh */
+  void refresh(bool reload) native;
+}
+
+/// @domName Selection
+class DOMSelection native "*Selection" {
+
+  /** @domName Selection.anchorNode */
+  final Node anchorNode;
+
+  /** @domName Selection.anchorOffset */
+  final int anchorOffset;
+
+  /** @domName Selection.baseNode */
+  final Node baseNode;
+
+  /** @domName Selection.baseOffset */
+  final int baseOffset;
+
+  /** @domName Selection.extentNode */
+  final Node extentNode;
+
+  /** @domName Selection.extentOffset */
+  final int extentOffset;
+
+  /** @domName Selection.focusNode */
+  final Node focusNode;
+
+  /** @domName Selection.focusOffset */
+  final int focusOffset;
+
+  /** @domName Selection.isCollapsed */
+  final bool isCollapsed;
+
+  /** @domName Selection.rangeCount */
+  final int rangeCount;
+
+  /** @domName Selection.type */
+  final String type;
+
+  /** @domName Selection.addRange */
+  void addRange(Range range) native;
+
+  /** @domName Selection.collapse */
+  void collapse(Node node, int index) native;
+
+  /** @domName Selection.collapseToEnd */
+  void collapseToEnd() native;
+
+  /** @domName Selection.collapseToStart */
+  void collapseToStart() native;
+
+  /** @domName Selection.containsNode */
+  bool containsNode(Node node, bool allowPartial) native;
+
+  /** @domName Selection.deleteFromDocument */
+  void deleteFromDocument() native;
+
+  /** @domName Selection.empty */
+  void empty() native;
+
+  /** @domName Selection.extend */
+  void extend(Node node, int offset) native;
+
+  /** @domName Selection.getRangeAt */
+  Range getRangeAt(int index) native;
+
+  /** @domName Selection.modify */
+  void modify(String alter, String direction, String granularity) native;
+
+  /** @domName Selection.removeAllRanges */
+  void removeAllRanges() native;
+
+  /** @domName Selection.selectAllChildren */
+  void selectAllChildren(Node node) native;
+
+  /** @domName Selection.setBaseAndExtent */
+  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native;
+
+  /** @domName Selection.setPosition */
+  void setPosition(Node node, int offset) native;
+
+  /** @domName Selection.toString */
+  String toString() native;
+}
+
+/// @domName DOMSettableTokenList
+class DOMSettableTokenList extends DOMTokenList native "*DOMSettableTokenList" {
+
+  /** @domName DOMSettableTokenList.value */
+  String value;
+}
+/// @domName DOMStringMap
+abstract class DOMStringMap {
+}
+
+/// @domName DOMTokenList
+class DOMTokenList native "*DOMTokenList" {
+
+  /** @domName DOMTokenList.length */
+  final int length;
+
+  /** @domName DOMTokenList.contains */
+  bool contains(String token) native;
+
+  /** @domName DOMTokenList.item */
+  String item(int index) native;
+
+  /** @domName DOMTokenList.toString */
+  String toString() native;
+
+  /** @domName DOMTokenList.toggle */
+  bool toggle(String token, [bool force]) native;
+}
+
+/// @domName HTMLDataListElement
+class DataListElement extends Element implements Element native "*HTMLDataListElement" {
+
+  factory DataListElement() => _Elements.createDataListElement();
+
+  /** @domName HTMLDataListElement.options */
+  final HTMLCollection options;
+}
+
+/// @domName DataTransferItem
+class DataTransferItem native "*DataTransferItem" {
+
+  /** @domName DataTransferItem.kind */
+  final String kind;
+
+  /** @domName DataTransferItem.type */
+  final String type;
+
+  /** @domName DataTransferItem.getAsFile */
+  Blob getAsFile() native;
+
+  /** @domName DataTransferItem.getAsString */
+  void getAsString([StringCallback callback]) native;
+
+  /** @domName DataTransferItem.webkitGetAsEntry */
+  Entry webkitGetAsEntry() native;
+}
+
+/// @domName DataTransferItemList
+class DataTransferItemList native "*DataTransferItemList" {
+
+  /** @domName DataTransferItemList.length */
+  final int length;
+
+  /** @domName DataTransferItemList.add */
+  void add(data_OR_file, [String type]) native;
+
+  /** @domName DataTransferItemList.clear */
+  void clear() native;
+
+  /** @domName DataTransferItemList.item */
+  DataTransferItem item(int index) native;
+}
+
+/// @domName DataView
+class DataView extends ArrayBufferView native "*DataView" {
+
+  factory DataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) {
+    if (!?byteOffset) {
+      return _DataViewFactoryProvider.createDataView(buffer);
+    }
+    if (!?byteLength) {
+      return _DataViewFactoryProvider.createDataView(buffer, byteOffset);
+    }
+    return _DataViewFactoryProvider.createDataView(buffer, byteOffset, byteLength);
+  }
+
+  /** @domName DataView.getFloat32 */
+  num getFloat32(int byteOffset, {bool littleEndian}) native;
+
+  /** @domName DataView.getFloat64 */
+  num getFloat64(int byteOffset, {bool littleEndian}) native;
+
+  /** @domName DataView.getInt16 */
+  int getInt16(int byteOffset, {bool littleEndian}) native;
+
+  /** @domName DataView.getInt32 */
+  int getInt32(int byteOffset, {bool littleEndian}) native;
+
+  /** @domName DataView.getInt8 */
+  int getInt8(int byteOffset) native;
+
+  /** @domName DataView.getUint16 */
+  int getUint16(int byteOffset, {bool littleEndian}) native;
+
+  /** @domName DataView.getUint32 */
+  int getUint32(int byteOffset, {bool littleEndian}) native;
+
+  /** @domName DataView.getUint8 */
+  int getUint8(int byteOffset) native;
+
+  /** @domName DataView.setFloat32 */
+  void setFloat32(int byteOffset, num value, {bool littleEndian}) native;
+
+  /** @domName DataView.setFloat64 */
+  void setFloat64(int byteOffset, num value, {bool littleEndian}) native;
+
+  /** @domName DataView.setInt16 */
+  void setInt16(int byteOffset, int value, {bool littleEndian}) native;
+
+  /** @domName DataView.setInt32 */
+  void setInt32(int byteOffset, int value, {bool littleEndian}) native;
+
+  /** @domName DataView.setInt8 */
+  void setInt8(int byteOffset, int value) native;
+
+  /** @domName DataView.setUint16 */
+  void setUint16(int byteOffset, int value, {bool littleEndian}) native;
+
+  /** @domName DataView.setUint32 */
+  void setUint32(int byteOffset, int value, {bool littleEndian}) native;
+
+  /** @domName DataView.setUint8 */
+  void setUint8(int byteOffset, int value) native;
+}
+
+/// @domName Database
+class Database native "*Database" {
+
+  /** @domName Database.version */
+  final String version;
+
+  /** @domName Database.changeVersion */
+  void changeVersion(String oldVersion, String newVersion, [SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
+
+  /** @domName Database.readTransaction */
+  void readTransaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
+
+  /** @domName Database.transaction */
+  void transaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void DatabaseCallback(database);
+
+/// @domName DatabaseSync
+class DatabaseSync native "*DatabaseSync" {
+
+  /** @domName DatabaseSync.lastErrorMessage */
+  final String lastErrorMessage;
+
+  /** @domName DatabaseSync.version */
+  final String version;
+
+  /** @domName DatabaseSync.changeVersion */
+  void changeVersion(String oldVersion, String newVersion, [SQLTransactionSyncCallback callback]) native;
+
+  /** @domName DatabaseSync.readTransaction */
+  void readTransaction(SQLTransactionSyncCallback callback) native;
+
+  /** @domName DatabaseSync.transaction */
+  void transaction(SQLTransactionSyncCallback callback) native;
+}
+
+/// @domName DedicatedWorkerContext
+class DedicatedWorkerContext extends WorkerContext native "*DedicatedWorkerContext" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  DedicatedWorkerContextEvents get on =>
+    new DedicatedWorkerContextEvents(this);
+
+  /** @domName DedicatedWorkerContext.postMessage */
+  void postMessage(/*any*/ message, [messagePorts]) {
+    if (?messagePorts) {
+      var message_1 = _convertDartToNative_SerializedScriptValue(message);
+      _postMessage_1(message_1, messagePorts);
+      return;
+    }
+    var message_2 = _convertDartToNative_SerializedScriptValue(message);
+    _postMessage_2(message_2);
+    return;
+  }
+  void _postMessage_1(message, List messagePorts) native "postMessage";
+  void _postMessage_2(message) native "postMessage";
+}
+
+class DedicatedWorkerContextEvents extends WorkerContextEvents {
+  DedicatedWorkerContextEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get message => this['message'];
+}
+
+/// @domName DelayNode
+class DelayNode extends AudioNode native "*DelayNode" {
+
+  /** @domName DelayNode.delayTime */
+  final AudioParam delayTime;
+}
+
+/// @domName HTMLDetailsElement
+class DetailsElement extends Element implements Element native "*HTMLDetailsElement" {
+
+  factory DetailsElement() => _Elements.createDetailsElement();
+
+  /** @domName HTMLDetailsElement.open */
+  bool open;
+}
+
+/// @domName DeviceMotionEvent
+class DeviceMotionEvent extends Event native "*DeviceMotionEvent" {
+
+  /** @domName DeviceMotionEvent.interval */
+  final num interval;
+}
+
+/// @domName DeviceOrientationEvent
+class DeviceOrientationEvent extends Event native "*DeviceOrientationEvent" {
+
+  /** @domName DeviceOrientationEvent.absolute */
+  final bool absolute;
+
+  /** @domName DeviceOrientationEvent.alpha */
+  final num alpha;
+
+  /** @domName DeviceOrientationEvent.beta */
+  final num beta;
+
+  /** @domName DeviceOrientationEvent.gamma */
+  final num gamma;
+
+  /** @domName DeviceOrientationEvent.initDeviceOrientationEvent */
+  void initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) native;
+}
+
+/// @domName HTMLDirectoryElement
+class DirectoryElement extends Element implements Element native "*HTMLDirectoryElement" {
+
+  /** @domName HTMLDirectoryElement.compact */
+  bool compact;
+}
+
+/// @domName DirectoryEntry
+class DirectoryEntry extends Entry native "*DirectoryEntry" {
+
+  /** @domName DirectoryEntry.createReader */
+  DirectoryReader createReader() native;
+
+  /** @domName DirectoryEntry.getDirectory */
+  void getDirectory(String path, {options, successCallback, errorCallback}) {
+    if (?errorCallback) {
+      var options_1 = _convertDartToNative_Dictionary(options);
+      _getDirectory_1(path, options_1, successCallback, errorCallback);
+      return;
+    }
+    if (?successCallback) {
+      var options_2 = _convertDartToNative_Dictionary(options);
+      _getDirectory_2(path, options_2, successCallback);
+      return;
+    }
+    if (?options) {
+      var options_3 = _convertDartToNative_Dictionary(options);
+      _getDirectory_3(path, options_3);
+      return;
+    }
+    _getDirectory_4(path);
+    return;
+  }
+  void _getDirectory_1(path, options, EntryCallback successCallback, ErrorCallback errorCallback) native "getDirectory";
+  void _getDirectory_2(path, options, EntryCallback successCallback) native "getDirectory";
+  void _getDirectory_3(path, options) native "getDirectory";
+  void _getDirectory_4(path) native "getDirectory";
+
+  /** @domName DirectoryEntry.getFile */
+  void getFile(String path, {options, successCallback, errorCallback}) {
+    if (?errorCallback) {
+      var options_1 = _convertDartToNative_Dictionary(options);
+      _getFile_1(path, options_1, successCallback, errorCallback);
+      return;
+    }
+    if (?successCallback) {
+      var options_2 = _convertDartToNative_Dictionary(options);
+      _getFile_2(path, options_2, successCallback);
+      return;
+    }
+    if (?options) {
+      var options_3 = _convertDartToNative_Dictionary(options);
+      _getFile_3(path, options_3);
+      return;
+    }
+    _getFile_4(path);
+    return;
+  }
+  void _getFile_1(path, options, EntryCallback successCallback, ErrorCallback errorCallback) native "getFile";
+  void _getFile_2(path, options, EntryCallback successCallback) native "getFile";
+  void _getFile_3(path, options) native "getFile";
+  void _getFile_4(path) native "getFile";
+
+  /** @domName DirectoryEntry.removeRecursively */
+  void removeRecursively(VoidCallback successCallback, [ErrorCallback errorCallback]) native;
+}
+
+/// @domName DirectoryEntrySync
+class DirectoryEntrySync extends EntrySync native "*DirectoryEntrySync" {
+
+  /** @domName DirectoryEntrySync.createReader */
+  DirectoryReaderSync createReader() native;
+
+  /** @domName DirectoryEntrySync.getDirectory */
+  DirectoryEntrySync getDirectory(String path, Map flags) {
+    var flags_1 = _convertDartToNative_Dictionary(flags);
+    return _getDirectory_1(path, flags_1);
+  }
+  DirectoryEntrySync _getDirectory_1(path, flags) native "getDirectory";
+
+  /** @domName DirectoryEntrySync.getFile */
+  FileEntrySync getFile(String path, Map flags) {
+    var flags_1 = _convertDartToNative_Dictionary(flags);
+    return _getFile_1(path, flags_1);
+  }
+  FileEntrySync _getFile_1(path, flags) native "getFile";
+
+  /** @domName DirectoryEntrySync.removeRecursively */
+  void removeRecursively() native;
+}
+
+/// @domName DirectoryReader
+class DirectoryReader native "*DirectoryReader" {
+
+  /** @domName DirectoryReader.readEntries */
+  void readEntries(EntriesCallback successCallback, [ErrorCallback errorCallback]) native;
+}
+
+/// @domName DirectoryReaderSync
+class DirectoryReaderSync native "*DirectoryReaderSync" {
+
+  /** @domName DirectoryReaderSync.readEntries */
+  List<EntrySync> readEntries() native;
+}
+
+/// @domName HTMLDivElement
+class DivElement extends Element implements Element native "*HTMLDivElement" {
+
+  factory DivElement() => _Elements.createDivElement();
+
+  /** @domName HTMLDivElement.align */
+  String align;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Document extends Node
+    native "*HTMLDocument"
+{
+
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  DocumentEvents get on =>
+    new DocumentEvents(this);
+
+  /** @domName HTMLDocument.activeElement */
+  final Element activeElement;
+
+  /** @domName Document.body */
+  Element body;
+
+  /** @domName Document.charset */
+  String charset;
+
+  /** @domName Document.cookie */
+  String cookie;
+
+  /** @domName Document.defaultView */
+  Window get window => _convertNativeToDart_Window(this._window);
+  Window get _window => JS("Window", "#.defaultView", this);
+
+  /** @domName Document.documentElement */
+  final Element documentElement;
+
+  /** @domName Document.domain */
+  final String domain;
+
+  /** @domName Document.head */
+  final HeadElement head;
+
+  /** @domName Document.implementation */
+  final DOMImplementation implementation;
+
+  /** @domName Document.lastModified */
+  final String lastModified;
+
+  /** @domName Document.preferredStylesheetSet */
+  final String preferredStylesheetSet;
+
+  /** @domName Document.readyState */
+  final String readyState;
+
+  /** @domName Document.referrer */
+  final String referrer;
+
+  /** @domName Document.selectedStylesheetSet */
+  String selectedStylesheetSet;
+
+  /** @domName Document.styleSheets */
+  final List<StyleSheet> styleSheets;
+
+  /** @domName Document.title */
+  String title;
+
+  /** @domName Document.webkitCurrentFullScreenElement */
+  final Element webkitCurrentFullScreenElement;
+
+  /** @domName Document.webkitFullScreenKeyboardInputAllowed */
+  final bool webkitFullScreenKeyboardInputAllowed;
+
+  /** @domName Document.webkitFullscreenElement */
+  final Element webkitFullscreenElement;
+
+  /** @domName Document.webkitFullscreenEnabled */
+  final bool webkitFullscreenEnabled;
+
+  /** @domName Document.webkitHidden */
+  final bool webkitHidden;
+
+  /** @domName Document.webkitIsFullScreen */
+  final bool webkitIsFullScreen;
+
+  /** @domName Document.webkitPointerLockElement */
+  final Element webkitPointerLockElement;
+
+  /** @domName Document.webkitVisibilityState */
+  final String webkitVisibilityState;
+
+  /** @domName Document.caretRangeFromPoint */
+  Range caretRangeFromPoint(int x, int y) native;
+
+  /** @domName Document.createCDATASection */
+  CDATASection createCDATASection(String data) native;
+
+  /** @domName Document.createDocumentFragment */
+  DocumentFragment createDocumentFragment() native;
+
+  /** @domName Document.createElement */
+  Element $dom_createElement(String tagName) native "createElement";
+
+  /** @domName Document.createElementNS */
+  Element $dom_createElementNS(String namespaceURI, String qualifiedName) native "createElementNS";
+
+  /** @domName Document.createEvent */
+  Event $dom_createEvent(String eventType) native "createEvent";
+
+  /** @domName Document.createRange */
+  Range createRange() native;
+
+  /** @domName Document.createTextNode */
+  Text $dom_createTextNode(String data) native "createTextNode";
+
+  /** @domName Document.createTouch */
+  Touch createTouch(LocalWindow window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) {
+    EventTarget target_1 = _convertDartToNative_EventTarget(target);
+    return _createTouch_1(window, target_1, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
+  }
+  Touch _createTouch_1(LocalWindow window, EventTarget target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "createTouch";
+
+  /** @domName Document.createTouchList */
+  TouchList $dom_createTouchList() native "createTouchList";
+
+  /** @domName Document.elementFromPoint */
+  Element elementFromPoint(int x, int y) native;
+
+  /** @domName Document.execCommand */
+  bool execCommand(String command, bool userInterface, String value) native;
+
+  /** @domName Document.getCSSCanvasContext */
+  CanvasRenderingContext getCSSCanvasContext(String contextId, String name, int width, int height) native;
+
+  /** @domName Document.getElementById */
+  Element $dom_getElementById(String elementId) native "getElementById";
+
+  /** @domName Document.getElementsByClassName */
+  List<Node> $dom_getElementsByClassName(String tagname) native "getElementsByClassName";
+
+  /** @domName Document.getElementsByName */
+  List<Node> $dom_getElementsByName(String elementName) native "getElementsByName";
+
+  /** @domName Document.getElementsByTagName */
+  List<Node> $dom_getElementsByTagName(String tagname) native "getElementsByTagName";
+
+  /** @domName Document.queryCommandEnabled */
+  bool queryCommandEnabled(String command) native;
+
+  /** @domName Document.queryCommandIndeterm */
+  bool queryCommandIndeterm(String command) native;
+
+  /** @domName Document.queryCommandState */
+  bool queryCommandState(String command) native;
+
+  /** @domName Document.queryCommandSupported */
+  bool queryCommandSupported(String command) native;
+
+  /** @domName Document.queryCommandValue */
+  String queryCommandValue(String command) native;
+
+  /** @domName Document.querySelector */
+  Element $dom_querySelector(String selectors) native "querySelector";
+
+  /** @domName Document.querySelectorAll */
+  List<Node> $dom_querySelectorAll(String selectors) native "querySelectorAll";
+
+  /** @domName Document.webkitCancelFullScreen */
+  void webkitCancelFullScreen() native;
+
+  /** @domName Document.webkitExitFullscreen */
+  void webkitExitFullscreen() native;
+
+  /** @domName Document.webkitExitPointerLock */
+  void webkitExitPointerLock() native;
+
+  // TODO(jacobr): implement all Element methods not on Document.
+
+  Element query(String selectors) {
+    // It is fine for our RegExp to detect element id query selectors to have
+    // false negatives but not false positives.
+    if (const RegExp("^#[_a-zA-Z]\\w*\$").hasMatch(selectors)) {
+      return $dom_getElementById(selectors.substring(1));
+    }
+    return $dom_querySelector(selectors);
+  }
+
+  List<Element> queryAll(String selectors) {
+    if (const RegExp("""^\\[name=["'][^'"]+['"]\\]\$""").hasMatch(selectors)) {
+      final mutableMatches = $dom_getElementsByName(
+          selectors.substring(7,selectors.length - 2));
+      int len = mutableMatches.length;
+      final copyOfMatches = new List<Element>(len);
+      for (int i = 0; i < len; ++i) {
+        copyOfMatches[i] = mutableMatches[i];
+      }
+      return new _FrozenElementList._wrap(copyOfMatches);
+    } else if (const RegExp("^[*a-zA-Z0-9]+\$").hasMatch(selectors)) {
+      final mutableMatches = $dom_getElementsByTagName(selectors);
+      int len = mutableMatches.length;
+      final copyOfMatches = new List<Element>(len);
+      for (int i = 0; i < len; ++i) {
+        copyOfMatches[i] = mutableMatches[i];
+      }
+      return new _FrozenElementList._wrap(copyOfMatches);
+    } else {
+      return new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
+    }
+  }
+}
+
+class DocumentEvents extends ElementEvents {
+  DocumentEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get abort => this['abort'];
+
+  EventListenerList get beforeCopy => this['beforecopy'];
+
+  EventListenerList get beforeCut => this['beforecut'];
+
+  EventListenerList get beforePaste => this['beforepaste'];
+
+  EventListenerList get blur => this['blur'];
+
+  EventListenerList get change => this['change'];
+
+  EventListenerList get click => this['click'];
+
+  EventListenerList get contextMenu => this['contextmenu'];
+
+  EventListenerList get copy => this['copy'];
+
+  EventListenerList get cut => this['cut'];
+
+  EventListenerList get doubleClick => this['dblclick'];
+
+  EventListenerList get drag => this['drag'];
+
+  EventListenerList get dragEnd => this['dragend'];
+
+  EventListenerList get dragEnter => this['dragenter'];
+
+  EventListenerList get dragLeave => this['dragleave'];
+
+  EventListenerList get dragOver => this['dragover'];
+
+  EventListenerList get dragStart => this['dragstart'];
+
+  EventListenerList get drop => this['drop'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get focus => this['focus'];
+
+  EventListenerList get input => this['input'];
+
+  EventListenerList get invalid => this['invalid'];
+
+  EventListenerList get keyDown => this['keydown'];
+
+  EventListenerList get keyPress => this['keypress'];
+
+  EventListenerList get keyUp => this['keyup'];
+
+  EventListenerList get load => this['load'];
+
+  EventListenerList get mouseDown => this['mousedown'];
+
+  EventListenerList get mouseMove => this['mousemove'];
+
+  EventListenerList get mouseOut => this['mouseout'];
+
+  EventListenerList get mouseOver => this['mouseover'];
+
+  EventListenerList get mouseUp => this['mouseup'];
+
+  EventListenerList get mouseWheel => this['mousewheel'];
+
+  EventListenerList get paste => this['paste'];
+
+  EventListenerList get readyStateChange => this['readystatechange'];
+
+  EventListenerList get reset => this['reset'];
+
+  EventListenerList get scroll => this['scroll'];
+
+  EventListenerList get search => this['search'];
+
+  EventListenerList get select => this['select'];
+
+  EventListenerList get selectionChange => this['selectionchange'];
+
+  EventListenerList get selectStart => this['selectstart'];
+
+  EventListenerList get submit => this['submit'];
+
+  EventListenerList get touchCancel => this['touchcancel'];
+
+  EventListenerList get touchEnd => this['touchend'];
+
+  EventListenerList get touchMove => this['touchmove'];
+
+  EventListenerList get touchStart => this['touchstart'];
+
+  EventListenerList get fullscreenChange => this['webkitfullscreenchange'];
+
+  EventListenerList get fullscreenError => this['webkitfullscreenerror'];
+
+  EventListenerList get pointerLockChange => this['webkitpointerlockchange'];
+
+  EventListenerList get pointerLockError => this['webkitpointerlockerror'];
+}
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _FilteredElementList implements List {
+  final Node _node;
+  final List<Node> _childNodes;
+
+  _FilteredElementList(Node node): _childNodes = node.nodes, _node = node;
+
+  // We can't memoize this, since it's possible that children will be messed
+  // with externally to this class.
+  //
+  // TODO(nweiz): Do we really need to copy the list to make the types work out?
+  List<Element> get _filtered =>
+    new List.from(_childNodes.filter((n) => n is Element));
+
+  void forEach(void f(Element element)) {
+    _filtered.forEach(f);
+  }
+
+  void operator []=(int index, Element value) {
+    this[index].replaceWith(value);
+  }
+
+  void set length(int newLength) {
+    final len = this.length;
+    if (newLength >= len) {
+      return;
+    } else if (newLength < 0) {
+      throw new ArgumentError("Invalid list length");
+    }
+
+    removeRange(newLength - 1, len - newLength);
+  }
+
+  void add(Element value) {
+    _childNodes.add(value);
+  }
+
+  void addAll(Collection<Element> collection) {
+    collection.forEach(add);
+  }
+
+  void addLast(Element value) {
+    add(value);
+  }
+
+  bool contains(Element element) {
+    return element is Element && _childNodes.contains(element);
+  }
+
+  void sort([Comparator<Element> compare = Comparable.compare]) {
+    throw new UnsupportedError('TODO(jacobr): should we impl?');
+  }
+
+  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
+    throw new UnimplementedError();
+  }
+
+  void removeRange(int start, int rangeLength) {
+    _filtered.getRange(start, rangeLength).forEach((el) => el.remove());
+  }
+
+  void insertRange(int start, int rangeLength, [initialValue = null]) {
+    throw new UnimplementedError();
+  }
+
+  void clear() {
+    // Currently, ElementList#clear clears even non-element nodes, so we follow
+    // that behavior.
+    _childNodes.clear();
+  }
+
+  Element removeLast() {
+    final result = this.last;
+    if (result != null) {
+      result.remove();
+    }
+    return result;
+  }
+
+  Collection map(f(Element element)) => _filtered.map(f);
+  Collection<Element> filter(bool f(Element element)) => _filtered.filter(f);
+  bool every(bool f(Element element)) => _filtered.every(f);
+  bool some(bool f(Element element)) => _filtered.some(f);
+  bool get isEmpty => _filtered.isEmpty;
+  int get length => _filtered.length;
+  Element operator [](int index) => _filtered[index];
+  Iterator<Element> iterator() => _filtered.iterator();
+  List<Element> getRange(int start, int rangeLength) =>
+    _filtered.getRange(start, rangeLength);
+  int indexOf(Element element, [int start = 0]) =>
+    _filtered.indexOf(element, start);
+
+  int lastIndexOf(Element element, [int start = null]) {
+    if (start == null) start = length - 1;
+    return _filtered.lastIndexOf(element, start);
+  }
+
+  Element get last => _filtered.last;
+}
+
+Future<CSSStyleDeclaration> _emptyStyleFuture() {
+  return _createMeasurementFuture(() => new Element.tag('div').style,
+                                  new Completer<CSSStyleDeclaration>());
+}
+
+class EmptyElementRect implements ElementRect {
+  final ClientRect client = const _SimpleClientRect(0, 0, 0, 0);
+  final ClientRect offset = const _SimpleClientRect(0, 0, 0, 0);
+  final ClientRect scroll = const _SimpleClientRect(0, 0, 0, 0);
+  final ClientRect bounding = const _SimpleClientRect(0, 0, 0, 0);
+  final List<ClientRect> clientRects = const <ClientRect>[];
+
+  const EmptyElementRect();
+}
+
+class _FrozenCssClassSet extends _CssClassSet {
+  _FrozenCssClassSet() : super(null);
+
+  void _write(Set s) {
+    throw new UnsupportedError(
+        'frozen class set cannot be modified');
+  }
+  Set<String> _read() => new Set<String>();
+
+  bool get frozen => true;
+}
+
+class DocumentFragment extends Node native "*DocumentFragment" {
+  factory DocumentFragment() => _DocumentFragmentFactoryProvider.createDocumentFragment();
+
+  factory DocumentFragment.html(String html) =>
+      _DocumentFragmentFactoryProvider.createDocumentFragment_html(html);
+
+  factory DocumentFragment.svg(String svg) =>
+      new _DocumentFragmentFactoryProvider.createDocumentFragment_svg(svg);
+
+  List<Element> _elements;
+
+  List<Element> get elements {
+    if (_elements == null) {
+      _elements = new _FilteredElementList(this);
+    }
+    return _elements;
+  }
+
+  // TODO: The type of value should be Collection<Element>. See http://b/5392897
+  void set elements(value) {
+    // Copy list first since we don't want liveness during iteration.
+    List copy = new List.from(value);
+    final elements = this.elements;
+    elements.clear();
+    elements.addAll(copy);
+  }
+
+  Element query(String selectors) => $dom_querySelector(selectors);
+
+  List<Element> queryAll(String selectors) =>
+    new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
+
+  String get innerHTML {
+    final e = new Element.tag("div");
+    e.nodes.add(this.clone(true));
+    return e.innerHTML;
+  }
+
+  String get outerHTML => innerHTML;
+
+  // TODO(nweiz): Do we want to support some variant of innerHTML for XML and/or
+  // SVG strings?
+  void set innerHTML(String value) {
+    this.nodes.clear();
+
+    final e = new Element.tag("div");
+    e.innerHTML = value;
+
+    // Copy list first since we don't want liveness during iteration.
+    List nodes = new List.from(e.nodes);
+    this.nodes.addAll(nodes);
+  }
+
+  Node _insertAdjacentNode(String where, Node node) {
+    switch (where.toLowerCase()) {
+      case "beforebegin": return null;
+      case "afterend": return null;
+      case "afterbegin":
+        var first = this.nodes.length > 0 ? this.nodes[0] : null;
+        this.insertBefore(node, first);
+        return node;
+      case "beforeend":
+        this.nodes.add(node);
+        return node;
+      default:
+        throw new ArgumentError("Invalid position ${where}");
+    }
+  }
+
+  Element insertAdjacentElement(String where, Element element)
+    => this._insertAdjacentNode(where, element);
+
+  void insertAdjacentText(String where, String text) {
+    this._insertAdjacentNode(where, new Text(text));
+  }
+
+  void insertAdjacentHTML(String where, String text) {
+    this._insertAdjacentNode(where, new DocumentFragment.html(text));
+  }
+
+  void addText(String text) {
+    this.insertAdjacentText('beforeend', text);
+  }
+
+  void addHTML(String text) {
+    this.insertAdjacentHTML('beforeend', text);
+  }
+
+  Future<ElementRect> get rect {
+    return _createMeasurementFuture(() => const EmptyElementRect(),
+                                    new Completer<ElementRect>());
+  }
+
+  // If we can come up with a semi-reasonable default value for an Element
+  // getter, we'll use it. In general, these return the same values as an
+  // element that has no parent.
+  String get contentEditable => "false";
+  bool get isContentEditable => false;
+  bool get draggable => false;
+  bool get hidden => false;
+  bool get spellcheck => false;
+  bool get translate => false;
+  int get tabIndex => -1;
+  String get id => "";
+  String get title => "";
+  String get tagName => "";
+  String get webkitdropzone => "";
+  String get webkitRegionOverflow => "";
+  Element get $m_firstElementChild {
+    if (elements.length > 0) {
+      return elements[0];
+    }
+    return null;
+  }
+  Element get $m_lastElementChild() => elements.last;
+  Element get nextElementSibling => null;
+  Element get previousElementSibling => null;
+  Element get offsetParent => null;
+  Element get parent => null;
+  Map<String, String> get attributes => const {};
+  CssClassSet get classes => new _FrozenCssClassSet();
+  Map<String, String> get dataAttributes => const {};
+  CSSStyleDeclaration get style => new Element.tag('div').style;
+  Future<CSSStyleDeclaration> get computedStyle =>
+      _emptyStyleFuture();
+  Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement) =>
+      _emptyStyleFuture();
+  bool matchesSelector(String selectors) => false;
+
+  // Imperative Element methods are made into no-ops, as they are on parentless
+  // elements.
+  void blur() {}
+  void focus() {}
+  void click() {}
+  void scrollByLines(int lines) {}
+  void scrollByPages(int pages) {}
+  void scrollIntoView([bool centerIfNeeded]) {}
+  void webkitRequestFullScreen(int flags) {}
+  void webkitRequestFullscreen() {}
+
+  // Setters throw errors rather than being no-ops because we aren't going to
+  // retain the values that were set, and erroring out seems clearer.
+  void set attributes(Map<String, String> value) {
+    throw new UnsupportedError(
+      "Attributes can't be set for document fragments.");
+  }
+
+  void set classes(Collection<String> value) {
+    throw new UnsupportedError(
+      "Classes can't be set for document fragments.");
+  }
+
+  void set dataAttributes(Map<String, String> value) {
+    throw new UnsupportedError(
+      "Data attributes can't be set for document fragments.");
+  }
+
+  void set contentEditable(String value) {
+    throw new UnsupportedError(
+      "Content editable can't be set for document fragments.");
+  }
+
+  String get dir {
+    throw new UnsupportedError(
+      "Document fragments don't support text direction.");
+  }
+
+  void set dir(String value) {
+    throw new UnsupportedError(
+      "Document fragments don't support text direction.");
+  }
+
+  void set draggable(bool value) {
+    throw new UnsupportedError(
+      "Draggable can't be set for document fragments.");
+  }
+
+  void set hidden(bool value) {
+    throw new UnsupportedError(
+      "Hidden can't be set for document fragments.");
+  }
+
+  void set id(String value) {
+    throw new UnsupportedError(
+      "ID can't be set for document fragments.");
+  }
+
+  String get lang {
+    throw new UnsupportedError(
+      "Document fragments don't support language.");
+  }
+
+  void set lang(String value) {
+    throw new UnsupportedError(
+      "Document fragments don't support language.");
+  }
+
+  void set scrollLeft(int value) {
+    throw new UnsupportedError(
+      "Document fragments don't support scrolling.");
+  }
+
+  void set scrollTop(int value) {
+    throw new UnsupportedError(
+      "Document fragments don't support scrolling.");
+  }
+
+  void set spellcheck(bool value) {
+     throw new UnsupportedError(
+      "Spellcheck can't be set for document fragments.");
+  }
+
+  void set translate(bool value) {
+     throw new UnsupportedError(
+      "Spellcheck can't be set for document fragments.");
+  }
+
+  void set tabIndex(int value) {
+    throw new UnsupportedError(
+      "Tab index can't be set for document fragments.");
+  }
+
+  void set title(String value) {
+    throw new UnsupportedError(
+      "Title can't be set for document fragments.");
+  }
+
+  void set webkitdropzone(String value) {
+    throw new UnsupportedError(
+      "WebKit drop zone can't be set for document fragments.");
+  }
+
+  void set webkitRegionOverflow(String value) {
+    throw new UnsupportedError(
+      "WebKit region overflow can't be set for document fragments.");
+  }
+
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  ElementEvents get on =>
+    new ElementEvents(this);
+
+  /** @domName DocumentFragment.querySelector */
+  Element $dom_querySelector(String selectors) native "querySelector";
+
+  /** @domName DocumentFragment.querySelectorAll */
+  List<Node> $dom_querySelectorAll(String selectors) native "querySelectorAll";
+
+}
+
+/// @domName DocumentType
+class DocumentType extends Node native "*DocumentType" {
+
+  /** @domName DocumentType.entities */
+  final NamedNodeMap entities;
+
+  /** @domName DocumentType.internalSubset */
+  final String internalSubset;
+
+  /** @domName DocumentType.name */
+  final String name;
+
+  /** @domName DocumentType.notations */
+  final NamedNodeMap notations;
+
+  /** @domName DocumentType.publicId */
+  final String publicId;
+
+  /** @domName DocumentType.systemId */
+  final String systemId;
+
+  /** @domName DocumentType.remove */
+  void remove() native;
+}
+
+/// @domName DynamicsCompressorNode
+class DynamicsCompressorNode extends AudioNode native "*DynamicsCompressorNode" {
+
+  /** @domName DynamicsCompressorNode.attack */
+  final AudioParam attack;
+
+  /** @domName DynamicsCompressorNode.knee */
+  final AudioParam knee;
+
+  /** @domName DynamicsCompressorNode.ratio */
+  final AudioParam ratio;
+
+  /** @domName DynamicsCompressorNode.reduction */
+  final AudioParam reduction;
+
+  /** @domName DynamicsCompressorNode.release */
+  final AudioParam release;
+
+  /** @domName DynamicsCompressorNode.threshold */
+  final AudioParam threshold;
+}
+
+/// @domName EXTTextureFilterAnisotropic
+class EXTTextureFilterAnisotropic native "*EXTTextureFilterAnisotropic" {
+
+  static const int MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;
+
+  static const int TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(jacobr): use _Lists.dart to remove some of the duplicated
+// functionality.
+class _ChildrenElementList implements List {
+  // Raw Element.
+  final Element _element;
+  final HTMLCollection _childElements;
+
+  _ChildrenElementList._wrap(Element element)
+    : _childElements = element.$dom_children,
+      _element = element;
+
+  List<Element> _toList() {
+    final output = new List(_childElements.length);
+    for (int i = 0, len = _childElements.length; i < len; i++) {
+      output[i] = _childElements[i];
+    }
+    return output;
+  }
+
+  bool contains(Element element) => _childElements.contains(element);
+
+  void forEach(void f(Element element)) {
+    for (Element element in _childElements) {
+      f(element);
+    }
+  }
+
+  List<Element> filter(bool f(Element element)) {
+    final output = [];
+    forEach((Element element) {
+      if (f(element)) {
+        output.add(element);
+      }
+    });
+    return new _FrozenElementList._wrap(output);
+  }
+
+  bool every(bool f(Element element)) {
+    for (Element element in this) {
+      if (!f(element)) {
+        return false;
+      }
+    };
+    return true;
+  }
+
+  bool some(bool f(Element element)) {
+    for (Element element in this) {
+      if (f(element)) {
+        return true;
+      }
+    };
+    return false;
+  }
+
+  Collection map(f(Element element)) {
+    final out = [];
+    for (Element el in this) {
+      out.add(f(el));
+    }
+    return out;
+  }
+
+  bool get isEmpty {
+    return _element.$dom_firstElementChild == null;
+  }
+
+  int get length {
+    return _childElements.length;
+  }
+
+  Element operator [](int index) {
+    return _childElements[index];
+  }
+
+  void operator []=(int index, Element value) {
+    _element.$dom_replaceChild(value, _childElements[index]);
+  }
+
+   void set length(int newLength) {
+     // TODO(jacobr): remove children when length is reduced.
+     throw new UnsupportedError('');
+   }
+
+  Element add(Element value) {
+    _element.$dom_appendChild(value);
+    return value;
+  }
+
+  Element addLast(Element value) => add(value);
+
+  Iterator<Element> iterator() => _toList().iterator();
+
+  void addAll(Collection<Element> collection) {
+    for (Element element in collection) {
+      _element.$dom_appendChild(element);
+    }
+  }
+
+  void sort([Comparator<Element> compare = Comparable.compare]) {
+    throw new UnsupportedError('TODO(jacobr): should we impl?');
+  }
+
+  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
+    throw new UnimplementedError();
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnimplementedError();
+  }
+
+  void insertRange(int start, int rangeLength, [initialValue = null]) {
+    throw new UnimplementedError();
+  }
+
+  List getRange(int start, int rangeLength) =>
+    new _FrozenElementList._wrap(_Lists.getRange(this, start, rangeLength,
+        []));
+
+  int indexOf(Element element, [int start = 0]) {
+    return _Lists.indexOf(this, element, start, this.length);
+  }
+
+  int lastIndexOf(Element element, [int start = null]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  void clear() {
+    // It is unclear if we want to keep non element nodes?
+    _element.text = '';
+  }
+
+  Element removeLast() {
+    final result = this.last;
+    if (result != null) {
+      _element.$dom_removeChild(result);
+    }
+    return result;
+  }
+
+  Element get last {
+    return _element.$dom_lastElementChild;
+  }
+}
+
+// TODO(jacobr): this is an inefficient implementation but it is hard to see
+// a better option given that we cannot quite force NodeList to be an
+// ElementList as there are valid cases where a NodeList JavaScript object
+// contains Node objects that are not Elements.
+class _FrozenElementList implements List {
+  final List<Node> _nodeList;
+
+  _FrozenElementList._wrap(this._nodeList);
+
+  Element get first {
+    return _nodeList[0];
+  }
+
+  bool contains(Element element) {
+    for (Element el in this) {
+      if (el == element) return true;
+    }
+    return false;
+  }
+
+  void forEach(void f(Element element)) {
+    for (Element el in this) {
+      f(el);
+    }
+  }
+
+  Collection map(f(Element element)) {
+    final out = [];
+    for (Element el in this) {
+      out.add(f(el));
+    }
+    return out;
+  }
+
+  List<Element> filter(bool f(Element element)) {
+    final out = [];
+    for (Element el in this) {
+      if (f(el)) out.add(el);
+    }
+    return out;
+  }
+
+  bool every(bool f(Element element)) {
+    for(Element element in this) {
+      if (!f(element)) {
+        return false;
+      }
+    };
+    return true;
+  }
+
+  bool some(bool f(Element element)) {
+    for(Element element in this) {
+      if (f(element)) {
+        return true;
+      }
+    };
+    return false;
+  }
+
+  bool get isEmpty => _nodeList.isEmpty;
+
+  int get length => _nodeList.length;
+
+  Element operator [](int index) => _nodeList[index];
+
+  void operator []=(int index, Element value) {
+    throw new UnsupportedError('');
+  }
+
+  void set length(int newLength) {
+    _nodeList.length = newLength;
+  }
+
+  void add(Element value) {
+    throw new UnsupportedError('');
+  }
+
+  void addLast(Element value) {
+    throw new UnsupportedError('');
+  }
+
+  Iterator<Element> iterator() => new _FrozenElementListIterator(this);
+
+  void addAll(Collection<Element> collection) {
+    throw new UnsupportedError('');
+  }
+
+  void sort([Comparator<Element> compare = Comparable.compare]) {
+    throw new UnsupportedError('');
+  }
+
+  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
+    throw new UnsupportedError('');
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError('');
+  }
+
+  void insertRange(int start, int rangeLength, [initialValue = null]) {
+    throw new UnsupportedError('');
+  }
+
+  List<Element> getRange(int start, int rangeLength) =>
+    new _FrozenElementList._wrap(_nodeList.getRange(start, rangeLength));
+
+  int indexOf(Element element, [int start = 0]) =>
+    _nodeList.indexOf(element, start);
+
+  int lastIndexOf(Element element, [int start = null]) =>
+    _nodeList.lastIndexOf(element, start);
+
+  void clear() {
+    throw new UnsupportedError('');
+  }
+
+  Element removeLast() {
+    throw new UnsupportedError('');
+  }
+
+  Element get last => _nodeList.last;
+}
+
+class _FrozenElementListIterator implements Iterator<Element> {
+  final _FrozenElementList _list;
+  int _index = 0;
+
+  _FrozenElementListIterator(this._list);
+
+  /**
+   * Gets the next element in the iteration. Throws a
+   * [StateError("No more elements")] if no element is left.
+   */
+  Element next() {
+    if (!hasNext) {
+      throw new StateError("No more elements");
+    }
+
+    return _list[_index++];
+  }
+
+  /**
+   * Returns whether the [Iterator] has elements left.
+   */
+  bool get hasNext => _index < _list.length;
+}
+
+/**
+ * All your attribute manipulation needs in one place.
+ * Extends the regular Map interface by automatically coercing non-string
+ * values to strings.
+ */
+abstract class AttributeMap implements Map<String, String> {
+  void operator []=(String key, value);
+}
+
+class _ElementAttributeMap extends AttributeMap {
+
+  final Element _element;
+
+  _ElementAttributeMap(this._element);
+
+  bool containsValue(String value) {
+    final attributes = _element.$dom_attributes;
+    for (int i = 0, len = attributes.length; i < len; i++) {
+      if(value == attributes[i].value) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  bool containsKey(String key) {
+    return _element.$dom_hasAttribute(key);
+  }
+
+  String operator [](String key) {
+    return _element.$dom_getAttribute(key);
+  }
+
+  void operator []=(String key, value) {
+    _element.$dom_setAttribute(key, '$value');
+  }
+
+  String putIfAbsent(String key, String ifAbsent()) {
+    if (!containsKey(key)) {
+      this[key] = ifAbsent();
+    }
+    return this[key];
+  }
+
+  String remove(String key) {
+    String value = _element.$dom_getAttribute(key);
+    _element.$dom_removeAttribute(key);
+    return value;
+  }
+
+  void clear() {
+    final attributes = _element.$dom_attributes;
+    for (int i = attributes.length - 1; i >= 0; i--) {
+      remove(attributes[i].name);
+    }
+  }
+
+  void forEach(void f(String key, String value)) {
+    final attributes = _element.$dom_attributes;
+    for (int i = 0, len = attributes.length; i < len; i++) {
+      final item = attributes[i];
+      f(item.name, item.value);
+    }
+  }
+
+  Collection<String> get keys {
+    // TODO(jacobr): generate a lazy collection instead.
+    final attributes = _element.$dom_attributes;
+    final keys = new List<String>(attributes.length);
+    for (int i = 0, len = attributes.length; i < len; i++) {
+      keys[i] = attributes[i].name;
+    }
+    return keys;
+  }
+
+  Collection<String> get values {
+    // TODO(jacobr): generate a lazy collection instead.
+    final attributes = _element.$dom_attributes;
+    final values = new List<String>(attributes.length);
+    for (int i = 0, len = attributes.length; i < len; i++) {
+      values[i] = attributes[i].value;
+    }
+    return values;
+  }
+
+  /**
+   * The number of {key, value} pairs in the map.
+   */
+  int get length {
+    return _element.$dom_attributes.length;
+  }
+
+  /**
+   * Returns true if there is no {key, value} pair in the map.
+   */
+  bool get isEmpty {
+    return length == 0;
+  }
+}
+
+/**
+ * Provides a Map abstraction on top of data-* attributes, similar to the
+ * dataSet in the old DOM.
+ */
+class _DataAttributeMap extends AttributeMap {
+
+  final Map<String, String> $dom_attributes;
+
+  _DataAttributeMap(this.$dom_attributes);
+
+  // interface Map
+
+  // TODO: Use lazy iterator when it is available on Map.
+  bool containsValue(String value) => values.some((v) => v == value);
+
+  bool containsKey(String key) => $dom_attributes.containsKey(_attr(key));
+
+  String operator [](String key) => $dom_attributes[_attr(key)];
+
+  void operator []=(String key, value) {
+    $dom_attributes[_attr(key)] = '$value';
+  }
+
+  String putIfAbsent(String key, String ifAbsent()) =>
+    $dom_attributes.putIfAbsent(_attr(key), ifAbsent);
+
+  String remove(String key) => $dom_attributes.remove(_attr(key));
+
+  void clear() {
+    // Needs to operate on a snapshot since we are mutating the collection.
+    for (String key in keys) {
+      remove(key);
+    }
+  }
+
+  void forEach(void f(String key, String value)) {
+    $dom_attributes.forEach((String key, String value) {
+      if (_matches(key)) {
+        f(_strip(key), value);
+      }
+    });
+  }
+
+  Collection<String> get keys {
+    final keys = new List<String>();
+    $dom_attributes.forEach((String key, String value) {
+      if (_matches(key)) {
+        keys.add(_strip(key));
+      }
+    });
+    return keys;
+  }
+
+  Collection<String> get values {
+    final values = new List<String>();
+    $dom_attributes.forEach((String key, String value) {
+      if (_matches(key)) {
+        values.add(value);
+      }
+    });
+    return values;
+  }
+
+  int get length => keys.length;
+
+  // TODO: Use lazy iterator when it is available on Map.
+  bool get isEmpty => length == 0;
+
+  // Helpers.
+  String _attr(String key) => 'data-$key';
+  bool _matches(String key) => key.startsWith('data-');
+  String _strip(String key) => key.substring(5);
+}
+
+abstract class CssClassSet implements Set<String> {
+  /**
+   * Adds the class [token] to the element if it is not on it, removes it if it
+   * is.
+   */
+  bool toggle(String token);
+
+  /**
+   * Returns [:true:] if classes cannot be added or removed from this
+   * [:CssClassSet:].
+   */
+  bool get frozen;
+}
+
+class _CssClassSet extends CssClassSet {
+
+  final Element _element;
+
+  _CssClassSet(this._element);
+
+  String toString() => _formatSet(_read());
+
+  // interface Iterable - BEGIN
+  Iterator<String> iterator() => _read().iterator();
+  // interface Iterable - END
+
+  // interface Collection - BEGIN
+  void forEach(void f(String element)) {
+    _read().forEach(f);
+  }
+
+  Collection map(f(String element)) => _read().map(f);
+
+  Collection<String> filter(bool f(String element)) => _read().filter(f);
+
+  bool every(bool f(String element)) => _read().every(f);
+
+  bool some(bool f(String element)) => _read().some(f);
+
+  bool get isEmpty => _read().isEmpty;
+
+  /**
+   * Returns [:true:] if classes cannot be added or removed from this
+   * [:CssClassSet:].
+   */
+  bool get frozen => false;
+
+  int get length =>_read().length;
+
+  // interface Collection - END
+
+  // interface Set - BEGIN
+  bool contains(String value) => _read().contains(value);
+
+  void add(String value) {
+    // TODO - figure out if we need to do any validation here
+    // or if the browser natively does enough
+    _modify((s) => s.add(value));
+  }
+
+  bool remove(String value) {
+    Set<String> s = _read();
+    bool result = s.remove(value);
+    _write(s);
+    return result;
+  }
+
+  /**
+   * Adds the class [token] to the element if it is not on it, removes it if it
+   * is.
+   */
+  bool toggle(String value) {
+    Set<String> s = _read();
+    bool result = false;
+    if (s.contains(value)) {
+      s.remove(value);
+    } else {
+      s.add(value);
+      result = true;
+    }
+    _write(s);
+    return result;
+  }
+
+  void addAll(Collection<String> collection) {
+    // TODO - see comment above about validation
+    _modify((s) => s.addAll(collection));
+  }
+
+  void removeAll(Collection<String> collection) {
+    _modify((s) => s.removeAll(collection));
+  }
+
+  bool isSubsetOf(Collection<String> collection) =>
+    _read().isSubsetOf(collection);
+
+  bool containsAll(Collection<String> collection) =>
+    _read().containsAll(collection);
+
+  Set<String> intersection(Collection<String> other) =>
+    _read().intersection(other);
+
+  void clear() {
+    _modify((s) => s.clear());
+  }
+  // interface Set - END
+
+  /**
+   * Helper method used to modify the set of css classes on this element.
+   *
+   *   f - callback with:
+   *      s - a Set of all the css class name currently on this element.
+   *
+   *   After f returns, the modified set is written to the
+   *       className property of this element.
+   */
+  void _modify( f(Set<String> s)) {
+    Set<String> s = _read();
+    f(s);
+    _write(s);
+  }
+
+  /**
+   * Read the class names from the Element class property,
+   * and put them into a set (duplicates are discarded).
+   */
+  Set<String> _read() {
+    // TODO(mattsh) simplify this once split can take regex.
+    Set<String> s = new Set<String>();
+    for (String name in _classname().split(' ')) {
+      String trimmed = name.trim();
+      if (!trimmed.isEmpty) {
+        s.add(trimmed);
+      }
+    }
+    return s;
+  }
+
+  /**
+   * Read the class names as a space-separated string. This is meant to be
+   * overridden by subclasses.
+   */
+  String _classname() => _element.$dom_className;
+
+  /**
+   * Join all the elements of a set into one string and write
+   * back to the element.
+   */
+  void _write(Set s) {
+    _element.$dom_className = _formatSet(s);
+  }
+
+  String _formatSet(Set<String> s) {
+    // TODO(mattsh) should be able to pass Set to String.joins http:/b/5398605
+    List list = new List.from(s);
+    return Strings.join(list, ' ');
+  }
+}
+
+class _SimpleClientRect implements ClientRect {
+  final num left;
+  final num top;
+  final num width;
+  final num height;
+  num get right => left + width;
+  num get bottom => top + height;
+
+  const _SimpleClientRect(this.left, this.top, this.width, this.height);
+
+  bool operator ==(ClientRect other) {
+    return other != null && left == other.left && top == other.top
+        && width == other.width && height == other.height;
+  }
+
+  String toString() => "($left, $top, $width, $height)";
+}
+
+// TODO(jacobr): we cannot currently be lazy about calculating the client
+// rects as we must perform all measurement queries at a safe point to avoid
+// triggering unneeded layouts.
+/**
+ * All your element measurement needs in one place.
+ * @domName none
+ */
+class ElementRect {
+  // Relative to offsetParent.
+  final ClientRect client;
+  final ClientRect offset;
+  final ClientRect scroll;
+
+  // TODO(jacobr): should we move these outside of ElementRect to avoid the
+  // overhead of computing them every time even though they are rarely used.
+  final ClientRect _boundingClientRect;
+  final _ClientRectList _clientRects;
+
+  ElementRect(Element element) :
+    client = new _SimpleClientRect(element.clientLeft,
+                                  element.clientTop,
+                                  element.clientWidth,
+                                  element.clientHeight),
+    offset = new _SimpleClientRect(element.offsetLeft,
+                                  element.offsetTop,
+                                  element.offsetWidth,
+                                  element.offsetHeight),
+    scroll = new _SimpleClientRect(element.scrollLeft,
+                                  element.scrollTop,
+                                  element.scrollWidth,
+                                  element.scrollHeight),
+    _boundingClientRect = element.getBoundingClientRect(),
+    _clientRects = element.getClientRects();
+
+  // In global coords.
+  ClientRect get bounding => _boundingClientRect;
+
+  // In global coords.
+  List<ClientRect> get clientRects {
+    final out = new List(_clientRects.length);
+    for (num i = 0; i < _clientRects.length; i++) {
+      out[i] = _clientRects.item(i);
+    }
+    return out;
+  }
+}
+
+class Element extends Node implements ElementTraversal native "*Element" {
+
+  factory Element.html(String html) =>
+      _ElementFactoryProvider.createElement_html(html);
+  factory Element.tag(String tag) =>
+      _ElementFactoryProvider.createElement_tag(tag);
+
+  /**
+   * @domName Element.hasAttribute, Element.getAttribute, Element.setAttribute,
+   *   Element.removeAttribute
+   */
+  _ElementAttributeMap get attributes => new _ElementAttributeMap(this);
+
+  void set attributes(Map<String, String> value) {
+    Map<String, String> attributes = this.attributes;
+    attributes.clear();
+    for (String key in value.keys) {
+      attributes[key] = value[key];
+    }
+  }
+
+  void set elements(Collection<Element> value) {
+    final elements = this.elements;
+    elements.clear();
+    elements.addAll(value);
+  }
+
+  /**
+   * @domName childElementCount, firstElementChild, lastElementChild,
+   *   children, Node.nodes.add
+   */
+  List<Element> get elements => new _ChildrenElementList._wrap(this);
+
+  Element query(String selectors) => $dom_querySelector(selectors);
+
+  List<Element> queryAll(String selectors) =>
+    new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
+
+  /** @domName className, classList */
+  CssClassSet get classes => new _CssClassSet(this);
+
+  void set classes(Collection<String> value) {
+    CssClassSet classSet = classes;
+    classSet.clear();
+    classSet.addAll(value);
+  }
+
+  Map<String, String> get dataAttributes =>
+    new _DataAttributeMap(attributes);
+
+  void set dataAttributes(Map<String, String> value) {
+    final dataAttributes = this.dataAttributes;
+    dataAttributes.clear();
+    for (String key in value.keys) {
+      dataAttributes[key] = value[key];
+    }
+  }
+
+  /**
+   * @domName getClientRects, getBoundingClientRect, clientHeight, clientWidth,
+   * clientTop, clientLeft, offsetHeight, offsetWidth, offsetTop, offsetLeft,
+   * scrollHeight, scrollWidth, scrollTop, scrollLeft
+   */
+  Future<ElementRect> get rect {
+    return _createMeasurementFuture(
+        () => new ElementRect(this),
+        new Completer<ElementRect>());
+  }
+
+  /** @domName Window.getComputedStyle */
+  Future<CSSStyleDeclaration> get computedStyle {
+     // TODO(jacobr): last param should be null, see b/5045788
+     return getComputedStyle('');
+  }
+
+  /** @domName Window.getComputedStyle */
+  Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement) {
+    return _createMeasurementFuture(
+        () => window.$dom_getComputedStyle(this, pseudoElement),
+        new Completer<CSSStyleDeclaration>());
+  }
+
+  /**
+   * Adds the specified text as a text node after the last child of this.
+   */
+  void addText(String text) {
+    this.insertAdjacentText('beforeend', text);
+  }
+
+  /**
+   * Parses the specified text as HTML and adds the resulting node after the
+   * last child of this.
+   */
+  void addHTML(String text) {
+    this.insertAdjacentHTML('beforeend', text);
+  }
+
+  // Hooks to support custom WebComponents.
+  /**
+   * Experimental support for [web components][wc]. This field stores a
+   * reference to the component implementation. It was inspired by Mozilla's
+   * [x-tags][] project. Please note: in the future it may be possible to
+   * `extend Element` from your class, in which case this field will be
+   * deprecated and will simply return this [Element] object.
+   *
+   * [wc]: http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html
+   * [x-tags]: http://x-tags.org/
+   */
+  var xtag;
+
+  // TODO(vsm): Implement noSuchMethod or similar for dart2js.
+
+  /** @domName Element.insertAdjacentText */
+  void insertAdjacentText(String where, String text) {
+    if (JS('bool', '!!#.insertAdjacentText', this)) {
+      _insertAdjacentText(where, text);
+    } else {
+      _insertAdjacentNode(where, new Text(text));
+    }
+  }
+
+  void _insertAdjacentText(String where, String text)
+      native 'insertAdjacentText';
+
+  /** @domName Element.insertAdjacentHTML */
+  void insertAdjacentHTML(String where, String text) {
+    if (JS('bool', '!!#.insertAdjacentHTML', this)) {
+      _insertAdjacentHTML(where, text);
+    } else {
+      _insertAdjacentNode(where, new DocumentFragment.html(text));
+    }
+  }
+
+  void _insertAdjacentHTML(String where, String text)
+      native 'insertAdjacentHTML';
+
+  /** @domName Element.insertAdjacentHTML */
+  Element insertAdjacentElement(String where, Element element) {
+    if (JS('bool', '!!#.insertAdjacentElement', this)) {
+      _insertAdjacentElement(where, element);
+    } else {
+      _insertAdjacentNode(where, element);
+    }
+    return element;
+  }
+
+  void _insertAdjacentElement(String where, Element element)
+      native 'insertAdjacentElement';
+
+  void _insertAdjacentNode(String where, Node node) {
+    switch (where.toLowerCase()) {
+      case 'beforebegin':
+        this.parent.insertBefore(node, this);
+        break;
+      case 'afterbegin':
+        var first = this.nodes.length > 0 ? this.nodes[0] : null;
+        this.insertBefore(node, first);
+        break;
+      case 'beforeend':
+        this.nodes.add(node);
+        break;
+      case 'afterend':
+        this.parent.insertBefore(node, this.nextNode);
+        break;
+      default:
+        throw new ArgumentError("Invalid position ${where}");
+    }
+  }
+
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  ElementEvents get on =>
+    new ElementEvents(this);
+
+  /** @domName HTMLElement.children */
+  HTMLCollection get $dom_children => JS("HTMLCollection", "#.children", this);
+
+  /** @domName HTMLElement.contentEditable */
+  String contentEditable;
+
+  /** @domName HTMLElement.dir */
+  String dir;
+
+  /** @domName HTMLElement.draggable */
+  bool draggable;
+
+  /** @domName HTMLElement.hidden */
+  bool hidden;
+
+  /** @domName HTMLElement.id */
+  String id;
+
+  /** @domName HTMLElement.innerHTML */
+  String innerHTML;
+
+  /** @domName HTMLElement.isContentEditable */
+  final bool isContentEditable;
+
+  /** @domName HTMLElement.lang */
+  String lang;
+
+  /** @domName HTMLElement.outerHTML */
+  final String outerHTML;
+
+  /** @domName HTMLElement.spellcheck */
+  bool spellcheck;
+
+  /** @domName HTMLElement.tabIndex */
+  int tabIndex;
+
+  /** @domName HTMLElement.title */
+  String title;
+
+  /** @domName HTMLElement.translate */
+  bool translate;
+
+  /** @domName HTMLElement.webkitdropzone */
+  String webkitdropzone;
+
+  /** @domName HTMLElement.click */
+  void click() native;
+
+  static const int ALLOW_KEYBOARD_INPUT = 1;
+
+  /** @domName Element.childElementCount */
+  int get $dom_childElementCount => JS("int", "#.childElementCount", this);
+
+  /** @domName Element.className */
+  String get $dom_className => JS("String", "#.className", this);
+
+  /** @domName Element.className */
+  void set $dom_className(String value) {
+    JS("void", "#.className = #", this, value);
+  }
+
+  /** @domName Element.clientHeight */
+  final int clientHeight;
+
+  /** @domName Element.clientLeft */
+  final int clientLeft;
+
+  /** @domName Element.clientTop */
+  final int clientTop;
+
+  /** @domName Element.clientWidth */
+  final int clientWidth;
+
+  /** @domName Element.dataset */
+  final Map<String, String> dataset;
+
+  /** @domName Element.firstElementChild */
+  Element get $dom_firstElementChild => JS("Element", "#.firstElementChild", this);
+
+  /** @domName Element.lastElementChild */
+  Element get $dom_lastElementChild => JS("Element", "#.lastElementChild", this);
+
+  /** @domName Element.nextElementSibling */
+  final Element nextElementSibling;
+
+  /** @domName Element.offsetHeight */
+  final int offsetHeight;
+
+  /** @domName Element.offsetLeft */
+  final int offsetLeft;
+
+  /** @domName Element.offsetParent */
+  final Element offsetParent;
+
+  /** @domName Element.offsetTop */
+  final int offsetTop;
+
+  /** @domName Element.offsetWidth */
+  final int offsetWidth;
+
+  /** @domName Element.previousElementSibling */
+  final Element previousElementSibling;
+
+  /** @domName Element.scrollHeight */
+  final int scrollHeight;
+
+  /** @domName Element.scrollLeft */
+  int scrollLeft;
+
+  /** @domName Element.scrollTop */
+  int scrollTop;
+
+  /** @domName Element.scrollWidth */
+  final int scrollWidth;
+
+  /** @domName Element.style */
+  final CSSStyleDeclaration style;
+
+  /** @domName Element.tagName */
+  final String tagName;
+
+  /** @domName Element.blur */
+  void blur() native;
+
+  /** @domName Element.focus */
+  void focus() native;
+
+  /** @domName Element.getAttribute */
+  String $dom_getAttribute(String name) native "getAttribute";
+
+  /** @domName Element.getBoundingClientRect */
+  ClientRect getBoundingClientRect() native;
+
+  /** @domName Element.getClientRects */
+  List<ClientRect> getClientRects() native;
+
+  /** @domName Element.getElementsByClassName */
+  List<Node> $dom_getElementsByClassName(String name) native "getElementsByClassName";
+
+  /** @domName Element.getElementsByTagName */
+  List<Node> $dom_getElementsByTagName(String name) native "getElementsByTagName";
+
+  /** @domName Element.hasAttribute */
+  bool $dom_hasAttribute(String name) native "hasAttribute";
+
+  /** @domName Element.querySelector */
+  Element $dom_querySelector(String selectors) native "querySelector";
+
+  /** @domName Element.querySelectorAll */
+  List<Node> $dom_querySelectorAll(String selectors) native "querySelectorAll";
+
+  /** @domName Element.removeAttribute */
+  void $dom_removeAttribute(String name) native "removeAttribute";
+
+  /** @domName Element.scrollByLines */
+  void scrollByLines(int lines) native;
+
+  /** @domName Element.scrollByPages */
+  void scrollByPages(int pages) native;
+
+  /** @domName Element.scrollIntoViewIfNeeded */
+  void scrollIntoView([bool centerIfNeeded]) native "scrollIntoViewIfNeeded";
+
+  /** @domName Element.setAttribute */
+  void $dom_setAttribute(String name, String value) native "setAttribute";
+
+  /** @domName Element.webkitMatchesSelector */
+  bool matchesSelector(String selectors) native "webkitMatchesSelector";
+
+  /** @domName Element.webkitRequestFullScreen */
+  void webkitRequestFullScreen(int flags) native;
+
+  /** @domName Element.webkitRequestFullscreen */
+  void webkitRequestFullscreen() native;
+
+  /** @domName Element.webkitRequestPointerLock */
+  void webkitRequestPointerLock() native;
+
+}
+
+// Temporary dispatch hook to support WebComponents.
+Function dynamicUnknownElementDispatcher;
+
+final _START_TAG_REGEXP = const RegExp('<(\\w+)');
+class _ElementFactoryProvider {
+  static final _CUSTOM_PARENT_TAG_MAP = const {
+    'body' : 'html',
+    'head' : 'html',
+    'caption' : 'table',
+    'td': 'tr',
+    'colgroup': 'table',
+    'col' : 'colgroup',
+    'tr' : 'tbody',
+    'tbody' : 'table',
+    'tfoot' : 'table',
+    'thead' : 'table',
+    'track' : 'audio',
+  };
+
+  /** @domName Document.createElement */
+  static Element createElement_html(String html) {
+    // TODO(jacobr): this method can be made more robust and performant.
+    // 1) Cache the dummy parent elements required to use innerHTML rather than
+    //    creating them every call.
+    // 2) Verify that the html does not contain leading or trailing text nodes.
+    // 3) Verify that the html does not contain both <head> and <body> tags.
+    // 4) Detatch the created element from its dummy parent.
+    String parentTag = 'div';
+    String tag;
+    final match = _START_TAG_REGEXP.firstMatch(html);
+    if (match != null) {
+      tag = match.group(1).toLowerCase();
+      if (_CUSTOM_PARENT_TAG_MAP.containsKey(tag)) {
+        parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
+      }
+    }
+    final Element temp = new Element.tag(parentTag);
+    temp.innerHTML = html;
+
+    Element element;
+    if (temp.elements.length == 1) {
+      element = temp.elements[0];
+    } else if (parentTag == 'html' && temp.elements.length == 2) {
+      // Work around for edge case in WebKit and possibly other browsers where
+      // both body and head elements are created even though the inner html
+      // only contains a head or body element.
+      element = temp.elements[tag == 'head' ? 0 : 1];
+    } else {
+      throw new ArgumentError('HTML had ${temp.elements.length} '
+          'top level elements but 1 expected');
+    }
+    element.remove();
+    return element;
+  }
+
+  /** @domName Document.createElement */
+  // Optimization to improve performance until the dart2js compiler inlines this
+  // method.
+  static Element createElement_tag(String tag) =>
+      JS('Element', 'document.createElement(#)', tag);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class ElementEvents extends Events {
+  ElementEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get abort => this['abort'];
+
+  EventListenerList get beforeCopy => this['beforecopy'];
+
+  EventListenerList get beforeCut => this['beforecut'];
+
+  EventListenerList get beforePaste => this['beforepaste'];
+
+  EventListenerList get blur => this['blur'];
+
+  EventListenerList get change => this['change'];
+
+  EventListenerList get click => this['click'];
+
+  EventListenerList get contextMenu => this['contextmenu'];
+
+  EventListenerList get copy => this['copy'];
+
+  EventListenerList get cut => this['cut'];
+
+  EventListenerList get doubleClick => this['dblclick'];
+
+  EventListenerList get drag => this['drag'];
+
+  EventListenerList get dragEnd => this['dragend'];
+
+  EventListenerList get dragEnter => this['dragenter'];
+
+  EventListenerList get dragLeave => this['dragleave'];
+
+  EventListenerList get dragOver => this['dragover'];
+
+  EventListenerList get dragStart => this['dragstart'];
+
+  EventListenerList get drop => this['drop'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get focus => this['focus'];
+
+  EventListenerList get input => this['input'];
+
+  EventListenerList get invalid => this['invalid'];
+
+  EventListenerList get keyDown => this['keydown'];
+
+  EventListenerList get keyPress => this['keypress'];
+
+  EventListenerList get keyUp => this['keyup'];
+
+  EventListenerList get load => this['load'];
+
+  EventListenerList get mouseDown => this['mousedown'];
+
+  EventListenerList get mouseMove => this['mousemove'];
+
+  EventListenerList get mouseOut => this['mouseout'];
+
+  EventListenerList get mouseOver => this['mouseover'];
+
+  EventListenerList get mouseUp => this['mouseup'];
+
+  EventListenerList get paste => this['paste'];
+
+  EventListenerList get reset => this['reset'];
+
+  EventListenerList get scroll => this['scroll'];
+
+  EventListenerList get search => this['search'];
+
+  EventListenerList get select => this['select'];
+
+  EventListenerList get selectStart => this['selectstart'];
+
+  EventListenerList get submit => this['submit'];
+
+  EventListenerList get touchCancel => this['touchcancel'];
+
+  EventListenerList get touchEnd => this['touchend'];
+
+  EventListenerList get touchEnter => this['touchenter'];
+
+  EventListenerList get touchLeave => this['touchleave'];
+
+  EventListenerList get touchMove => this['touchmove'];
+
+  EventListenerList get touchStart => this['touchstart'];
+
+  EventListenerList get transitionEnd => this['webkitTransitionEnd'];
+
+  EventListenerList get fullscreenChange => this['webkitfullscreenchange'];
+
+  EventListenerList get fullscreenError => this['webkitfullscreenerror'];
+
+  EventListenerList get mouseWheel {
+    if (JS('bool', '#.onwheel !== undefined', _ptr)) {
+      // W3C spec, and should be IE9+, but IE has a bug exposing onwheel.
+      return this['wheel'];
+    } else if (JS('bool', '#.onmousewheel !== undefined', _ptr)) {
+      // Chrome & IE
+      return this['mousewheel'];
+    } else {
+      // Firefox
+      return this['DOMMouseScroll'];
+    }
+  }
+}
+/// @domName ElementTimeControl
+abstract class ElementTimeControl {
+
+  /** @domName ElementTimeControl.beginElement */
+  void beginElement();
+
+  /** @domName ElementTimeControl.beginElementAt */
+  void beginElementAt(num offset);
+
+  /** @domName ElementTimeControl.endElement */
+  void endElement();
+
+  /** @domName ElementTimeControl.endElementAt */
+  void endElementAt(num offset);
+}
+/// @domName ElementTraversal
+abstract class ElementTraversal {
+
+  int childElementCount;
+
+  Element firstElementChild;
+
+  Element lastElementChild;
+
+  Element nextElementSibling;
+
+  Element previousElementSibling;
+}
+
+/// @domName HTMLEmbedElement
+class EmbedElement extends Element implements Element native "*HTMLEmbedElement" {
+
+  factory EmbedElement() => _Elements.createEmbedElement();
+
+  /** @domName HTMLEmbedElement.align */
+  String align;
+
+  /** @domName HTMLEmbedElement.height */
+  String height;
+
+  /** @domName HTMLEmbedElement.name */
+  String name;
+
+  /** @domName HTMLEmbedElement.src */
+  String src;
+
+  /** @domName HTMLEmbedElement.type */
+  String type;
+
+  /** @domName HTMLEmbedElement.width */
+  String width;
+}
+
+/// @domName EntityReference
+class EntityReference extends Node native "*EntityReference" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void EntriesCallback(List<Entry> entries);
+
+/// @domName Entry
+class Entry native "*Entry" {
+
+  /** @domName Entry.filesystem */
+  final DOMFileSystem filesystem;
+
+  /** @domName Entry.fullPath */
+  final String fullPath;
+
+  /** @domName Entry.isDirectory */
+  final bool isDirectory;
+
+  /** @domName Entry.isFile */
+  final bool isFile;
+
+  /** @domName Entry.name */
+  final String name;
+
+  /** @domName Entry.copyTo */
+  void copyTo(DirectoryEntry parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]) native;
+
+  /** @domName Entry.getMetadata */
+  void getMetadata(MetadataCallback successCallback, [ErrorCallback errorCallback]) native;
+
+  /** @domName Entry.getParent */
+  void getParent([EntryCallback successCallback, ErrorCallback errorCallback]) native;
+
+  /** @domName Entry.moveTo */
+  void moveTo(DirectoryEntry parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]) native;
+
+  /** @domName Entry.remove */
+  void remove(VoidCallback successCallback, [ErrorCallback errorCallback]) native;
+
+  /** @domName Entry.toURL */
+  String toURL() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void EntryCallback(Entry entry);
+
+/// @domName EntrySync
+class EntrySync native "*EntrySync" {
+
+  /** @domName EntrySync.filesystem */
+  final DOMFileSystemSync filesystem;
+
+  /** @domName EntrySync.fullPath */
+  final String fullPath;
+
+  /** @domName EntrySync.isDirectory */
+  final bool isDirectory;
+
+  /** @domName EntrySync.isFile */
+  final bool isFile;
+
+  /** @domName EntrySync.name */
+  final String name;
+
+  /** @domName EntrySync.copyTo */
+  EntrySync copyTo(DirectoryEntrySync parent, String name) native;
+
+  /** @domName EntrySync.getMetadata */
+  Metadata getMetadata() native;
+
+  /** @domName EntrySync.getParent */
+  EntrySync getParent() native;
+
+  /** @domName EntrySync.moveTo */
+  EntrySync moveTo(DirectoryEntrySync parent, String name) native;
+
+  /** @domName EntrySync.remove */
+  void remove() native;
+
+  /** @domName EntrySync.toURL */
+  String toURL() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void ErrorCallback(FileError error);
+
+/// @domName ErrorEvent
+class ErrorEvent extends Event native "*ErrorEvent" {
+
+  /** @domName ErrorEvent.filename */
+  final String filename;
+
+  /** @domName ErrorEvent.lineno */
+  final int lineno;
+
+  /** @domName ErrorEvent.message */
+  final String message;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+class Event native "*Event" {
+  // In JS, canBubble and cancelable are technically required parameters to
+  // init*Event. In practice, though, if they aren't provided they simply
+  // default to false (since that's Boolean(undefined)).
+  //
+  // Contrary to JS, we default canBubble and cancelable to true, since that's
+  // what people want most of the time anyway.
+  factory Event(String type, [bool canBubble = true, bool cancelable = true]) =>
+      _EventFactoryProvider.createEvent(type, canBubble, cancelable);
+
+  static const int AT_TARGET = 2;
+
+  static const int BLUR = 8192;
+
+  static const int BUBBLING_PHASE = 3;
+
+  static const int CAPTURING_PHASE = 1;
+
+  static const int CHANGE = 32768;
+
+  static const int CLICK = 64;
+
+  static const int DBLCLICK = 128;
+
+  static const int DRAGDROP = 2048;
+
+  static const int FOCUS = 4096;
+
+  static const int KEYDOWN = 256;
+
+  static const int KEYPRESS = 1024;
+
+  static const int KEYUP = 512;
+
+  static const int MOUSEDOWN = 1;
+
+  static const int MOUSEDRAG = 32;
+
+  static const int MOUSEMOVE = 16;
+
+  static const int MOUSEOUT = 8;
+
+  static const int MOUSEOVER = 4;
+
+  static const int MOUSEUP = 2;
+
+  static const int NONE = 0;
+
+  static const int SELECT = 16384;
+
+  /** @domName Event.bubbles */
+  final bool bubbles;
+
+  /** @domName Event.cancelBubble */
+  bool cancelBubble;
+
+  /** @domName Event.cancelable */
+  final bool cancelable;
+
+  /** @domName Event.clipboardData */
+  final Clipboard clipboardData;
+
+  /** @domName Event.currentTarget */
+  EventTarget get currentTarget => _convertNativeToDart_EventTarget(this._currentTarget);
+  EventTarget get _currentTarget => JS("EventTarget", "#.currentTarget", this);
+
+  /** @domName Event.defaultPrevented */
+  final bool defaultPrevented;
+
+  /** @domName Event.eventPhase */
+  final int eventPhase;
+
+  /** @domName Event.returnValue */
+  bool returnValue;
+
+  /** @domName Event.srcElement */
+  EventTarget get srcElement => _convertNativeToDart_EventTarget(this._srcElement);
+  EventTarget get _srcElement => JS("EventTarget", "#.srcElement", this);
+
+  /** @domName Event.target */
+  EventTarget get target => _convertNativeToDart_EventTarget(this._target);
+  EventTarget get _target => JS("EventTarget", "#.target", this);
+
+  /** @domName Event.timeStamp */
+  final int timeStamp;
+
+  /** @domName Event.type */
+  final String type;
+
+  /** @domName Event.initEvent */
+  void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native "initEvent";
+
+  /** @domName Event.preventDefault */
+  void preventDefault() native;
+
+  /** @domName Event.stopImmediatePropagation */
+  void stopImmediatePropagation() native;
+
+  /** @domName Event.stopPropagation */
+  void stopPropagation() native;
+
+}
+
+/// @domName EventException
+class EventException native "*EventException" {
+
+  static const int DISPATCH_REQUEST_ERR = 1;
+
+  static const int UNSPECIFIED_EVENT_TYPE_ERR = 0;
+
+  /** @domName EventException.code */
+  final int code;
+
+  /** @domName EventException.message */
+  final String message;
+
+  /** @domName EventException.name */
+  final String name;
+
+  /** @domName EventException.toString */
+  String toString() native;
+}
+
+/// @domName EventSource
+class EventSource extends EventTarget native "*EventSource" {
+
+  factory EventSource(String scriptUrl) => _EventSourceFactoryProvider.createEventSource(scriptUrl);
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  EventSourceEvents get on =>
+    new EventSourceEvents(this);
+
+  static const int CLOSED = 2;
+
+  static const int CONNECTING = 0;
+
+  static const int OPEN = 1;
+
+  /** @domName EventSource.URL */
+  final String URL;
+
+  /** @domName EventSource.readyState */
+  final int readyState;
+
+  /** @domName EventSource.url */
+  final String url;
+
+  /** @domName EventSource.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName EventSource.close */
+  void close() native;
+
+  /** @domName EventSource.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName EventSource.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+class EventSourceEvents extends Events {
+  EventSourceEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get message => this['message'];
+
+  EventListenerList get open => this['open'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Events {
+  /* Raw event target. */
+  final EventTarget _ptr;
+
+  Events(this._ptr);
+
+  EventListenerList operator [](String type) {
+    return new EventListenerList(_ptr, type);
+  }
+}
+
+class EventListenerList {
+
+  final EventTarget _ptr;
+  final String _type;
+
+  EventListenerList(this._ptr, this._type);
+
+  // TODO(jacobr): implement equals.
+
+  EventListenerList add(EventListener listener,
+      [bool useCapture = false]) {
+    _add(listener, useCapture);
+    return this;
+  }
+
+  EventListenerList remove(EventListener listener,
+      [bool useCapture = false]) {
+    _remove(listener, useCapture);
+    return this;
+  }
+
+  bool dispatch(Event evt) {
+    return _ptr.$dom_dispatchEvent(evt);
+  }
+
+  void _add(EventListener listener, bool useCapture) {
+    _ptr.$dom_addEventListener(_type, listener, useCapture);
+  }
+
+  void _remove(EventListener listener, bool useCapture) {
+    _ptr.$dom_removeEventListener(_type, listener, useCapture);
+  }
+}
+
+
+class EventTarget native "*EventTarget" {
+
+  /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
+  Events get on => new Events(this);
+
+  /** @domName EventTarget.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName EventTarget.dispatchEvent */
+  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+
+  /** @domName EventTarget.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+}
+
+/// @domName HTMLFieldSetElement
+class FieldSetElement extends Element implements Element native "*HTMLFieldSetElement" {
+
+  factory FieldSetElement() => _Elements.createFieldSetElement();
+
+  /** @domName HTMLFieldSetElement.disabled */
+  bool disabled;
+
+  /** @domName HTMLFieldSetElement.elements */
+  final HTMLCollection elements;
+
+  /** @domName HTMLFieldSetElement.form */
+  final FormElement form;
+
+  /** @domName HTMLFieldSetElement.name */
+  String name;
+
+  /** @domName HTMLFieldSetElement.type */
+  final String type;
+
+  /** @domName HTMLFieldSetElement.validationMessage */
+  final String validationMessage;
+
+  /** @domName HTMLFieldSetElement.validity */
+  final ValidityState validity;
+
+  /** @domName HTMLFieldSetElement.willValidate */
+  final bool willValidate;
+
+  /** @domName HTMLFieldSetElement.checkValidity */
+  bool checkValidity() native;
+
+  /** @domName HTMLFieldSetElement.setCustomValidity */
+  void setCustomValidity(String error) native;
+}
+
+/// @domName File
+class File extends Blob native "*File" {
+
+  /** @domName File.lastModifiedDate */
+  final Date lastModifiedDate;
+
+  /** @domName File.name */
+  final String name;
+
+  /** @domName File.webkitRelativePath */
+  final String webkitRelativePath;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void FileCallback(File file);
+
+/// @domName FileEntry
+class FileEntry extends Entry native "*FileEntry" {
+
+  /** @domName FileEntry.createWriter */
+  void createWriter(FileWriterCallback successCallback, [ErrorCallback errorCallback]) native;
+
+  /** @domName FileEntry.file */
+  void file(FileCallback successCallback, [ErrorCallback errorCallback]) native;
+}
+
+/// @domName FileEntrySync
+class FileEntrySync extends EntrySync native "*FileEntrySync" {
+
+  /** @domName FileEntrySync.createWriter */
+  FileWriterSync createWriter() native;
+
+  /** @domName FileEntrySync.file */
+  File file() native;
+}
+
+/// @domName FileError
+class FileError native "*FileError" {
+
+  static const int ABORT_ERR = 3;
+
+  static const int ENCODING_ERR = 5;
+
+  static const int INVALID_MODIFICATION_ERR = 9;
+
+  static const int INVALID_STATE_ERR = 7;
+
+  static const int NOT_FOUND_ERR = 1;
+
+  static const int NOT_READABLE_ERR = 4;
+
+  static const int NO_MODIFICATION_ALLOWED_ERR = 6;
+
+  static const int PATH_EXISTS_ERR = 12;
+
+  static const int QUOTA_EXCEEDED_ERR = 10;
+
+  static const int SECURITY_ERR = 2;
+
+  static const int SYNTAX_ERR = 8;
+
+  static const int TYPE_MISMATCH_ERR = 11;
+
+  /** @domName FileError.code */
+  final int code;
+}
+
+/// @domName FileException
+class FileException native "*FileException" {
+
+  static const int ABORT_ERR = 3;
+
+  static const int ENCODING_ERR = 5;
+
+  static const int INVALID_MODIFICATION_ERR = 9;
+
+  static const int INVALID_STATE_ERR = 7;
+
+  static const int NOT_FOUND_ERR = 1;
+
+  static const int NOT_READABLE_ERR = 4;
+
+  static const int NO_MODIFICATION_ALLOWED_ERR = 6;
+
+  static const int PATH_EXISTS_ERR = 12;
+
+  static const int QUOTA_EXCEEDED_ERR = 10;
+
+  static const int SECURITY_ERR = 2;
+
+  static const int SYNTAX_ERR = 8;
+
+  static const int TYPE_MISMATCH_ERR = 11;
+
+  /** @domName FileException.code */
+  final int code;
+
+  /** @domName FileException.message */
+  final String message;
+
+  /** @domName FileException.name */
+  final String name;
+
+  /** @domName FileException.toString */
+  String toString() native;
+}
+
+/// @domName FileReader
+class FileReader extends EventTarget native "*FileReader" {
+
+  factory FileReader() => _FileReaderFactoryProvider.createFileReader();
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  FileReaderEvents get on =>
+    new FileReaderEvents(this);
+
+  static const int DONE = 2;
+
+  static const int EMPTY = 0;
+
+  static const int LOADING = 1;
+
+  /** @domName FileReader.error */
+  final FileError error;
+
+  /** @domName FileReader.readyState */
+  final int readyState;
+
+  /** @domName FileReader.result */
+  final Object result;
+
+  /** @domName FileReader.abort */
+  void abort() native;
+
+  /** @domName FileReader.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName FileReader.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName FileReader.readAsArrayBuffer */
+  void readAsArrayBuffer(Blob blob) native;
+
+  /** @domName FileReader.readAsBinaryString */
+  void readAsBinaryString(Blob blob) native;
+
+  /** @domName FileReader.readAsDataURL */
+  void readAsDataURL(Blob blob) native;
+
+  /** @domName FileReader.readAsText */
+  void readAsText(Blob blob, [String encoding]) native;
+
+  /** @domName FileReader.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+class FileReaderEvents extends Events {
+  FileReaderEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get abort => this['abort'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get load => this['load'];
+
+  EventListenerList get loadEnd => this['loadend'];
+
+  EventListenerList get loadStart => this['loadstart'];
+
+  EventListenerList get progress => this['progress'];
+}
+
+/// @domName FileReaderSync
+class FileReaderSync native "*FileReaderSync" {
+
+  factory FileReaderSync() => _FileReaderSyncFactoryProvider.createFileReaderSync();
+
+  /** @domName FileReaderSync.readAsArrayBuffer */
+  ArrayBuffer readAsArrayBuffer(Blob blob) native;
+
+  /** @domName FileReaderSync.readAsBinaryString */
+  String readAsBinaryString(Blob blob) native;
+
+  /** @domName FileReaderSync.readAsDataURL */
+  String readAsDataURL(Blob blob) native;
+
+  /** @domName FileReaderSync.readAsText */
+  String readAsText(Blob blob, [String encoding]) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void FileSystemCallback(DOMFileSystem fileSystem);
+
+/// @domName FileWriter
+class FileWriter extends EventTarget native "*FileWriter" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  FileWriterEvents get on =>
+    new FileWriterEvents(this);
+
+  static const int DONE = 2;
+
+  static const int INIT = 0;
+
+  static const int WRITING = 1;
+
+  /** @domName FileWriter.error */
+  final FileError error;
+
+  /** @domName FileWriter.length */
+  final int length;
+
+  /** @domName FileWriter.position */
+  final int position;
+
+  /** @domName FileWriter.readyState */
+  final int readyState;
+
+  /** @domName FileWriter.abort */
+  void abort() native;
+
+  /** @domName FileWriter.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName FileWriter.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName FileWriter.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName FileWriter.seek */
+  void seek(int position) native;
+
+  /** @domName FileWriter.truncate */
+  void truncate(int size) native;
+
+  /** @domName FileWriter.write */
+  void write(Blob data) native;
+}
+
+class FileWriterEvents extends Events {
+  FileWriterEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get abort => this['abort'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get progress => this['progress'];
+
+  EventListenerList get write => this['write'];
+
+  EventListenerList get writeEnd => this['writeend'];
+
+  EventListenerList get writeStart => this['writestart'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void FileWriterCallback(FileWriter fileWriter);
+
+/// @domName FileWriterSync
+class FileWriterSync native "*FileWriterSync" {
+
+  /** @domName FileWriterSync.length */
+  final int length;
+
+  /** @domName FileWriterSync.position */
+  final int position;
+
+  /** @domName FileWriterSync.seek */
+  void seek(int position) native;
+
+  /** @domName FileWriterSync.truncate */
+  void truncate(int size) native;
+
+  /** @domName FileWriterSync.write */
+  void write(Blob data) native;
+}
+
+/// @domName Float32Array
+class Float32Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<num> native "*Float32Array" {
+
+  factory Float32Array(int length) =>
+    _TypedArrayFactoryProvider.createFloat32Array(length);
+
+  factory Float32Array.fromList(List<num> list) =>
+    _TypedArrayFactoryProvider.createFloat32Array_fromList(list);
+
+  factory Float32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
+    _TypedArrayFactoryProvider.createFloat32Array_fromBuffer(buffer, byteOffset, length);
+
+  static const int BYTES_PER_ELEMENT = 4;
+
+  /** @domName Float32Array.length */
+  final int length;
+
+  num operator[](int index) => JS("num", "#[#]", this, index);
+
+  void operator[]=(int index, num value) => JS("void", "#[#] = #", this, index, value);
+  // -- start List<num> mixins.
+  // num is the element type.
+
+  // From Iterable<num>:
+
+  Iterator<num> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<num>(this);
+  }
+
+  // From Collection<num>:
+
+  void add(num value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(num value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<num> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(num element) => _Collections.contains(this, element);
+
+  void forEach(void f(num element)) => _Collections.forEach(this, f);
+
+  Collection map(f(num element)) => _Collections.map(this, [], f);
+
+  Collection<num> filter(bool f(num element)) =>
+     _Collections.filter(this, <num>[], f);
+
+  bool every(bool f(num element)) => _Collections.every(this, f);
+
+  bool some(bool f(num element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<num>:
+
+  void sort([Comparator<num> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(num element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(num element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  num get last => this[length - 1];
+
+  num removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [num initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<num> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <num>[]);
+
+  // -- end List<num> mixins.
+
+  /** @domName Float32Array.setElements */
+  void setElements(Object array, [int offset]) native "set";
+
+  /** @domName Float32Array.subarray */
+  Float32Array subarray(int start, [int end]) native;
+}
+
+/// @domName Float64Array
+class Float64Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<num> native "*Float64Array" {
+
+  factory Float64Array(int length) =>
+    _TypedArrayFactoryProvider.createFloat64Array(length);
+
+  factory Float64Array.fromList(List<num> list) =>
+    _TypedArrayFactoryProvider.createFloat64Array_fromList(list);
+
+  factory Float64Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
+    _TypedArrayFactoryProvider.createFloat64Array_fromBuffer(buffer, byteOffset, length);
+
+  static const int BYTES_PER_ELEMENT = 8;
+
+  /** @domName Float64Array.length */
+  final int length;
+
+  num operator[](int index) => JS("num", "#[#]", this, index);
+
+  void operator[]=(int index, num value) => JS("void", "#[#] = #", this, index, value);
+  // -- start List<num> mixins.
+  // num is the element type.
+
+  // From Iterable<num>:
+
+  Iterator<num> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<num>(this);
+  }
+
+  // From Collection<num>:
+
+  void add(num value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(num value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<num> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(num element) => _Collections.contains(this, element);
+
+  void forEach(void f(num element)) => _Collections.forEach(this, f);
+
+  Collection map(f(num element)) => _Collections.map(this, [], f);
+
+  Collection<num> filter(bool f(num element)) =>
+     _Collections.filter(this, <num>[], f);
+
+  bool every(bool f(num element)) => _Collections.every(this, f);
+
+  bool some(bool f(num element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<num>:
+
+  void sort([Comparator<num> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(num element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(num element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  num get last => this[length - 1];
+
+  num removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [num initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<num> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <num>[]);
+
+  // -- end List<num> mixins.
+
+  /** @domName Float64Array.setElements */
+  void setElements(Object array, [int offset]) native "set";
+
+  /** @domName Float64Array.subarray */
+  Float64Array subarray(int start, [int end]) native;
+}
+
+/// @domName HTMLFontElement
+class FontElement extends Element implements Element native "*HTMLFontElement" {
+
+  /** @domName HTMLFontElement.color */
+  String color;
+
+  /** @domName HTMLFontElement.face */
+  String face;
+
+  /** @domName HTMLFontElement.size */
+  String size;
+}
+
+/// @domName FormData
+class FormData native "*FormData" {
+
+  factory FormData([FormElement form]) {
+    if (!?form) {
+      return _FormDataFactoryProvider.createFormData();
+    }
+    return _FormDataFactoryProvider.createFormData(form);
+  }
+
+  /** @domName FormData.append */
+  void append(String name, String value, String filename) native;
+}
+
+/// @domName HTMLFormElement
+class FormElement extends Element implements Element native "*HTMLFormElement" {
+
+  factory FormElement() => _Elements.createFormElement();
+
+  /** @domName HTMLFormElement.acceptCharset */
+  String acceptCharset;
+
+  /** @domName HTMLFormElement.action */
+  String action;
+
+  /** @domName HTMLFormElement.autocomplete */
+  String autocomplete;
+
+  /** @domName HTMLFormElement.encoding */
+  String encoding;
+
+  /** @domName HTMLFormElement.enctype */
+  String enctype;
+
+  /** @domName HTMLFormElement.length */
+  final int length;
+
+  /** @domName HTMLFormElement.method */
+  String method;
+
+  /** @domName HTMLFormElement.name */
+  String name;
+
+  /** @domName HTMLFormElement.noValidate */
+  bool noValidate;
+
+  /** @domName HTMLFormElement.target */
+  String target;
+
+  /** @domName HTMLFormElement.checkValidity */
+  bool checkValidity() native;
+
+  /** @domName HTMLFormElement.reset */
+  void reset() native;
+
+  /** @domName HTMLFormElement.submit */
+  void submit() native;
+}
+
+/// @domName HTMLFrameElement
+class FrameElement extends Element implements Element native "*HTMLFrameElement" {
+
+  /** @domName HTMLFrameElement.contentWindow */
+  Window get contentWindow => _convertNativeToDart_Window(this._contentWindow);
+  Window get _contentWindow => JS("Window", "#.contentWindow", this);
+
+  /** @domName HTMLFrameElement.frameBorder */
+  String frameBorder;
+
+  /** @domName HTMLFrameElement.height */
+  final int height;
+
+  /** @domName HTMLFrameElement.location */
+  String location;
+
+  /** @domName HTMLFrameElement.longDesc */
+  String longDesc;
+
+  /** @domName HTMLFrameElement.marginHeight */
+  String marginHeight;
+
+  /** @domName HTMLFrameElement.marginWidth */
+  String marginWidth;
+
+  /** @domName HTMLFrameElement.name */
+  String name;
+
+  /** @domName HTMLFrameElement.noResize */
+  bool noResize;
+
+  /** @domName HTMLFrameElement.scrolling */
+  String scrolling;
+
+  /** @domName HTMLFrameElement.src */
+  String src;
+
+  /** @domName HTMLFrameElement.width */
+  final int width;
+}
+
+/// @domName HTMLFrameSetElement
+class FrameSetElement extends Element implements Element native "*HTMLFrameSetElement" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  FrameSetElementEvents get on =>
+    new FrameSetElementEvents(this);
+
+  /** @domName HTMLFrameSetElement.cols */
+  String cols;
+
+  /** @domName HTMLFrameSetElement.rows */
+  String rows;
+}
+
+class FrameSetElementEvents extends ElementEvents {
+  FrameSetElementEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get beforeUnload => this['beforeunload'];
+
+  EventListenerList get blur => this['blur'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get focus => this['focus'];
+
+  EventListenerList get hashChange => this['hashchange'];
+
+  EventListenerList get load => this['load'];
+
+  EventListenerList get message => this['message'];
+
+  EventListenerList get offline => this['offline'];
+
+  EventListenerList get online => this['online'];
+
+  EventListenerList get popState => this['popstate'];
+
+  EventListenerList get resize => this['resize'];
+
+  EventListenerList get storage => this['storage'];
+
+  EventListenerList get unload => this['unload'];
+}
+
+/// @domName GainNode
+class GainNode extends AudioNode native "*GainNode" {
+
+  /** @domName GainNode.gain */
+  final AudioGain gain;
+}
+
+/// @domName Gamepad
+class Gamepad native "*Gamepad" {
+
+  /** @domName Gamepad.axes */
+  final List<num> axes;
+
+  /** @domName Gamepad.buttons */
+  final List<num> buttons;
+
+  /** @domName Gamepad.id */
+  final String id;
+
+  /** @domName Gamepad.index */
+  final int index;
+
+  /** @domName Gamepad.timestamp */
+  final int timestamp;
+}
+
+/// @domName Geolocation
+class Geolocation native "*Geolocation" {
+
+  /** @domName Geolocation.clearWatch */
+  void clearWatch(int watchId) native;
+
+  /** @domName Geolocation.getCurrentPosition */
+  void getCurrentPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native;
+
+  /** @domName Geolocation.watchPosition */
+  int watchPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native;
+}
+
+/// @domName Geoposition
+class Geoposition native "*Geoposition" {
+
+  /** @domName Geoposition.coords */
+  final Coordinates coords;
+
+  /** @domName Geoposition.timestamp */
+  final int timestamp;
+}
+
+/// @domName HTMLHRElement
+class HRElement extends Element implements Element native "*HTMLHRElement" {
+
+  factory HRElement() => _Elements.createHRElement();
+
+  /** @domName HTMLHRElement.align */
+  String align;
+
+  /** @domName HTMLHRElement.noShade */
+  bool noShade;
+
+  /** @domName HTMLHRElement.size */
+  String size;
+
+  /** @domName HTMLHRElement.width */
+  String width;
+}
+
+/// @domName HTMLAllCollection
+class HTMLAllCollection implements JavaScriptIndexingBehavior, List<Node> native "*HTMLAllCollection" {
+
+  /** @domName HTMLAllCollection.length */
+  final int length;
+
+  Node operator[](int index) => JS("Node", "#[#]", this, index);
+
+  void operator[]=(int index, Node value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<Node> mixins.
+  // Node is the element type.
+
+  // From Iterable<Node>:
+
+  Iterator<Node> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<Node>(this);
+  }
+
+  // From Collection<Node>:
+
+  void add(Node value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(Node value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<Node> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(Node element) => _Collections.contains(this, element);
+
+  void forEach(void f(Node element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Node element)) => _Collections.map(this, [], f);
+
+  Collection<Node> filter(bool f(Node element)) =>
+     _Collections.filter(this, <Node>[], f);
+
+  bool every(bool f(Node element)) => _Collections.every(this, f);
+
+  bool some(bool f(Node element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Node>:
+
+  void sort([Comparator<Node> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Node element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Node element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  Node get last => this[length - 1];
+
+  Node removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [Node initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<Node> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Node>[]);
+
+  // -- end List<Node> mixins.
+
+  /** @domName HTMLAllCollection.item */
+  Node item(int index) native;
+
+  /** @domName HTMLAllCollection.namedItem */
+  Node namedItem(String name) native;
+
+  /** @domName HTMLAllCollection.tags */
+  List<Node> tags(String name) native;
+}
+
+/// @domName HTMLCollection
+class HTMLCollection implements JavaScriptIndexingBehavior, List<Node> native "*HTMLCollection" {
+
+  /** @domName HTMLCollection.length */
+  final int length;
+
+  Node operator[](int index) => JS("Node", "#[#]", this, index);
+
+  void operator[]=(int index, Node value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<Node> mixins.
+  // Node is the element type.
+
+  // From Iterable<Node>:
+
+  Iterator<Node> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<Node>(this);
+  }
+
+  // From Collection<Node>:
+
+  void add(Node value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(Node value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<Node> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(Node element) => _Collections.contains(this, element);
+
+  void forEach(void f(Node element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Node element)) => _Collections.map(this, [], f);
+
+  Collection<Node> filter(bool f(Node element)) =>
+     _Collections.filter(this, <Node>[], f);
+
+  bool every(bool f(Node element)) => _Collections.every(this, f);
+
+  bool some(bool f(Node element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Node>:
+
+  void sort([Comparator<Node> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Node element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Node element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  Node get last => this[length - 1];
+
+  Node removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [Node initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<Node> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Node>[]);
+
+  // -- end List<Node> mixins.
+
+  /** @domName HTMLCollection.item */
+  Node item(int index) native;
+
+  /** @domName HTMLCollection.namedItem */
+  Node namedItem(String name) native;
+}
+
+/// @domName HTMLOptionsCollection
+class HTMLOptionsCollection extends HTMLCollection native "*HTMLOptionsCollection" {
+
+  // Shadowing definition.
+  /** @domName HTMLOptionsCollection.length */
+  int get length => JS("int", "#.length", this);
+
+  /** @domName HTMLOptionsCollection.length */
+  void set length(int value) {
+    JS("void", "#.length = #", this, value);
+  }
+
+  /** @domName HTMLOptionsCollection.selectedIndex */
+  int selectedIndex;
+
+  /** @domName HTMLOptionsCollection.remove */
+  void remove(int index) native;
+}
+
+/// @domName HashChangeEvent
+class HashChangeEvent extends Event native "*HashChangeEvent" {
+
+  /** @domName HashChangeEvent.newURL */
+  final String newURL;
+
+  /** @domName HashChangeEvent.oldURL */
+  final String oldURL;
+
+  /** @domName HashChangeEvent.initHashChangeEvent */
+  void initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) native;
+}
+
+/// @domName HTMLHeadElement
+class HeadElement extends Element implements Element native "*HTMLHeadElement" {
+
+  factory HeadElement() => _Elements.createHeadElement();
+
+  /** @domName HTMLHeadElement.profile */
+  String profile;
+}
+
+/// @domName HTMLHeadingElement
+class HeadingElement extends Element implements Element native "*HTMLHeadingElement" {
+
+  factory HeadingElement.h1() => _Elements.createHeadingElement_h1();
+
+  factory HeadingElement.h2() => _Elements.createHeadingElement_h2();
+
+  factory HeadingElement.h3() => _Elements.createHeadingElement_h3();
+
+  factory HeadingElement.h4() => _Elements.createHeadingElement_h4();
+
+  factory HeadingElement.h5() => _Elements.createHeadingElement_h5();
+
+  factory HeadingElement.h6() => _Elements.createHeadingElement_h6();
+
+  /** @domName HTMLHeadingElement.align */
+  String align;
+}
+
+/// @domName HTMLHtmlElement
+class HtmlElement extends Element implements Element native "*HTMLHtmlElement" {
+
+  factory HtmlElement() => _Elements.createHtmlElement();
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class HttpRequest extends EventTarget native "*XMLHttpRequest" {
+  factory HttpRequest.get(String url, onSuccess(HttpRequest request)) =>
+      _HttpRequestFactoryProvider.createHttpRequest_get(url, onSuccess);
+
+  factory HttpRequest.getWithCredentials(String url, onSuccess(HttpRequest request)) =>
+      _HttpRequestFactoryProvider.createHttpRequestgetWithCredentials(url, onSuccess);
+
+
+  factory HttpRequest() => _HttpRequestFactoryProvider.createHttpRequest();
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  HttpRequestEvents get on =>
+    new HttpRequestEvents(this);
+
+  static const int DONE = 4;
+
+  static const int HEADERS_RECEIVED = 2;
+
+  static const int LOADING = 3;
+
+  static const int OPENED = 1;
+
+  static const int UNSENT = 0;
+
+  /** @domName XMLHttpRequest.readyState */
+  final int readyState;
+
+  /** @domName XMLHttpRequest.response */
+  final Object response;
+
+  /** @domName XMLHttpRequest.responseText */
+  final String responseText;
+
+  /** @domName XMLHttpRequest.responseType */
+  String responseType;
+
+  /** @domName XMLHttpRequest.responseXML */
+  final Document responseXML;
+
+  /** @domName XMLHttpRequest.status */
+  final int status;
+
+  /** @domName XMLHttpRequest.statusText */
+  final String statusText;
+
+  /** @domName XMLHttpRequest.upload */
+  final HttpRequestUpload upload;
+
+  /** @domName XMLHttpRequest.withCredentials */
+  bool withCredentials;
+
+  /** @domName XMLHttpRequest.abort */
+  void abort() native;
+
+  /** @domName XMLHttpRequest.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName XMLHttpRequest.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName XMLHttpRequest.getAllResponseHeaders */
+  String getAllResponseHeaders() native;
+
+  /** @domName XMLHttpRequest.getResponseHeader */
+  String getResponseHeader(String header) native;
+
+  /** @domName XMLHttpRequest.open */
+  void open(String method, String url, [bool async, String user, String password]) native;
+
+  /** @domName XMLHttpRequest.overrideMimeType */
+  void overrideMimeType(String override) native;
+
+  /** @domName XMLHttpRequest.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName XMLHttpRequest.send */
+  void send([data]) native;
+
+  /** @domName XMLHttpRequest.setRequestHeader */
+  void setRequestHeader(String header, String value) native;
+
+}
+
+class HttpRequestEvents extends Events {
+  HttpRequestEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get abort => this['abort'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get load => this['load'];
+
+  EventListenerList get loadEnd => this['loadend'];
+
+  EventListenerList get loadStart => this['loadstart'];
+
+  EventListenerList get progress => this['progress'];
+
+  EventListenerList get readyStateChange => this['readystatechange'];
+}
+
+/// @domName XMLHttpRequestException
+class HttpRequestException native "*XMLHttpRequestException" {
+
+  static const int ABORT_ERR = 102;
+
+  static const int NETWORK_ERR = 101;
+
+  /** @domName XMLHttpRequestException.code */
+  final int code;
+
+  /** @domName XMLHttpRequestException.message */
+  final String message;
+
+  /** @domName XMLHttpRequestException.name */
+  final String name;
+
+  /** @domName XMLHttpRequestException.toString */
+  String toString() native;
+}
+
+/// @domName XMLHttpRequestProgressEvent
+class HttpRequestProgressEvent extends ProgressEvent native "*XMLHttpRequestProgressEvent" {
+
+  /** @domName XMLHttpRequestProgressEvent.position */
+  final int position;
+
+  /** @domName XMLHttpRequestProgressEvent.totalSize */
+  final int totalSize;
+}
+
+/// @domName XMLHttpRequestUpload
+class HttpRequestUpload extends EventTarget native "*XMLHttpRequestUpload" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  HttpRequestUploadEvents get on =>
+    new HttpRequestUploadEvents(this);
+
+  /** @domName XMLHttpRequestUpload.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName XMLHttpRequestUpload.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName XMLHttpRequestUpload.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+class HttpRequestUploadEvents extends Events {
+  HttpRequestUploadEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get abort => this['abort'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get load => this['load'];
+
+  EventListenerList get loadEnd => this['loadend'];
+
+  EventListenerList get loadStart => this['loadstart'];
+
+  EventListenerList get progress => this['progress'];
+}
+
+/// @domName IDBAny
+class IDBAny native "*IDBAny" {
+}
+
+/// @domName IDBCursor
+class IDBCursor native "*IDBCursor" {
+
+  static const int NEXT = 0;
+
+  static const int NEXT_NO_DUPLICATE = 1;
+
+  static const int PREV = 2;
+
+  static const int PREV_NO_DUPLICATE = 3;
+
+  /** @domName IDBCursor.direction */
+  final String direction;
+
+  /** @domName IDBCursor.key */
+  final Object key;
+
+  /** @domName IDBCursor.primaryKey */
+  final Object primaryKey;
+
+  /** @domName IDBCursor.source */
+  final dynamic source;
+
+  /** @domName IDBCursor.advance */
+  void advance(int count) native;
+
+  /** @domName IDBCursor.continueFunction */
+  void continueFunction([key]) {
+    if (?key) {
+      var key_1 = _convertDartToNative_IDBKey(key);
+      _continueFunction_1(key_1);
+      return;
+    }
+    _continueFunction_2();
+    return;
+  }
+  void _continueFunction_1(key) native "continue";
+  void _continueFunction_2() native "continue";
+
+  /** @domName IDBCursor.delete */
+  IDBRequest delete() native;
+
+  /** @domName IDBCursor.update */
+  IDBRequest update(/*any*/ value) {
+    var value_1 = _convertDartToNative_SerializedScriptValue(value);
+    return _update_1(value_1);
+  }
+  IDBRequest _update_1(value) native "update";
+}
+
+/// @domName IDBCursorWithValue
+class IDBCursorWithValue extends IDBCursor native "*IDBCursorWithValue" {
+
+  /** @domName IDBCursorWithValue.value */
+  final Object value;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class IDBDatabase extends EventTarget native "*IDBDatabase" {
+
+  IDBTransaction transaction(storeName_OR_storeNames, String mode) {
+    if (mode != 'readonly' && mode != 'readwrite') {
+      throw new ArgumentError(mode);
+    }
+
+    // TODO(sra): Ensure storeName_OR_storeNames is a string or List<String>,
+    // and copy to JavaScript array if necessary.
+
+    if (_transaction_fn != null) {
+      return _transaction_fn(this, storeName_OR_storeNames, mode);
+    }
+
+    // Try and create a transaction with a string mode.  Browsers that expect a
+    // numeric mode tend to convert the string into a number.  This fails
+    // silently, resulting in zero ('readonly').
+    var txn = _transaction(storeName_OR_storeNames, mode);
+    if (_hasNumericMode(txn)) {
+      _transaction_fn = _transaction_numeric_mode;
+      txn = _transaction_fn(this, storeName_OR_storeNames, mode);
+    } else {
+      _transaction_fn = _transaction_string_mode;
+    }
+    return txn;
+  }
+
+  static IDBTransaction _transaction_string_mode(IDBDatabase db, stores, mode) {
+    return db._transaction(stores, mode);
+  }
+
+  static IDBTransaction _transaction_numeric_mode(IDBDatabase db, stores, mode) {
+    int intMode;
+    if (mode == 'readonly') intMode = IDBTransaction.READ_ONLY;
+    if (mode == 'readwrite') intMode = IDBTransaction.READ_WRITE;
+    return db._transaction(stores, intMode);
+  }
+
+  IDBTransaction _transaction(stores, mode) native 'transaction';
+
+  static bool _hasNumericMode(txn) =>
+      JS('bool', 'typeof(#.mode) === "number"', txn);
+
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  IDBDatabaseEvents get on =>
+    new IDBDatabaseEvents(this);
+
+  /** @domName IDBDatabase.name */
+  final String name;
+
+  /** @domName IDBDatabase.objectStoreNames */
+  final List<String> objectStoreNames;
+
+  /** @domName IDBDatabase.version */
+  final dynamic version;
+
+  /** @domName IDBDatabase.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName IDBDatabase.close */
+  void close() native;
+
+  /** @domName IDBDatabase.createObjectStore */
+  IDBObjectStore createObjectStore(String name, [options]) {
+    if (?options) {
+      var options_1 = _convertDartToNative_Dictionary(options);
+      return _createObjectStore_1(name, options_1);
+    }
+    return _createObjectStore_2(name);
+  }
+  IDBObjectStore _createObjectStore_1(name, options) native "createObjectStore";
+  IDBObjectStore _createObjectStore_2(name) native "createObjectStore";
+
+  /** @domName IDBDatabase.deleteObjectStore */
+  void deleteObjectStore(String name) native;
+
+  /** @domName IDBDatabase.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName IDBDatabase.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName IDBDatabase.setVersion */
+  IDBVersionChangeRequest setVersion(String version) native;
+}
+
+// TODO(sra): This should be a static member of IDBTransaction but dart2js
+// can't handle that.  Move it back after dart2js is completely done.
+var _transaction_fn;  // Assigned one of the static methods.
+
+class IDBDatabaseEvents extends Events {
+  IDBDatabaseEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get abort => this['abort'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get versionChange => this['versionchange'];
+}
+
+/// @domName IDBDatabaseException
+class IDBDatabaseException native "*IDBDatabaseException" {
+
+  static const int ABORT_ERR = 20;
+
+  static const int CONSTRAINT_ERR = 4;
+
+  static const int DATA_ERR = 5;
+
+  static const int NON_TRANSIENT_ERR = 2;
+
+  static const int NOT_ALLOWED_ERR = 6;
+
+  static const int NOT_FOUND_ERR = 8;
+
+  static const int NO_ERR = 0;
+
+  static const int QUOTA_ERR = 22;
+
+  static const int READ_ONLY_ERR = 9;
+
+  static const int TIMEOUT_ERR = 23;
+
+  static const int TRANSACTION_INACTIVE_ERR = 7;
+
+  static const int UNKNOWN_ERR = 1;
+
+  static const int VER_ERR = 12;
+
+  /** @domName IDBDatabaseException.code */
+  final int code;
+
+  /** @domName IDBDatabaseException.message */
+  final String message;
+
+  /** @domName IDBDatabaseException.name */
+  final String name;
+
+  /** @domName IDBDatabaseException.toString */
+  String toString() native;
+}
+
+/// @domName IDBFactory
+class IDBFactory native "*IDBFactory" {
+
+  /** @domName IDBFactory.cmp */
+  int cmp(/*IDBKey*/ first, /*IDBKey*/ second) {
+    var first_1 = _convertDartToNative_IDBKey(first);
+    var second_2 = _convertDartToNative_IDBKey(second);
+    return _cmp_1(first_1, second_2);
+  }
+  int _cmp_1(first, second) native "cmp";
+
+  /** @domName IDBFactory.deleteDatabase */
+  IDBVersionChangeRequest deleteDatabase(String name) native;
+
+  /** @domName IDBFactory.open */
+  IDBOpenDBRequest open(String name, [int version]) native;
+
+  /** @domName IDBFactory.webkitGetDatabaseNames */
+  IDBRequest webkitGetDatabaseNames() native;
+}
+
+/// @domName IDBIndex
+class IDBIndex native "*IDBIndex" {
+
+  /** @domName IDBIndex.keyPath */
+  final dynamic keyPath;
+
+  /** @domName IDBIndex.multiEntry */
+  final bool multiEntry;
+
+  /** @domName IDBIndex.name */
+  final String name;
+
+  /** @domName IDBIndex.objectStore */
+  final IDBObjectStore objectStore;
+
+  /** @domName IDBIndex.unique */
+  final bool unique;
+
+  /** @domName IDBIndex.count */
+  IDBRequest count([key_OR_range]) {
+    if (!?key_OR_range) {
+      return _count_1();
+    }
+    if ((key_OR_range is IDBKeyRange || key_OR_range == null)) {
+      return _count_2(key_OR_range);
+    }
+    if (?key_OR_range) {
+      var key_1 = _convertDartToNative_IDBKey(key_OR_range);
+      return _count_3(key_1);
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  IDBRequest _count_1() native "count";
+  IDBRequest _count_2(IDBKeyRange range) native "count";
+  IDBRequest _count_3(key) native "count";
+
+  /** @domName IDBIndex.get */
+  IDBRequest get(key) {
+    if ((key is IDBKeyRange || key == null)) {
+      return _get_1(key);
+    }
+    if (?key) {
+      var key_1 = _convertDartToNative_IDBKey(key);
+      return _get_2(key_1);
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  IDBRequest _get_1(IDBKeyRange key) native "get";
+  IDBRequest _get_2(key) native "get";
+
+  /** @domName IDBIndex.getKey */
+  IDBRequest getKey(key) {
+    if ((key is IDBKeyRange || key == null)) {
+      return _getKey_1(key);
+    }
+    if (?key) {
+      var key_1 = _convertDartToNative_IDBKey(key);
+      return _getKey_2(key_1);
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  IDBRequest _getKey_1(IDBKeyRange key) native "getKey";
+  IDBRequest _getKey_2(key) native "getKey";
+
+  /** @domName IDBIndex.openCursor */
+  IDBRequest openCursor([key_OR_range, direction]) {
+    if (!?key_OR_range &&
+        !?direction) {
+      return _openCursor_1();
+    }
+    if ((key_OR_range is IDBKeyRange || key_OR_range == null) &&
+        !?direction) {
+      return _openCursor_2(key_OR_range);
+    }
+    if ((key_OR_range is IDBKeyRange || key_OR_range == null) &&
+        (direction is String || direction == null)) {
+      return _openCursor_3(key_OR_range, direction);
+    }
+    if (?key_OR_range &&
+        !?direction) {
+      var key_1 = _convertDartToNative_IDBKey(key_OR_range);
+      return _openCursor_4(key_1);
+    }
+    if (?key_OR_range &&
+        (direction is String || direction == null)) {
+      var key_2 = _convertDartToNative_IDBKey(key_OR_range);
+      return _openCursor_5(key_2, direction);
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  IDBRequest _openCursor_1() native "openCursor";
+  IDBRequest _openCursor_2(IDBKeyRange range) native "openCursor";
+  IDBRequest _openCursor_3(IDBKeyRange range, String direction) native "openCursor";
+  IDBRequest _openCursor_4(key) native "openCursor";
+  IDBRequest _openCursor_5(key, String direction) native "openCursor";
+
+  /** @domName IDBIndex.openKeyCursor */
+  IDBRequest openKeyCursor([key_OR_range, direction]) {
+    if (!?key_OR_range &&
+        !?direction) {
+      return _openKeyCursor_1();
+    }
+    if ((key_OR_range is IDBKeyRange || key_OR_range == null) &&
+        !?direction) {
+      return _openKeyCursor_2(key_OR_range);
+    }
+    if ((key_OR_range is IDBKeyRange || key_OR_range == null) &&
+        (direction is String || direction == null)) {
+      return _openKeyCursor_3(key_OR_range, direction);
+    }
+    if (?key_OR_range &&
+        !?direction) {
+      var key_1 = _convertDartToNative_IDBKey(key_OR_range);
+      return _openKeyCursor_4(key_1);
+    }
+    if (?key_OR_range &&
+        (direction is String || direction == null)) {
+      var key_2 = _convertDartToNative_IDBKey(key_OR_range);
+      return _openKeyCursor_5(key_2, direction);
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  IDBRequest _openKeyCursor_1() native "openKeyCursor";
+  IDBRequest _openKeyCursor_2(IDBKeyRange range) native "openKeyCursor";
+  IDBRequest _openKeyCursor_3(IDBKeyRange range, String direction) native "openKeyCursor";
+  IDBRequest _openKeyCursor_4(key) native "openKeyCursor";
+  IDBRequest _openKeyCursor_5(key, String direction) native "openKeyCursor";
+}
+
+/// @domName IDBKey
+class IDBKey native "*IDBKey" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class IDBKeyRange native "*IDBKeyRange" {
+  /**
+   * @domName IDBKeyRange.only
+   */
+  factory IDBKeyRange.only(/*IDBKey*/ value) =>
+      _IDBKeyRangeFactoryProvider.createIDBKeyRange_only(value);
+
+  /**
+   * @domName IDBKeyRange.lowerBound
+   */
+  factory IDBKeyRange.lowerBound(/*IDBKey*/ bound, [bool open = false]) =>
+      _IDBKeyRangeFactoryProvider.createIDBKeyRange_lowerBound(bound, open);
+
+  /**
+   * @domName IDBKeyRange.upperBound
+   */
+  factory IDBKeyRange.upperBound(/*IDBKey*/ bound, [bool open = false]) =>
+      _IDBKeyRangeFactoryProvider.createIDBKeyRange_upperBound(bound, open);
+
+  /**
+   * @domName IDBKeyRange.bound
+   */
+  factory IDBKeyRange.bound(/*IDBKey*/ lower, /*IDBKey*/ upper,
+                            [bool lowerOpen = false, bool upperOpen = false]) =>
+      _IDBKeyRangeFactoryProvider.createIDBKeyRange_bound(
+          lower, upper, lowerOpen, upperOpen);
+
+
+  /** @domName IDBKeyRange.lower */
+  dynamic get lower => _convertNativeToDart_IDBKey(this._lower);
+  dynamic get _lower => JS("dynamic", "#.lower", this);
+
+  /** @domName IDBKeyRange.lowerOpen */
+  final bool lowerOpen;
+
+  /** @domName IDBKeyRange.upper */
+  dynamic get upper => _convertNativeToDart_IDBKey(this._upper);
+  dynamic get _upper => JS("dynamic", "#.upper", this);
+
+  /** @domName IDBKeyRange.upperOpen */
+  final bool upperOpen;
+
+  /** @domName IDBKeyRange.bound_ */
+  static IDBKeyRange bound_(/*IDBKey*/ lower, /*IDBKey*/ upper, [lowerOpen, upperOpen]) {
+    if (?upperOpen) {
+      var lower_1 = _convertDartToNative_IDBKey(lower);
+      var upper_2 = _convertDartToNative_IDBKey(upper);
+      return _bound__1(lower_1, upper_2, lowerOpen, upperOpen);
+    }
+    if (?lowerOpen) {
+      var lower_3 = _convertDartToNative_IDBKey(lower);
+      var upper_4 = _convertDartToNative_IDBKey(upper);
+      return _bound__2(lower_3, upper_4, lowerOpen);
+    }
+    var lower_5 = _convertDartToNative_IDBKey(lower);
+    var upper_6 = _convertDartToNative_IDBKey(upper);
+    return _bound__3(lower_5, upper_6);
+  }
+  IDBKeyRange _bound__1(lower, upper, bool lowerOpen, bool upperOpen) native "bound";
+  IDBKeyRange _bound__2(lower, upper, bool lowerOpen) native "bound";
+  IDBKeyRange _bound__3(lower, upper) native "bound";
+
+  /** @domName IDBKeyRange.lowerBound_ */
+  static IDBKeyRange lowerBound_(/*IDBKey*/ bound, [open]) {
+    if (?open) {
+      var bound_1 = _convertDartToNative_IDBKey(bound);
+      return _lowerBound__1(bound_1, open);
+    }
+    var bound_2 = _convertDartToNative_IDBKey(bound);
+    return _lowerBound__2(bound_2);
+  }
+  IDBKeyRange _lowerBound__1(bound, bool open) native "lowerBound";
+  IDBKeyRange _lowerBound__2(bound) native "lowerBound";
+
+  /** @domName IDBKeyRange.only_ */
+  static IDBKeyRange only_(/*IDBKey*/ value) {
+    var value_1 = _convertDartToNative_IDBKey(value);
+    return _only__1(value_1);
+  }
+  IDBKeyRange _only__1(value) native "only";
+
+  /** @domName IDBKeyRange.upperBound_ */
+  static IDBKeyRange upperBound_(/*IDBKey*/ bound, [open]) {
+    if (?open) {
+      var bound_1 = _convertDartToNative_IDBKey(bound);
+      return _upperBound__1(bound_1, open);
+    }
+    var bound_2 = _convertDartToNative_IDBKey(bound);
+    return _upperBound__2(bound_2);
+  }
+  IDBKeyRange _upperBound__1(bound, bool open) native "upperBound";
+  IDBKeyRange _upperBound__2(bound) native "upperBound";
+
+}
+
+/// @domName IDBObjectStore
+class IDBObjectStore native "*IDBObjectStore" {
+
+  /** @domName IDBObjectStore.autoIncrement */
+  final bool autoIncrement;
+
+  /** @domName IDBObjectStore.indexNames */
+  final List<String> indexNames;
+
+  /** @domName IDBObjectStore.keyPath */
+  final dynamic keyPath;
+
+  /** @domName IDBObjectStore.name */
+  final String name;
+
+  /** @domName IDBObjectStore.transaction */
+  final IDBTransaction transaction;
+
+  /** @domName IDBObjectStore.add */
+  IDBRequest add(/*any*/ value, [key]) {
+    if (?key) {
+      var value_1 = _convertDartToNative_SerializedScriptValue(value);
+      var key_2 = _convertDartToNative_IDBKey(key);
+      return _add_1(value_1, key_2);
+    }
+    var value_3 = _convertDartToNative_SerializedScriptValue(value);
+    return _add_2(value_3);
+  }
+  IDBRequest _add_1(value, key) native "add";
+  IDBRequest _add_2(value) native "add";
+
+  /** @domName IDBObjectStore.clear */
+  IDBRequest clear() native;
+
+  /** @domName IDBObjectStore.count */
+  IDBRequest count([key_OR_range]) {
+    if (!?key_OR_range) {
+      return _count_1();
+    }
+    if ((key_OR_range is IDBKeyRange || key_OR_range == null)) {
+      return _count_2(key_OR_range);
+    }
+    if (?key_OR_range) {
+      var key_1 = _convertDartToNative_IDBKey(key_OR_range);
+      return _count_3(key_1);
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  IDBRequest _count_1() native "count";
+  IDBRequest _count_2(IDBKeyRange range) native "count";
+  IDBRequest _count_3(key) native "count";
+
+  /** @domName IDBObjectStore.createIndex */
+  IDBIndex createIndex(String name, keyPath, [options]) {
+    if ((keyPath is List<String> || keyPath == null) &&
+        !?options) {
+      List keyPath_1 = _convertDartToNative_StringArray(keyPath);
+      return _createIndex_1(name, keyPath_1);
+    }
+    if ((keyPath is List<String> || keyPath == null) &&
+        (options is Map || options == null)) {
+      List keyPath_2 = _convertDartToNative_StringArray(keyPath);
+      var options_3 = _convertDartToNative_Dictionary(options);
+      return _createIndex_2(name, keyPath_2, options_3);
+    }
+    if ((keyPath is String || keyPath == null) &&
+        !?options) {
+      return _createIndex_3(name, keyPath);
+    }
+    if ((keyPath is String || keyPath == null) &&
+        (options is Map || options == null)) {
+      var options_4 = _convertDartToNative_Dictionary(options);
+      return _createIndex_4(name, keyPath, options_4);
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  IDBIndex _createIndex_1(name, List keyPath) native "createIndex";
+  IDBIndex _createIndex_2(name, List keyPath, options) native "createIndex";
+  IDBIndex _createIndex_3(name, String keyPath) native "createIndex";
+  IDBIndex _createIndex_4(name, String keyPath, options) native "createIndex";
+
+  /** @domName IDBObjectStore.delete */
+  IDBRequest delete(key_OR_keyRange) {
+    if ((key_OR_keyRange is IDBKeyRange || key_OR_keyRange == null)) {
+      return _delete_1(key_OR_keyRange);
+    }
+    if (?key_OR_keyRange) {
+      var key_1 = _convertDartToNative_IDBKey(key_OR_keyRange);
+      return _delete_2(key_1);
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  IDBRequest _delete_1(IDBKeyRange keyRange) native "delete";
+  IDBRequest _delete_2(key) native "delete";
+
+  /** @domName IDBObjectStore.deleteIndex */
+  void deleteIndex(String name) native;
+
+  /** @domName IDBObjectStore.getObject */
+  IDBRequest getObject(key) {
+    if ((key is IDBKeyRange || key == null)) {
+      return _getObject_1(key);
+    }
+    if (?key) {
+      var key_1 = _convertDartToNative_IDBKey(key);
+      return _getObject_2(key_1);
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  IDBRequest _getObject_1(IDBKeyRange key) native "get";
+  IDBRequest _getObject_2(key) native "get";
+
+  /** @domName IDBObjectStore.index */
+  IDBIndex index(String name) native;
+
+  /** @domName IDBObjectStore.openCursor */
+  IDBRequest openCursor([key_OR_range, direction]) {
+    if (!?key_OR_range &&
+        !?direction) {
+      return _openCursor_1();
+    }
+    if ((key_OR_range is IDBKeyRange || key_OR_range == null) &&
+        !?direction) {
+      return _openCursor_2(key_OR_range);
+    }
+    if ((key_OR_range is IDBKeyRange || key_OR_range == null) &&
+        (direction is String || direction == null)) {
+      return _openCursor_3(key_OR_range, direction);
+    }
+    if (?key_OR_range &&
+        !?direction) {
+      var key_1 = _convertDartToNative_IDBKey(key_OR_range);
+      return _openCursor_4(key_1);
+    }
+    if (?key_OR_range &&
+        (direction is String || direction == null)) {
+      var key_2 = _convertDartToNative_IDBKey(key_OR_range);
+      return _openCursor_5(key_2, direction);
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  IDBRequest _openCursor_1() native "openCursor";
+  IDBRequest _openCursor_2(IDBKeyRange range) native "openCursor";
+  IDBRequest _openCursor_3(IDBKeyRange range, String direction) native "openCursor";
+  IDBRequest _openCursor_4(key) native "openCursor";
+  IDBRequest _openCursor_5(key, String direction) native "openCursor";
+
+  /** @domName IDBObjectStore.put */
+  IDBRequest put(/*any*/ value, [key]) {
+    if (?key) {
+      var value_1 = _convertDartToNative_SerializedScriptValue(value);
+      var key_2 = _convertDartToNative_IDBKey(key);
+      return _put_1(value_1, key_2);
+    }
+    var value_3 = _convertDartToNative_SerializedScriptValue(value);
+    return _put_2(value_3);
+  }
+  IDBRequest _put_1(value, key) native "put";
+  IDBRequest _put_2(value) native "put";
+}
+
+/// @domName IDBOpenDBRequest
+class IDBOpenDBRequest extends IDBRequest implements EventTarget native "*IDBOpenDBRequest" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  IDBOpenDBRequestEvents get on =>
+    new IDBOpenDBRequestEvents(this);
+}
+
+class IDBOpenDBRequestEvents extends IDBRequestEvents {
+  IDBOpenDBRequestEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get blocked => this['blocked'];
+
+  EventListenerList get upgradeNeeded => this['upgradeneeded'];
+}
+
+/// @domName IDBRequest
+class IDBRequest extends EventTarget native "*IDBRequest" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  IDBRequestEvents get on =>
+    new IDBRequestEvents(this);
+
+  /** @domName IDBRequest.error */
+  final DOMError error;
+
+  /** @domName IDBRequest.errorCode */
+  final int errorCode;
+
+  /** @domName IDBRequest.readyState */
+  final String readyState;
+
+  /** @domName IDBRequest.result */
+  dynamic get result => _convertNativeToDart_IDBAny(this._result);
+  dynamic get _result => JS("dynamic", "#.result", this);
+
+  /** @domName IDBRequest.source */
+  final dynamic source;
+
+  /** @domName IDBRequest.transaction */
+  final IDBTransaction transaction;
+
+  /** @domName IDBRequest.webkitErrorMessage */
+  final String webkitErrorMessage;
+
+  /** @domName IDBRequest.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName IDBRequest.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName IDBRequest.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+class IDBRequestEvents extends Events {
+  IDBRequestEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get success => this['success'];
+}
+
+/// @domName IDBTransaction
+class IDBTransaction extends EventTarget native "*IDBTransaction" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  IDBTransactionEvents get on =>
+    new IDBTransactionEvents(this);
+
+  static const int READ_ONLY = 0;
+
+  static const int READ_WRITE = 1;
+
+  static const int VERSION_CHANGE = 2;
+
+  /** @domName IDBTransaction.db */
+  final IDBDatabase db;
+
+  /** @domName IDBTransaction.error */
+  final DOMError error;
+
+  /** @domName IDBTransaction.mode */
+  final String mode;
+
+  /** @domName IDBTransaction.abort */
+  void abort() native;
+
+  /** @domName IDBTransaction.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName IDBTransaction.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName IDBTransaction.objectStore */
+  IDBObjectStore objectStore(String name) native;
+
+  /** @domName IDBTransaction.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+class IDBTransactionEvents extends Events {
+  IDBTransactionEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get abort => this['abort'];
+
+  EventListenerList get complete => this['complete'];
+
+  EventListenerList get error => this['error'];
+}
+
+/// @domName IDBVersionChangeEvent
+class IDBUpgradeNeededEvent extends Event native "*IDBVersionChangeEvent" {
+
+  /** @domName IDBVersionChangeEvent.newVersion */
+  final int newVersion;
+
+  /** @domName IDBVersionChangeEvent.oldVersion */
+  final int oldVersion;
+}
+
+/// @domName IDBVersionChangeEvent
+class IDBVersionChangeEvent extends Event native "*IDBVersionChangeEvent" {
+
+  /** @domName IDBVersionChangeEvent.version */
+  final String version;
+}
+
+/// @domName IDBVersionChangeRequest
+class IDBVersionChangeRequest extends IDBRequest implements EventTarget native "*IDBVersionChangeRequest" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  IDBVersionChangeRequestEvents get on =>
+    new IDBVersionChangeRequestEvents(this);
+}
+
+class IDBVersionChangeRequestEvents extends IDBRequestEvents {
+  IDBVersionChangeRequestEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get blocked => this['blocked'];
+}
+
+/// @domName HTMLIFrameElement
+class IFrameElement extends Element implements Element native "*HTMLIFrameElement" {
+
+  factory IFrameElement() => _Elements.createIFrameElement();
+
+  /** @domName HTMLIFrameElement.align */
+  String align;
+
+  /** @domName HTMLIFrameElement.contentWindow */
+  Window get contentWindow => _convertNativeToDart_Window(this._contentWindow);
+  Window get _contentWindow => JS("Window", "#.contentWindow", this);
+
+  /** @domName HTMLIFrameElement.frameBorder */
+  String frameBorder;
+
+  /** @domName HTMLIFrameElement.height */
+  String height;
+
+  /** @domName HTMLIFrameElement.longDesc */
+  String longDesc;
+
+  /** @domName HTMLIFrameElement.marginHeight */
+  String marginHeight;
+
+  /** @domName HTMLIFrameElement.marginWidth */
+  String marginWidth;
+
+  /** @domName HTMLIFrameElement.name */
+  String name;
+
+  /** @domName HTMLIFrameElement.sandbox */
+  String sandbox;
+
+  /** @domName HTMLIFrameElement.scrolling */
+  String scrolling;
+
+  /** @domName HTMLIFrameElement.src */
+  String src;
+
+  /** @domName HTMLIFrameElement.srcdoc */
+  String srcdoc;
+
+  /** @domName HTMLIFrameElement.width */
+  String width;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void IceCallback(IceCandidate candidate, bool moreToFollow, PeerConnection00 source);
+
+/// @domName IceCandidate
+class IceCandidate native "*IceCandidate" {
+
+  factory IceCandidate(String label, String candidateLine) => _IceCandidateFactoryProvider.createIceCandidate(label, candidateLine);
+
+  /** @domName IceCandidate.label */
+  final String label;
+
+  /** @domName IceCandidate.toSdp */
+  String toSdp() native;
+}
+
+/// @domName ImageData
+class ImageData native "*ImageData" {
+
+  /** @domName ImageData.data */
+  final Uint8ClampedArray data;
+
+  /** @domName ImageData.height */
+  final int height;
+
+  /** @domName ImageData.width */
+  final int width;
+}
+
+/// @domName HTMLImageElement
+class ImageElement extends Element implements Element native "*HTMLImageElement" {
+
+  factory ImageElement({String src, int width, int height}) {
+    if (!?src) {
+      return _Elements.createImageElement();
+    }
+    if (!?width) {
+      return _Elements.createImageElement(src);
+    }
+    if (!?height) {
+      return _Elements.createImageElement(src, width);
+    }
+    return _Elements.createImageElement(src, width, height);
+  }
+
+  /** @domName HTMLImageElement.align */
+  String align;
+
+  /** @domName HTMLImageElement.alt */
+  String alt;
+
+  /** @domName HTMLImageElement.border */
+  String border;
+
+  /** @domName HTMLImageElement.complete */
+  final bool complete;
+
+  /** @domName HTMLImageElement.crossOrigin */
+  String crossOrigin;
+
+  /** @domName HTMLImageElement.height */
+  int height;
+
+  /** @domName HTMLImageElement.hspace */
+  int hspace;
+
+  /** @domName HTMLImageElement.isMap */
+  bool isMap;
+
+  /** @domName HTMLImageElement.longDesc */
+  String longDesc;
+
+  /** @domName HTMLImageElement.lowsrc */
+  String lowsrc;
+
+  /** @domName HTMLImageElement.name */
+  String name;
+
+  /** @domName HTMLImageElement.naturalHeight */
+  final int naturalHeight;
+
+  /** @domName HTMLImageElement.naturalWidth */
+  final int naturalWidth;
+
+  /** @domName HTMLImageElement.src */
+  String src;
+
+  /** @domName HTMLImageElement.useMap */
+  String useMap;
+
+  /** @domName HTMLImageElement.vspace */
+  int vspace;
+
+  /** @domName HTMLImageElement.width */
+  int width;
+
+  /** @domName HTMLImageElement.x */
+  final int x;
+
+  /** @domName HTMLImageElement.y */
+  final int y;
+}
+
+/// @domName HTMLInputElement
+class InputElement extends Element implements Element native "*HTMLInputElement" {
+
+  factory InputElement({String type}) {
+    if (!?type) {
+      return _Elements.createInputElement();
+    }
+    return _Elements.createInputElement(type);
+  }
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  InputElementEvents get on =>
+    new InputElementEvents(this);
+
+  /** @domName HTMLInputElement.accept */
+  String accept;
+
+  /** @domName HTMLInputElement.align */
+  String align;
+
+  /** @domName HTMLInputElement.alt */
+  String alt;
+
+  /** @domName HTMLInputElement.autocomplete */
+  String autocomplete;
+
+  /** @domName HTMLInputElement.autofocus */
+  bool autofocus;
+
+  /** @domName HTMLInputElement.checked */
+  bool checked;
+
+  /** @domName HTMLInputElement.defaultChecked */
+  bool defaultChecked;
+
+  /** @domName HTMLInputElement.defaultValue */
+  String defaultValue;
+
+  /** @domName HTMLInputElement.dirName */
+  String dirName;
+
+  /** @domName HTMLInputElement.disabled */
+  bool disabled;
+
+  /** @domName HTMLInputElement.files */
+  List<File> files;
+
+  /** @domName HTMLInputElement.form */
+  final FormElement form;
+
+  /** @domName HTMLInputElement.formAction */
+  String formAction;
+
+  /** @domName HTMLInputElement.formEnctype */
+  String formEnctype;
+
+  /** @domName HTMLInputElement.formMethod */
+  String formMethod;
+
+  /** @domName HTMLInputElement.formNoValidate */
+  bool formNoValidate;
+
+  /** @domName HTMLInputElement.formTarget */
+  String formTarget;
+
+  /** @domName HTMLInputElement.height */
+  int height;
+
+  /** @domName HTMLInputElement.incremental */
+  bool incremental;
+
+  /** @domName HTMLInputElement.indeterminate */
+  bool indeterminate;
+
+  /** @domName HTMLInputElement.labels */
+  final List<Node> labels;
+
+  /** @domName HTMLInputElement.list */
+  final Element list;
+
+  /** @domName HTMLInputElement.max */
+  String max;
+
+  /** @domName HTMLInputElement.maxLength */
+  int maxLength;
+
+  /** @domName HTMLInputElement.min */
+  String min;
+
+  /** @domName HTMLInputElement.multiple */
+  bool multiple;
+
+  /** @domName HTMLInputElement.name */
+  String name;
+
+  /** @domName HTMLInputElement.pattern */
+  String pattern;
+
+  /** @domName HTMLInputElement.placeholder */
+  String placeholder;
+
+  /** @domName HTMLInputElement.readOnly */
+  bool readOnly;
+
+  /** @domName HTMLInputElement.required */
+  bool required;
+
+  /** @domName HTMLInputElement.selectionDirection */
+  String selectionDirection;
+
+  /** @domName HTMLInputElement.selectionEnd */
+  int selectionEnd;
+
+  /** @domName HTMLInputElement.selectionStart */
+  int selectionStart;
+
+  /** @domName HTMLInputElement.size */
+  int size;
+
+  /** @domName HTMLInputElement.src */
+  String src;
+
+  /** @domName HTMLInputElement.step */
+  String step;
+
+  /** @domName HTMLInputElement.type */
+  String type;
+
+  /** @domName HTMLInputElement.useMap */
+  String useMap;
+
+  /** @domName HTMLInputElement.validationMessage */
+  final String validationMessage;
+
+  /** @domName HTMLInputElement.validity */
+  final ValidityState validity;
+
+  /** @domName HTMLInputElement.value */
+  String value;
+
+  /** @domName HTMLInputElement.valueAsDate */
+  Date valueAsDate;
+
+  /** @domName HTMLInputElement.valueAsNumber */
+  num valueAsNumber;
+
+  /** @domName HTMLInputElement.webkitEntries */
+  final List<Entry> webkitEntries;
+
+  /** @domName HTMLInputElement.webkitGrammar */
+  bool webkitGrammar;
+
+  /** @domName HTMLInputElement.webkitSpeech */
+  bool webkitSpeech;
+
+  /** @domName HTMLInputElement.webkitdirectory */
+  bool webkitdirectory;
+
+  /** @domName HTMLInputElement.width */
+  int width;
+
+  /** @domName HTMLInputElement.willValidate */
+  final bool willValidate;
+
+  /** @domName HTMLInputElement.checkValidity */
+  bool checkValidity() native;
+
+  /** @domName HTMLInputElement.select */
+  void select() native;
+
+  /** @domName HTMLInputElement.setCustomValidity */
+  void setCustomValidity(String error) native;
+
+  /** @domName HTMLInputElement.setRangeText */
+  void setRangeText(String replacement, [int start, int end, String selectionMode]) native;
+
+  /** @domName HTMLInputElement.setSelectionRange */
+  void setSelectionRange(int start, int end, [String direction]) native;
+
+  /** @domName HTMLInputElement.stepDown */
+  void stepDown([int n]) native;
+
+  /** @domName HTMLInputElement.stepUp */
+  void stepUp([int n]) native;
+}
+
+class InputElementEvents extends ElementEvents {
+  InputElementEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get speechChange => this['webkitSpeechChange'];
+}
+
+/// @domName Int16Array
+class Int16Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Int16Array" {
+
+  factory Int16Array(int length) =>
+    _TypedArrayFactoryProvider.createInt16Array(length);
+
+  factory Int16Array.fromList(List<int> list) =>
+    _TypedArrayFactoryProvider.createInt16Array_fromList(list);
+
+  factory Int16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
+    _TypedArrayFactoryProvider.createInt16Array_fromBuffer(buffer, byteOffset, length);
+
+  static const int BYTES_PER_ELEMENT = 2;
+
+  /** @domName Int16Array.length */
+  final int length;
+
+  int operator[](int index) => JS("int", "#[#]", this, index);
+
+  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
+  // -- start List<int> mixins.
+  // int is the element type.
+
+  // From Iterable<int>:
+
+  Iterator<int> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<int>(this);
+  }
+
+  // From Collection<int>:
+
+  void add(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<int> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(int element) => _Collections.contains(this, element);
+
+  void forEach(void f(int element)) => _Collections.forEach(this, f);
+
+  Collection map(f(int element)) => _Collections.map(this, [], f);
+
+  Collection<int> filter(bool f(int element)) =>
+     _Collections.filter(this, <int>[], f);
+
+  bool every(bool f(int element)) => _Collections.every(this, f);
+
+  bool some(bool f(int element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<int>:
+
+  void sort([Comparator<int> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(int element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(int element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  int get last => this[length - 1];
+
+  int removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [int initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<int> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <int>[]);
+
+  // -- end List<int> mixins.
+
+  /** @domName Int16Array.setElements */
+  void setElements(Object array, [int offset]) native "set";
+
+  /** @domName Int16Array.subarray */
+  Int16Array subarray(int start, [int end]) native;
+}
+
+/// @domName Int32Array
+class Int32Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Int32Array" {
+
+  factory Int32Array(int length) =>
+    _TypedArrayFactoryProvider.createInt32Array(length);
+
+  factory Int32Array.fromList(List<int> list) =>
+    _TypedArrayFactoryProvider.createInt32Array_fromList(list);
+
+  factory Int32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
+    _TypedArrayFactoryProvider.createInt32Array_fromBuffer(buffer, byteOffset, length);
+
+  static const int BYTES_PER_ELEMENT = 4;
+
+  /** @domName Int32Array.length */
+  final int length;
+
+  int operator[](int index) => JS("int", "#[#]", this, index);
+
+  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
+  // -- start List<int> mixins.
+  // int is the element type.
+
+  // From Iterable<int>:
+
+  Iterator<int> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<int>(this);
+  }
+
+  // From Collection<int>:
+
+  void add(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<int> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(int element) => _Collections.contains(this, element);
+
+  void forEach(void f(int element)) => _Collections.forEach(this, f);
+
+  Collection map(f(int element)) => _Collections.map(this, [], f);
+
+  Collection<int> filter(bool f(int element)) =>
+     _Collections.filter(this, <int>[], f);
+
+  bool every(bool f(int element)) => _Collections.every(this, f);
+
+  bool some(bool f(int element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<int>:
+
+  void sort([Comparator<int> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(int element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(int element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  int get last => this[length - 1];
+
+  int removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [int initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<int> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <int>[]);
+
+  // -- end List<int> mixins.
+
+  /** @domName Int32Array.setElements */
+  void setElements(Object array, [int offset]) native "set";
+
+  /** @domName Int32Array.subarray */
+  Int32Array subarray(int start, [int end]) native;
+}
+
+/// @domName Int8Array
+class Int8Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Int8Array" {
+
+  factory Int8Array(int length) =>
+    _TypedArrayFactoryProvider.createInt8Array(length);
+
+  factory Int8Array.fromList(List<int> list) =>
+    _TypedArrayFactoryProvider.createInt8Array_fromList(list);
+
+  factory Int8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
+    _TypedArrayFactoryProvider.createInt8Array_fromBuffer(buffer, byteOffset, length);
+
+  static const int BYTES_PER_ELEMENT = 1;
+
+  /** @domName Int8Array.length */
+  final int length;
+
+  int operator[](int index) => JS("int", "#[#]", this, index);
+
+  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
+  // -- start List<int> mixins.
+  // int is the element type.
+
+  // From Iterable<int>:
+
+  Iterator<int> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<int>(this);
+  }
+
+  // From Collection<int>:
+
+  void add(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<int> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(int element) => _Collections.contains(this, element);
+
+  void forEach(void f(int element)) => _Collections.forEach(this, f);
+
+  Collection map(f(int element)) => _Collections.map(this, [], f);
+
+  Collection<int> filter(bool f(int element)) =>
+     _Collections.filter(this, <int>[], f);
+
+  bool every(bool f(int element)) => _Collections.every(this, f);
+
+  bool some(bool f(int element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<int>:
+
+  void sort([Comparator<int> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(int element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(int element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  int get last => this[length - 1];
+
+  int removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [int initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<int> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <int>[]);
+
+  // -- end List<int> mixins.
+
+  /** @domName Int8Array.setElements */
+  void setElements(Object array, [int offset]) native "set";
+
+  /** @domName Int8Array.subarray */
+  Int8Array subarray(int start, [int end]) native;
+}
+
+/// @domName JavaScriptCallFrame
+class JavaScriptCallFrame native "*JavaScriptCallFrame" {
+
+  static const int CATCH_SCOPE = 4;
+
+  static const int CLOSURE_SCOPE = 3;
+
+  static const int GLOBAL_SCOPE = 0;
+
+  static const int LOCAL_SCOPE = 1;
+
+  static const int WITH_SCOPE = 2;
+
+  /** @domName JavaScriptCallFrame.caller */
+  final JavaScriptCallFrame caller;
+
+  /** @domName JavaScriptCallFrame.column */
+  final int column;
+
+  /** @domName JavaScriptCallFrame.functionName */
+  final String functionName;
+
+  /** @domName JavaScriptCallFrame.line */
+  final int line;
+
+  /** @domName JavaScriptCallFrame.scopeChain */
+  final List scopeChain;
+
+  /** @domName JavaScriptCallFrame.sourceID */
+  final int sourceID;
+
+  /** @domName JavaScriptCallFrame.thisObject */
+  final Object thisObject;
+
+  /** @domName JavaScriptCallFrame.type */
+  final String type;
+
+  /** @domName JavaScriptCallFrame.evaluate */
+  void evaluate(String script) native;
+
+  /** @domName JavaScriptCallFrame.restart */
+  Object restart() native;
+
+  /** @domName JavaScriptCallFrame.scopeType */
+  int scopeType(int scopeIndex) native;
+}
+
+/// @domName KeyboardEvent
+class KeyboardEvent extends UIEvent native "*KeyboardEvent" {
+
+  /** @domName KeyboardEvent.altGraphKey */
+  final bool altGraphKey;
+
+  /** @domName KeyboardEvent.altKey */
+  final bool altKey;
+
+  /** @domName KeyboardEvent.ctrlKey */
+  final bool ctrlKey;
+
+  /** @domName KeyboardEvent.keyIdentifier */
+  final String keyIdentifier;
+
+  /** @domName KeyboardEvent.keyLocation */
+  final int keyLocation;
+
+  /** @domName KeyboardEvent.metaKey */
+  final bool metaKey;
+
+  /** @domName KeyboardEvent.shiftKey */
+  final bool shiftKey;
+
+  /** @domName KeyboardEvent.initKeyboardEvent */
+  void initKeyboardEvent(String type, bool canBubble, bool cancelable, LocalWindow view, String keyIdentifier, int keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) native;
+}
+
+/// @domName HTMLKeygenElement
+class KeygenElement extends Element implements Element native "*HTMLKeygenElement" {
+
+  factory KeygenElement() => _Elements.createKeygenElement();
+
+  /** @domName HTMLKeygenElement.autofocus */
+  bool autofocus;
+
+  /** @domName HTMLKeygenElement.challenge */
+  String challenge;
+
+  /** @domName HTMLKeygenElement.disabled */
+  bool disabled;
+
+  /** @domName HTMLKeygenElement.form */
+  final FormElement form;
+
+  /** @domName HTMLKeygenElement.keytype */
+  String keytype;
+
+  /** @domName HTMLKeygenElement.labels */
+  final List<Node> labels;
+
+  /** @domName HTMLKeygenElement.name */
+  String name;
+
+  /** @domName HTMLKeygenElement.type */
+  final String type;
+
+  /** @domName HTMLKeygenElement.validationMessage */
+  final String validationMessage;
+
+  /** @domName HTMLKeygenElement.validity */
+  final ValidityState validity;
+
+  /** @domName HTMLKeygenElement.willValidate */
+  final bool willValidate;
+
+  /** @domName HTMLKeygenElement.checkValidity */
+  bool checkValidity() native;
+
+  /** @domName HTMLKeygenElement.setCustomValidity */
+  void setCustomValidity(String error) native;
+}
+
+/// @domName HTMLLIElement
+class LIElement extends Element implements Element native "*HTMLLIElement" {
+
+  factory LIElement() => _Elements.createLIElement();
+
+  /** @domName HTMLLIElement.type */
+  String type;
+
+  /** @domName HTMLLIElement.value */
+  int value;
+}
+
+/// @domName HTMLLabelElement
+class LabelElement extends Element implements Element native "*HTMLLabelElement" {
+
+  factory LabelElement() => _Elements.createLabelElement();
+
+  /** @domName HTMLLabelElement.control */
+  final Element control;
+
+  /** @domName HTMLLabelElement.form */
+  final FormElement form;
+
+  /** @domName HTMLLabelElement.htmlFor */
+  String htmlFor;
+}
+
+/// @domName HTMLLegendElement
+class LegendElement extends Element implements Element native "*HTMLLegendElement" {
+
+  factory LegendElement() => _Elements.createLegendElement();
+
+  /** @domName HTMLLegendElement.align */
+  String align;
+
+  /** @domName HTMLLegendElement.form */
+  final FormElement form;
+}
+
+/// @domName HTMLLinkElement
+class LinkElement extends Element implements Element native "*HTMLLinkElement" {
+
+  factory LinkElement() => _Elements.createLinkElement();
+
+  /** @domName HTMLLinkElement.charset */
+  String charset;
+
+  /** @domName HTMLLinkElement.disabled */
+  bool disabled;
+
+  /** @domName HTMLLinkElement.href */
+  String href;
+
+  /** @domName HTMLLinkElement.hreflang */
+  String hreflang;
+
+  /** @domName HTMLLinkElement.media */
+  String media;
+
+  /** @domName HTMLLinkElement.rel */
+  String rel;
+
+  /** @domName HTMLLinkElement.rev */
+  String rev;
+
+  /** @domName HTMLLinkElement.sheet */
+  final StyleSheet sheet;
+
+  /** @domName HTMLLinkElement.sizes */
+  DOMSettableTokenList sizes;
+
+  /** @domName HTMLLinkElement.target */
+  String target;
+
+  /** @domName HTMLLinkElement.type */
+  String type;
+}
+
+/// @domName History
+class LocalHistory implements History native "*History" {
+
+  /** @domName History.length */
+  final int length;
+
+  /** @domName History.state */
+  final dynamic state;
+
+  /** @domName History.back */
+  void back() native;
+
+  /** @domName History.forward */
+  void forward() native;
+
+  /** @domName History.go */
+  void go(int distance) native;
+
+  /** @domName History.pushState */
+  void pushState(Object data, String title, [String url]) native;
+
+  /** @domName History.replaceState */
+  void replaceState(Object data, String title, [String url]) native;
+}
+
+/// @domName Location
+class LocalLocation implements Location native "*Location" {
+
+  /** @domName Location.ancestorOrigins */
+  final List<String> ancestorOrigins;
+
+  /** @domName Location.hash */
+  String hash;
+
+  /** @domName Location.host */
+  String host;
+
+  /** @domName Location.hostname */
+  String hostname;
+
+  /** @domName Location.href */
+  String href;
+
+  /** @domName Location.origin */
+  final String origin;
+
+  /** @domName Location.pathname */
+  String pathname;
+
+  /** @domName Location.port */
+  String port;
+
+  /** @domName Location.protocol */
+  String protocol;
+
+  /** @domName Location.search */
+  String search;
+
+  /** @domName Location.assign */
+  void assign(String url) native;
+
+  /** @domName Location.reload */
+  void reload() native;
+
+  /** @domName Location.replace */
+  void replace(String url) native;
+
+  /** @domName Location.toString */
+  String toString() native;
+}
+
+/// @domName LocalMediaStream
+class LocalMediaStream extends MediaStream implements EventTarget native "*LocalMediaStream" {
+
+  /** @domName LocalMediaStream.stop */
+  void stop() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class LocalWindow extends EventTarget implements Window native "@*DOMWindow" {
+
+  Document get document => JS('Document', '#.document', this);
+
+  Window _open2(url, name) => JS('Window', '#.open(#,#)', this, url, name);
+
+  Window _open3(url, name, options) =>
+      JS('Window', '#.open(#,#,#)', this, url, name, options);
+
+  Window open(String url, String name, [String options]) {
+    if (options == null) {
+      return _DOMWindowCrossFrame._createSafe(_open2(url, name));
+    } else {
+      return _DOMWindowCrossFrame._createSafe(_open3(url, name, options));
+    }
+  }
+
+  // API level getter and setter for Location.
+  // TODO: The cross domain safe wrapper can be inserted here or folded into
+  // _LocationWrapper.
+  LocalLocation get location() {
+    // Firefox work-around for Location.  The Firefox location object cannot be
+    // made to behave like a Dart object so must be wrapped.
+    var result = _location;
+    if (_isDartLocation(result)) return result;  // e.g. on Chrome.
+    if (null == _location_wrapper) {
+      _location_wrapper = new _LocationWrapper(result);
+    }
+    return _location_wrapper;
+  }
+
+  // TODO: consider forcing users to do: window.location.assign('string').
+  /**
+   * Sets the window's location, which causes the browser to navigate to the new
+   * location. [value] may be a Location object or a string.
+   */
+  void set location(value) {
+    if (value is _LocationWrapper) {
+      _location = value._ptr;
+    } else {
+      _location = value;
+    }
+  }
+
+  var _location_wrapper;  // Cached wrapped Location object.
+
+  // Native getter and setter to access raw Location object.
+  Location get _location => JS('Location', '#.location', this);
+  void set _location(Location value) {
+    JS('void', '#.location = #', this, value);
+  }
+  // Prevent compiled from thinking 'location' property is available for a Dart
+  // member.
+  _protect_location() native 'location';
+
+  static _isDartLocation(thing) {
+    // On Firefox the code that implements 'is Location' fails to find the patch
+    // stub on Object.prototype and throws an exception.
+    try {
+      return thing is Location;
+    } catch (e) {
+      return false;
+    }
+  }
+
+  /**
+   * Executes a [callback] after the next batch of browser layout measurements
+   * has completed or would have completed if any browser layout measurements
+   * had been scheduled.
+   */
+  void requestLayoutFrame(TimeoutHandler callback) {
+    _addMeasurementFrameCallback(callback);
+  }
+
+  /** @domName DOMWindow.requestAnimationFrame */
+  int requestAnimationFrame(RequestAnimationFrameCallback callback) {
+    _ensureRequestAnimationFrame();
+    return _requestAnimationFrame(callback);
+  }
+
+  void cancelAnimationFrame(id) {
+    _ensureRequestAnimationFrame();
+    _cancelAnimationFrame(id);
+  }
+
+  int _requestAnimationFrame(RequestAnimationFrameCallback callback)
+      native 'requestAnimationFrame';
+
+  void _cancelAnimationFrame(int id)
+      native 'cancelAnimationFrame';
+
+  _ensureRequestAnimationFrame() {
+    if (JS('bool',
+           '!!(#.requestAnimationFrame && #.cancelAnimationFrame)', this, this))
+      return;
+
+    JS('void',
+       r"""
+  (function($this) {
+   var vendors = ['ms', 'moz', 'webkit', 'o'];
+   for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
+     $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
+     $this.cancelAnimationFrame =
+         $this[vendors[i]+'CancelAnimationFrame'] ||
+         $this[vendors[i]+'CancelRequestAnimationFrame'];
+   }
+   if ($this.requestAnimationFrame && $this.cancelAnimationFrame) return;
+   $this.requestAnimationFrame = function(callback) {
+      return window.setTimeout(function() {
+        callback(Date.now());
+      }, 16 /* 16ms ~= 60fps */);
+   };
+   $this.cancelAnimationFrame = function(id) { clearTimeout(id); }
+  })(#)""",
+       this);
+  }
+
+  IDBFactory get indexedDB() =>
+      JS('IDBFactory',
+         '#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
+         this, this, this);
+
+  /**
+   * Lookup a port by its [name].  Return null if no port is
+   * registered under [name].
+   */
+  SendPortSync lookupPort(String name) {
+    var port = JSON.parse(localStorage['dart-port:$name']);
+    return _deserialize(port);
+  }
+
+  /**
+   * Register a [port] on this window under the given [name].  This
+   * port may be retrieved by any isolate (or JavaScript script)
+   * running in this window.
+   */
+  void registerPort(String name, var port) {
+    var serialized = _serialize(port);
+    localStorage['dart-port:$name'] = JSON.stringify(serialized);
+  }
+
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  LocalWindowEvents get on =>
+    new LocalWindowEvents(this);
+
+  static const int PERSISTENT = 1;
+
+  static const int TEMPORARY = 0;
+
+  /** @domName Window.applicationCache */
+  final DOMApplicationCache applicationCache;
+
+  /** @domName Window.clientInformation */
+  final Navigator clientInformation;
+
+  /** @domName Window.closed */
+  final bool closed;
+
+  /** @domName Window.console */
+  final Console console;
+
+  /** @domName Window.crypto */
+  final Crypto crypto;
+
+  /** @domName Window.defaultStatus */
+  String defaultStatus;
+
+  /** @domName Window.defaultstatus */
+  String defaultstatus;
+
+  /** @domName Window.devicePixelRatio */
+  final num devicePixelRatio;
+
+  /** @domName Window.event */
+  final Event event;
+
+  /** @domName Window.history */
+  final LocalHistory history;
+
+  /** @domName Window.innerHeight */
+  final int innerHeight;
+
+  /** @domName Window.innerWidth */
+  final int innerWidth;
+
+  /** @domName Window.localStorage */
+  final Storage localStorage;
+
+  /** @domName Window.locationbar */
+  final BarInfo locationbar;
+
+  /** @domName Window.menubar */
+  final BarInfo menubar;
+
+  /** @domName Window.name */
+  String name;
+
+  /** @domName Window.navigator */
+  final Navigator navigator;
+
+  /** @domName Window.offscreenBuffering */
+  final bool offscreenBuffering;
+
+  /** @domName Window.opener */
+  Window get opener => _convertNativeToDart_Window(this._opener);
+  Window get _opener => JS("Window", "#.opener", this);
+
+  /** @domName Window.outerHeight */
+  final int outerHeight;
+
+  /** @domName Window.outerWidth */
+  final int outerWidth;
+
+  /** @domName DOMWindow.pagePopupController */
+  final PagePopupController pagePopupController;
+
+  /** @domName Window.pageXOffset */
+  final int pageXOffset;
+
+  /** @domName Window.pageYOffset */
+  final int pageYOffset;
+
+  /** @domName Window.parent */
+  Window get parent => _convertNativeToDart_Window(this._parent);
+  Window get _parent => JS("Window", "#.parent", this);
+
+  /** @domName Window.performance */
+  final Performance performance;
+
+  /** @domName Window.personalbar */
+  final BarInfo personalbar;
+
+  /** @domName Window.screen */
+  final Screen screen;
+
+  /** @domName Window.screenLeft */
+  final int screenLeft;
+
+  /** @domName Window.screenTop */
+  final int screenTop;
+
+  /** @domName Window.screenX */
+  final int screenX;
+
+  /** @domName Window.screenY */
+  final int screenY;
+
+  /** @domName Window.scrollX */
+  final int scrollX;
+
+  /** @domName Window.scrollY */
+  final int scrollY;
+
+  /** @domName Window.scrollbars */
+  final BarInfo scrollbars;
+
+  /** @domName Window.self */
+  Window get self => _convertNativeToDart_Window(this._self);
+  Window get _self => JS("Window", "#.self", this);
+
+  /** @domName Window.sessionStorage */
+  final Storage sessionStorage;
+
+  /** @domName Window.status */
+  String status;
+
+  /** @domName Window.statusbar */
+  final BarInfo statusbar;
+
+  /** @domName Window.styleMedia */
+  final StyleMedia styleMedia;
+
+  /** @domName Window.toolbar */
+  final BarInfo toolbar;
+
+  /** @domName Window.top */
+  Window get top => _convertNativeToDart_Window(this._top);
+  Window get _top => JS("Window", "#.top", this);
+
+  /** @domName DOMWindow.webkitIndexedDB */
+  final IDBFactory webkitIndexedDB;
+
+  /** @domName DOMWindow.webkitNotifications */
+  final NotificationCenter webkitNotifications;
+
+  /** @domName DOMWindow.webkitStorageInfo */
+  final StorageInfo webkitStorageInfo;
+
+  /** @domName Window.window */
+  Window get window => _convertNativeToDart_Window(this._window);
+  Window get _window => JS("Window", "#.window", this);
+
+  /** @domName Window.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName Window.alert */
+  void alert(String message) native;
+
+  /** @domName Window.atob */
+  String atob(String string) native;
+
+  /** @domName Window.blur */
+  void blur() native;
+
+  /** @domName Window.btoa */
+  String btoa(String string) native;
+
+  /** @domName Window.captureEvents */
+  void captureEvents() native;
+
+  /** @domName Window.clearInterval */
+  void clearInterval(int handle) native;
+
+  /** @domName Window.clearTimeout */
+  void clearTimeout(int handle) native;
+
+  /** @domName Window.close */
+  void close() native;
+
+  /** @domName Window.confirm */
+  bool confirm(String message) native;
+
+  /** @domName Window.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName Window.find */
+  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native;
+
+  /** @domName Window.focus */
+  void focus() native;
+
+  /** @domName Window.getComputedStyle */
+  CSSStyleDeclaration $dom_getComputedStyle(Element element, String pseudoElement) native "getComputedStyle";
+
+  /** @domName Window.getMatchedCSSRules */
+  List<CSSRule> getMatchedCSSRules(Element element, String pseudoElement) native;
+
+  /** @domName Window.getSelection */
+  DOMSelection getSelection() native;
+
+  /** @domName Window.matchMedia */
+  MediaQueryList matchMedia(String query) native;
+
+  /** @domName Window.moveBy */
+  void moveBy(num x, num y) native;
+
+  /** @domName Window.moveTo */
+  void moveTo(num x, num y) native;
+
+  /** @domName DOMWindow.openDatabase */
+  Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
+
+  /** @domName Window.postMessage */
+  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [messagePorts]) {
+    if (?message &&
+        !?messagePorts) {
+      var message_1 = _convertDartToNative_SerializedScriptValue(message);
+      _postMessage_1(message_1, targetOrigin);
+      return;
+    }
+    if (?message &&
+        (messagePorts is List || messagePorts == null)) {
+      var message_2 = _convertDartToNative_SerializedScriptValue(message);
+      _postMessage_2(message_2, targetOrigin, messagePorts);
+      return;
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  void _postMessage_1(message, targetOrigin) native "postMessage";
+  void _postMessage_2(message, targetOrigin, List messagePorts) native "postMessage";
+
+  /** @domName Window.print */
+  void print() native;
+
+  /** @domName Window.prompt */
+  String prompt(String message, String defaultValue) native;
+
+  /** @domName Window.releaseEvents */
+  void releaseEvents() native;
+
+  /** @domName Window.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName Window.resizeBy */
+  void resizeBy(num x, num y) native;
+
+  /** @domName Window.resizeTo */
+  void resizeTo(num width, num height) native;
+
+  /** @domName Window.scroll */
+  void scroll(int x, int y) native;
+
+  /** @domName Window.scrollBy */
+  void scrollBy(int x, int y) native;
+
+  /** @domName Window.scrollTo */
+  void scrollTo(int x, int y) native;
+
+  /** @domName Window.setInterval */
+  int setInterval(TimeoutHandler handler, int timeout) native;
+
+  /** @domName Window.setTimeout */
+  int setTimeout(TimeoutHandler handler, int timeout) native;
+
+  /** @domName Window.showModalDialog */
+  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native;
+
+  /** @domName Window.stop */
+  void stop() native;
+
+  /** @domName Window.webkitConvertPointFromNodeToPage */
+  Point webkitConvertPointFromNodeToPage(Node node, Point p) native;
+
+  /** @domName Window.webkitConvertPointFromPageToNode */
+  Point webkitConvertPointFromPageToNode(Node node, Point p) native;
+
+  /** @domName DOMWindow.webkitRequestFileSystem */
+  void webkitRequestFileSystem(int type, int size, FileSystemCallback successCallback, [ErrorCallback errorCallback]) native;
+
+  /** @domName DOMWindow.webkitResolveLocalFileSystemURL */
+  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native;
+
+}
+
+class LocalWindowEvents extends Events {
+  LocalWindowEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get abort => this['abort'];
+
+  EventListenerList get beforeUnload => this['beforeunload'];
+
+  EventListenerList get blur => this['blur'];
+
+  EventListenerList get canPlay => this['canplay'];
+
+  EventListenerList get canPlayThrough => this['canplaythrough'];
+
+  EventListenerList get change => this['change'];
+
+  EventListenerList get click => this['click'];
+
+  EventListenerList get contextMenu => this['contextmenu'];
+
+  EventListenerList get doubleClick => this['dblclick'];
+
+  EventListenerList get deviceMotion => this['devicemotion'];
+
+  EventListenerList get deviceOrientation => this['deviceorientation'];
+
+  EventListenerList get drag => this['drag'];
+
+  EventListenerList get dragEnd => this['dragend'];
+
+  EventListenerList get dragEnter => this['dragenter'];
+
+  EventListenerList get dragLeave => this['dragleave'];
+
+  EventListenerList get dragOver => this['dragover'];
+
+  EventListenerList get dragStart => this['dragstart'];
+
+  EventListenerList get drop => this['drop'];
+
+  EventListenerList get durationChange => this['durationchange'];
+
+  EventListenerList get emptied => this['emptied'];
+
+  EventListenerList get ended => this['ended'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get focus => this['focus'];
+
+  EventListenerList get hashChange => this['hashchange'];
+
+  EventListenerList get input => this['input'];
+
+  EventListenerList get invalid => this['invalid'];
+
+  EventListenerList get keyDown => this['keydown'];
+
+  EventListenerList get keyPress => this['keypress'];
+
+  EventListenerList get keyUp => this['keyup'];
+
+  EventListenerList get load => this['load'];
+
+  EventListenerList get loadedData => this['loadeddata'];
+
+  EventListenerList get loadedMetadata => this['loadedmetadata'];
+
+  EventListenerList get loadStart => this['loadstart'];
+
+  EventListenerList get message => this['message'];
+
+  EventListenerList get mouseDown => this['mousedown'];
+
+  EventListenerList get mouseMove => this['mousemove'];
+
+  EventListenerList get mouseOut => this['mouseout'];
+
+  EventListenerList get mouseOver => this['mouseover'];
+
+  EventListenerList get mouseUp => this['mouseup'];
+
+  EventListenerList get mouseWheel => this['mousewheel'];
+
+  EventListenerList get offline => this['offline'];
+
+  EventListenerList get online => this['online'];
+
+  EventListenerList get pageHide => this['pagehide'];
+
+  EventListenerList get pageShow => this['pageshow'];
+
+  EventListenerList get pause => this['pause'];
+
+  EventListenerList get play => this['play'];
+
+  EventListenerList get playing => this['playing'];
+
+  EventListenerList get popState => this['popstate'];
+
+  EventListenerList get progress => this['progress'];
+
+  EventListenerList get rateChange => this['ratechange'];
+
+  EventListenerList get reset => this['reset'];
+
+  EventListenerList get resize => this['resize'];
+
+  EventListenerList get scroll => this['scroll'];
+
+  EventListenerList get search => this['search'];
+
+  EventListenerList get seeked => this['seeked'];
+
+  EventListenerList get seeking => this['seeking'];
+
+  EventListenerList get select => this['select'];
+
+  EventListenerList get stalled => this['stalled'];
+
+  EventListenerList get storage => this['storage'];
+
+  EventListenerList get submit => this['submit'];
+
+  EventListenerList get suspend => this['suspend'];
+
+  EventListenerList get timeUpdate => this['timeupdate'];
+
+  EventListenerList get touchCancel => this['touchcancel'];
+
+  EventListenerList get touchEnd => this['touchend'];
+
+  EventListenerList get touchMove => this['touchmove'];
+
+  EventListenerList get touchStart => this['touchstart'];
+
+  EventListenerList get unload => this['unload'];
+
+  EventListenerList get volumeChange => this['volumechange'];
+
+  EventListenerList get waiting => this['waiting'];
+
+  EventListenerList get animationEnd => this['webkitAnimationEnd'];
+
+  EventListenerList get animationIteration => this['webkitAnimationIteration'];
+
+  EventListenerList get animationStart => this['webkitAnimationStart'];
+
+  EventListenerList get transitionEnd => this['webkitTransitionEnd'];
+}
+
+/// @domName HTMLMapElement
+class MapElement extends Element implements Element native "*HTMLMapElement" {
+
+  factory MapElement() => _Elements.createMapElement();
+
+  /** @domName HTMLMapElement.areas */
+  final HTMLCollection areas;
+
+  /** @domName HTMLMapElement.name */
+  String name;
+}
+
+/// @domName HTMLMarqueeElement
+class MarqueeElement extends Element implements Element native "*HTMLMarqueeElement" {
+
+  /** @domName HTMLMarqueeElement.behavior */
+  String behavior;
+
+  /** @domName HTMLMarqueeElement.bgColor */
+  String bgColor;
+
+  /** @domName HTMLMarqueeElement.direction */
+  String direction;
+
+  /** @domName HTMLMarqueeElement.height */
+  String height;
+
+  /** @domName HTMLMarqueeElement.hspace */
+  int hspace;
+
+  /** @domName HTMLMarqueeElement.loop */
+  int loop;
+
+  /** @domName HTMLMarqueeElement.scrollAmount */
+  int scrollAmount;
+
+  /** @domName HTMLMarqueeElement.scrollDelay */
+  int scrollDelay;
+
+  /** @domName HTMLMarqueeElement.trueSpeed */
+  bool trueSpeed;
+
+  /** @domName HTMLMarqueeElement.vspace */
+  int vspace;
+
+  /** @domName HTMLMarqueeElement.width */
+  String width;
+
+  /** @domName HTMLMarqueeElement.start */
+  void start() native;
+
+  /** @domName HTMLMarqueeElement.stop */
+  void stop() native;
+}
+
+/// @domName MediaController
+class MediaController extends EventTarget native "*MediaController" {
+
+  factory MediaController() => _MediaControllerFactoryProvider.createMediaController();
+
+  /** @domName MediaController.buffered */
+  final TimeRanges buffered;
+
+  /** @domName MediaController.currentTime */
+  num currentTime;
+
+  /** @domName MediaController.defaultPlaybackRate */
+  num defaultPlaybackRate;
+
+  /** @domName MediaController.duration */
+  final num duration;
+
+  /** @domName MediaController.muted */
+  bool muted;
+
+  /** @domName MediaController.paused */
+  final bool paused;
+
+  /** @domName MediaController.playbackRate */
+  num playbackRate;
+
+  /** @domName MediaController.played */
+  final TimeRanges played;
+
+  /** @domName MediaController.seekable */
+  final TimeRanges seekable;
+
+  /** @domName MediaController.volume */
+  num volume;
+
+  /** @domName MediaController.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName MediaController.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName MediaController.pause */
+  void pause() native;
+
+  /** @domName MediaController.play */
+  void play() native;
+
+  /** @domName MediaController.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+/// @domName HTMLMediaElement
+class MediaElement extends Element implements Element native "*HTMLMediaElement" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  MediaElementEvents get on =>
+    new MediaElementEvents(this);
+
+  static const int HAVE_CURRENT_DATA = 2;
+
+  static const int HAVE_ENOUGH_DATA = 4;
+
+  static const int HAVE_FUTURE_DATA = 3;
+
+  static const int HAVE_METADATA = 1;
+
+  static const int HAVE_NOTHING = 0;
+
+  static const int NETWORK_EMPTY = 0;
+
+  static const int NETWORK_IDLE = 1;
+
+  static const int NETWORK_LOADING = 2;
+
+  static const int NETWORK_NO_SOURCE = 3;
+
+  /** @domName HTMLMediaElement.autoplay */
+  bool autoplay;
+
+  /** @domName HTMLMediaElement.buffered */
+  final TimeRanges buffered;
+
+  /** @domName HTMLMediaElement.controller */
+  MediaController controller;
+
+  /** @domName HTMLMediaElement.controls */
+  bool controls;
+
+  /** @domName HTMLMediaElement.currentSrc */
+  final String currentSrc;
+
+  /** @domName HTMLMediaElement.currentTime */
+  num currentTime;
+
+  /** @domName HTMLMediaElement.defaultMuted */
+  bool defaultMuted;
+
+  /** @domName HTMLMediaElement.defaultPlaybackRate */
+  num defaultPlaybackRate;
+
+  /** @domName HTMLMediaElement.duration */
+  final num duration;
+
+  /** @domName HTMLMediaElement.ended */
+  final bool ended;
+
+  /** @domName HTMLMediaElement.error */
+  final MediaError error;
+
+  /** @domName HTMLMediaElement.initialTime */
+  final num initialTime;
+
+  /** @domName HTMLMediaElement.loop */
+  bool loop;
+
+  /** @domName HTMLMediaElement.mediaGroup */
+  String mediaGroup;
+
+  /** @domName HTMLMediaElement.muted */
+  bool muted;
+
+  /** @domName HTMLMediaElement.networkState */
+  final int networkState;
+
+  /** @domName HTMLMediaElement.paused */
+  final bool paused;
+
+  /** @domName HTMLMediaElement.playbackRate */
+  num playbackRate;
+
+  /** @domName HTMLMediaElement.played */
+  final TimeRanges played;
+
+  /** @domName HTMLMediaElement.preload */
+  String preload;
+
+  /** @domName HTMLMediaElement.readyState */
+  final int readyState;
+
+  /** @domName HTMLMediaElement.seekable */
+  final TimeRanges seekable;
+
+  /** @domName HTMLMediaElement.seeking */
+  final bool seeking;
+
+  /** @domName HTMLMediaElement.src */
+  String src;
+
+  /** @domName HTMLMediaElement.startTime */
+  final num startTime;
+
+  /** @domName HTMLMediaElement.textTracks */
+  final TextTrackList textTracks;
+
+  /** @domName HTMLMediaElement.volume */
+  num volume;
+
+  /** @domName HTMLMediaElement.webkitAudioDecodedByteCount */
+  final int webkitAudioDecodedByteCount;
+
+  /** @domName HTMLMediaElement.webkitClosedCaptionsVisible */
+  bool webkitClosedCaptionsVisible;
+
+  /** @domName HTMLMediaElement.webkitHasClosedCaptions */
+  final bool webkitHasClosedCaptions;
+
+  /** @domName HTMLMediaElement.webkitPreservesPitch */
+  bool webkitPreservesPitch;
+
+  /** @domName HTMLMediaElement.webkitVideoDecodedByteCount */
+  final int webkitVideoDecodedByteCount;
+
+  /** @domName HTMLMediaElement.addTextTrack */
+  TextTrack addTextTrack(String kind, [String label, String language]) native;
+
+  /** @domName HTMLMediaElement.canPlayType */
+  String canPlayType(String type, String keySystem) native;
+
+  /** @domName HTMLMediaElement.load */
+  void load() native;
+
+  /** @domName HTMLMediaElement.pause */
+  void pause() native;
+
+  /** @domName HTMLMediaElement.play */
+  void play() native;
+
+  /** @domName HTMLMediaElement.webkitAddKey */
+  void webkitAddKey(String keySystem, Uint8Array key, [Uint8Array initData, String sessionId]) native;
+
+  /** @domName HTMLMediaElement.webkitCancelKeyRequest */
+  void webkitCancelKeyRequest(String keySystem, String sessionId) native;
+
+  /** @domName HTMLMediaElement.webkitGenerateKeyRequest */
+  void webkitGenerateKeyRequest(String keySystem, [Uint8Array initData]) native;
+}
+
+class MediaElementEvents extends ElementEvents {
+  MediaElementEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get canPlay => this['canplay'];
+
+  EventListenerList get canPlayThrough => this['canplaythrough'];
+
+  EventListenerList get durationChange => this['durationchange'];
+
+  EventListenerList get emptied => this['emptied'];
+
+  EventListenerList get ended => this['ended'];
+
+  EventListenerList get loadedData => this['loadeddata'];
+
+  EventListenerList get loadedMetadata => this['loadedmetadata'];
+
+  EventListenerList get loadStart => this['loadstart'];
+
+  EventListenerList get pause => this['pause'];
+
+  EventListenerList get play => this['play'];
+
+  EventListenerList get playing => this['playing'];
+
+  EventListenerList get progress => this['progress'];
+
+  EventListenerList get rateChange => this['ratechange'];
+
+  EventListenerList get seeked => this['seeked'];
+
+  EventListenerList get seeking => this['seeking'];
+
+  EventListenerList get show => this['show'];
+
+  EventListenerList get stalled => this['stalled'];
+
+  EventListenerList get suspend => this['suspend'];
+
+  EventListenerList get timeUpdate => this['timeupdate'];
+
+  EventListenerList get volumeChange => this['volumechange'];
+
+  EventListenerList get waiting => this['waiting'];
+
+  EventListenerList get keyAdded => this['webkitkeyadded'];
+
+  EventListenerList get keyError => this['webkitkeyerror'];
+
+  EventListenerList get keyMessage => this['webkitkeymessage'];
+
+  EventListenerList get needKey => this['webkitneedkey'];
+}
+
+/// @domName MediaElementAudioSourceNode
+class MediaElementAudioSourceNode extends AudioSourceNode native "*MediaElementAudioSourceNode" {
+
+  /** @domName MediaElementAudioSourceNode.mediaElement */
+  final MediaElement mediaElement;
+}
+
+/// @domName MediaError
+class MediaError native "*MediaError" {
+
+  static const int MEDIA_ERR_ABORTED = 1;
+
+  static const int MEDIA_ERR_DECODE = 3;
+
+  static const int MEDIA_ERR_ENCRYPTED = 5;
+
+  static const int MEDIA_ERR_NETWORK = 2;
+
+  static const int MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
+
+  /** @domName MediaError.code */
+  final int code;
+}
+
+/// @domName MediaKeyError
+class MediaKeyError native "*MediaKeyError" {
+
+  static const int MEDIA_KEYERR_CLIENT = 2;
+
+  static const int MEDIA_KEYERR_DOMAIN = 6;
+
+  static const int MEDIA_KEYERR_HARDWARECHANGE = 5;
+
+  static const int MEDIA_KEYERR_OUTPUT = 4;
+
+  static const int MEDIA_KEYERR_SERVICE = 3;
+
+  static const int MEDIA_KEYERR_UNKNOWN = 1;
+
+  /** @domName MediaKeyError.code */
+  final int code;
+}
+
+/// @domName MediaKeyEvent
+class MediaKeyEvent extends Event native "*MediaKeyEvent" {
+
+  /** @domName MediaKeyEvent.defaultURL */
+  final String defaultURL;
+
+  /** @domName MediaKeyEvent.errorCode */
+  final MediaKeyError errorCode;
+
+  /** @domName MediaKeyEvent.initData */
+  final Uint8Array initData;
+
+  /** @domName MediaKeyEvent.keySystem */
+  final String keySystem;
+
+  /** @domName MediaKeyEvent.message */
+  final Uint8Array message;
+
+  /** @domName MediaKeyEvent.sessionId */
+  final String sessionId;
+
+  /** @domName MediaKeyEvent.systemCode */
+  final int systemCode;
+}
+
+/// @domName MediaList
+class MediaList native "*MediaList" {
+
+  /** @domName MediaList.length */
+  final int length;
+
+  /** @domName MediaList.mediaText */
+  String mediaText;
+
+  /** @domName MediaList.appendMedium */
+  void appendMedium(String newMedium) native;
+
+  /** @domName MediaList.deleteMedium */
+  void deleteMedium(String oldMedium) native;
+
+  /** @domName MediaList.item */
+  String item(int index) native;
+}
+
+/// @domName MediaQueryList
+class MediaQueryList native "*MediaQueryList" {
+
+  /** @domName MediaQueryList.matches */
+  final bool matches;
+
+  /** @domName MediaQueryList.media */
+  final String media;
+
+  /** @domName MediaQueryList.addListener */
+  void addListener(MediaQueryListListener listener) native;
+
+  /** @domName MediaQueryList.removeListener */
+  void removeListener(MediaQueryListListener listener) native;
+}
+/// @domName MediaQueryListListener
+abstract class MediaQueryListListener {
+
+  /** @domName MediaQueryListListener.queryChanged */
+  void queryChanged(MediaQueryList list);
+}
+
+/// @domName MediaSource
+class MediaSource extends EventTarget native "*MediaSource" {
+
+  factory MediaSource() => _MediaSourceFactoryProvider.createMediaSource();
+
+  /** @domName MediaSource.activeSourceBuffers */
+  final SourceBufferList activeSourceBuffers;
+
+  /** @domName MediaSource.duration */
+  num duration;
+
+  /** @domName MediaSource.readyState */
+  final String readyState;
+
+  /** @domName MediaSource.sourceBuffers */
+  final SourceBufferList sourceBuffers;
+
+  /** @domName MediaSource.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName MediaSource.addSourceBuffer */
+  SourceBuffer addSourceBuffer(String type) native;
+
+  /** @domName MediaSource.dispatchEvent */
+  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+
+  /** @domName MediaSource.endOfStream */
+  void endOfStream(String error) native;
+
+  /** @domName MediaSource.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName MediaSource.removeSourceBuffer */
+  void removeSourceBuffer(SourceBuffer buffer) native;
+}
+
+/// @domName MediaStream
+class MediaStream extends EventTarget native "*MediaStream" {
+
+  factory MediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) => _MediaStreamFactoryProvider.createMediaStream(audioTracks, videoTracks);
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  MediaStreamEvents get on =>
+    new MediaStreamEvents(this);
+
+  static const int ENDED = 2;
+
+  static const int LIVE = 1;
+
+  /** @domName MediaStream.audioTracks */
+  final MediaStreamTrackList audioTracks;
+
+  /** @domName MediaStream.label */
+  final String label;
+
+  /** @domName MediaStream.readyState */
+  final int readyState;
+
+  /** @domName MediaStream.videoTracks */
+  final MediaStreamTrackList videoTracks;
+
+  /** @domName MediaStream.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName MediaStream.dispatchEvent */
+  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+
+  /** @domName MediaStream.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+class MediaStreamEvents extends Events {
+  MediaStreamEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get ended => this['ended'];
+}
+
+/// @domName MediaStreamAudioSourceNode
+class MediaStreamAudioSourceNode extends AudioSourceNode native "*MediaStreamAudioSourceNode" {
+
+  /** @domName MediaStreamAudioSourceNode.mediaStream */
+  final MediaStream mediaStream;
+}
+
+/// @domName MediaStreamEvent
+class MediaStreamEvent extends Event native "*MediaStreamEvent" {
+
+  /** @domName MediaStreamEvent.stream */
+  final MediaStream stream;
+}
+
+/// @domName MediaStreamTrack
+class MediaStreamTrack extends EventTarget native "*MediaStreamTrack" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  MediaStreamTrackEvents get on =>
+    new MediaStreamTrackEvents(this);
+
+  static const int ENDED = 2;
+
+  static const int LIVE = 0;
+
+  static const int MUTED = 1;
+
+  /** @domName MediaStreamTrack.enabled */
+  bool enabled;
+
+  /** @domName MediaStreamTrack.kind */
+  final String kind;
+
+  /** @domName MediaStreamTrack.label */
+  final String label;
+
+  /** @domName MediaStreamTrack.readyState */
+  final int readyState;
+
+  /** @domName MediaStreamTrack.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName MediaStreamTrack.dispatchEvent */
+  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+
+  /** @domName MediaStreamTrack.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+class MediaStreamTrackEvents extends Events {
+  MediaStreamTrackEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get ended => this['ended'];
+
+  EventListenerList get mute => this['mute'];
+
+  EventListenerList get unmute => this['unmute'];
+}
+
+/// @domName MediaStreamTrackEvent
+class MediaStreamTrackEvent extends Event native "*MediaStreamTrackEvent" {
+
+  /** @domName MediaStreamTrackEvent.track */
+  final MediaStreamTrack track;
+}
+
+/// @domName MediaStreamTrackList
+class MediaStreamTrackList extends EventTarget native "*MediaStreamTrackList" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  MediaStreamTrackListEvents get on =>
+    new MediaStreamTrackListEvents(this);
+
+  /** @domName MediaStreamTrackList.length */
+  final int length;
+
+  /** @domName MediaStreamTrackList.add */
+  void add(MediaStreamTrack track) native;
+
+  /** @domName MediaStreamTrackList.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName MediaStreamTrackList.dispatchEvent */
+  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+
+  /** @domName MediaStreamTrackList.item */
+  MediaStreamTrack item(int index) native;
+
+  /** @domName MediaStreamTrackList.remove */
+  void remove(MediaStreamTrack track) native;
+
+  /** @domName MediaStreamTrackList.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+class MediaStreamTrackListEvents extends Events {
+  MediaStreamTrackListEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get addTrack => this['addtrack'];
+
+  EventListenerList get removeTrack => this['removetrack'];
+}
+
+/// @domName MemoryInfo
+class MemoryInfo native "*MemoryInfo" {
+
+  /** @domName MemoryInfo.jsHeapSizeLimit */
+  final int jsHeapSizeLimit;
+
+  /** @domName MemoryInfo.totalJSHeapSize */
+  final int totalJSHeapSize;
+
+  /** @domName MemoryInfo.usedJSHeapSize */
+  final int usedJSHeapSize;
+}
+
+/// @domName HTMLMenuElement
+class MenuElement extends Element implements Element native "*HTMLMenuElement" {
+
+  factory MenuElement() => _Elements.createMenuElement();
+
+  /** @domName HTMLMenuElement.compact */
+  bool compact;
+}
+
+/// @domName MessageChannel
+class MessageChannel native "*MessageChannel" {
+
+  factory MessageChannel() => _MessageChannelFactoryProvider.createMessageChannel();
+
+  /** @domName MessageChannel.port1 */
+  final MessagePort port1;
+
+  /** @domName MessageChannel.port2 */
+  final MessagePort port2;
+}
+
+/// @domName MessageEvent
+class MessageEvent extends Event native "*MessageEvent" {
+
+  /** @domName MessageEvent.data */
+  dynamic get data => _convertNativeToDart_SerializedScriptValue(this._data);
+  dynamic get _data => JS("dynamic", "#.data", this);
+
+  /** @domName MessageEvent.lastEventId */
+  final String lastEventId;
+
+  /** @domName MessageEvent.origin */
+  final String origin;
+
+  /** @domName MessageEvent.ports */
+  final List ports;
+
+  /** @domName MessageEvent.source */
+  Window get source => _convertNativeToDart_Window(this._source);
+  Window get _source => JS("Window", "#.source", this);
+
+  /** @domName MessageEvent.initMessageEvent */
+  void initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List messagePorts) native;
+
+  /** @domName MessageEvent.webkitInitMessageEvent */
+  void webkitInitMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List transferables) native;
+}
+
+/// @domName MessagePort
+class MessagePort extends EventTarget native "*MessagePort" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  MessagePortEvents get on =>
+    new MessagePortEvents(this);
+
+  /** @domName MessagePort.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName MessagePort.close */
+  void close() native;
+
+  /** @domName MessagePort.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName MessagePort.postMessage */
+  void postMessage(/*any*/ message, [messagePorts]) {
+    if (?messagePorts) {
+      var message_1 = _convertDartToNative_SerializedScriptValue(message);
+      _postMessage_1(message_1, messagePorts);
+      return;
+    }
+    var message_2 = _convertDartToNative_SerializedScriptValue(message);
+    _postMessage_2(message_2);
+    return;
+  }
+  void _postMessage_1(message, List messagePorts) native "postMessage";
+  void _postMessage_2(message) native "postMessage";
+
+  /** @domName MessagePort.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName MessagePort.start */
+  void start() native;
+}
+
+class MessagePortEvents extends Events {
+  MessagePortEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get message => this['message'];
+}
+
+/// @domName HTMLMetaElement
+class MetaElement extends Element implements Element native "*HTMLMetaElement" {
+
+  /** @domName HTMLMetaElement.content */
+  String content;
+
+  /** @domName HTMLMetaElement.httpEquiv */
+  String httpEquiv;
+
+  /** @domName HTMLMetaElement.name */
+  String name;
+
+  /** @domName HTMLMetaElement.scheme */
+  String scheme;
+}
+
+/// @domName Metadata
+class Metadata native "*Metadata" {
+
+  /** @domName Metadata.modificationTime */
+  final Date modificationTime;
+
+  /** @domName Metadata.size */
+  final int size;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void MetadataCallback(Metadata metadata);
+
+/// @domName HTMLMeterElement
+class MeterElement extends Element implements Element native "*HTMLMeterElement" {
+
+  factory MeterElement() => _Elements.createMeterElement();
+
+  /** @domName HTMLMeterElement.high */
+  num high;
+
+  /** @domName HTMLMeterElement.labels */
+  final List<Node> labels;
+
+  /** @domName HTMLMeterElement.low */
+  num low;
+
+  /** @domName HTMLMeterElement.max */
+  num max;
+
+  /** @domName HTMLMeterElement.min */
+  num min;
+
+  /** @domName HTMLMeterElement.optimum */
+  num optimum;
+
+  /** @domName HTMLMeterElement.value */
+  num value;
+}
+
+/// @domName HTMLModElement
+class ModElement extends Element implements Element native "*HTMLModElement" {
+
+  /** @domName HTMLModElement.cite */
+  String cite;
+
+  /** @domName HTMLModElement.dateTime */
+  String dateTime;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class MouseEvent extends UIEvent native "*MouseEvent" {
+  factory MouseEvent(String type, Window view, int detail, int screenX,
+      int screenY, int clientX, int clientY, int button, [bool canBubble = true,
+      bool cancelable = true, bool ctrlKey = false, bool altKey = false,
+      bool shiftKey = false, bool metaKey = false,
+      EventTarget relatedTarget = null]) =>
+      _MouseEventFactoryProvider.createMouseEvent(
+          type, view, detail, screenX, screenY,
+          clientX, clientY, button, canBubble, cancelable,
+          ctrlKey, altKey, shiftKey, metaKey,
+          relatedTarget);
+
+  /** @domName MouseEvent.altKey */
+  final bool altKey;
+
+  /** @domName MouseEvent.button */
+  final int button;
+
+  /** @domName MouseEvent.clientX */
+  final int clientX;
+
+  /** @domName MouseEvent.clientY */
+  final int clientY;
+
+  /** @domName MouseEvent.ctrlKey */
+  final bool ctrlKey;
+
+  /** @domName MouseEvent.dataTransfer */
+  final Clipboard dataTransfer;
+
+  /** @domName MouseEvent.fromElement */
+  final Node fromElement;
+
+  /** @domName MouseEvent.metaKey */
+  final bool metaKey;
+
+  /** @domName MouseEvent.relatedTarget */
+  EventTarget get relatedTarget => _convertNativeToDart_EventTarget(this._relatedTarget);
+  EventTarget get _relatedTarget => JS("EventTarget", "#.relatedTarget", this);
+
+  /** @domName MouseEvent.screenX */
+  final int screenX;
+
+  /** @domName MouseEvent.screenY */
+  final int screenY;
+
+  /** @domName MouseEvent.shiftKey */
+  final bool shiftKey;
+
+  /** @domName MouseEvent.toElement */
+  final Node toElement;
+
+  /** @domName MouseEvent.webkitMovementX */
+  final int webkitMovementX;
+
+  /** @domName MouseEvent.webkitMovementY */
+  final int webkitMovementY;
+
+  /** @domName MouseEvent.x */
+  final int x;
+
+  /** @domName MouseEvent.y */
+  final int y;
+
+  /** @domName MouseEvent.initMouseEvent */
+  void $dom_initMouseEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) {
+    EventTarget relatedTarget_1 = _convertDartToNative_EventTarget(relatedTarget);
+    _$dom_initMouseEvent_1(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
+    return;
+  }
+  void _$dom_initMouseEvent_1(type, canBubble, cancelable, LocalWindow view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, EventTarget relatedTarget) native "initMouseEvent";
+
+
+  int get offsetX {
+  if (JS('bool', '!!#.offsetX', this)) {
+      return JS('int', '#.offsetX', this);
+    } else {
+      // Firefox does not support offsetX.
+      var target = this.target;
+      if (!(target is Element)) {
+        throw new UnsupportedError(
+            'offsetX is only supported on elements');
+      }
+      return this.clientX - this.target.getBoundingClientRect().left;
+    }
+  }
+
+  int get offsetY {
+    if (JS('bool', '!!#.offsetY', this)) {
+      return JS('int', '#.offsetY', this);
+    } else {
+      // Firefox does not support offsetY.
+      var target = this.target;
+      if (!(target is Element)) {
+        throw new UnsupportedError(
+            'offsetY is only supported on elements');
+      }
+      return this.clientY - this.target.getBoundingClientRect().top;
+    }
+  }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void MutationCallback(List<MutationRecord> mutations, MutationObserver observer);
+
+/// @domName MutationEvent
+class MutationEvent extends Event native "*MutationEvent" {
+
+  static const int ADDITION = 2;
+
+  static const int MODIFICATION = 1;
+
+  static const int REMOVAL = 3;
+
+  /** @domName MutationEvent.attrChange */
+  final int attrChange;
+
+  /** @domName MutationEvent.attrName */
+  final String attrName;
+
+  /** @domName MutationEvent.newValue */
+  final String newValue;
+
+  /** @domName MutationEvent.prevValue */
+  final String prevValue;
+
+  /** @domName MutationEvent.relatedNode */
+  final Node relatedNode;
+
+  /** @domName MutationEvent.initMutationEvent */
+  void initMutationEvent(String type, bool canBubble, bool cancelable, Node relatedNode, String prevValue, String newValue, String attrName, int attrChange) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class MutationObserver native "*MutationObserver" {
+
+  factory MutationObserver(MutationCallback callback) => _MutationObserverFactoryProvider.createMutationObserver(callback);
+
+  /** @domName MutationObserver.disconnect */
+  void disconnect() native;
+
+  /** @domName MutationObserver._observe */
+  void _observe(Node target, Map options) {
+    var options_1 = _convertDartToNative_Dictionary(options);
+    __observe_1(target, options_1);
+    return;
+  }
+  void __observe_1(Node target, options) native "observe";
+
+  /** @domName MutationObserver.takeRecords */
+  List<MutationRecord> takeRecords() native;
+
+  void observe(Node target,
+               {Map options,
+                bool childList,
+                bool attributes,
+                bool characterData,
+                bool subtree,
+                bool attributeOldValue,
+                bool characterDataOldValue,
+                List<String> attributeFilter}) {
+
+    // Parse options into map of known type.
+    var parsedOptions = _createDict();
+
+    if (options != null) {
+      options.forEach((k, v) {
+          if (_boolKeys.containsKey(k)) {
+            _add(parsedOptions, k, true == v);
+          } else if (k == 'attributeFilter') {
+            _add(parsedOptions, k, _fixupList(v));
+          } else {
+            throw new ArgumentError(
+                "Illegal MutationObserver.observe option '$k'");
+          }
+        });
+    }
+
+    // Override options passed in the map with named optional arguments.
+    override(key, value) {
+      if (value != null) _add(parsedOptions, key, value);
+    }
+
+    override('childList', childList);
+    override('attributes', attributes);
+    override('characterData', characterData);
+    override('subtree', subtree);
+    override('attributeOldValue', attributeOldValue);
+    override('characterDataOldValue', characterDataOldValue);
+    if (attributeFilter != null) {
+      override('attributeFilter', _fixupList(attributeFilter));
+    }
+
+    _call(target, parsedOptions);
+  }
+
+   // TODO: Change to a set when const Sets are available.
+  static final _boolKeys =
+    const {'childList': true,
+           'attributes': true,
+           'characterData': true,
+           'subtree': true,
+           'attributeOldValue': true,
+           'characterDataOldValue': true };
+
+
+  static _createDict() => JS('var', '{}');
+  static _add(m, String key, value) { JS('void', '#[#] = #', m, key, value); }
+  static _fixupList(list) => list;  // TODO: Ensure is a JavaScript Array.
+
+  // Call native function with no conversions.
+  void _call(target, options) native 'observe';
+}
+
+/// @domName MutationRecord
+class MutationRecord native "*MutationRecord" {
+
+  /** @domName MutationRecord.addedNodes */
+  final List<Node> addedNodes;
+
+  /** @domName MutationRecord.attributeName */
+  final String attributeName;
+
+  /** @domName MutationRecord.attributeNamespace */
+  final String attributeNamespace;
+
+  /** @domName MutationRecord.nextSibling */
+  final Node nextSibling;
+
+  /** @domName MutationRecord.oldValue */
+  final String oldValue;
+
+  /** @domName MutationRecord.previousSibling */
+  final Node previousSibling;
+
+  /** @domName MutationRecord.removedNodes */
+  final List<Node> removedNodes;
+
+  /** @domName MutationRecord.target */
+  final Node target;
+
+  /** @domName MutationRecord.type */
+  final String type;
+}
+
+/// @domName NamedNodeMap
+class NamedNodeMap implements JavaScriptIndexingBehavior, List<Node> native "*NamedNodeMap" {
+
+  /** @domName NamedNodeMap.length */
+  final int length;
+
+  Node operator[](int index) => JS("Node", "#[#]", this, index);
+
+  void operator[]=(int index, Node value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<Node> mixins.
+  // Node is the element type.
+
+  // From Iterable<Node>:
+
+  Iterator<Node> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<Node>(this);
+  }
+
+  // From Collection<Node>:
+
+  void add(Node value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(Node value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<Node> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(Node element) => _Collections.contains(this, element);
+
+  void forEach(void f(Node element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Node element)) => _Collections.map(this, [], f);
+
+  Collection<Node> filter(bool f(Node element)) =>
+     _Collections.filter(this, <Node>[], f);
+
+  bool every(bool f(Node element)) => _Collections.every(this, f);
+
+  bool some(bool f(Node element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Node>:
+
+  void sort([Comparator<Node> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Node element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Node element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  Node get last => this[length - 1];
+
+  Node removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [Node initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<Node> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Node>[]);
+
+  // -- end List<Node> mixins.
+
+  /** @domName NamedNodeMap.getNamedItem */
+  Node getNamedItem(String name) native;
+
+  /** @domName NamedNodeMap.getNamedItemNS */
+  Node getNamedItemNS(String namespaceURI, String localName) native;
+
+  /** @domName NamedNodeMap.item */
+  Node item(int index) native;
+
+  /** @domName NamedNodeMap.removeNamedItem */
+  Node removeNamedItem(String name) native;
+
+  /** @domName NamedNodeMap.removeNamedItemNS */
+  Node removeNamedItemNS(String namespaceURI, String localName) native;
+
+  /** @domName NamedNodeMap.setNamedItem */
+  Node setNamedItem(Node node) native;
+
+  /** @domName NamedNodeMap.setNamedItemNS */
+  Node setNamedItemNS(Node node) native;
+}
+
+/// @domName Navigator
+class Navigator native "*Navigator" {
+
+  /** @domName Navigator.appCodeName */
+  final String appCodeName;
+
+  /** @domName Navigator.appName */
+  final String appName;
+
+  /** @domName Navigator.appVersion */
+  final String appVersion;
+
+  /** @domName Navigator.cookieEnabled */
+  final bool cookieEnabled;
+
+  /** @domName Navigator.geolocation */
+  final Geolocation geolocation;
+
+  /** @domName Navigator.language */
+  final String language;
+
+  /** @domName Navigator.mimeTypes */
+  final DOMMimeTypeArray mimeTypes;
+
+  /** @domName Navigator.onLine */
+  final bool onLine;
+
+  /** @domName Navigator.platform */
+  final String platform;
+
+  /** @domName Navigator.plugins */
+  final DOMPluginArray plugins;
+
+  /** @domName Navigator.product */
+  final String product;
+
+  /** @domName Navigator.productSub */
+  final String productSub;
+
+  /** @domName Navigator.userAgent */
+  final String userAgent;
+
+  /** @domName Navigator.vendor */
+  final String vendor;
+
+  /** @domName Navigator.vendorSub */
+  final String vendorSub;
+
+  /** @domName Navigator.webkitBattery */
+  final BatteryManager webkitBattery;
+
+  /** @domName Navigator.getStorageUpdates */
+  void getStorageUpdates() native;
+
+  /** @domName Navigator.javaEnabled */
+  bool javaEnabled() native;
+
+  /** @domName Navigator.webkitGetGamepads */
+  List<Gamepad> webkitGetGamepads() native;
+
+  /** @domName Navigator.webkitGetUserMedia */
+  void webkitGetUserMedia(Map options, NavigatorUserMediaSuccessCallback successCallback, [errorCallback]) {
+    if (?errorCallback) {
+      var options_1 = _convertDartToNative_Dictionary(options);
+      _webkitGetUserMedia_1(options_1, successCallback, errorCallback);
+      return;
+    }
+    var options_2 = _convertDartToNative_Dictionary(options);
+    _webkitGetUserMedia_2(options_2, successCallback);
+    return;
+  }
+  void _webkitGetUserMedia_1(options, NavigatorUserMediaSuccessCallback successCallback, NavigatorUserMediaErrorCallback errorCallback) native "webkitGetUserMedia";
+  void _webkitGetUserMedia_2(options, NavigatorUserMediaSuccessCallback successCallback) native "webkitGetUserMedia";
+}
+
+/// @domName NavigatorUserMediaError
+class NavigatorUserMediaError native "*NavigatorUserMediaError" {
+
+  static const int PERMISSION_DENIED = 1;
+
+  /** @domName NavigatorUserMediaError.code */
+  final int code;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void NavigatorUserMediaErrorCallback(NavigatorUserMediaError error);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void NavigatorUserMediaSuccessCallback(LocalMediaStream stream);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Lazy implementation of the child nodes of an element that does not request
+ * the actual child nodes of an element until strictly necessary greatly
+ * improving performance for the typical cases where it is not required.
+ */
+class _ChildNodeListLazy implements List {
+  final Node _this;
+
+  _ChildNodeListLazy(this._this);
+
+
+  Node get first => JS('Node', '#.firstChild', _this);
+  Node get last => JS('Node', '#.lastChild', _this);
+
+  void add(Node value) {
+    _this.$dom_appendChild(value);
+  }
+
+  void addLast(Node value) {
+    _this.$dom_appendChild(value);
+  }
+
+
+  void addAll(Collection<Node> collection) {
+    for (Node node in collection) {
+      _this.$dom_appendChild(node);
+    }
+  }
+
+  Node removeLast() {
+    final result = last;
+    if (result != null) {
+      _this.$dom_removeChild(result);
+    }
+    return result;
+  }
+
+  void clear() {
+    _this.text = '';
+  }
+
+  void operator []=(int index, Node value) {
+    _this.$dom_replaceChild(value, this[index]);
+  }
+
+  Iterator<Node> iterator() => _this.$dom_childNodes.iterator();
+
+  // TODO(jacobr): We can implement these methods much more efficiently by
+  // looking up the nodeList only once instead of once per iteration.
+  bool contains(Node element) => _Collections.contains(this, element);
+
+  void forEach(void f(Node element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Node element)) => _Collections.map(this, [], f);
+
+  Collection<Node> filter(bool f(Node element)) =>
+     new _NodeListWrapper(_Collections.filter(this, <Node>[], f));
+
+  bool every(bool f(Node element)) => _Collections.every(this, f);
+
+  bool some(bool f(Node element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Node>:
+
+  // TODO(jacobr): this could be implemented for child node lists.
+  // The exception we throw here is misleading.
+  void sort([Comparator<Node> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Node element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Node element, [int start = 0]) =>
+      _Lists.lastIndexOf(this, element, start);
+
+  // FIXME: implement these.
+  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
+    throw new UnsupportedError(
+        "Cannot setRange on immutable List.");
+  }
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError(
+        "Cannot removeRange on immutable List.");
+  }
+  void insertRange(int start, int rangeLength, [Node initialValue]) {
+    throw new UnsupportedError(
+        "Cannot insertRange on immutable List.");
+  }
+  List<Node> getRange(int start, int rangeLength) =>
+    new _NodeListWrapper(_Lists.getRange(this, start, rangeLength, <Node>[]));
+
+  // -- end List<Node> mixins.
+
+  // TODO(jacobr): benchmark whether this is more efficient or whether caching
+  // a local copy of $dom_childNodes is more efficient.
+  int get length => _this.$dom_childNodes.length;
+
+  Node operator[](int index) => _this.$dom_childNodes[index];
+}
+
+class Node extends EventTarget native "*Node" {
+  _ChildNodeListLazy get nodes {
+    return new _ChildNodeListLazy(this);
+  }
+
+  void set nodes(Collection<Node> value) {
+    // Copy list first since we don't want liveness during iteration.
+    // TODO(jacobr): there is a better way to do this.
+    List copy = new List.from(value);
+    text = '';
+    for (Node node in copy) {
+      $dom_appendChild(node);
+    }
+  }
+
+  /**
+   * Removes this node from the DOM.
+   * @domName Node.removeChild
+   */
+  void remove() {
+    // TODO(jacobr): should we throw an exception if parent is already null?
+    // TODO(vsm): Use the native remove when available.
+    if (this.parent != null) {
+      final Node parent = this.parent;
+      parent.$dom_removeChild(this);
+    }
+  }
+
+  /**
+   * Replaces this node with another node.
+   * @domName Node.replaceChild
+   */
+  Node replaceWith(Node otherNode) {
+    try {
+      final Node parent = this.parent;
+      parent.$dom_replaceChild(otherNode, this);
+    } catch (e) {
+
+    };
+    return this;
+  }
+
+
+  static const int ATTRIBUTE_NODE = 2;
+
+  static const int CDATA_SECTION_NODE = 4;
+
+  static const int COMMENT_NODE = 8;
+
+  static const int DOCUMENT_FRAGMENT_NODE = 11;
+
+  static const int DOCUMENT_NODE = 9;
+
+  static const int DOCUMENT_POSITION_CONTAINED_BY = 0x10;
+
+  static const int DOCUMENT_POSITION_CONTAINS = 0x08;
+
+  static const int DOCUMENT_POSITION_DISCONNECTED = 0x01;
+
+  static const int DOCUMENT_POSITION_FOLLOWING = 0x04;
+
+  static const int DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
+
+  static const int DOCUMENT_POSITION_PRECEDING = 0x02;
+
+  static const int DOCUMENT_TYPE_NODE = 10;
+
+  static const int ELEMENT_NODE = 1;
+
+  static const int ENTITY_NODE = 6;
+
+  static const int ENTITY_REFERENCE_NODE = 5;
+
+  static const int NOTATION_NODE = 12;
+
+  static const int PROCESSING_INSTRUCTION_NODE = 7;
+
+  static const int TEXT_NODE = 3;
+
+  /** @domName Node.attributes */
+  NamedNodeMap get $dom_attributes => JS("NamedNodeMap", "#.attributes", this);
+
+  /** @domName Node.childNodes */
+  List<Node> get $dom_childNodes => JS("List<Node>", "#.childNodes", this);
+
+  /** @domName Node.firstChild */
+  Node get $dom_firstChild => JS("Node", "#.firstChild", this);
+
+  /** @domName Node.lastChild */
+  Node get $dom_lastChild => JS("Node", "#.lastChild", this);
+
+  /** @domName Node.nextSibling */
+  Node get nextNode => JS("Node", "#.nextSibling", this);
+
+  /** @domName Node.nodeType */
+  int get $dom_nodeType => JS("int", "#.nodeType", this);
+
+  /** @domName Node.ownerDocument */
+  Document get document => JS("Document", "#.ownerDocument", this);
+
+  /** @domName Node.parentNode */
+  Node get parent => JS("Node", "#.parentNode", this);
+
+  /** @domName Node.previousSibling */
+  Node get previousNode => JS("Node", "#.previousSibling", this);
+
+  /** @domName Node.textContent */
+  String get text => JS("String", "#.textContent", this);
+
+  /** @domName Node.textContent */
+  void set text(String value) {
+    JS("void", "#.textContent = #", this, value);
+  }
+
+  /** @domName Node.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName Node.appendChild */
+  Node $dom_appendChild(Node newChild) native "appendChild";
+
+  /** @domName Node.cloneNode */
+  Node clone(bool deep) native "cloneNode";
+
+  /** @domName Node.contains */
+  bool contains(Node other) native;
+
+  /** @domName Node.dispatchEvent */
+  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+
+  /** @domName Node.hasChildNodes */
+  bool hasChildNodes() native;
+
+  /** @domName Node.insertBefore */
+  Node insertBefore(Node newChild, Node refChild) native;
+
+  /** @domName Node.removeChild */
+  Node $dom_removeChild(Node oldChild) native "removeChild";
+
+  /** @domName Node.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName Node.replaceChild */
+  Node $dom_replaceChild(Node newChild, Node oldChild) native "replaceChild";
+
+}
+
+/// @domName NodeFilter
+class NodeFilter native "*NodeFilter" {
+
+  static const int FILTER_ACCEPT = 1;
+
+  static const int FILTER_REJECT = 2;
+
+  static const int FILTER_SKIP = 3;
+
+  static const int SHOW_ALL = 0xFFFFFFFF;
+
+  static const int SHOW_ATTRIBUTE = 0x00000002;
+
+  static const int SHOW_CDATA_SECTION = 0x00000008;
+
+  static const int SHOW_COMMENT = 0x00000080;
+
+  static const int SHOW_DOCUMENT = 0x00000100;
+
+  static const int SHOW_DOCUMENT_FRAGMENT = 0x00000400;
+
+  static const int SHOW_DOCUMENT_TYPE = 0x00000200;
+
+  static const int SHOW_ELEMENT = 0x00000001;
+
+  static const int SHOW_ENTITY = 0x00000020;
+
+  static const int SHOW_ENTITY_REFERENCE = 0x00000010;
+
+  static const int SHOW_NOTATION = 0x00000800;
+
+  static const int SHOW_PROCESSING_INSTRUCTION = 0x00000040;
+
+  static const int SHOW_TEXT = 0x00000004;
+
+  /** @domName NodeFilter.acceptNode */
+  int acceptNode(Node n) native;
+}
+
+/// @domName NodeIterator
+class NodeIterator native "*NodeIterator" {
+
+  /** @domName NodeIterator.expandEntityReferences */
+  final bool expandEntityReferences;
+
+  /** @domName NodeIterator.filter */
+  final NodeFilter filter;
+
+  /** @domName NodeIterator.pointerBeforeReferenceNode */
+  final bool pointerBeforeReferenceNode;
+
+  /** @domName NodeIterator.referenceNode */
+  final Node referenceNode;
+
+  /** @domName NodeIterator.root */
+  final Node root;
+
+  /** @domName NodeIterator.whatToShow */
+  final int whatToShow;
+
+  /** @domName NodeIterator.detach */
+  void detach() native;
+
+  /** @domName NodeIterator.nextNode */
+  Node nextNode() native;
+
+  /** @domName NodeIterator.previousNode */
+  Node previousNode() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(nweiz): when all implementations we target have the same name for the
+// coreimpl implementation of List<E>, extend that rather than wrapping.
+class _ListWrapper<E> implements List<E> {
+  List _list;
+
+  _ListWrapper(List this._list);
+
+  Iterator<E> iterator() => _list.iterator();
+
+  bool contains(E element) => _list.contains(element);
+
+  void forEach(void f(E element)) => _list.forEach(f);
+
+  Collection map(f(E element)) => _list.map(f);
+
+  List<E> filter(bool f(E element)) => _list.filter(f);
+
+  bool every(bool f(E element)) => _list.every(f);
+
+  bool some(bool f(E element)) => _list.some(f);
+
+  bool get isEmpty => _list.isEmpty;
+
+  int get length => _list.length;
+
+  E operator [](int index) => _list[index];
+
+  void operator []=(int index, E value) { _list[index] = value; }
+
+  void set length(int newLength) { _list.length = newLength; }
+
+  void add(E value) => _list.add(value);
+
+  void addLast(E value) => _list.addLast(value);
+
+  void addAll(Collection<E> collection) => _list.addAll(collection);
+
+  void sort([Comparator<E> compare = Comparable.compare]) => _list.sort(compare);
+
+  int indexOf(E element, [int start = 0]) => _list.indexOf(element, start);
+
+  int lastIndexOf(E element, [int start = 0]) =>
+    _list.lastIndexOf(element, start);
+
+  void clear() => _list.clear();
+
+  E removeLast() => _list.removeLast();
+
+  E get last => _list.last;
+
+  List<E> getRange(int start, int rangeLength) =>
+    _list.getRange(start, rangeLength);
+
+  void setRange(int start, int rangeLength, List<E> from, [int startFrom = 0])
+      => _list.setRange(start, rangeLength, from, startFrom);
+
+  void removeRange(int start, int rangeLength) =>
+    _list.removeRange(start, rangeLength);
+
+  void insertRange(int start, int rangeLength, [E initialValue = null]) =>
+    _list.insertRange(start, rangeLength, initialValue);
+
+  E get first => _list[0];
+}
+
+/**
+ * This class is used to insure the results of list operations are NodeLists
+ * instead of lists.
+ */
+class _NodeListWrapper extends _ListWrapper<Node> implements List {
+  _NodeListWrapper(List list) : super(list);
+
+  List<Node> filter(bool f(Node element)) =>
+    new _NodeListWrapper(_list.filter(f));
+
+  List<Node> getRange(int start, int rangeLength) =>
+    new _NodeListWrapper(_list.getRange(start, rangeLength));
+}
+
+class NodeList implements JavaScriptIndexingBehavior, List<Node> native "*NodeList" {
+  Node _parent;
+
+  // -- start List<Node> mixins.
+  // Node is the element type.
+
+  // From Iterable<Node>:
+
+  Iterator<Node> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<Node>(this);
+  }
+
+  // From Collection<Node>:
+
+  void add(Node value) {
+    _parent.$dom_appendChild(value);
+  }
+
+  void addLast(Node value) {
+    _parent.$dom_appendChild(value);
+  }
+
+  void addAll(Collection<Node> collection) {
+    for (Node node in collection) {
+      _parent.$dom_appendChild(node);
+    }
+  }
+
+  Node removeLast() {
+    final result = this.last;
+    if (result != null) {
+      _parent.$dom_removeChild(result);
+    }
+    return result;
+  }
+
+  void clear() {
+    _parent.text = '';
+  }
+
+  void operator []=(int index, Node value) {
+    _parent.$dom_replaceChild(value, this[index]);
+  }
+
+  bool contains(Node element) => _Collections.contains(this, element);
+
+  void forEach(void f(Node element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Node element)) => _Collections.map(this, [], f);
+
+  Collection<Node> filter(bool f(Node element)) =>
+     new _NodeListWrapper(_Collections.filter(this, <Node>[], f));
+
+  bool every(bool f(Node element)) => _Collections.every(this, f);
+
+  bool some(bool f(Node element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Node>:
+
+  void sort([Comparator<Node> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Node element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Node element, [int start = 0]) =>
+      _Lists.lastIndexOf(this, element, start);
+
+  Node get last => this[length - 1];
+  Node get first => this[0];
+
+  // FIXME: implement thesee.
+  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+  void insertRange(int start, int rangeLength, [Node initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+  List<Node> getRange(int start, int rangeLength) =>
+    new _NodeListWrapper(_Lists.getRange(this, start, rangeLength, <Node>[]));
+
+  // -- end List<Node> mixins.
+
+
+  /** @domName NodeList.length */
+  final int length;
+
+  Node operator[](int index) => JS("Node", "#[#]", this, index);
+
+  /** @domName NodeList.item */
+  Node _item(int index) native "item";
+
+}
+
+/// @domName Notation
+class Notation extends Node native "*Notation" {
+
+  /** @domName Notation.publicId */
+  final String publicId;
+
+  /** @domName Notation.systemId */
+  final String systemId;
+}
+
+/// @domName Notification
+class Notification extends EventTarget native "*Notification" {
+
+  factory Notification(String title, [Map options]) {
+    if (!?options) {
+      return _NotificationFactoryProvider.createNotification(title);
+    }
+    return _NotificationFactoryProvider.createNotification(title, options);
+  }
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  NotificationEvents get on =>
+    new NotificationEvents(this);
+
+  /** @domName Notification.dir */
+  String dir;
+
+  /** @domName Notification.permission */
+  final String permission;
+
+  /** @domName Notification.replaceId */
+  String replaceId;
+
+  /** @domName Notification.tag */
+  String tag;
+
+  /** @domName Notification.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName Notification.cancel */
+  void cancel() native;
+
+  /** @domName Notification.close */
+  void close() native;
+
+  /** @domName Notification.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName Notification.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName Notification.requestPermission */
+  static void requestPermission(NotificationPermissionCallback callback) native;
+
+  /** @domName Notification.show */
+  void show() native;
+}
+
+class NotificationEvents extends Events {
+  NotificationEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get click => this['click'];
+
+  EventListenerList get close => this['close'];
+
+  EventListenerList get display => this['display'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get show => this['show'];
+}
+
+/// @domName NotificationCenter
+class NotificationCenter native "*NotificationCenter" {
+
+  /** @domName NotificationCenter.checkPermission */
+  int checkPermission() native;
+
+  /** @domName NotificationCenter.createHTMLNotification */
+  Notification createHTMLNotification(String url) native;
+
+  /** @domName NotificationCenter.createNotification */
+  Notification createNotification(String iconUrl, String title, String body) native;
+
+  /** @domName NotificationCenter.requestPermission */
+  void requestPermission(VoidCallback callback) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void NotificationPermissionCallback(String permission);
+
+/// @domName OESElementIndexUint
+class OESElementIndexUint native "*OESElementIndexUint" {
+}
+
+/// @domName OESStandardDerivatives
+class OESStandardDerivatives native "*OESStandardDerivatives" {
+
+  static const int FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;
+}
+
+/// @domName OESTextureFloat
+class OESTextureFloat native "*OESTextureFloat" {
+}
+
+/// @domName OESVertexArrayObject
+class OESVertexArrayObject native "*OESVertexArrayObject" {
+
+  static const int VERTEX_ARRAY_BINDING_OES = 0x85B5;
+
+  /** @domName OESVertexArrayObject.bindVertexArrayOES */
+  void bindVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native;
+
+  /** @domName OESVertexArrayObject.createVertexArrayOES */
+  WebGLVertexArrayObjectOES createVertexArrayOES() native;
+
+  /** @domName OESVertexArrayObject.deleteVertexArrayOES */
+  void deleteVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native;
+
+  /** @domName OESVertexArrayObject.isVertexArrayOES */
+  bool isVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native;
+}
+
+/// @domName HTMLOListElement
+class OListElement extends Element implements Element native "*HTMLOListElement" {
+
+  factory OListElement() => _Elements.createOListElement();
+
+  /** @domName HTMLOListElement.compact */
+  bool compact;
+
+  /** @domName HTMLOListElement.reversed */
+  bool reversed;
+
+  /** @domName HTMLOListElement.start */
+  int start;
+
+  /** @domName HTMLOListElement.type */
+  String type;
+}
+
+/// @domName HTMLObjectElement
+class ObjectElement extends Element implements Element native "*HTMLObjectElement" {
+
+  factory ObjectElement() => _Elements.createObjectElement();
+
+  /** @domName HTMLObjectElement.align */
+  String align;
+
+  /** @domName HTMLObjectElement.archive */
+  String archive;
+
+  /** @domName HTMLObjectElement.border */
+  String border;
+
+  /** @domName HTMLObjectElement.code */
+  String code;
+
+  /** @domName HTMLObjectElement.codeBase */
+  String codeBase;
+
+  /** @domName HTMLObjectElement.codeType */
+  String codeType;
+
+  /** @domName HTMLObjectElement.data */
+  String data;
+
+  /** @domName HTMLObjectElement.declare */
+  bool declare;
+
+  /** @domName HTMLObjectElement.form */
+  final FormElement form;
+
+  /** @domName HTMLObjectElement.height */
+  String height;
+
+  /** @domName HTMLObjectElement.hspace */
+  int hspace;
+
+  /** @domName HTMLObjectElement.name */
+  String name;
+
+  /** @domName HTMLObjectElement.standby */
+  String standby;
+
+  /** @domName HTMLObjectElement.type */
+  String type;
+
+  /** @domName HTMLObjectElement.useMap */
+  String useMap;
+
+  /** @domName HTMLObjectElement.validationMessage */
+  final String validationMessage;
+
+  /** @domName HTMLObjectElement.validity */
+  final ValidityState validity;
+
+  /** @domName HTMLObjectElement.vspace */
+  int vspace;
+
+  /** @domName HTMLObjectElement.width */
+  String width;
+
+  /** @domName HTMLObjectElement.willValidate */
+  final bool willValidate;
+
+  /** @domName HTMLObjectElement.checkValidity */
+  bool checkValidity() native;
+
+  /** @domName HTMLObjectElement.setCustomValidity */
+  void setCustomValidity(String error) native;
+}
+
+/// @domName OfflineAudioCompletionEvent
+class OfflineAudioCompletionEvent extends Event native "*OfflineAudioCompletionEvent" {
+
+  /** @domName OfflineAudioCompletionEvent.renderedBuffer */
+  final AudioBuffer renderedBuffer;
+}
+
+/// @domName HTMLOptGroupElement
+class OptGroupElement extends Element implements Element native "*HTMLOptGroupElement" {
+
+  factory OptGroupElement() => _Elements.createOptGroupElement();
+
+  /** @domName HTMLOptGroupElement.disabled */
+  bool disabled;
+
+  /** @domName HTMLOptGroupElement.label */
+  String label;
+}
+
+/// @domName HTMLOptionElement
+class OptionElement extends Element implements Element native "*HTMLOptionElement" {
+
+  factory OptionElement([String data, String value, bool defaultSelected, bool selected]) {
+    if (!?data) {
+      return _OptionElementFactoryProvider.createOptionElement();
+    }
+    if (!?value) {
+      return _OptionElementFactoryProvider.createOptionElement(data);
+    }
+    if (!?defaultSelected) {
+      return _OptionElementFactoryProvider.createOptionElement(data, value);
+    }
+    if (!?selected) {
+      return _OptionElementFactoryProvider.createOptionElement(data, value, defaultSelected);
+    }
+    return _OptionElementFactoryProvider.createOptionElement(data, value, defaultSelected, selected);
+  }
+
+  /** @domName HTMLOptionElement.defaultSelected */
+  bool defaultSelected;
+
+  /** @domName HTMLOptionElement.disabled */
+  bool disabled;
+
+  /** @domName HTMLOptionElement.form */
+  final FormElement form;
+
+  /** @domName HTMLOptionElement.index */
+  final int index;
+
+  /** @domName HTMLOptionElement.label */
+  String label;
+
+  /** @domName HTMLOptionElement.selected */
+  bool selected;
+
+  /** @domName HTMLOptionElement.value */
+  String value;
+}
+
+/// @domName OscillatorNode
+class OscillatorNode extends AudioSourceNode native "*OscillatorNode" {
+
+  static const int CUSTOM = 4;
+
+  static const int FINISHED_STATE = 3;
+
+  static const int PLAYING_STATE = 2;
+
+  static const int SAWTOOTH = 2;
+
+  static const int SCHEDULED_STATE = 1;
+
+  static const int SINE = 0;
+
+  static const int SQUARE = 1;
+
+  static const int TRIANGLE = 3;
+
+  static const int UNSCHEDULED_STATE = 0;
+
+  /** @domName OscillatorNode.detune */
+  final AudioParam detune;
+
+  /** @domName OscillatorNode.frequency */
+  final AudioParam frequency;
+
+  /** @domName OscillatorNode.playbackState */
+  final int playbackState;
+
+  /** @domName OscillatorNode.type */
+  int type;
+
+  /** @domName OscillatorNode.setWaveTable */
+  void setWaveTable(WaveTable waveTable) native;
+
+  /** @domName OscillatorNode.start */
+  void start(num when) native;
+
+  /** @domName OscillatorNode.stop */
+  void stop(num when) native;
+}
+
+/// @domName HTMLOutputElement
+class OutputElement extends Element implements Element native "*HTMLOutputElement" {
+
+  factory OutputElement() => _Elements.createOutputElement();
+
+  /** @domName HTMLOutputElement.defaultValue */
+  String defaultValue;
+
+  /** @domName HTMLOutputElement.form */
+  final FormElement form;
+
+  /** @domName HTMLOutputElement.htmlFor */
+  DOMSettableTokenList htmlFor;
+
+  /** @domName HTMLOutputElement.labels */
+  final List<Node> labels;
+
+  /** @domName HTMLOutputElement.name */
+  String name;
+
+  /** @domName HTMLOutputElement.type */
+  final String type;
+
+  /** @domName HTMLOutputElement.validationMessage */
+  final String validationMessage;
+
+  /** @domName HTMLOutputElement.validity */
+  final ValidityState validity;
+
+  /** @domName HTMLOutputElement.value */
+  String value;
+
+  /** @domName HTMLOutputElement.willValidate */
+  final bool willValidate;
+
+  /** @domName HTMLOutputElement.checkValidity */
+  bool checkValidity() native;
+
+  /** @domName HTMLOutputElement.setCustomValidity */
+  void setCustomValidity(String error) native;
+}
+
+/// @domName OverflowEvent
+class OverflowEvent extends Event native "*OverflowEvent" {
+
+  static const int BOTH = 2;
+
+  static const int HORIZONTAL = 0;
+
+  static const int VERTICAL = 1;
+
+  /** @domName OverflowEvent.horizontalOverflow */
+  final bool horizontalOverflow;
+
+  /** @domName OverflowEvent.orient */
+  final int orient;
+
+  /** @domName OverflowEvent.verticalOverflow */
+  final bool verticalOverflow;
+}
+
+/// @domName PagePopupController
+class PagePopupController native "*PagePopupController" {
+
+  /** @domName PagePopupController.localizeNumberString */
+  String localizeNumberString(String numberString) native;
+
+  /** @domName PagePopupController.setValueAndClosePopup */
+  void setValueAndClosePopup(int numberValue, String stringValue) native;
+}
+
+/// @domName PageTransitionEvent
+class PageTransitionEvent extends Event native "*PageTransitionEvent" {
+
+  /** @domName PageTransitionEvent.persisted */
+  final bool persisted;
+}
+
+/// @domName PannerNode
+class PannerNode extends AudioNode native "*PannerNode" {
+
+  static const int EQUALPOWER = 0;
+
+  static const int EXPONENTIAL_DISTANCE = 2;
+
+  static const int HRTF = 1;
+
+  static const int INVERSE_DISTANCE = 1;
+
+  static const int LINEAR_DISTANCE = 0;
+
+  static const int SOUNDFIELD = 2;
+
+  /** @domName PannerNode.coneGain */
+  final AudioGain coneGain;
+
+  /** @domName PannerNode.coneInnerAngle */
+  num coneInnerAngle;
+
+  /** @domName PannerNode.coneOuterAngle */
+  num coneOuterAngle;
+
+  /** @domName PannerNode.coneOuterGain */
+  num coneOuterGain;
+
+  /** @domName PannerNode.distanceGain */
+  final AudioGain distanceGain;
+
+  /** @domName PannerNode.distanceModel */
+  int distanceModel;
+
+  /** @domName PannerNode.maxDistance */
+  num maxDistance;
+
+  /** @domName PannerNode.panningModel */
+  int panningModel;
+
+  /** @domName PannerNode.refDistance */
+  num refDistance;
+
+  /** @domName PannerNode.rolloffFactor */
+  num rolloffFactor;
+
+  /** @domName PannerNode.setOrientation */
+  void setOrientation(num x, num y, num z) native;
+
+  /** @domName PannerNode.setPosition */
+  void setPosition(num x, num y, num z) native;
+
+  /** @domName PannerNode.setVelocity */
+  void setVelocity(num x, num y, num z) native;
+}
+
+/// @domName HTMLParagraphElement
+class ParagraphElement extends Element implements Element native "*HTMLParagraphElement" {
+
+  factory ParagraphElement() => _Elements.createParagraphElement();
+
+  /** @domName HTMLParagraphElement.align */
+  String align;
+}
+
+/// @domName HTMLParamElement
+class ParamElement extends Element implements Element native "*HTMLParamElement" {
+
+  factory ParamElement() => _Elements.createParamElement();
+
+  /** @domName HTMLParamElement.name */
+  String name;
+
+  /** @domName HTMLParamElement.type */
+  String type;
+
+  /** @domName HTMLParamElement.value */
+  String value;
+
+  /** @domName HTMLParamElement.valueType */
+  String valueType;
+}
+
+/// @domName PeerConnection00
+class PeerConnection00 extends EventTarget native "*PeerConnection00" {
+
+  factory PeerConnection00(String serverConfiguration, IceCallback iceCallback) => _PeerConnection00FactoryProvider.createPeerConnection00(serverConfiguration, iceCallback);
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  PeerConnection00Events get on =>
+    new PeerConnection00Events(this);
+
+  static const int ACTIVE = 2;
+
+  static const int CLOSED = 3;
+
+  static const int ICE_CHECKING = 0x300;
+
+  static const int ICE_CLOSED = 0x700;
+
+  static const int ICE_COMPLETED = 0x500;
+
+  static const int ICE_CONNECTED = 0x400;
+
+  static const int ICE_FAILED = 0x600;
+
+  static const int ICE_GATHERING = 0x100;
+
+  static const int ICE_WAITING = 0x200;
+
+  static const int NEW = 0;
+
+  static const int OPENING = 1;
+
+  static const int SDP_ANSWER = 0x300;
+
+  static const int SDP_OFFER = 0x100;
+
+  static const int SDP_PRANSWER = 0x200;
+
+  /** @domName PeerConnection00.iceState */
+  final int iceState;
+
+  /** @domName PeerConnection00.localDescription */
+  final SessionDescription localDescription;
+
+  /** @domName PeerConnection00.localStreams */
+  final List<MediaStream> localStreams;
+
+  /** @domName PeerConnection00.readyState */
+  final int readyState;
+
+  /** @domName PeerConnection00.remoteDescription */
+  final SessionDescription remoteDescription;
+
+  /** @domName PeerConnection00.remoteStreams */
+  final List<MediaStream> remoteStreams;
+
+  /** @domName PeerConnection00.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName PeerConnection00.addStream */
+  void addStream(MediaStream stream, [mediaStreamHints]) {
+    if (?mediaStreamHints) {
+      var mediaStreamHints_1 = _convertDartToNative_Dictionary(mediaStreamHints);
+      _addStream_1(stream, mediaStreamHints_1);
+      return;
+    }
+    _addStream_2(stream);
+    return;
+  }
+  void _addStream_1(MediaStream stream, mediaStreamHints) native "addStream";
+  void _addStream_2(MediaStream stream) native "addStream";
+
+  /** @domName PeerConnection00.close */
+  void close() native;
+
+  /** @domName PeerConnection00.createAnswer */
+  SessionDescription createAnswer(String offer, [mediaHints]) {
+    if (?mediaHints) {
+      var mediaHints_1 = _convertDartToNative_Dictionary(mediaHints);
+      return _createAnswer_1(offer, mediaHints_1);
+    }
+    return _createAnswer_2(offer);
+  }
+  SessionDescription _createAnswer_1(offer, mediaHints) native "createAnswer";
+  SessionDescription _createAnswer_2(offer) native "createAnswer";
+
+  /** @domName PeerConnection00.createOffer */
+  SessionDescription createOffer([mediaHints]) {
+    if (?mediaHints) {
+      var mediaHints_1 = _convertDartToNative_Dictionary(mediaHints);
+      return _createOffer_1(mediaHints_1);
+    }
+    return _createOffer_2();
+  }
+  SessionDescription _createOffer_1(mediaHints) native "createOffer";
+  SessionDescription _createOffer_2() native "createOffer";
+
+  /** @domName PeerConnection00.dispatchEvent */
+  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+
+  /** @domName PeerConnection00.processIceMessage */
+  void processIceMessage(IceCandidate candidate) native;
+
+  /** @domName PeerConnection00.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName PeerConnection00.removeStream */
+  void removeStream(MediaStream stream) native;
+
+  /** @domName PeerConnection00.setLocalDescription */
+  void setLocalDescription(int action, SessionDescription desc) native;
+
+  /** @domName PeerConnection00.setRemoteDescription */
+  void setRemoteDescription(int action, SessionDescription desc) native;
+
+  /** @domName PeerConnection00.startIce */
+  void startIce([iceOptions]) {
+    if (?iceOptions) {
+      var iceOptions_1 = _convertDartToNative_Dictionary(iceOptions);
+      _startIce_1(iceOptions_1);
+      return;
+    }
+    _startIce_2();
+    return;
+  }
+  void _startIce_1(iceOptions) native "startIce";
+  void _startIce_2() native "startIce";
+}
+
+class PeerConnection00Events extends Events {
+  PeerConnection00Events(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get addStream => this['addstream'];
+
+  EventListenerList get connecting => this['connecting'];
+
+  EventListenerList get open => this['open'];
+
+  EventListenerList get removeStream => this['removestream'];
+
+  EventListenerList get stateChange => this['statechange'];
+}
+
+/// @domName Performance
+class Performance extends EventTarget native "*Performance" {
+
+  /** @domName Performance.memory */
+  final MemoryInfo memory;
+
+  /** @domName Performance.navigation */
+  final PerformanceNavigation navigation;
+
+  /** @domName Performance.timing */
+  final PerformanceTiming timing;
+
+  /** @domName Performance.now */
+  num now() native;
+}
+
+/// @domName PerformanceNavigation
+class PerformanceNavigation native "*PerformanceNavigation" {
+
+  static const int TYPE_BACK_FORWARD = 2;
+
+  static const int TYPE_NAVIGATE = 0;
+
+  static const int TYPE_RELOAD = 1;
+
+  static const int TYPE_RESERVED = 255;
+
+  /** @domName PerformanceNavigation.redirectCount */
+  final int redirectCount;
+
+  /** @domName PerformanceNavigation.type */
+  final int type;
+}
+
+/// @domName PerformanceTiming
+class PerformanceTiming native "*PerformanceTiming" {
+
+  /** @domName PerformanceTiming.connectEnd */
+  final int connectEnd;
+
+  /** @domName PerformanceTiming.connectStart */
+  final int connectStart;
+
+  /** @domName PerformanceTiming.domComplete */
+  final int domComplete;
+
+  /** @domName PerformanceTiming.domContentLoadedEventEnd */
+  final int domContentLoadedEventEnd;
+
+  /** @domName PerformanceTiming.domContentLoadedEventStart */
+  final int domContentLoadedEventStart;
+
+  /** @domName PerformanceTiming.domInteractive */
+  final int domInteractive;
+
+  /** @domName PerformanceTiming.domLoading */
+  final int domLoading;
+
+  /** @domName PerformanceTiming.domainLookupEnd */
+  final int domainLookupEnd;
+
+  /** @domName PerformanceTiming.domainLookupStart */
+  final int domainLookupStart;
+
+  /** @domName PerformanceTiming.fetchStart */
+  final int fetchStart;
+
+  /** @domName PerformanceTiming.loadEventEnd */
+  final int loadEventEnd;
+
+  /** @domName PerformanceTiming.loadEventStart */
+  final int loadEventStart;
+
+  /** @domName PerformanceTiming.navigationStart */
+  final int navigationStart;
+
+  /** @domName PerformanceTiming.redirectEnd */
+  final int redirectEnd;
+
+  /** @domName PerformanceTiming.redirectStart */
+  final int redirectStart;
+
+  /** @domName PerformanceTiming.requestStart */
+  final int requestStart;
+
+  /** @domName PerformanceTiming.responseEnd */
+  final int responseEnd;
+
+  /** @domName PerformanceTiming.responseStart */
+  final int responseStart;
+
+  /** @domName PerformanceTiming.secureConnectionStart */
+  final int secureConnectionStart;
+
+  /** @domName PerformanceTiming.unloadEventEnd */
+  final int unloadEventEnd;
+
+  /** @domName PerformanceTiming.unloadEventStart */
+  final int unloadEventStart;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+class Point native "*WebKitPoint" {
+  factory Point(num x, num y) => _PointFactoryProvider.createPoint(x, y);
+
+  /** @domName WebKitPoint.x */
+  num x;
+
+  /** @domName WebKitPoint.y */
+  num y;
+
+}
+
+/// @domName PopStateEvent
+class PopStateEvent extends Event native "*PopStateEvent" {
+
+  /** @domName PopStateEvent.state */
+  dynamic get state => _convertNativeToDart_SerializedScriptValue(this._state);
+  dynamic get _state => JS("dynamic", "#.state", this);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void PositionCallback(Geoposition position);
+
+/// @domName PositionError
+class PositionError native "*PositionError" {
+
+  static const int PERMISSION_DENIED = 1;
+
+  static const int POSITION_UNAVAILABLE = 2;
+
+  static const int TIMEOUT = 3;
+
+  /** @domName PositionError.code */
+  final int code;
+
+  /** @domName PositionError.message */
+  final String message;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void PositionErrorCallback(PositionError error);
+
+/// @domName HTMLPreElement
+class PreElement extends Element implements Element native "*HTMLPreElement" {
+
+  factory PreElement() => _Elements.createPreElement();
+
+  /** @domName HTMLPreElement.width */
+  int width;
+
+  /** @domName HTMLPreElement.wrap */
+  bool wrap;
+}
+
+/// @domName ProcessingInstruction
+class ProcessingInstruction extends Node native "*ProcessingInstruction" {
+
+  /** @domName ProcessingInstruction.data */
+  String data;
+
+  /** @domName ProcessingInstruction.sheet */
+  final StyleSheet sheet;
+
+  /** @domName ProcessingInstruction.target */
+  final String target;
+}
+
+/// @domName HTMLProgressElement
+class ProgressElement extends Element implements Element native "*HTMLProgressElement" {
+
+  factory ProgressElement() => _Elements.createProgressElement();
+
+  /** @domName HTMLProgressElement.labels */
+  final List<Node> labels;
+
+  /** @domName HTMLProgressElement.max */
+  num max;
+
+  /** @domName HTMLProgressElement.position */
+  final num position;
+
+  /** @domName HTMLProgressElement.value */
+  num value;
+}
+
+/// @domName ProgressEvent
+class ProgressEvent extends Event native "*ProgressEvent" {
+
+  /** @domName ProgressEvent.lengthComputable */
+  final bool lengthComputable;
+
+  /** @domName ProgressEvent.loaded */
+  final int loaded;
+
+  /** @domName ProgressEvent.total */
+  final int total;
+}
+
+/// @domName HTMLQuoteElement
+class QuoteElement extends Element implements Element native "*HTMLQuoteElement" {
+
+  /** @domName HTMLQuoteElement.cite */
+  String cite;
+}
+
+/// @domName RGBColor
+class RGBColor native "*RGBColor" {
+
+  /** @domName RGBColor.blue */
+  final CSSPrimitiveValue blue;
+
+  /** @domName RGBColor.green */
+  final CSSPrimitiveValue green;
+
+  /** @domName RGBColor.red */
+  final CSSPrimitiveValue red;
+}
+
+/// @domName RTCDataChannel
+class RTCDataChannel extends EventTarget native "*RTCDataChannel" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  RTCDataChannelEvents get on =>
+    new RTCDataChannelEvents(this);
+
+  /** @domName RTCDataChannel.binaryType */
+  String binaryType;
+
+  /** @domName RTCDataChannel.bufferedAmount */
+  final int bufferedAmount;
+
+  /** @domName RTCDataChannel.label */
+  final String label;
+
+  /** @domName RTCDataChannel.readyState */
+  final String readyState;
+
+  /** @domName RTCDataChannel.reliable */
+  final bool reliable;
+
+  /** @domName RTCDataChannel.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName RTCDataChannel.close */
+  void close() native;
+
+  /** @domName RTCDataChannel.dispatchEvent */
+  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+
+  /** @domName RTCDataChannel.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName RTCDataChannel.send */
+  void send(data) native;
+}
+
+class RTCDataChannelEvents extends Events {
+  RTCDataChannelEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get close => this['close'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get message => this['message'];
+
+  EventListenerList get open => this['open'];
+}
+
+/// @domName RTCDataChannelEvent
+class RTCDataChannelEvent extends Event native "*RTCDataChannelEvent" {
+
+  /** @domName RTCDataChannelEvent.channel */
+  final RTCDataChannel channel;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void RTCErrorCallback(String errorInformation);
+
+/// @domName RTCIceCandidate
+class RTCIceCandidate native "*RTCIceCandidate" {
+
+  factory RTCIceCandidate(Map dictionary) => _RTCIceCandidateFactoryProvider.createRTCIceCandidate(dictionary);
+
+  /** @domName RTCIceCandidate.candidate */
+  final String candidate;
+
+  /** @domName RTCIceCandidate.sdpMLineIndex */
+  final int sdpMLineIndex;
+
+  /** @domName RTCIceCandidate.sdpMid */
+  final String sdpMid;
+}
+
+/// @domName RTCIceCandidateEvent
+class RTCIceCandidateEvent extends Event native "*RTCIceCandidateEvent" {
+
+  /** @domName RTCIceCandidateEvent.candidate */
+  final RTCIceCandidate candidate;
+}
+
+/// @domName RTCPeerConnection
+class RTCPeerConnection extends EventTarget native "*RTCPeerConnection" {
+
+  factory RTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
+    if (!?mediaConstraints) {
+      return _RTCPeerConnectionFactoryProvider.createRTCPeerConnection(rtcIceServers);
+    }
+    return _RTCPeerConnectionFactoryProvider.createRTCPeerConnection(rtcIceServers, mediaConstraints);
+  }
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  RTCPeerConnectionEvents get on =>
+    new RTCPeerConnectionEvents(this);
+
+  /** @domName RTCPeerConnection.iceState */
+  final String iceState;
+
+  /** @domName RTCPeerConnection.localDescription */
+  final RTCSessionDescription localDescription;
+
+  /** @domName RTCPeerConnection.localStreams */
+  final List<MediaStream> localStreams;
+
+  /** @domName RTCPeerConnection.readyState */
+  final String readyState;
+
+  /** @domName RTCPeerConnection.remoteDescription */
+  final RTCSessionDescription remoteDescription;
+
+  /** @domName RTCPeerConnection.remoteStreams */
+  final List<MediaStream> remoteStreams;
+
+  /** @domName RTCPeerConnection.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName RTCPeerConnection.addIceCandidate */
+  void addIceCandidate(RTCIceCandidate candidate) native;
+
+  /** @domName RTCPeerConnection.addStream */
+  void addStream(MediaStream stream, [mediaConstraints]) {
+    if (?mediaConstraints) {
+      var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
+      _addStream_1(stream, mediaConstraints_1);
+      return;
+    }
+    _addStream_2(stream);
+    return;
+  }
+  void _addStream_1(MediaStream stream, mediaConstraints) native "addStream";
+  void _addStream_2(MediaStream stream) native "addStream";
+
+  /** @domName RTCPeerConnection.close */
+  void close() native;
+
+  /** @domName RTCPeerConnection.createAnswer */
+  void createAnswer(RTCSessionDescriptionCallback successCallback, [failureCallback, mediaConstraints]) {
+    if (?mediaConstraints) {
+      var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
+      _createAnswer_1(successCallback, failureCallback, mediaConstraints_1);
+      return;
+    }
+    _createAnswer_2(successCallback, failureCallback);
+    return;
+  }
+  void _createAnswer_1(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback, mediaConstraints) native "createAnswer";
+  void _createAnswer_2(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback) native "createAnswer";
+
+  /** @domName RTCPeerConnection.createDataChannel */
+  RTCDataChannel createDataChannel(String label, [options]) {
+    if (?options) {
+      var options_1 = _convertDartToNative_Dictionary(options);
+      return _createDataChannel_1(label, options_1);
+    }
+    return _createDataChannel_2(label);
+  }
+  RTCDataChannel _createDataChannel_1(label, options) native "createDataChannel";
+  RTCDataChannel _createDataChannel_2(label) native "createDataChannel";
+
+  /** @domName RTCPeerConnection.createOffer */
+  void createOffer(RTCSessionDescriptionCallback successCallback, [failureCallback, mediaConstraints]) {
+    if (?mediaConstraints) {
+      var mediaConstraints_1 = _convertDartToNative_Dictionary(mediaConstraints);
+      _createOffer_1(successCallback, failureCallback, mediaConstraints_1);
+      return;
+    }
+    _createOffer_2(successCallback, failureCallback);
+    return;
+  }
+  void _createOffer_1(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback, mediaConstraints) native "createOffer";
+  void _createOffer_2(RTCSessionDescriptionCallback successCallback, RTCErrorCallback failureCallback) native "createOffer";
+
+  /** @domName RTCPeerConnection.dispatchEvent */
+  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+
+  /** @domName RTCPeerConnection.getStats */
+  void getStats(RTCStatsCallback successCallback, MediaStreamTrack selector) native;
+
+  /** @domName RTCPeerConnection.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName RTCPeerConnection.removeStream */
+  void removeStream(MediaStream stream) native;
+
+  /** @domName RTCPeerConnection.setLocalDescription */
+  void setLocalDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]) native;
+
+  /** @domName RTCPeerConnection.setRemoteDescription */
+  void setRemoteDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]) native;
+
+  /** @domName RTCPeerConnection.updateIce */
+  void updateIce([configuration, mediaConstraints]) {
+    if (?mediaConstraints) {
+      var configuration_1 = _convertDartToNative_Dictionary(configuration);
+      var mediaConstraints_2 = _convertDartToNative_Dictionary(mediaConstraints);
+      _updateIce_1(configuration_1, mediaConstraints_2);
+      return;
+    }
+    if (?configuration) {
+      var configuration_3 = _convertDartToNative_Dictionary(configuration);
+      _updateIce_2(configuration_3);
+      return;
+    }
+    _updateIce_3();
+    return;
+  }
+  void _updateIce_1(configuration, mediaConstraints) native "updateIce";
+  void _updateIce_2(configuration) native "updateIce";
+  void _updateIce_3() native "updateIce";
+}
+
+class RTCPeerConnectionEvents extends Events {
+  RTCPeerConnectionEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get addStream => this['addstream'];
+
+  EventListenerList get iceCandidate => this['icecandidate'];
+
+  EventListenerList get iceChange => this['icechange'];
+
+  EventListenerList get negotiationNeeded => this['negotiationneeded'];
+
+  EventListenerList get open => this['open'];
+
+  EventListenerList get removeStream => this['removestream'];
+
+  EventListenerList get stateChange => this['statechange'];
+}
+
+/// @domName RTCSessionDescription
+class RTCSessionDescription native "*RTCSessionDescription" {
+
+  factory RTCSessionDescription(Map dictionary) => _RTCSessionDescriptionFactoryProvider.createRTCSessionDescription(dictionary);
+
+  /** @domName RTCSessionDescription.sdp */
+  String sdp;
+
+  /** @domName RTCSessionDescription.type */
+  String type;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void RTCSessionDescriptionCallback(RTCSessionDescription sdp);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void RTCStatsCallback(RTCStatsResponse response);
+
+/// @domName RTCStatsElement
+class RTCStatsElement native "*RTCStatsElement" {
+
+  /** @domName RTCStatsElement.timestamp */
+  final Date timestamp;
+
+  /** @domName RTCStatsElement.stat */
+  String stat(String name) native;
+}
+
+/// @domName RTCStatsReport
+class RTCStatsReport native "*RTCStatsReport" {
+
+  /** @domName RTCStatsReport.local */
+  final RTCStatsElement local;
+
+  /** @domName RTCStatsReport.remote */
+  final RTCStatsElement remote;
+}
+
+/// @domName RTCStatsResponse
+class RTCStatsResponse native "*RTCStatsResponse" {
+
+  /** @domName RTCStatsResponse.result */
+  List<RTCStatsReport> result() native;
+}
+
+/// @domName RadioNodeList
+class RadioNodeList extends NodeList native "*RadioNodeList" {
+
+  /** @domName RadioNodeList.value */
+  String value;
+}
+
+/// @domName Range
+class Range native "*Range" {
+
+  static const int END_TO_END = 2;
+
+  static const int END_TO_START = 3;
+
+  static const int NODE_AFTER = 1;
+
+  static const int NODE_BEFORE = 0;
+
+  static const int NODE_BEFORE_AND_AFTER = 2;
+
+  static const int NODE_INSIDE = 3;
+
+  static const int START_TO_END = 1;
+
+  static const int START_TO_START = 0;
+
+  /** @domName Range.collapsed */
+  final bool collapsed;
+
+  /** @domName Range.commonAncestorContainer */
+  final Node commonAncestorContainer;
+
+  /** @domName Range.endContainer */
+  final Node endContainer;
+
+  /** @domName Range.endOffset */
+  final int endOffset;
+
+  /** @domName Range.startContainer */
+  final Node startContainer;
+
+  /** @domName Range.startOffset */
+  final int startOffset;
+
+  /** @domName Range.cloneContents */
+  DocumentFragment cloneContents() native;
+
+  /** @domName Range.cloneRange */
+  Range cloneRange() native;
+
+  /** @domName Range.collapse */
+  void collapse(bool toStart) native;
+
+  /** @domName Range.compareNode */
+  int compareNode(Node refNode) native;
+
+  /** @domName Range.comparePoint */
+  int comparePoint(Node refNode, int offset) native;
+
+  /** @domName Range.createContextualFragment */
+  DocumentFragment createContextualFragment(String html) native;
+
+  /** @domName Range.deleteContents */
+  void deleteContents() native;
+
+  /** @domName Range.detach */
+  void detach() native;
+
+  /** @domName Range.expand */
+  void expand(String unit) native;
+
+  /** @domName Range.extractContents */
+  DocumentFragment extractContents() native;
+
+  /** @domName Range.getBoundingClientRect */
+  ClientRect getBoundingClientRect() native;
+
+  /** @domName Range.getClientRects */
+  List<ClientRect> getClientRects() native;
+
+  /** @domName Range.insertNode */
+  void insertNode(Node newNode) native;
+
+  /** @domName Range.intersectsNode */
+  bool intersectsNode(Node refNode) native;
+
+  /** @domName Range.isPointInRange */
+  bool isPointInRange(Node refNode, int offset) native;
+
+  /** @domName Range.selectNode */
+  void selectNode(Node refNode) native;
+
+  /** @domName Range.selectNodeContents */
+  void selectNodeContents(Node refNode) native;
+
+  /** @domName Range.setEnd */
+  void setEnd(Node refNode, int offset) native;
+
+  /** @domName Range.setEndAfter */
+  void setEndAfter(Node refNode) native;
+
+  /** @domName Range.setEndBefore */
+  void setEndBefore(Node refNode) native;
+
+  /** @domName Range.setStart */
+  void setStart(Node refNode, int offset) native;
+
+  /** @domName Range.setStartAfter */
+  void setStartAfter(Node refNode) native;
+
+  /** @domName Range.setStartBefore */
+  void setStartBefore(Node refNode) native;
+
+  /** @domName Range.surroundContents */
+  void surroundContents(Node newParent) native;
+
+  /** @domName Range.toString */
+  String toString() native;
+}
+
+/// @domName RangeException
+class RangeException native "*RangeException" {
+
+  static const int BAD_BOUNDARYPOINTS_ERR = 1;
+
+  static const int INVALID_NODE_TYPE_ERR = 2;
+
+  /** @domName RangeException.code */
+  final int code;
+
+  /** @domName RangeException.message */
+  final String message;
+
+  /** @domName RangeException.name */
+  final String name;
+
+  /** @domName RangeException.toString */
+  String toString() native;
+}
+
+/// @domName Rect
+class Rect native "*Rect" {
+
+  /** @domName Rect.bottom */
+  final CSSPrimitiveValue bottom;
+
+  /** @domName Rect.left */
+  final CSSPrimitiveValue left;
+
+  /** @domName Rect.right */
+  final CSSPrimitiveValue right;
+
+  /** @domName Rect.top */
+  final CSSPrimitiveValue top;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void RequestAnimationFrameCallback(num highResTime);
+
+/// @domName SQLError
+class SQLError native "*SQLError" {
+
+  static const int CONSTRAINT_ERR = 6;
+
+  static const int DATABASE_ERR = 1;
+
+  static const int QUOTA_ERR = 4;
+
+  static const int SYNTAX_ERR = 5;
+
+  static const int TIMEOUT_ERR = 7;
+
+  static const int TOO_LARGE_ERR = 3;
+
+  static const int UNKNOWN_ERR = 0;
+
+  static const int VERSION_ERR = 2;
+
+  /** @domName SQLError.code */
+  final int code;
+
+  /** @domName SQLError.message */
+  final String message;
+}
+
+/// @domName SQLException
+class SQLException native "*SQLException" {
+
+  static const int CONSTRAINT_ERR = 6;
+
+  static const int DATABASE_ERR = 1;
+
+  static const int QUOTA_ERR = 4;
+
+  static const int SYNTAX_ERR = 5;
+
+  static const int TIMEOUT_ERR = 7;
+
+  static const int TOO_LARGE_ERR = 3;
+
+  static const int UNKNOWN_ERR = 0;
+
+  static const int VERSION_ERR = 2;
+
+  /** @domName SQLException.code */
+  final int code;
+
+  /** @domName SQLException.message */
+  final String message;
+}
+
+/// @domName SQLResultSet
+class SQLResultSet native "*SQLResultSet" {
+
+  /** @domName SQLResultSet.insertId */
+  final int insertId;
+
+  /** @domName SQLResultSet.rows */
+  final SQLResultSetRowList rows;
+
+  /** @domName SQLResultSet.rowsAffected */
+  final int rowsAffected;
+}
+
+/// @domName SQLResultSetRowList
+class SQLResultSetRowList implements JavaScriptIndexingBehavior, List<Map> native "*SQLResultSetRowList" {
+
+  /** @domName SQLResultSetRowList.length */
+  final int length;
+
+  Map operator[](int index) => JS("Map", "#[#]", this, index);
+
+  void operator[]=(int index, Map value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<Map> mixins.
+  // Map is the element type.
+
+  // From Iterable<Map>:
+
+  Iterator<Map> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<Map>(this);
+  }
+
+  // From Collection<Map>:
+
+  void add(Map value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(Map value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<Map> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(Map element) => _Collections.contains(this, element);
+
+  void forEach(void f(Map element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Map element)) => _Collections.map(this, [], f);
+
+  Collection<Map> filter(bool f(Map element)) =>
+     _Collections.filter(this, <Map>[], f);
+
+  bool every(bool f(Map element)) => _Collections.every(this, f);
+
+  bool some(bool f(Map element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Map>:
+
+  void sort([Comparator<Map> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Map element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Map element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  Map get last => this[length - 1];
+
+  Map removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<Map> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [Map initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<Map> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Map>[]);
+
+  // -- end List<Map> mixins.
+
+  /** @domName SQLResultSetRowList.item */
+  Map item(int index) {
+    return _convertNativeToDart_Dictionary(_item_1(index));
+  }
+  _item_1(index) native "item";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void SQLStatementCallback(SQLTransaction transaction, SQLResultSet resultSet);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void SQLStatementErrorCallback(SQLTransaction transaction, SQLError error);
+
+/// @domName SQLTransaction
+class SQLTransaction native "*SQLTransaction" {
+
+  /** @domName SQLTransaction.executeSql */
+  void executeSql(String sqlStatement, List arguments, [SQLStatementCallback callback, SQLStatementErrorCallback errorCallback]) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void SQLTransactionCallback(SQLTransaction transaction);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void SQLTransactionErrorCallback(SQLError error);
+
+/// @domName SQLTransactionSync
+class SQLTransactionSync native "*SQLTransactionSync" {
+
+  /** @domName SQLTransactionSync.executeSql */
+  SQLResultSet executeSql(String sqlStatement, List arguments) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void SQLTransactionSyncCallback(SQLTransactionSync transaction);
+
+/// @domName SVGAElement
+class SVGAElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable native "*SVGAElement" {
+
+  /** @domName SVGAElement.target */
+  final SVGAnimatedString target;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+
+/// @domName SVGAltGlyphDefElement
+class SVGAltGlyphDefElement extends SVGElement native "*SVGAltGlyphDefElement" {
+}
+
+/// @domName SVGAltGlyphElement
+class SVGAltGlyphElement extends SVGTextPositioningElement implements SVGURIReference native "*SVGAltGlyphElement" {
+
+  /** @domName SVGAltGlyphElement.format */
+  String format;
+
+  /** @domName SVGAltGlyphElement.glyphRef */
+  String glyphRef;
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+
+/// @domName SVGAltGlyphItemElement
+class SVGAltGlyphItemElement extends SVGElement native "*SVGAltGlyphItemElement" {
+}
+
+/// @domName SVGAngle
+class SVGAngle native "*SVGAngle" {
+
+  static const int SVG_ANGLETYPE_DEG = 2;
+
+  static const int SVG_ANGLETYPE_GRAD = 4;
+
+  static const int SVG_ANGLETYPE_RAD = 3;
+
+  static const int SVG_ANGLETYPE_UNKNOWN = 0;
+
+  static const int SVG_ANGLETYPE_UNSPECIFIED = 1;
+
+  /** @domName SVGAngle.unitType */
+  final int unitType;
+
+  /** @domName SVGAngle.value */
+  num value;
+
+  /** @domName SVGAngle.valueAsString */
+  String valueAsString;
+
+  /** @domName SVGAngle.valueInSpecifiedUnits */
+  num valueInSpecifiedUnits;
+
+  /** @domName SVGAngle.convertToSpecifiedUnits */
+  void convertToSpecifiedUnits(int unitType) native;
+
+  /** @domName SVGAngle.newValueSpecifiedUnits */
+  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native;
+}
+
+/// @domName SVGAnimateColorElement
+class SVGAnimateColorElement extends SVGAnimationElement native "*SVGAnimateColorElement" {
+}
+
+/// @domName SVGAnimateElement
+class SVGAnimateElement extends SVGAnimationElement native "*SVGAnimateElement" {
+}
+
+/// @domName SVGAnimateMotionElement
+class SVGAnimateMotionElement extends SVGAnimationElement native "*SVGAnimateMotionElement" {
+}
+
+/// @domName SVGAnimateTransformElement
+class SVGAnimateTransformElement extends SVGAnimationElement native "*SVGAnimateTransformElement" {
+}
+
+/// @domName SVGAnimatedAngle
+class SVGAnimatedAngle native "*SVGAnimatedAngle" {
+
+  /** @domName SVGAnimatedAngle.animVal */
+  final SVGAngle animVal;
+
+  /** @domName SVGAnimatedAngle.baseVal */
+  final SVGAngle baseVal;
+}
+
+/// @domName SVGAnimatedBoolean
+class SVGAnimatedBoolean native "*SVGAnimatedBoolean" {
+
+  /** @domName SVGAnimatedBoolean.animVal */
+  final bool animVal;
+
+  /** @domName SVGAnimatedBoolean.baseVal */
+  bool baseVal;
+}
+
+/// @domName SVGAnimatedEnumeration
+class SVGAnimatedEnumeration native "*SVGAnimatedEnumeration" {
+
+  /** @domName SVGAnimatedEnumeration.animVal */
+  final int animVal;
+
+  /** @domName SVGAnimatedEnumeration.baseVal */
+  int baseVal;
+}
+
+/// @domName SVGAnimatedInteger
+class SVGAnimatedInteger native "*SVGAnimatedInteger" {
+
+  /** @domName SVGAnimatedInteger.animVal */
+  final int animVal;
+
+  /** @domName SVGAnimatedInteger.baseVal */
+  int baseVal;
+}
+
+/// @domName SVGAnimatedLength
+class SVGAnimatedLength native "*SVGAnimatedLength" {
+
+  /** @domName SVGAnimatedLength.animVal */
+  final SVGLength animVal;
+
+  /** @domName SVGAnimatedLength.baseVal */
+  final SVGLength baseVal;
+}
+
+/// @domName SVGAnimatedLengthList
+class SVGAnimatedLengthList implements JavaScriptIndexingBehavior, List<SVGAnimatedLength> native "*SVGAnimatedLengthList" {
+
+  /** @domName SVGAnimatedLengthList.animVal */
+  final SVGLengthList animVal;
+
+  /** @domName SVGAnimatedLengthList.baseVal */
+  final SVGLengthList baseVal;
+
+  SVGAnimatedLength operator[](int index) => JS("SVGAnimatedLength", "#[#]", this, index);
+
+  void operator[]=(int index, SVGAnimatedLength value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SVGAnimatedLength> mixins.
+  // SVGAnimatedLength is the element type.
+
+  // From Iterable<SVGAnimatedLength>:
+
+  Iterator<SVGAnimatedLength> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SVGAnimatedLength>(this);
+  }
+
+  // From Collection<SVGAnimatedLength>:
+
+  void add(SVGAnimatedLength value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SVGAnimatedLength value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SVGAnimatedLength> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SVGAnimatedLength element) => _Collections.contains(this, element);
+
+  void forEach(void f(SVGAnimatedLength element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SVGAnimatedLength element)) => _Collections.map(this, [], f);
+
+  Collection<SVGAnimatedLength> filter(bool f(SVGAnimatedLength element)) =>
+     _Collections.filter(this, <SVGAnimatedLength>[], f);
+
+  bool every(bool f(SVGAnimatedLength element)) => _Collections.every(this, f);
+
+  bool some(bool f(SVGAnimatedLength element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SVGAnimatedLength>:
+
+  void sort([Comparator<SVGAnimatedLength> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SVGAnimatedLength element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SVGAnimatedLength element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SVGAnimatedLength get last => this[length - 1];
+
+  SVGAnimatedLength removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SVGAnimatedLength> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SVGAnimatedLength initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SVGAnimatedLength> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SVGAnimatedLength>[]);
+
+  // -- end List<SVGAnimatedLength> mixins.
+}
+
+/// @domName SVGAnimatedNumber
+class SVGAnimatedNumber native "*SVGAnimatedNumber" {
+
+  /** @domName SVGAnimatedNumber.animVal */
+  final num animVal;
+
+  /** @domName SVGAnimatedNumber.baseVal */
+  num baseVal;
+}
+
+/// @domName SVGAnimatedNumberList
+class SVGAnimatedNumberList implements JavaScriptIndexingBehavior, List<SVGAnimatedNumber> native "*SVGAnimatedNumberList" {
+
+  /** @domName SVGAnimatedNumberList.animVal */
+  final SVGNumberList animVal;
+
+  /** @domName SVGAnimatedNumberList.baseVal */
+  final SVGNumberList baseVal;
+
+  SVGAnimatedNumber operator[](int index) => JS("SVGAnimatedNumber", "#[#]", this, index);
+
+  void operator[]=(int index, SVGAnimatedNumber value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SVGAnimatedNumber> mixins.
+  // SVGAnimatedNumber is the element type.
+
+  // From Iterable<SVGAnimatedNumber>:
+
+  Iterator<SVGAnimatedNumber> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SVGAnimatedNumber>(this);
+  }
+
+  // From Collection<SVGAnimatedNumber>:
+
+  void add(SVGAnimatedNumber value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SVGAnimatedNumber value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SVGAnimatedNumber> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SVGAnimatedNumber element) => _Collections.contains(this, element);
+
+  void forEach(void f(SVGAnimatedNumber element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SVGAnimatedNumber element)) => _Collections.map(this, [], f);
+
+  Collection<SVGAnimatedNumber> filter(bool f(SVGAnimatedNumber element)) =>
+     _Collections.filter(this, <SVGAnimatedNumber>[], f);
+
+  bool every(bool f(SVGAnimatedNumber element)) => _Collections.every(this, f);
+
+  bool some(bool f(SVGAnimatedNumber element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SVGAnimatedNumber>:
+
+  void sort([Comparator<SVGAnimatedNumber> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SVGAnimatedNumber element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SVGAnimatedNumber element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SVGAnimatedNumber get last => this[length - 1];
+
+  SVGAnimatedNumber removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SVGAnimatedNumber> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SVGAnimatedNumber initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SVGAnimatedNumber> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SVGAnimatedNumber>[]);
+
+  // -- end List<SVGAnimatedNumber> mixins.
+}
+
+/// @domName SVGAnimatedPreserveAspectRatio
+class SVGAnimatedPreserveAspectRatio native "*SVGAnimatedPreserveAspectRatio" {
+
+  /** @domName SVGAnimatedPreserveAspectRatio.animVal */
+  final SVGPreserveAspectRatio animVal;
+
+  /** @domName SVGAnimatedPreserveAspectRatio.baseVal */
+  final SVGPreserveAspectRatio baseVal;
+}
+
+/// @domName SVGAnimatedRect
+class SVGAnimatedRect native "*SVGAnimatedRect" {
+
+  /** @domName SVGAnimatedRect.animVal */
+  final SVGRect animVal;
+
+  /** @domName SVGAnimatedRect.baseVal */
+  final SVGRect baseVal;
+}
+
+/// @domName SVGAnimatedString
+class SVGAnimatedString native "*SVGAnimatedString" {
+
+  /** @domName SVGAnimatedString.animVal */
+  final String animVal;
+
+  /** @domName SVGAnimatedString.baseVal */
+  String baseVal;
+}
+
+/// @domName SVGAnimatedTransformList
+class SVGAnimatedTransformList implements JavaScriptIndexingBehavior, List<SVGAnimateTransformElement> native "*SVGAnimatedTransformList" {
+
+  /** @domName SVGAnimatedTransformList.animVal */
+  final SVGTransformList animVal;
+
+  /** @domName SVGAnimatedTransformList.baseVal */
+  final SVGTransformList baseVal;
+
+  SVGAnimateTransformElement operator[](int index) => JS("SVGAnimateTransformElement", "#[#]", this, index);
+
+  void operator[]=(int index, SVGAnimateTransformElement value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SVGAnimateTransformElement> mixins.
+  // SVGAnimateTransformElement is the element type.
+
+  // From Iterable<SVGAnimateTransformElement>:
+
+  Iterator<SVGAnimateTransformElement> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SVGAnimateTransformElement>(this);
+  }
+
+  // From Collection<SVGAnimateTransformElement>:
+
+  void add(SVGAnimateTransformElement value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SVGAnimateTransformElement value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SVGAnimateTransformElement> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SVGAnimateTransformElement element) => _Collections.contains(this, element);
+
+  void forEach(void f(SVGAnimateTransformElement element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SVGAnimateTransformElement element)) => _Collections.map(this, [], f);
+
+  Collection<SVGAnimateTransformElement> filter(bool f(SVGAnimateTransformElement element)) =>
+     _Collections.filter(this, <SVGAnimateTransformElement>[], f);
+
+  bool every(bool f(SVGAnimateTransformElement element)) => _Collections.every(this, f);
+
+  bool some(bool f(SVGAnimateTransformElement element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SVGAnimateTransformElement>:
+
+  void sort([Comparator<SVGAnimateTransformElement> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SVGAnimateTransformElement element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SVGAnimateTransformElement element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SVGAnimateTransformElement get last => this[length - 1];
+
+  SVGAnimateTransformElement removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SVGAnimateTransformElement> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SVGAnimateTransformElement initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SVGAnimateTransformElement> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SVGAnimateTransformElement>[]);
+
+  // -- end List<SVGAnimateTransformElement> mixins.
+}
+
+/// @domName SVGAnimationElement
+class SVGAnimationElement extends SVGElement implements ElementTimeControl, SVGTests, SVGExternalResourcesRequired native "*SVGAnimationElement" {
+
+  /** @domName SVGAnimationElement.targetElement */
+  final SVGElement targetElement;
+
+  /** @domName SVGAnimationElement.getCurrentTime */
+  num getCurrentTime() native;
+
+  /** @domName SVGAnimationElement.getSimpleDuration */
+  num getSimpleDuration() native;
+
+  /** @domName SVGAnimationElement.getStartTime */
+  num getStartTime() native;
+
+  // From ElementTimeControl
+
+  /** @domName ElementTimeControl.beginElement */
+  void beginElement() native;
+
+  /** @domName ElementTimeControl.beginElementAt */
+  void beginElementAt(num offset) native;
+
+  /** @domName ElementTimeControl.endElement */
+  void endElement() native;
+
+  /** @domName ElementTimeControl.endElementAt */
+  void endElementAt(num offset) native;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+}
+
+/// @domName SVGCircleElement
+class SVGCircleElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGCircleElement" {
+
+  /** @domName SVGCircleElement.cx */
+  final SVGAnimatedLength cx;
+
+  /** @domName SVGCircleElement.cy */
+  final SVGAnimatedLength cy;
+
+  /** @domName SVGCircleElement.r */
+  final SVGAnimatedLength r;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+}
+
+/// @domName SVGClipPathElement
+class SVGClipPathElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGClipPathElement" {
+
+  /** @domName SVGClipPathElement.clipPathUnits */
+  final SVGAnimatedEnumeration clipPathUnits;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+}
+
+/// @domName SVGColor
+class SVGColor extends CSSValue native "*SVGColor" {
+
+  static const int SVG_COLORTYPE_CURRENTCOLOR = 3;
+
+  static const int SVG_COLORTYPE_RGBCOLOR = 1;
+
+  static const int SVG_COLORTYPE_RGBCOLOR_ICCCOLOR = 2;
+
+  static const int SVG_COLORTYPE_UNKNOWN = 0;
+
+  /** @domName SVGColor.colorType */
+  final int colorType;
+
+  /** @domName SVGColor.rgbColor */
+  final RGBColor rgbColor;
+
+  /** @domName SVGColor.setColor */
+  void setColor(int colorType, String rgbColor, String iccColor) native;
+
+  /** @domName SVGColor.setRGBColor */
+  void setRGBColor(String rgbColor) native;
+
+  /** @domName SVGColor.setRGBColorICCColor */
+  void setRGBColorICCColor(String rgbColor, String iccColor) native;
+}
+
+/// @domName SVGComponentTransferFunctionElement
+class SVGComponentTransferFunctionElement extends SVGElement native "*SVGComponentTransferFunctionElement" {
+
+  static const int SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
+
+  static const int SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5;
+
+  static const int SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1;
+
+  static const int SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4;
+
+  static const int SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2;
+
+  static const int SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;
+
+  /** @domName SVGComponentTransferFunctionElement.amplitude */
+  final SVGAnimatedNumber amplitude;
+
+  /** @domName SVGComponentTransferFunctionElement.exponent */
+  final SVGAnimatedNumber exponent;
+
+  /** @domName SVGComponentTransferFunctionElement.intercept */
+  final SVGAnimatedNumber intercept;
+
+  /** @domName SVGComponentTransferFunctionElement.offset */
+  final SVGAnimatedNumber offset;
+
+  /** @domName SVGComponentTransferFunctionElement.slope */
+  final SVGAnimatedNumber slope;
+
+  /** @domName SVGComponentTransferFunctionElement.tableValues */
+  final SVGAnimatedNumberList tableValues;
+
+  /** @domName SVGComponentTransferFunctionElement.type */
+  final SVGAnimatedEnumeration type;
+}
+
+/// @domName SVGCursorElement
+class SVGCursorElement extends SVGElement implements SVGURIReference, SVGTests, SVGExternalResourcesRequired native "*SVGCursorElement" {
+
+  /** @domName SVGCursorElement.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGCursorElement.y */
+  final SVGAnimatedLength y;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+
+/// @domName SVGDefsElement
+class SVGDefsElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGDefsElement" {
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+}
+
+/// @domName SVGDescElement
+class SVGDescElement extends SVGElement implements SVGLangSpace, SVGStylable native "*SVGDescElement" {
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGDocument
+class SVGDocument extends Document native "*SVGDocument" {
+
+  /** @domName SVGDocument.rootElement */
+  final SVGSVGElement rootElement;
+
+  /** @domName SVGDocument.createEvent */
+  Event $dom_createEvent(String eventType) native "createEvent";
+}
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _AttributeClassSet extends _CssClassSet {
+  _AttributeClassSet(element) : super(element);
+
+  String $dom_className() => _element.attributes['class'];
+
+  void _write(Set s) {
+    _element.attributes['class'] = _formatSet(s);
+  }
+}
+
+class SVGElement extends Element native "*SVGElement" {
+  factory SVGElement.tag(String tag) =>
+      _SVGElementFactoryProvider.createSVGElement_tag(tag);
+  factory SVGElement.svg(String svg) =>
+      _SVGElementFactoryProvider.createSVGElement_svg(svg);
+
+  CssClassSet get classes {
+    if (_cssClassSet == null) {
+      _cssClassSet = new _AttributeClassSet(_ptr);
+    }
+    return _cssClassSet;
+  }
+
+  List<Element> get elements => new _FilteredElementList(this);
+
+  void set elements(Collection<Element> value) {
+    final elements = this.elements;
+    elements.clear();
+    elements.addAll(value);
+  }
+
+  String get outerHTML {
+    final container = new Element.tag("div");
+    final SVGElement cloned = this.clone(true);
+    container.elements.add(cloned);
+    return container.innerHTML;
+  }
+
+  String get innerHTML {
+    final container = new Element.tag("div");
+    final SVGElement cloned = this.clone(true);
+    container.elements.addAll(cloned.elements);
+    return container.innerHTML;
+  }
+
+  void set innerHTML(String svg) {
+    final container = new Element.tag("div");
+    // Wrap the SVG string in <svg> so that SVGElements are created, rather than
+    // HTMLElements.
+    container.innerHTML = '<svg version="1.1">$svg</svg>';
+    this.elements = container.elements[0].elements;
+  }
+
+
+  // Shadowing definition.
+  /** @domName SVGElement.id */
+  String get id => JS("String", "#.id", this);
+
+  /** @domName SVGElement.id */
+  void set id(String value) {
+    JS("void", "#.id = #", this, value);
+  }
+
+  /** @domName SVGElement.ownerSVGElement */
+  final SVGSVGElement ownerSVGElement;
+
+  /** @domName SVGElement.viewportElement */
+  final SVGElement viewportElement;
+
+  /** @domName SVGElement.xmlbase */
+  String xmlbase;
+
+}
+
+/// @domName SVGElementInstance
+class SVGElementInstance extends EventTarget native "*SVGElementInstance" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  SVGElementInstanceEvents get on =>
+    new SVGElementInstanceEvents(this);
+
+  /** @domName SVGElementInstance.childNodes */
+  final List<SVGElementInstance> childNodes;
+
+  /** @domName SVGElementInstance.correspondingElement */
+  final SVGElement correspondingElement;
+
+  /** @domName SVGElementInstance.correspondingUseElement */
+  final SVGUseElement correspondingUseElement;
+
+  /** @domName SVGElementInstance.firstChild */
+  final SVGElementInstance firstChild;
+
+  /** @domName SVGElementInstance.lastChild */
+  final SVGElementInstance lastChild;
+
+  /** @domName SVGElementInstance.nextSibling */
+  final SVGElementInstance nextSibling;
+
+  /** @domName SVGElementInstance.parentNode */
+  final SVGElementInstance parentNode;
+
+  /** @domName SVGElementInstance.previousSibling */
+  final SVGElementInstance previousSibling;
+}
+
+class SVGElementInstanceEvents extends Events {
+  SVGElementInstanceEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get abort => this['abort'];
+
+  EventListenerList get beforeCopy => this['beforecopy'];
+
+  EventListenerList get beforeCut => this['beforecut'];
+
+  EventListenerList get beforePaste => this['beforepaste'];
+
+  EventListenerList get blur => this['blur'];
+
+  EventListenerList get change => this['change'];
+
+  EventListenerList get click => this['click'];
+
+  EventListenerList get contextMenu => this['contextmenu'];
+
+  EventListenerList get copy => this['copy'];
+
+  EventListenerList get cut => this['cut'];
+
+  EventListenerList get doubleClick => this['dblclick'];
+
+  EventListenerList get drag => this['drag'];
+
+  EventListenerList get dragEnd => this['dragend'];
+
+  EventListenerList get dragEnter => this['dragenter'];
+
+  EventListenerList get dragLeave => this['dragleave'];
+
+  EventListenerList get dragOver => this['dragover'];
+
+  EventListenerList get dragStart => this['dragstart'];
+
+  EventListenerList get drop => this['drop'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get focus => this['focus'];
+
+  EventListenerList get input => this['input'];
+
+  EventListenerList get keyDown => this['keydown'];
+
+  EventListenerList get keyPress => this['keypress'];
+
+  EventListenerList get keyUp => this['keyup'];
+
+  EventListenerList get load => this['load'];
+
+  EventListenerList get mouseDown => this['mousedown'];
+
+  EventListenerList get mouseMove => this['mousemove'];
+
+  EventListenerList get mouseOut => this['mouseout'];
+
+  EventListenerList get mouseOver => this['mouseover'];
+
+  EventListenerList get mouseUp => this['mouseup'];
+
+  EventListenerList get mouseWheel => this['mousewheel'];
+
+  EventListenerList get paste => this['paste'];
+
+  EventListenerList get reset => this['reset'];
+
+  EventListenerList get resize => this['resize'];
+
+  EventListenerList get scroll => this['scroll'];
+
+  EventListenerList get search => this['search'];
+
+  EventListenerList get select => this['select'];
+
+  EventListenerList get selectStart => this['selectstart'];
+
+  EventListenerList get submit => this['submit'];
+
+  EventListenerList get unload => this['unload'];
+}
+
+/// @domName SVGEllipseElement
+class SVGEllipseElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGEllipseElement" {
+
+  /** @domName SVGEllipseElement.cx */
+  final SVGAnimatedLength cx;
+
+  /** @domName SVGEllipseElement.cy */
+  final SVGAnimatedLength cy;
+
+  /** @domName SVGEllipseElement.rx */
+  final SVGAnimatedLength rx;
+
+  /** @domName SVGEllipseElement.ry */
+  final SVGAnimatedLength ry;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+}
+
+/// @domName SVGException
+class SVGException native "*SVGException" {
+
+  static const int SVG_INVALID_VALUE_ERR = 1;
+
+  static const int SVG_MATRIX_NOT_INVERTABLE = 2;
+
+  static const int SVG_WRONG_TYPE_ERR = 0;
+
+  /** @domName SVGException.code */
+  final int code;
+
+  /** @domName SVGException.message */
+  final String message;
+
+  /** @domName SVGException.name */
+  final String name;
+
+  /** @domName SVGException.toString */
+  String toString() native;
+}
+/// @domName SVGExternalResourcesRequired
+abstract class SVGExternalResourcesRequired {
+
+  SVGAnimatedBoolean externalResourcesRequired;
+}
+
+/// @domName SVGFEBlendElement
+class SVGFEBlendElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEBlendElement" {
+
+  static const int SVG_FEBLEND_MODE_DARKEN = 4;
+
+  static const int SVG_FEBLEND_MODE_LIGHTEN = 5;
+
+  static const int SVG_FEBLEND_MODE_MULTIPLY = 2;
+
+  static const int SVG_FEBLEND_MODE_NORMAL = 1;
+
+  static const int SVG_FEBLEND_MODE_SCREEN = 3;
+
+  static const int SVG_FEBLEND_MODE_UNKNOWN = 0;
+
+  /** @domName SVGFEBlendElement.in1 */
+  final SVGAnimatedString in1;
+
+  /** @domName SVGFEBlendElement.in2 */
+  final SVGAnimatedString in2;
+
+  /** @domName SVGFEBlendElement.mode */
+  final SVGAnimatedEnumeration mode;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFEColorMatrixElement
+class SVGFEColorMatrixElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEColorMatrixElement" {
+
+  static const int SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
+
+  static const int SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;
+
+  static const int SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
+
+  static const int SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
+
+  static const int SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
+
+  /** @domName SVGFEColorMatrixElement.in1 */
+  final SVGAnimatedString in1;
+
+  /** @domName SVGFEColorMatrixElement.type */
+  final SVGAnimatedEnumeration type;
+
+  /** @domName SVGFEColorMatrixElement.values */
+  final SVGAnimatedNumberList values;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFEComponentTransferElement
+class SVGFEComponentTransferElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEComponentTransferElement" {
+
+  /** @domName SVGFEComponentTransferElement.in1 */
+  final SVGAnimatedString in1;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFECompositeElement
+class SVGFECompositeElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFECompositeElement" {
+
+  static const int SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
+
+  static const int SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
+
+  static const int SVG_FECOMPOSITE_OPERATOR_IN = 2;
+
+  static const int SVG_FECOMPOSITE_OPERATOR_OUT = 3;
+
+  static const int SVG_FECOMPOSITE_OPERATOR_OVER = 1;
+
+  static const int SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
+
+  static const int SVG_FECOMPOSITE_OPERATOR_XOR = 5;
+
+  /** @domName SVGFECompositeElement.in1 */
+  final SVGAnimatedString in1;
+
+  /** @domName SVGFECompositeElement.in2 */
+  final SVGAnimatedString in2;
+
+  /** @domName SVGFECompositeElement.k1 */
+  final SVGAnimatedNumber k1;
+
+  /** @domName SVGFECompositeElement.k2 */
+  final SVGAnimatedNumber k2;
+
+  /** @domName SVGFECompositeElement.k3 */
+  final SVGAnimatedNumber k3;
+
+  /** @domName SVGFECompositeElement.k4 */
+  final SVGAnimatedNumber k4;
+
+  /** @domName SVGFECompositeElement.operator */
+  final SVGAnimatedEnumeration operator;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFEConvolveMatrixElement
+class SVGFEConvolveMatrixElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEConvolveMatrixElement" {
+
+  static const int SVG_EDGEMODE_DUPLICATE = 1;
+
+  static const int SVG_EDGEMODE_NONE = 3;
+
+  static const int SVG_EDGEMODE_UNKNOWN = 0;
+
+  static const int SVG_EDGEMODE_WRAP = 2;
+
+  /** @domName SVGFEConvolveMatrixElement.bias */
+  final SVGAnimatedNumber bias;
+
+  /** @domName SVGFEConvolveMatrixElement.divisor */
+  final SVGAnimatedNumber divisor;
+
+  /** @domName SVGFEConvolveMatrixElement.edgeMode */
+  final SVGAnimatedEnumeration edgeMode;
+
+  /** @domName SVGFEConvolveMatrixElement.in1 */
+  final SVGAnimatedString in1;
+
+  /** @domName SVGFEConvolveMatrixElement.kernelMatrix */
+  final SVGAnimatedNumberList kernelMatrix;
+
+  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthX */
+  final SVGAnimatedNumber kernelUnitLengthX;
+
+  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthY */
+  final SVGAnimatedNumber kernelUnitLengthY;
+
+  /** @domName SVGFEConvolveMatrixElement.orderX */
+  final SVGAnimatedInteger orderX;
+
+  /** @domName SVGFEConvolveMatrixElement.orderY */
+  final SVGAnimatedInteger orderY;
+
+  /** @domName SVGFEConvolveMatrixElement.preserveAlpha */
+  final SVGAnimatedBoolean preserveAlpha;
+
+  /** @domName SVGFEConvolveMatrixElement.targetX */
+  final SVGAnimatedInteger targetX;
+
+  /** @domName SVGFEConvolveMatrixElement.targetY */
+  final SVGAnimatedInteger targetY;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFEDiffuseLightingElement
+class SVGFEDiffuseLightingElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEDiffuseLightingElement" {
+
+  /** @domName SVGFEDiffuseLightingElement.diffuseConstant */
+  final SVGAnimatedNumber diffuseConstant;
+
+  /** @domName SVGFEDiffuseLightingElement.in1 */
+  final SVGAnimatedString in1;
+
+  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthX */
+  final SVGAnimatedNumber kernelUnitLengthX;
+
+  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthY */
+  final SVGAnimatedNumber kernelUnitLengthY;
+
+  /** @domName SVGFEDiffuseLightingElement.surfaceScale */
+  final SVGAnimatedNumber surfaceScale;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFEDisplacementMapElement
+class SVGFEDisplacementMapElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEDisplacementMapElement" {
+
+  static const int SVG_CHANNEL_A = 4;
+
+  static const int SVG_CHANNEL_B = 3;
+
+  static const int SVG_CHANNEL_G = 2;
+
+  static const int SVG_CHANNEL_R = 1;
+
+  static const int SVG_CHANNEL_UNKNOWN = 0;
+
+  /** @domName SVGFEDisplacementMapElement.in1 */
+  final SVGAnimatedString in1;
+
+  /** @domName SVGFEDisplacementMapElement.in2 */
+  final SVGAnimatedString in2;
+
+  /** @domName SVGFEDisplacementMapElement.scale */
+  final SVGAnimatedNumber scale;
+
+  /** @domName SVGFEDisplacementMapElement.xChannelSelector */
+  final SVGAnimatedEnumeration xChannelSelector;
+
+  /** @domName SVGFEDisplacementMapElement.yChannelSelector */
+  final SVGAnimatedEnumeration yChannelSelector;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFEDistantLightElement
+class SVGFEDistantLightElement extends SVGElement native "*SVGFEDistantLightElement" {
+
+  /** @domName SVGFEDistantLightElement.azimuth */
+  final SVGAnimatedNumber azimuth;
+
+  /** @domName SVGFEDistantLightElement.elevation */
+  final SVGAnimatedNumber elevation;
+}
+
+/// @domName SVGFEDropShadowElement
+class SVGFEDropShadowElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEDropShadowElement" {
+
+  /** @domName SVGFEDropShadowElement.dx */
+  final SVGAnimatedNumber dx;
+
+  /** @domName SVGFEDropShadowElement.dy */
+  final SVGAnimatedNumber dy;
+
+  /** @domName SVGFEDropShadowElement.in1 */
+  final SVGAnimatedString in1;
+
+  /** @domName SVGFEDropShadowElement.stdDeviationX */
+  final SVGAnimatedNumber stdDeviationX;
+
+  /** @domName SVGFEDropShadowElement.stdDeviationY */
+  final SVGAnimatedNumber stdDeviationY;
+
+  /** @domName SVGFEDropShadowElement.setStdDeviation */
+  void setStdDeviation(num stdDeviationX, num stdDeviationY) native;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFEFloodElement
+class SVGFEFloodElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEFloodElement" {
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFEFuncAElement
+class SVGFEFuncAElement extends SVGComponentTransferFunctionElement native "*SVGFEFuncAElement" {
+}
+
+/// @domName SVGFEFuncBElement
+class SVGFEFuncBElement extends SVGComponentTransferFunctionElement native "*SVGFEFuncBElement" {
+}
+
+/// @domName SVGFEFuncGElement
+class SVGFEFuncGElement extends SVGComponentTransferFunctionElement native "*SVGFEFuncGElement" {
+}
+
+/// @domName SVGFEFuncRElement
+class SVGFEFuncRElement extends SVGComponentTransferFunctionElement native "*SVGFEFuncRElement" {
+}
+
+/// @domName SVGFEGaussianBlurElement
+class SVGFEGaussianBlurElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEGaussianBlurElement" {
+
+  /** @domName SVGFEGaussianBlurElement.in1 */
+  final SVGAnimatedString in1;
+
+  /** @domName SVGFEGaussianBlurElement.stdDeviationX */
+  final SVGAnimatedNumber stdDeviationX;
+
+  /** @domName SVGFEGaussianBlurElement.stdDeviationY */
+  final SVGAnimatedNumber stdDeviationY;
+
+  /** @domName SVGFEGaussianBlurElement.setStdDeviation */
+  void setStdDeviation(num stdDeviationX, num stdDeviationY) native;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFEImageElement
+class SVGFEImageElement extends SVGElement implements SVGURIReference, SVGLangSpace, SVGFilterPrimitiveStandardAttributes, SVGExternalResourcesRequired native "*SVGFEImageElement" {
+
+  /** @domName SVGFEImageElement.preserveAspectRatio */
+  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+
+/// @domName SVGFEMergeElement
+class SVGFEMergeElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEMergeElement" {
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFEMergeNodeElement
+class SVGFEMergeNodeElement extends SVGElement native "*SVGFEMergeNodeElement" {
+
+  /** @domName SVGFEMergeNodeElement.in1 */
+  final SVGAnimatedString in1;
+}
+
+/// @domName SVGFEMorphologyElement
+class SVGFEMorphologyElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEMorphologyElement" {
+
+  static const int SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
+
+  static const int SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
+
+  static const int SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
+
+  /** @domName SVGFEMorphologyElement.in1 */
+  final SVGAnimatedString in1;
+
+  /** @domName SVGFEMorphologyElement.operator */
+  final SVGAnimatedEnumeration operator;
+
+  /** @domName SVGFEMorphologyElement.radiusX */
+  final SVGAnimatedNumber radiusX;
+
+  /** @domName SVGFEMorphologyElement.radiusY */
+  final SVGAnimatedNumber radiusY;
+
+  /** @domName SVGFEMorphologyElement.setRadius */
+  void setRadius(num radiusX, num radiusY) native;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFEOffsetElement
+class SVGFEOffsetElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFEOffsetElement" {
+
+  /** @domName SVGFEOffsetElement.dx */
+  final SVGAnimatedNumber dx;
+
+  /** @domName SVGFEOffsetElement.dy */
+  final SVGAnimatedNumber dy;
+
+  /** @domName SVGFEOffsetElement.in1 */
+  final SVGAnimatedString in1;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFEPointLightElement
+class SVGFEPointLightElement extends SVGElement native "*SVGFEPointLightElement" {
+
+  /** @domName SVGFEPointLightElement.x */
+  final SVGAnimatedNumber x;
+
+  /** @domName SVGFEPointLightElement.y */
+  final SVGAnimatedNumber y;
+
+  /** @domName SVGFEPointLightElement.z */
+  final SVGAnimatedNumber z;
+}
+
+/// @domName SVGFESpecularLightingElement
+class SVGFESpecularLightingElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFESpecularLightingElement" {
+
+  /** @domName SVGFESpecularLightingElement.in1 */
+  final SVGAnimatedString in1;
+
+  /** @domName SVGFESpecularLightingElement.specularConstant */
+  final SVGAnimatedNumber specularConstant;
+
+  /** @domName SVGFESpecularLightingElement.specularExponent */
+  final SVGAnimatedNumber specularExponent;
+
+  /** @domName SVGFESpecularLightingElement.surfaceScale */
+  final SVGAnimatedNumber surfaceScale;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFESpotLightElement
+class SVGFESpotLightElement extends SVGElement native "*SVGFESpotLightElement" {
+
+  /** @domName SVGFESpotLightElement.limitingConeAngle */
+  final SVGAnimatedNumber limitingConeAngle;
+
+  /** @domName SVGFESpotLightElement.pointsAtX */
+  final SVGAnimatedNumber pointsAtX;
+
+  /** @domName SVGFESpotLightElement.pointsAtY */
+  final SVGAnimatedNumber pointsAtY;
+
+  /** @domName SVGFESpotLightElement.pointsAtZ */
+  final SVGAnimatedNumber pointsAtZ;
+
+  /** @domName SVGFESpotLightElement.specularExponent */
+  final SVGAnimatedNumber specularExponent;
+
+  /** @domName SVGFESpotLightElement.x */
+  final SVGAnimatedNumber x;
+
+  /** @domName SVGFESpotLightElement.y */
+  final SVGAnimatedNumber y;
+
+  /** @domName SVGFESpotLightElement.z */
+  final SVGAnimatedNumber z;
+}
+
+/// @domName SVGFETileElement
+class SVGFETileElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFETileElement" {
+
+  /** @domName SVGFETileElement.in1 */
+  final SVGAnimatedString in1;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFETurbulenceElement
+class SVGFETurbulenceElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes native "*SVGFETurbulenceElement" {
+
+  static const int SVG_STITCHTYPE_NOSTITCH = 2;
+
+  static const int SVG_STITCHTYPE_STITCH = 1;
+
+  static const int SVG_STITCHTYPE_UNKNOWN = 0;
+
+  static const int SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
+
+  static const int SVG_TURBULENCE_TYPE_TURBULENCE = 2;
+
+  static const int SVG_TURBULENCE_TYPE_UNKNOWN = 0;
+
+  /** @domName SVGFETurbulenceElement.baseFrequencyX */
+  final SVGAnimatedNumber baseFrequencyX;
+
+  /** @domName SVGFETurbulenceElement.baseFrequencyY */
+  final SVGAnimatedNumber baseFrequencyY;
+
+  /** @domName SVGFETurbulenceElement.numOctaves */
+  final SVGAnimatedInteger numOctaves;
+
+  /** @domName SVGFETurbulenceElement.seed */
+  final SVGAnimatedNumber seed;
+
+  /** @domName SVGFETurbulenceElement.stitchTiles */
+  final SVGAnimatedEnumeration stitchTiles;
+
+  /** @domName SVGFETurbulenceElement.type */
+  final SVGAnimatedEnumeration type;
+
+  // From SVGFilterPrimitiveStandardAttributes
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.result */
+  final SVGAnimatedString result;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.y */
+  final SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGFilterElement
+class SVGFilterElement extends SVGElement implements SVGURIReference, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable native "*SVGFilterElement" {
+
+  /** @domName SVGFilterElement.filterResX */
+  final SVGAnimatedInteger filterResX;
+
+  /** @domName SVGFilterElement.filterResY */
+  final SVGAnimatedInteger filterResY;
+
+  /** @domName SVGFilterElement.filterUnits */
+  final SVGAnimatedEnumeration filterUnits;
+
+  /** @domName SVGFilterElement.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGFilterElement.primitiveUnits */
+  final SVGAnimatedEnumeration primitiveUnits;
+
+  /** @domName SVGFilterElement.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGFilterElement.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGFilterElement.y */
+  final SVGAnimatedLength y;
+
+  /** @domName SVGFilterElement.setFilterRes */
+  void setFilterRes(int filterResX, int filterResY) native;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+/// @domName SVGFilterPrimitiveStandardAttributes
+abstract class SVGFilterPrimitiveStandardAttributes implements SVGStylable {
+
+  SVGAnimatedLength height;
+
+  SVGAnimatedString result;
+
+  SVGAnimatedLength width;
+
+  SVGAnimatedLength x;
+
+  SVGAnimatedLength y;
+
+  // From SVGStylable
+
+  SVGAnimatedString className;
+
+  CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name);
+}
+/// @domName SVGFitToViewBox
+abstract class SVGFitToViewBox {
+
+  SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+
+  SVGAnimatedRect viewBox;
+}
+
+/// @domName SVGFontElement
+class SVGFontElement extends SVGElement native "*SVGFontElement" {
+}
+
+/// @domName SVGFontFaceElement
+class SVGFontFaceElement extends SVGElement native "*SVGFontFaceElement" {
+}
+
+/// @domName SVGFontFaceFormatElement
+class SVGFontFaceFormatElement extends SVGElement native "*SVGFontFaceFormatElement" {
+}
+
+/// @domName SVGFontFaceNameElement
+class SVGFontFaceNameElement extends SVGElement native "*SVGFontFaceNameElement" {
+}
+
+/// @domName SVGFontFaceSrcElement
+class SVGFontFaceSrcElement extends SVGElement native "*SVGFontFaceSrcElement" {
+}
+
+/// @domName SVGFontFaceUriElement
+class SVGFontFaceUriElement extends SVGElement native "*SVGFontFaceUriElement" {
+}
+
+/// @domName SVGForeignObjectElement
+class SVGForeignObjectElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGForeignObjectElement" {
+
+  /** @domName SVGForeignObjectElement.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGForeignObjectElement.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGForeignObjectElement.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGForeignObjectElement.y */
+  final SVGAnimatedLength y;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+}
+
+/// @domName SVGGElement
+class SVGGElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGGElement" {
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+}
+
+/// @domName SVGGlyphElement
+class SVGGlyphElement extends SVGElement native "*SVGGlyphElement" {
+}
+
+/// @domName SVGGlyphRefElement
+class SVGGlyphRefElement extends SVGElement implements SVGURIReference, SVGStylable native "*SVGGlyphRefElement" {
+
+  /** @domName SVGGlyphRefElement.dx */
+  num dx;
+
+  /** @domName SVGGlyphRefElement.dy */
+  num dy;
+
+  /** @domName SVGGlyphRefElement.format */
+  String format;
+
+  /** @domName SVGGlyphRefElement.glyphRef */
+  String glyphRef;
+
+  /** @domName SVGGlyphRefElement.x */
+  num x;
+
+  /** @domName SVGGlyphRefElement.y */
+  num y;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+
+/// @domName SVGGradientElement
+class SVGGradientElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired, SVGStylable native "*SVGGradientElement" {
+
+  static const int SVG_SPREADMETHOD_PAD = 1;
+
+  static const int SVG_SPREADMETHOD_REFLECT = 2;
+
+  static const int SVG_SPREADMETHOD_REPEAT = 3;
+
+  static const int SVG_SPREADMETHOD_UNKNOWN = 0;
+
+  /** @domName SVGGradientElement.gradientTransform */
+  final SVGAnimatedTransformList gradientTransform;
+
+  /** @domName SVGGradientElement.gradientUnits */
+  final SVGAnimatedEnumeration gradientUnits;
+
+  /** @domName SVGGradientElement.spreadMethod */
+  final SVGAnimatedEnumeration spreadMethod;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+
+/// @domName SVGHKernElement
+class SVGHKernElement extends SVGElement native "*SVGHKernElement" {
+}
+
+/// @domName SVGImageElement
+class SVGImageElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable native "*SVGImageElement" {
+
+  /** @domName SVGImageElement.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGImageElement.preserveAspectRatio */
+  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+
+  /** @domName SVGImageElement.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGImageElement.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGImageElement.y */
+  final SVGAnimatedLength y;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+/// @domName SVGLangSpace
+abstract class SVGLangSpace {
+
+  String xmllang;
+
+  String xmlspace;
+}
+
+/// @domName SVGLength
+class SVGLength native "*SVGLength" {
+
+  static const int SVG_LENGTHTYPE_CM = 6;
+
+  static const int SVG_LENGTHTYPE_EMS = 3;
+
+  static const int SVG_LENGTHTYPE_EXS = 4;
+
+  static const int SVG_LENGTHTYPE_IN = 8;
+
+  static const int SVG_LENGTHTYPE_MM = 7;
+
+  static const int SVG_LENGTHTYPE_NUMBER = 1;
+
+  static const int SVG_LENGTHTYPE_PC = 10;
+
+  static const int SVG_LENGTHTYPE_PERCENTAGE = 2;
+
+  static const int SVG_LENGTHTYPE_PT = 9;
+
+  static const int SVG_LENGTHTYPE_PX = 5;
+
+  static const int SVG_LENGTHTYPE_UNKNOWN = 0;
+
+  /** @domName SVGLength.unitType */
+  final int unitType;
+
+  /** @domName SVGLength.value */
+  num value;
+
+  /** @domName SVGLength.valueAsString */
+  String valueAsString;
+
+  /** @domName SVGLength.valueInSpecifiedUnits */
+  num valueInSpecifiedUnits;
+
+  /** @domName SVGLength.convertToSpecifiedUnits */
+  void convertToSpecifiedUnits(int unitType) native;
+
+  /** @domName SVGLength.newValueSpecifiedUnits */
+  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native;
+}
+
+/// @domName SVGLengthList
+class SVGLengthList implements JavaScriptIndexingBehavior, List<SVGLength> native "*SVGLengthList" {
+
+  /** @domName SVGLengthList.numberOfItems */
+  final int numberOfItems;
+
+  SVGLength operator[](int index) => JS("SVGLength", "#[#]", this, index);
+
+  void operator[]=(int index, SVGLength value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SVGLength> mixins.
+  // SVGLength is the element type.
+
+  // From Iterable<SVGLength>:
+
+  Iterator<SVGLength> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SVGLength>(this);
+  }
+
+  // From Collection<SVGLength>:
+
+  void add(SVGLength value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SVGLength value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SVGLength> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SVGLength element) => _Collections.contains(this, element);
+
+  void forEach(void f(SVGLength element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SVGLength element)) => _Collections.map(this, [], f);
+
+  Collection<SVGLength> filter(bool f(SVGLength element)) =>
+     _Collections.filter(this, <SVGLength>[], f);
+
+  bool every(bool f(SVGLength element)) => _Collections.every(this, f);
+
+  bool some(bool f(SVGLength element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SVGLength>:
+
+  void sort([Comparator<SVGLength> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SVGLength element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SVGLength element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SVGLength get last => this[length - 1];
+
+  SVGLength removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SVGLength> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SVGLength initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SVGLength> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SVGLength>[]);
+
+  // -- end List<SVGLength> mixins.
+
+  /** @domName SVGLengthList.appendItem */
+  SVGLength appendItem(SVGLength item) native;
+
+  /** @domName SVGLengthList.clear */
+  void clear() native;
+
+  /** @domName SVGLengthList.getItem */
+  SVGLength getItem(int index) native;
+
+  /** @domName SVGLengthList.initialize */
+  SVGLength initialize(SVGLength item) native;
+
+  /** @domName SVGLengthList.insertItemBefore */
+  SVGLength insertItemBefore(SVGLength item, int index) native;
+
+  /** @domName SVGLengthList.removeItem */
+  SVGLength removeItem(int index) native;
+
+  /** @domName SVGLengthList.replaceItem */
+  SVGLength replaceItem(SVGLength item, int index) native;
+}
+
+/// @domName SVGLineElement
+class SVGLineElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGLineElement" {
+
+  /** @domName SVGLineElement.x1 */
+  final SVGAnimatedLength x1;
+
+  /** @domName SVGLineElement.x2 */
+  final SVGAnimatedLength x2;
+
+  /** @domName SVGLineElement.y1 */
+  final SVGAnimatedLength y1;
+
+  /** @domName SVGLineElement.y2 */
+  final SVGAnimatedLength y2;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+}
+
+/// @domName SVGLinearGradientElement
+class SVGLinearGradientElement extends SVGGradientElement native "*SVGLinearGradientElement" {
+
+  /** @domName SVGLinearGradientElement.x1 */
+  final SVGAnimatedLength x1;
+
+  /** @domName SVGLinearGradientElement.x2 */
+  final SVGAnimatedLength x2;
+
+  /** @domName SVGLinearGradientElement.y1 */
+  final SVGAnimatedLength y1;
+
+  /** @domName SVGLinearGradientElement.y2 */
+  final SVGAnimatedLength y2;
+}
+/// @domName SVGLocatable
+abstract class SVGLocatable {
+
+  SVGElement farthestViewportElement;
+
+  SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox();
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM();
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM();
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element);
+}
+
+/// @domName SVGMPathElement
+class SVGMPathElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired native "*SVGMPathElement" {
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+
+/// @domName SVGMarkerElement
+class SVGMarkerElement extends SVGElement implements SVGLangSpace, SVGFitToViewBox, SVGExternalResourcesRequired, SVGStylable native "*SVGMarkerElement" {
+
+  static const int SVG_MARKERUNITS_STROKEWIDTH = 2;
+
+  static const int SVG_MARKERUNITS_UNKNOWN = 0;
+
+  static const int SVG_MARKERUNITS_USERSPACEONUSE = 1;
+
+  static const int SVG_MARKER_ORIENT_ANGLE = 2;
+
+  static const int SVG_MARKER_ORIENT_AUTO = 1;
+
+  static const int SVG_MARKER_ORIENT_UNKNOWN = 0;
+
+  /** @domName SVGMarkerElement.markerHeight */
+  final SVGAnimatedLength markerHeight;
+
+  /** @domName SVGMarkerElement.markerUnits */
+  final SVGAnimatedEnumeration markerUnits;
+
+  /** @domName SVGMarkerElement.markerWidth */
+  final SVGAnimatedLength markerWidth;
+
+  /** @domName SVGMarkerElement.orientAngle */
+  final SVGAnimatedAngle orientAngle;
+
+  /** @domName SVGMarkerElement.orientType */
+  final SVGAnimatedEnumeration orientType;
+
+  /** @domName SVGMarkerElement.refX */
+  final SVGAnimatedLength refX;
+
+  /** @domName SVGMarkerElement.refY */
+  final SVGAnimatedLength refY;
+
+  /** @domName SVGMarkerElement.setOrientToAngle */
+  void setOrientToAngle(SVGAngle angle) native;
+
+  /** @domName SVGMarkerElement.setOrientToAuto */
+  void setOrientToAuto() native;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGFitToViewBox
+
+  /** @domName SVGFitToViewBox.preserveAspectRatio */
+  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+
+  /** @domName SVGFitToViewBox.viewBox */
+  final SVGAnimatedRect viewBox;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGMaskElement
+class SVGMaskElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGExternalResourcesRequired native "*SVGMaskElement" {
+
+  /** @domName SVGMaskElement.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGMaskElement.maskContentUnits */
+  final SVGAnimatedEnumeration maskContentUnits;
+
+  /** @domName SVGMaskElement.maskUnits */
+  final SVGAnimatedEnumeration maskUnits;
+
+  /** @domName SVGMaskElement.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGMaskElement.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGMaskElement.y */
+  final SVGAnimatedLength y;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+}
+
+/// @domName SVGMatrix
+class SVGMatrix native "*SVGMatrix" {
+
+  /** @domName SVGMatrix.a */
+  num a;
+
+  /** @domName SVGMatrix.b */
+  num b;
+
+  /** @domName SVGMatrix.c */
+  num c;
+
+  /** @domName SVGMatrix.d */
+  num d;
+
+  /** @domName SVGMatrix.e */
+  num e;
+
+  /** @domName SVGMatrix.f */
+  num f;
+
+  /** @domName SVGMatrix.flipX */
+  SVGMatrix flipX() native;
+
+  /** @domName SVGMatrix.flipY */
+  SVGMatrix flipY() native;
+
+  /** @domName SVGMatrix.inverse */
+  SVGMatrix inverse() native;
+
+  /** @domName SVGMatrix.multiply */
+  SVGMatrix multiply(SVGMatrix secondMatrix) native;
+
+  /** @domName SVGMatrix.rotate */
+  SVGMatrix rotate(num angle) native;
+
+  /** @domName SVGMatrix.rotateFromVector */
+  SVGMatrix rotateFromVector(num x, num y) native;
+
+  /** @domName SVGMatrix.scale */
+  SVGMatrix scale(num scaleFactor) native;
+
+  /** @domName SVGMatrix.scaleNonUniform */
+  SVGMatrix scaleNonUniform(num scaleFactorX, num scaleFactorY) native;
+
+  /** @domName SVGMatrix.skewX */
+  SVGMatrix skewX(num angle) native;
+
+  /** @domName SVGMatrix.skewY */
+  SVGMatrix skewY(num angle) native;
+
+  /** @domName SVGMatrix.translate */
+  SVGMatrix translate(num x, num y) native;
+}
+
+/// @domName SVGMetadataElement
+class SVGMetadataElement extends SVGElement native "*SVGMetadataElement" {
+}
+
+/// @domName SVGMissingGlyphElement
+class SVGMissingGlyphElement extends SVGElement native "*SVGMissingGlyphElement" {
+}
+
+/// @domName SVGNumber
+class SVGNumber native "*SVGNumber" {
+
+  /** @domName SVGNumber.value */
+  num value;
+}
+
+/// @domName SVGNumberList
+class SVGNumberList implements JavaScriptIndexingBehavior, List<SVGNumber> native "*SVGNumberList" {
+
+  /** @domName SVGNumberList.numberOfItems */
+  final int numberOfItems;
+
+  SVGNumber operator[](int index) => JS("SVGNumber", "#[#]", this, index);
+
+  void operator[]=(int index, SVGNumber value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SVGNumber> mixins.
+  // SVGNumber is the element type.
+
+  // From Iterable<SVGNumber>:
+
+  Iterator<SVGNumber> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SVGNumber>(this);
+  }
+
+  // From Collection<SVGNumber>:
+
+  void add(SVGNumber value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SVGNumber value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SVGNumber> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SVGNumber element) => _Collections.contains(this, element);
+
+  void forEach(void f(SVGNumber element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SVGNumber element)) => _Collections.map(this, [], f);
+
+  Collection<SVGNumber> filter(bool f(SVGNumber element)) =>
+     _Collections.filter(this, <SVGNumber>[], f);
+
+  bool every(bool f(SVGNumber element)) => _Collections.every(this, f);
+
+  bool some(bool f(SVGNumber element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SVGNumber>:
+
+  void sort([Comparator<SVGNumber> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SVGNumber element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SVGNumber element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SVGNumber get last => this[length - 1];
+
+  SVGNumber removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SVGNumber> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SVGNumber initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SVGNumber> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SVGNumber>[]);
+
+  // -- end List<SVGNumber> mixins.
+
+  /** @domName SVGNumberList.appendItem */
+  SVGNumber appendItem(SVGNumber item) native;
+
+  /** @domName SVGNumberList.clear */
+  void clear() native;
+
+  /** @domName SVGNumberList.getItem */
+  SVGNumber getItem(int index) native;
+
+  /** @domName SVGNumberList.initialize */
+  SVGNumber initialize(SVGNumber item) native;
+
+  /** @domName SVGNumberList.insertItemBefore */
+  SVGNumber insertItemBefore(SVGNumber item, int index) native;
+
+  /** @domName SVGNumberList.removeItem */
+  SVGNumber removeItem(int index) native;
+
+  /** @domName SVGNumberList.replaceItem */
+  SVGNumber replaceItem(SVGNumber item, int index) native;
+}
+
+/// @domName SVGPaint
+class SVGPaint extends SVGColor native "*SVGPaint" {
+
+  static const int SVG_PAINTTYPE_CURRENTCOLOR = 102;
+
+  static const int SVG_PAINTTYPE_NONE = 101;
+
+  static const int SVG_PAINTTYPE_RGBCOLOR = 1;
+
+  static const int SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR = 2;
+
+  static const int SVG_PAINTTYPE_UNKNOWN = 0;
+
+  static const int SVG_PAINTTYPE_URI = 107;
+
+  static const int SVG_PAINTTYPE_URI_CURRENTCOLOR = 104;
+
+  static const int SVG_PAINTTYPE_URI_NONE = 103;
+
+  static const int SVG_PAINTTYPE_URI_RGBCOLOR = 105;
+
+  static const int SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106;
+
+  /** @domName SVGPaint.paintType */
+  final int paintType;
+
+  /** @domName SVGPaint.uri */
+  final String uri;
+
+  /** @domName SVGPaint.setPaint */
+  void setPaint(int paintType, String uri, String rgbColor, String iccColor) native;
+
+  /** @domName SVGPaint.setUri */
+  void setUri(String uri) native;
+}
+
+/// @domName SVGPathElement
+class SVGPathElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGPathElement" {
+
+  /** @domName SVGPathElement.animatedNormalizedPathSegList */
+  final SVGPathSegList animatedNormalizedPathSegList;
+
+  /** @domName SVGPathElement.animatedPathSegList */
+  final SVGPathSegList animatedPathSegList;
+
+  /** @domName SVGPathElement.normalizedPathSegList */
+  final SVGPathSegList normalizedPathSegList;
+
+  /** @domName SVGPathElement.pathLength */
+  final SVGAnimatedNumber pathLength;
+
+  /** @domName SVGPathElement.pathSegList */
+  final SVGPathSegList pathSegList;
+
+  /** @domName SVGPathElement.createSVGPathSegArcAbs */
+  SVGPathSegArcAbs createSVGPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
+
+  /** @domName SVGPathElement.createSVGPathSegArcRel */
+  SVGPathSegArcRel createSVGPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
+
+  /** @domName SVGPathElement.createSVGPathSegClosePath */
+  SVGPathSegClosePath createSVGPathSegClosePath() native;
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicAbs */
+  SVGPathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native;
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicRel */
+  SVGPathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) native;
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs */
+  SVGPathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) native;
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel */
+  SVGPathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native;
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticAbs */
+  SVGPathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native;
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticRel */
+  SVGPathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native;
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs */
+  SVGPathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(num x, num y) native;
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel */
+  SVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(num x, num y) native;
+
+  /** @domName SVGPathElement.createSVGPathSegLinetoAbs */
+  SVGPathSegLinetoAbs createSVGPathSegLinetoAbs(num x, num y) native;
+
+  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalAbs */
+  SVGPathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(num x) native;
+
+  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalRel */
+  SVGPathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(num x) native;
+
+  /** @domName SVGPathElement.createSVGPathSegLinetoRel */
+  SVGPathSegLinetoRel createSVGPathSegLinetoRel(num x, num y) native;
+
+  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalAbs */
+  SVGPathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(num y) native;
+
+  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalRel */
+  SVGPathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(num y) native;
+
+  /** @domName SVGPathElement.createSVGPathSegMovetoAbs */
+  SVGPathSegMovetoAbs createSVGPathSegMovetoAbs(num x, num y) native;
+
+  /** @domName SVGPathElement.createSVGPathSegMovetoRel */
+  SVGPathSegMovetoRel createSVGPathSegMovetoRel(num x, num y) native;
+
+  /** @domName SVGPathElement.getPathSegAtLength */
+  int getPathSegAtLength(num distance) native;
+
+  /** @domName SVGPathElement.getPointAtLength */
+  SVGPoint getPointAtLength(num distance) native;
+
+  /** @domName SVGPathElement.getTotalLength */
+  num getTotalLength() native;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+}
+
+/// @domName SVGPathSeg
+class SVGPathSeg native "*SVGPathSeg" {
+
+  static const int PATHSEG_ARC_ABS = 10;
+
+  static const int PATHSEG_ARC_REL = 11;
+
+  static const int PATHSEG_CLOSEPATH = 1;
+
+  static const int PATHSEG_CURVETO_CUBIC_ABS = 6;
+
+  static const int PATHSEG_CURVETO_CUBIC_REL = 7;
+
+  static const int PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
+
+  static const int PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
+
+  static const int PATHSEG_CURVETO_QUADRATIC_ABS = 8;
+
+  static const int PATHSEG_CURVETO_QUADRATIC_REL = 9;
+
+  static const int PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
+
+  static const int PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
+
+  static const int PATHSEG_LINETO_ABS = 4;
+
+  static const int PATHSEG_LINETO_HORIZONTAL_ABS = 12;
+
+  static const int PATHSEG_LINETO_HORIZONTAL_REL = 13;
+
+  static const int PATHSEG_LINETO_REL = 5;
+
+  static const int PATHSEG_LINETO_VERTICAL_ABS = 14;
+
+  static const int PATHSEG_LINETO_VERTICAL_REL = 15;
+
+  static const int PATHSEG_MOVETO_ABS = 2;
+
+  static const int PATHSEG_MOVETO_REL = 3;
+
+  static const int PATHSEG_UNKNOWN = 0;
+
+  /** @domName SVGPathSeg.pathSegType */
+  final int pathSegType;
+
+  /** @domName SVGPathSeg.pathSegTypeAsLetter */
+  final String pathSegTypeAsLetter;
+}
+
+/// @domName SVGPathSegArcAbs
+class SVGPathSegArcAbs extends SVGPathSeg native "*SVGPathSegArcAbs" {
+
+  /** @domName SVGPathSegArcAbs.angle */
+  num angle;
+
+  /** @domName SVGPathSegArcAbs.largeArcFlag */
+  bool largeArcFlag;
+
+  /** @domName SVGPathSegArcAbs.r1 */
+  num r1;
+
+  /** @domName SVGPathSegArcAbs.r2 */
+  num r2;
+
+  /** @domName SVGPathSegArcAbs.sweepFlag */
+  bool sweepFlag;
+
+  /** @domName SVGPathSegArcAbs.x */
+  num x;
+
+  /** @domName SVGPathSegArcAbs.y */
+  num y;
+}
+
+/// @domName SVGPathSegArcRel
+class SVGPathSegArcRel extends SVGPathSeg native "*SVGPathSegArcRel" {
+
+  /** @domName SVGPathSegArcRel.angle */
+  num angle;
+
+  /** @domName SVGPathSegArcRel.largeArcFlag */
+  bool largeArcFlag;
+
+  /** @domName SVGPathSegArcRel.r1 */
+  num r1;
+
+  /** @domName SVGPathSegArcRel.r2 */
+  num r2;
+
+  /** @domName SVGPathSegArcRel.sweepFlag */
+  bool sweepFlag;
+
+  /** @domName SVGPathSegArcRel.x */
+  num x;
+
+  /** @domName SVGPathSegArcRel.y */
+  num y;
+}
+
+/// @domName SVGPathSegClosePath
+class SVGPathSegClosePath extends SVGPathSeg native "*SVGPathSegClosePath" {
+}
+
+/// @domName SVGPathSegCurvetoCubicAbs
+class SVGPathSegCurvetoCubicAbs extends SVGPathSeg native "*SVGPathSegCurvetoCubicAbs" {
+
+  /** @domName SVGPathSegCurvetoCubicAbs.x */
+  num x;
+
+  /** @domName SVGPathSegCurvetoCubicAbs.x1 */
+  num x1;
+
+  /** @domName SVGPathSegCurvetoCubicAbs.x2 */
+  num x2;
+
+  /** @domName SVGPathSegCurvetoCubicAbs.y */
+  num y;
+
+  /** @domName SVGPathSegCurvetoCubicAbs.y1 */
+  num y1;
+
+  /** @domName SVGPathSegCurvetoCubicAbs.y2 */
+  num y2;
+}
+
+/// @domName SVGPathSegCurvetoCubicRel
+class SVGPathSegCurvetoCubicRel extends SVGPathSeg native "*SVGPathSegCurvetoCubicRel" {
+
+  /** @domName SVGPathSegCurvetoCubicRel.x */
+  num x;
+
+  /** @domName SVGPathSegCurvetoCubicRel.x1 */
+  num x1;
+
+  /** @domName SVGPathSegCurvetoCubicRel.x2 */
+  num x2;
+
+  /** @domName SVGPathSegCurvetoCubicRel.y */
+  num y;
+
+  /** @domName SVGPathSegCurvetoCubicRel.y1 */
+  num y1;
+
+  /** @domName SVGPathSegCurvetoCubicRel.y2 */
+  num y2;
+}
+
+/// @domName SVGPathSegCurvetoCubicSmoothAbs
+class SVGPathSegCurvetoCubicSmoothAbs extends SVGPathSeg native "*SVGPathSegCurvetoCubicSmoothAbs" {
+
+  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x */
+  num x;
+
+  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x2 */
+  num x2;
+
+  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y */
+  num y;
+
+  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y2 */
+  num y2;
+}
+
+/// @domName SVGPathSegCurvetoCubicSmoothRel
+class SVGPathSegCurvetoCubicSmoothRel extends SVGPathSeg native "*SVGPathSegCurvetoCubicSmoothRel" {
+
+  /** @domName SVGPathSegCurvetoCubicSmoothRel.x */
+  num x;
+
+  /** @domName SVGPathSegCurvetoCubicSmoothRel.x2 */
+  num x2;
+
+  /** @domName SVGPathSegCurvetoCubicSmoothRel.y */
+  num y;
+
+  /** @domName SVGPathSegCurvetoCubicSmoothRel.y2 */
+  num y2;
+}
+
+/// @domName SVGPathSegCurvetoQuadraticAbs
+class SVGPathSegCurvetoQuadraticAbs extends SVGPathSeg native "*SVGPathSegCurvetoQuadraticAbs" {
+
+  /** @domName SVGPathSegCurvetoQuadraticAbs.x */
+  num x;
+
+  /** @domName SVGPathSegCurvetoQuadraticAbs.x1 */
+  num x1;
+
+  /** @domName SVGPathSegCurvetoQuadraticAbs.y */
+  num y;
+
+  /** @domName SVGPathSegCurvetoQuadraticAbs.y1 */
+  num y1;
+}
+
+/// @domName SVGPathSegCurvetoQuadraticRel
+class SVGPathSegCurvetoQuadraticRel extends SVGPathSeg native "*SVGPathSegCurvetoQuadraticRel" {
+
+  /** @domName SVGPathSegCurvetoQuadraticRel.x */
+  num x;
+
+  /** @domName SVGPathSegCurvetoQuadraticRel.x1 */
+  num x1;
+
+  /** @domName SVGPathSegCurvetoQuadraticRel.y */
+  num y;
+
+  /** @domName SVGPathSegCurvetoQuadraticRel.y1 */
+  num y1;
+}
+
+/// @domName SVGPathSegCurvetoQuadraticSmoothAbs
+class SVGPathSegCurvetoQuadraticSmoothAbs extends SVGPathSeg native "*SVGPathSegCurvetoQuadraticSmoothAbs" {
+
+  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.x */
+  num x;
+
+  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.y */
+  num y;
+}
+
+/// @domName SVGPathSegCurvetoQuadraticSmoothRel
+class SVGPathSegCurvetoQuadraticSmoothRel extends SVGPathSeg native "*SVGPathSegCurvetoQuadraticSmoothRel" {
+
+  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.x */
+  num x;
+
+  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.y */
+  num y;
+}
+
+/// @domName SVGPathSegLinetoAbs
+class SVGPathSegLinetoAbs extends SVGPathSeg native "*SVGPathSegLinetoAbs" {
+
+  /** @domName SVGPathSegLinetoAbs.x */
+  num x;
+
+  /** @domName SVGPathSegLinetoAbs.y */
+  num y;
+}
+
+/// @domName SVGPathSegLinetoHorizontalAbs
+class SVGPathSegLinetoHorizontalAbs extends SVGPathSeg native "*SVGPathSegLinetoHorizontalAbs" {
+
+  /** @domName SVGPathSegLinetoHorizontalAbs.x */
+  num x;
+}
+
+/// @domName SVGPathSegLinetoHorizontalRel
+class SVGPathSegLinetoHorizontalRel extends SVGPathSeg native "*SVGPathSegLinetoHorizontalRel" {
+
+  /** @domName SVGPathSegLinetoHorizontalRel.x */
+  num x;
+}
+
+/// @domName SVGPathSegLinetoRel
+class SVGPathSegLinetoRel extends SVGPathSeg native "*SVGPathSegLinetoRel" {
+
+  /** @domName SVGPathSegLinetoRel.x */
+  num x;
+
+  /** @domName SVGPathSegLinetoRel.y */
+  num y;
+}
+
+/// @domName SVGPathSegLinetoVerticalAbs
+class SVGPathSegLinetoVerticalAbs extends SVGPathSeg native "*SVGPathSegLinetoVerticalAbs" {
+
+  /** @domName SVGPathSegLinetoVerticalAbs.y */
+  num y;
+}
+
+/// @domName SVGPathSegLinetoVerticalRel
+class SVGPathSegLinetoVerticalRel extends SVGPathSeg native "*SVGPathSegLinetoVerticalRel" {
+
+  /** @domName SVGPathSegLinetoVerticalRel.y */
+  num y;
+}
+
+/// @domName SVGPathSegList
+class SVGPathSegList implements JavaScriptIndexingBehavior, List<SVGPathSeg> native "*SVGPathSegList" {
+
+  /** @domName SVGPathSegList.numberOfItems */
+  final int numberOfItems;
+
+  SVGPathSeg operator[](int index) => JS("SVGPathSeg", "#[#]", this, index);
+
+  void operator[]=(int index, SVGPathSeg value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SVGPathSeg> mixins.
+  // SVGPathSeg is the element type.
+
+  // From Iterable<SVGPathSeg>:
+
+  Iterator<SVGPathSeg> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SVGPathSeg>(this);
+  }
+
+  // From Collection<SVGPathSeg>:
+
+  void add(SVGPathSeg value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SVGPathSeg value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SVGPathSeg> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SVGPathSeg element) => _Collections.contains(this, element);
+
+  void forEach(void f(SVGPathSeg element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SVGPathSeg element)) => _Collections.map(this, [], f);
+
+  Collection<SVGPathSeg> filter(bool f(SVGPathSeg element)) =>
+     _Collections.filter(this, <SVGPathSeg>[], f);
+
+  bool every(bool f(SVGPathSeg element)) => _Collections.every(this, f);
+
+  bool some(bool f(SVGPathSeg element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SVGPathSeg>:
+
+  void sort([Comparator<SVGPathSeg> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SVGPathSeg element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SVGPathSeg element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SVGPathSeg get last => this[length - 1];
+
+  SVGPathSeg removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SVGPathSeg> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SVGPathSeg initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SVGPathSeg> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SVGPathSeg>[]);
+
+  // -- end List<SVGPathSeg> mixins.
+
+  /** @domName SVGPathSegList.appendItem */
+  SVGPathSeg appendItem(SVGPathSeg newItem) native;
+
+  /** @domName SVGPathSegList.clear */
+  void clear() native;
+
+  /** @domName SVGPathSegList.getItem */
+  SVGPathSeg getItem(int index) native;
+
+  /** @domName SVGPathSegList.initialize */
+  SVGPathSeg initialize(SVGPathSeg newItem) native;
+
+  /** @domName SVGPathSegList.insertItemBefore */
+  SVGPathSeg insertItemBefore(SVGPathSeg newItem, int index) native;
+
+  /** @domName SVGPathSegList.removeItem */
+  SVGPathSeg removeItem(int index) native;
+
+  /** @domName SVGPathSegList.replaceItem */
+  SVGPathSeg replaceItem(SVGPathSeg newItem, int index) native;
+}
+
+/// @domName SVGPathSegMovetoAbs
+class SVGPathSegMovetoAbs extends SVGPathSeg native "*SVGPathSegMovetoAbs" {
+
+  /** @domName SVGPathSegMovetoAbs.x */
+  num x;
+
+  /** @domName SVGPathSegMovetoAbs.y */
+  num y;
+}
+
+/// @domName SVGPathSegMovetoRel
+class SVGPathSegMovetoRel extends SVGPathSeg native "*SVGPathSegMovetoRel" {
+
+  /** @domName SVGPathSegMovetoRel.x */
+  num x;
+
+  /** @domName SVGPathSegMovetoRel.y */
+  num y;
+}
+
+/// @domName SVGPatternElement
+class SVGPatternElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGFitToViewBox, SVGExternalResourcesRequired native "*SVGPatternElement" {
+
+  /** @domName SVGPatternElement.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGPatternElement.patternContentUnits */
+  final SVGAnimatedEnumeration patternContentUnits;
+
+  /** @domName SVGPatternElement.patternTransform */
+  final SVGAnimatedTransformList patternTransform;
+
+  /** @domName SVGPatternElement.patternUnits */
+  final SVGAnimatedEnumeration patternUnits;
+
+  /** @domName SVGPatternElement.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGPatternElement.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGPatternElement.y */
+  final SVGAnimatedLength y;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGFitToViewBox
+
+  /** @domName SVGFitToViewBox.preserveAspectRatio */
+  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+
+  /** @domName SVGFitToViewBox.viewBox */
+  final SVGAnimatedRect viewBox;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+
+/// @domName SVGPoint
+class SVGPoint native "*SVGPoint" {
+
+  /** @domName SVGPoint.x */
+  num x;
+
+  /** @domName SVGPoint.y */
+  num y;
+
+  /** @domName SVGPoint.matrixTransform */
+  SVGPoint matrixTransform(SVGMatrix matrix) native;
+}
+
+/// @domName SVGPointList
+class SVGPointList native "*SVGPointList" {
+
+  /** @domName SVGPointList.numberOfItems */
+  final int numberOfItems;
+
+  /** @domName SVGPointList.appendItem */
+  SVGPoint appendItem(SVGPoint item) native;
+
+  /** @domName SVGPointList.clear */
+  void clear() native;
+
+  /** @domName SVGPointList.getItem */
+  SVGPoint getItem(int index) native;
+
+  /** @domName SVGPointList.initialize */
+  SVGPoint initialize(SVGPoint item) native;
+
+  /** @domName SVGPointList.insertItemBefore */
+  SVGPoint insertItemBefore(SVGPoint item, int index) native;
+
+  /** @domName SVGPointList.removeItem */
+  SVGPoint removeItem(int index) native;
+
+  /** @domName SVGPointList.replaceItem */
+  SVGPoint replaceItem(SVGPoint item, int index) native;
+}
+
+/// @domName SVGPolygonElement
+class SVGPolygonElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGPolygonElement" {
+
+  /** @domName SVGPolygonElement.animatedPoints */
+  final SVGPointList animatedPoints;
+
+  /** @domName SVGPolygonElement.points */
+  final SVGPointList points;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+}
+
+/// @domName SVGPolylineElement
+class SVGPolylineElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGPolylineElement" {
+
+  /** @domName SVGPolylineElement.animatedPoints */
+  final SVGPointList animatedPoints;
+
+  /** @domName SVGPolylineElement.points */
+  final SVGPointList points;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+}
+
+/// @domName SVGPreserveAspectRatio
+class SVGPreserveAspectRatio native "*SVGPreserveAspectRatio" {
+
+  static const int SVG_MEETORSLICE_MEET = 1;
+
+  static const int SVG_MEETORSLICE_SLICE = 2;
+
+  static const int SVG_MEETORSLICE_UNKNOWN = 0;
+
+  static const int SVG_PRESERVEASPECTRATIO_NONE = 1;
+
+  static const int SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;
+
+  static const int SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;
+
+  static const int SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;
+
+  static const int SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;
+
+  static const int SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;
+
+  static const int SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;
+
+  static const int SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;
+
+  static const int SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;
+
+  static const int SVG_PRESERVEASPECTRATIO_XMINYMID = 5;
+
+  static const int SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
+
+  /** @domName SVGPreserveAspectRatio.align */
+  int align;
+
+  /** @domName SVGPreserveAspectRatio.meetOrSlice */
+  int meetOrSlice;
+}
+
+/// @domName SVGRadialGradientElement
+class SVGRadialGradientElement extends SVGGradientElement native "*SVGRadialGradientElement" {
+
+  /** @domName SVGRadialGradientElement.cx */
+  final SVGAnimatedLength cx;
+
+  /** @domName SVGRadialGradientElement.cy */
+  final SVGAnimatedLength cy;
+
+  /** @domName SVGRadialGradientElement.fr */
+  final SVGAnimatedLength fr;
+
+  /** @domName SVGRadialGradientElement.fx */
+  final SVGAnimatedLength fx;
+
+  /** @domName SVGRadialGradientElement.fy */
+  final SVGAnimatedLength fy;
+
+  /** @domName SVGRadialGradientElement.r */
+  final SVGAnimatedLength r;
+}
+
+/// @domName SVGRect
+class SVGRect native "*SVGRect" {
+
+  /** @domName SVGRect.height */
+  num height;
+
+  /** @domName SVGRect.width */
+  num width;
+
+  /** @domName SVGRect.x */
+  num x;
+
+  /** @domName SVGRect.y */
+  num y;
+}
+
+/// @domName SVGRectElement
+class SVGRectElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGRectElement" {
+
+  /** @domName SVGRectElement.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGRectElement.rx */
+  final SVGAnimatedLength rx;
+
+  /** @domName SVGRectElement.ry */
+  final SVGAnimatedLength ry;
+
+  /** @domName SVGRectElement.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGRectElement.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGRectElement.y */
+  final SVGAnimatedLength y;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+}
+
+/// @domName SVGRenderingIntent
+class SVGRenderingIntent native "*SVGRenderingIntent" {
+
+  static const int RENDERING_INTENT_ABSOLUTE_COLORIMETRIC = 5;
+
+  static const int RENDERING_INTENT_AUTO = 1;
+
+  static const int RENDERING_INTENT_PERCEPTUAL = 2;
+
+  static const int RENDERING_INTENT_RELATIVE_COLORIMETRIC = 3;
+
+  static const int RENDERING_INTENT_SATURATION = 4;
+
+  static const int RENDERING_INTENT_UNKNOWN = 0;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class SVGSVGElement extends SVGElement implements SVGZoomAndPan, SVGLocatable, SVGLangSpace, SVGTests, SVGStylable, SVGFitToViewBox, SVGExternalResourcesRequired native "*SVGSVGElement" {
+  factory SVGSVGElement() => _SVGSVGElementFactoryProvider.createSVGSVGElement();
+
+
+  /** @domName SVGSVGElement.contentScriptType */
+  String contentScriptType;
+
+  /** @domName SVGSVGElement.contentStyleType */
+  String contentStyleType;
+
+  /** @domName SVGSVGElement.currentScale */
+  num currentScale;
+
+  /** @domName SVGSVGElement.currentTranslate */
+  final SVGPoint currentTranslate;
+
+  /** @domName SVGSVGElement.currentView */
+  final SVGViewSpec currentView;
+
+  /** @domName SVGSVGElement.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGSVGElement.pixelUnitToMillimeterX */
+  final num pixelUnitToMillimeterX;
+
+  /** @domName SVGSVGElement.pixelUnitToMillimeterY */
+  final num pixelUnitToMillimeterY;
+
+  /** @domName SVGSVGElement.screenPixelToMillimeterX */
+  final num screenPixelToMillimeterX;
+
+  /** @domName SVGSVGElement.screenPixelToMillimeterY */
+  final num screenPixelToMillimeterY;
+
+  /** @domName SVGSVGElement.useCurrentView */
+  final bool useCurrentView;
+
+  /** @domName SVGSVGElement.viewport */
+  final SVGRect viewport;
+
+  /** @domName SVGSVGElement.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGSVGElement.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGSVGElement.y */
+  final SVGAnimatedLength y;
+
+  /** @domName SVGSVGElement.animationsPaused */
+  bool animationsPaused() native;
+
+  /** @domName SVGSVGElement.checkEnclosure */
+  bool checkEnclosure(SVGElement element, SVGRect rect) native;
+
+  /** @domName SVGSVGElement.checkIntersection */
+  bool checkIntersection(SVGElement element, SVGRect rect) native;
+
+  /** @domName SVGSVGElement.createSVGAngle */
+  SVGAngle createSVGAngle() native;
+
+  /** @domName SVGSVGElement.createSVGLength */
+  SVGLength createSVGLength() native;
+
+  /** @domName SVGSVGElement.createSVGMatrix */
+  SVGMatrix createSVGMatrix() native;
+
+  /** @domName SVGSVGElement.createSVGNumber */
+  SVGNumber createSVGNumber() native;
+
+  /** @domName SVGSVGElement.createSVGPoint */
+  SVGPoint createSVGPoint() native;
+
+  /** @domName SVGSVGElement.createSVGRect */
+  SVGRect createSVGRect() native;
+
+  /** @domName SVGSVGElement.createSVGTransform */
+  SVGTransform createSVGTransform() native;
+
+  /** @domName SVGSVGElement.createSVGTransformFromMatrix */
+  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix) native;
+
+  /** @domName SVGSVGElement.deselectAll */
+  void deselectAll() native;
+
+  /** @domName SVGSVGElement.forceRedraw */
+  void forceRedraw() native;
+
+  /** @domName SVGSVGElement.getCurrentTime */
+  num getCurrentTime() native;
+
+  /** @domName SVGSVGElement.getElementById */
+  Element getElementById(String elementId) native;
+
+  /** @domName SVGSVGElement.getEnclosureList */
+  List<Node> getEnclosureList(SVGRect rect, SVGElement referenceElement) native;
+
+  /** @domName SVGSVGElement.getIntersectionList */
+  List<Node> getIntersectionList(SVGRect rect, SVGElement referenceElement) native;
+
+  /** @domName SVGSVGElement.pauseAnimations */
+  void pauseAnimations() native;
+
+  /** @domName SVGSVGElement.setCurrentTime */
+  void setCurrentTime(num seconds) native;
+
+  /** @domName SVGSVGElement.suspendRedraw */
+  int suspendRedraw(int maxWaitMilliseconds) native;
+
+  /** @domName SVGSVGElement.unpauseAnimations */
+  void unpauseAnimations() native;
+
+  /** @domName SVGSVGElement.unsuspendRedraw */
+  void unsuspendRedraw(int suspendHandleId) native;
+
+  /** @domName SVGSVGElement.unsuspendRedrawAll */
+  void unsuspendRedrawAll() native;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGFitToViewBox
+
+  /** @domName SVGFitToViewBox.preserveAspectRatio */
+  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+
+  /** @domName SVGFitToViewBox.viewBox */
+  final SVGAnimatedRect viewBox;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGZoomAndPan
+
+  /** @domName SVGZoomAndPan.zoomAndPan */
+  int zoomAndPan;
+
+}
+
+/// @domName SVGScriptElement
+class SVGScriptElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired native "*SVGScriptElement" {
+
+  /** @domName SVGScriptElement.type */
+  String type;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+
+/// @domName SVGSetElement
+class SVGSetElement extends SVGAnimationElement native "*SVGSetElement" {
+}
+
+/// @domName SVGStopElement
+class SVGStopElement extends SVGElement implements SVGStylable native "*SVGStopElement" {
+
+  /** @domName SVGStopElement.offset */
+  final SVGAnimatedNumber offset;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGStringList
+class SVGStringList implements JavaScriptIndexingBehavior, List<String> native "*SVGStringList" {
+
+  /** @domName SVGStringList.numberOfItems */
+  final int numberOfItems;
+
+  String operator[](int index) => JS("String", "#[#]", this, index);
+
+  void operator[]=(int index, String value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<String> mixins.
+  // String is the element type.
+
+  // From Iterable<String>:
+
+  Iterator<String> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<String>(this);
+  }
+
+  // From Collection<String>:
+
+  void add(String value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(String value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<String> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(String element) => _Collections.contains(this, element);
+
+  void forEach(void f(String element)) => _Collections.forEach(this, f);
+
+  Collection map(f(String element)) => _Collections.map(this, [], f);
+
+  Collection<String> filter(bool f(String element)) =>
+     _Collections.filter(this, <String>[], f);
+
+  bool every(bool f(String element)) => _Collections.every(this, f);
+
+  bool some(bool f(String element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<String>:
+
+  void sort([Comparator<String> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(String element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(String element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  String get last => this[length - 1];
+
+  String removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [String initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<String> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <String>[]);
+
+  // -- end List<String> mixins.
+
+  /** @domName SVGStringList.appendItem */
+  String appendItem(String item) native;
+
+  /** @domName SVGStringList.clear */
+  void clear() native;
+
+  /** @domName SVGStringList.getItem */
+  String getItem(int index) native;
+
+  /** @domName SVGStringList.initialize */
+  String initialize(String item) native;
+
+  /** @domName SVGStringList.insertItemBefore */
+  String insertItemBefore(String item, int index) native;
+
+  /** @domName SVGStringList.removeItem */
+  String removeItem(int index) native;
+
+  /** @domName SVGStringList.replaceItem */
+  String replaceItem(String item, int index) native;
+}
+/// @domName SVGStylable
+abstract class SVGStylable {
+
+  SVGAnimatedString className;
+
+  CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name);
+}
+
+/// @domName SVGStyleElement
+class SVGStyleElement extends SVGElement implements SVGLangSpace native "*SVGStyleElement" {
+
+  /** @domName SVGStyleElement.disabled */
+  bool disabled;
+
+  /** @domName SVGStyleElement.media */
+  String media;
+
+  // Shadowing definition.
+  /** @domName SVGStyleElement.title */
+  String get title => JS("String", "#.title", this);
+
+  /** @domName SVGStyleElement.title */
+  void set title(String value) {
+    JS("void", "#.title = #", this, value);
+  }
+
+  /** @domName SVGStyleElement.type */
+  String type;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+}
+
+/// @domName SVGSwitchElement
+class SVGSwitchElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired native "*SVGSwitchElement" {
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+}
+
+/// @domName SVGSymbolElement
+class SVGSymbolElement extends SVGElement implements SVGLangSpace, SVGFitToViewBox, SVGExternalResourcesRequired, SVGStylable native "*SVGSymbolElement" {
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGFitToViewBox
+
+  /** @domName SVGFitToViewBox.preserveAspectRatio */
+  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+
+  /** @domName SVGFitToViewBox.viewBox */
+  final SVGAnimatedRect viewBox;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGTRefElement
+class SVGTRefElement extends SVGTextPositioningElement implements SVGURIReference native "*SVGTRefElement" {
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+
+/// @domName SVGTSpanElement
+class SVGTSpanElement extends SVGTextPositioningElement native "*SVGTSpanElement" {
+}
+/// @domName SVGTests
+abstract class SVGTests {
+
+  SVGStringList requiredExtensions;
+
+  SVGStringList requiredFeatures;
+
+  SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension);
+}
+
+/// @domName SVGTextContentElement
+class SVGTextContentElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGExternalResourcesRequired native "*SVGTextContentElement" {
+
+  static const int LENGTHADJUST_SPACING = 1;
+
+  static const int LENGTHADJUST_SPACINGANDGLYPHS = 2;
+
+  static const int LENGTHADJUST_UNKNOWN = 0;
+
+  /** @domName SVGTextContentElement.lengthAdjust */
+  final SVGAnimatedEnumeration lengthAdjust;
+
+  /** @domName SVGTextContentElement.textLength */
+  final SVGAnimatedLength textLength;
+
+  /** @domName SVGTextContentElement.getCharNumAtPosition */
+  int getCharNumAtPosition(SVGPoint point) native;
+
+  /** @domName SVGTextContentElement.getComputedTextLength */
+  num getComputedTextLength() native;
+
+  /** @domName SVGTextContentElement.getEndPositionOfChar */
+  SVGPoint getEndPositionOfChar(int offset) native;
+
+  /** @domName SVGTextContentElement.getExtentOfChar */
+  SVGRect getExtentOfChar(int offset) native;
+
+  /** @domName SVGTextContentElement.getNumberOfChars */
+  int getNumberOfChars() native;
+
+  /** @domName SVGTextContentElement.getRotationOfChar */
+  num getRotationOfChar(int offset) native;
+
+  /** @domName SVGTextContentElement.getStartPositionOfChar */
+  SVGPoint getStartPositionOfChar(int offset) native;
+
+  /** @domName SVGTextContentElement.getSubStringLength */
+  num getSubStringLength(int offset, int length) native;
+
+  /** @domName SVGTextContentElement.selectSubString */
+  void selectSubString(int offset, int length) native;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+}
+
+/// @domName SVGTextElement
+class SVGTextElement extends SVGTextPositioningElement implements SVGTransformable native "*SVGTextElement" {
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+}
+
+/// @domName SVGTextPathElement
+class SVGTextPathElement extends SVGTextContentElement implements SVGURIReference native "*SVGTextPathElement" {
+
+  static const int TEXTPATH_METHODTYPE_ALIGN = 1;
+
+  static const int TEXTPATH_METHODTYPE_STRETCH = 2;
+
+  static const int TEXTPATH_METHODTYPE_UNKNOWN = 0;
+
+  static const int TEXTPATH_SPACINGTYPE_AUTO = 1;
+
+  static const int TEXTPATH_SPACINGTYPE_EXACT = 2;
+
+  static const int TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
+
+  /** @domName SVGTextPathElement.method */
+  final SVGAnimatedEnumeration method;
+
+  /** @domName SVGTextPathElement.spacing */
+  final SVGAnimatedEnumeration spacing;
+
+  /** @domName SVGTextPathElement.startOffset */
+  final SVGAnimatedLength startOffset;
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+
+/// @domName SVGTextPositioningElement
+class SVGTextPositioningElement extends SVGTextContentElement native "*SVGTextPositioningElement" {
+
+  /** @domName SVGTextPositioningElement.dx */
+  final SVGAnimatedLengthList dx;
+
+  /** @domName SVGTextPositioningElement.dy */
+  final SVGAnimatedLengthList dy;
+
+  /** @domName SVGTextPositioningElement.rotate */
+  final SVGAnimatedNumberList rotate;
+
+  /** @domName SVGTextPositioningElement.x */
+  final SVGAnimatedLengthList x;
+
+  /** @domName SVGTextPositioningElement.y */
+  final SVGAnimatedLengthList y;
+}
+
+/// @domName SVGTitleElement
+class SVGTitleElement extends SVGElement implements SVGLangSpace, SVGStylable native "*SVGTitleElement" {
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+}
+
+/// @domName SVGTransform
+class SVGTransform native "*SVGTransform" {
+
+  static const int SVG_TRANSFORM_MATRIX = 1;
+
+  static const int SVG_TRANSFORM_ROTATE = 4;
+
+  static const int SVG_TRANSFORM_SCALE = 3;
+
+  static const int SVG_TRANSFORM_SKEWX = 5;
+
+  static const int SVG_TRANSFORM_SKEWY = 6;
+
+  static const int SVG_TRANSFORM_TRANSLATE = 2;
+
+  static const int SVG_TRANSFORM_UNKNOWN = 0;
+
+  /** @domName SVGTransform.angle */
+  final num angle;
+
+  /** @domName SVGTransform.matrix */
+  final SVGMatrix matrix;
+
+  /** @domName SVGTransform.type */
+  final int type;
+
+  /** @domName SVGTransform.setMatrix */
+  void setMatrix(SVGMatrix matrix) native;
+
+  /** @domName SVGTransform.setRotate */
+  void setRotate(num angle, num cx, num cy) native;
+
+  /** @domName SVGTransform.setScale */
+  void setScale(num sx, num sy) native;
+
+  /** @domName SVGTransform.setSkewX */
+  void setSkewX(num angle) native;
+
+  /** @domName SVGTransform.setSkewY */
+  void setSkewY(num angle) native;
+
+  /** @domName SVGTransform.setTranslate */
+  void setTranslate(num tx, num ty) native;
+}
+
+/// @domName SVGTransformList
+class SVGTransformList implements JavaScriptIndexingBehavior, List<SVGTransform> native "*SVGTransformList" {
+
+  /** @domName SVGTransformList.numberOfItems */
+  final int numberOfItems;
+
+  SVGTransform operator[](int index) => JS("SVGTransform", "#[#]", this, index);
+
+  void operator[]=(int index, SVGTransform value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SVGTransform> mixins.
+  // SVGTransform is the element type.
+
+  // From Iterable<SVGTransform>:
+
+  Iterator<SVGTransform> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SVGTransform>(this);
+  }
+
+  // From Collection<SVGTransform>:
+
+  void add(SVGTransform value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SVGTransform value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SVGTransform> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SVGTransform element) => _Collections.contains(this, element);
+
+  void forEach(void f(SVGTransform element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SVGTransform element)) => _Collections.map(this, [], f);
+
+  Collection<SVGTransform> filter(bool f(SVGTransform element)) =>
+     _Collections.filter(this, <SVGTransform>[], f);
+
+  bool every(bool f(SVGTransform element)) => _Collections.every(this, f);
+
+  bool some(bool f(SVGTransform element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SVGTransform>:
+
+  void sort([Comparator<SVGTransform> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SVGTransform element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SVGTransform element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SVGTransform get last => this[length - 1];
+
+  SVGTransform removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SVGTransform> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SVGTransform initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SVGTransform> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SVGTransform>[]);
+
+  // -- end List<SVGTransform> mixins.
+
+  /** @domName SVGTransformList.appendItem */
+  SVGTransform appendItem(SVGTransform item) native;
+
+  /** @domName SVGTransformList.clear */
+  void clear() native;
+
+  /** @domName SVGTransformList.consolidate */
+  SVGTransform consolidate() native;
+
+  /** @domName SVGTransformList.createSVGTransformFromMatrix */
+  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix) native;
+
+  /** @domName SVGTransformList.getItem */
+  SVGTransform getItem(int index) native;
+
+  /** @domName SVGTransformList.initialize */
+  SVGTransform initialize(SVGTransform item) native;
+
+  /** @domName SVGTransformList.insertItemBefore */
+  SVGTransform insertItemBefore(SVGTransform item, int index) native;
+
+  /** @domName SVGTransformList.removeItem */
+  SVGTransform removeItem(int index) native;
+
+  /** @domName SVGTransformList.replaceItem */
+  SVGTransform replaceItem(SVGTransform item, int index) native;
+}
+/// @domName SVGTransformable
+abstract class SVGTransformable implements SVGLocatable {
+
+  SVGAnimatedTransformList transform;
+
+  // From SVGLocatable
+
+  SVGElement farthestViewportElement;
+
+  SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox();
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM();
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM();
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element);
+}
+/// @domName SVGURIReference
+abstract class SVGURIReference {
+
+  SVGAnimatedString href;
+}
+
+/// @domName SVGUnitTypes
+class SVGUnitTypes native "*SVGUnitTypes" {
+
+  static const int SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
+
+  static const int SVG_UNIT_TYPE_UNKNOWN = 0;
+
+  static const int SVG_UNIT_TYPE_USERSPACEONUSE = 1;
+}
+
+/// @domName SVGUseElement
+class SVGUseElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable native "*SVGUseElement" {
+
+  /** @domName SVGUseElement.animatedInstanceRoot */
+  final SVGElementInstance animatedInstanceRoot;
+
+  /** @domName SVGUseElement.height */
+  final SVGAnimatedLength height;
+
+  /** @domName SVGUseElement.instanceRoot */
+  final SVGElementInstance instanceRoot;
+
+  /** @domName SVGUseElement.width */
+  final SVGAnimatedLength width;
+
+  /** @domName SVGUseElement.x */
+  final SVGAnimatedLength x;
+
+  /** @domName SVGUseElement.y */
+  final SVGAnimatedLength y;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGLangSpace
+
+  /** @domName SVGLangSpace.xmllang */
+  String xmllang;
+
+  /** @domName SVGLangSpace.xmlspace */
+  String xmlspace;
+
+  // From SVGLocatable
+
+  /** @domName SVGLocatable.farthestViewportElement */
+  final SVGElement farthestViewportElement;
+
+  /** @domName SVGLocatable.nearestViewportElement */
+  final SVGElement nearestViewportElement;
+
+  /** @domName SVGLocatable.getBBox */
+  SVGRect getBBox() native;
+
+  /** @domName SVGLocatable.getCTM */
+  SVGMatrix getCTM() native;
+
+  /** @domName SVGLocatable.getScreenCTM */
+  SVGMatrix getScreenCTM() native;
+
+  /** @domName SVGLocatable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native;
+
+  // From SVGStylable
+
+  /** @domName SVGStylable.className */
+  SVGAnimatedString get $dom_svgClassName => JS("SVGAnimatedString", "#.className", this);
+
+  // Use implementation from Element.
+  // final CSSStyleDeclaration style;
+
+  /** @domName SVGStylable.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native;
+
+  // From SVGTests
+
+  /** @domName SVGTests.requiredExtensions */
+  final SVGStringList requiredExtensions;
+
+  /** @domName SVGTests.requiredFeatures */
+  final SVGStringList requiredFeatures;
+
+  /** @domName SVGTests.systemLanguage */
+  final SVGStringList systemLanguage;
+
+  /** @domName SVGTests.hasExtension */
+  bool hasExtension(String extension) native;
+
+  // From SVGTransformable
+
+  /** @domName SVGTransformable.transform */
+  final SVGAnimatedTransformList transform;
+
+  // From SVGURIReference
+
+  /** @domName SVGURIReference.href */
+  final SVGAnimatedString href;
+}
+
+/// @domName SVGVKernElement
+class SVGVKernElement extends SVGElement native "*SVGVKernElement" {
+}
+
+/// @domName SVGViewElement
+class SVGViewElement extends SVGElement implements SVGFitToViewBox, SVGZoomAndPan, SVGExternalResourcesRequired native "*SVGViewElement" {
+
+  /** @domName SVGViewElement.viewTarget */
+  final SVGStringList viewTarget;
+
+  // From SVGExternalResourcesRequired
+
+  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
+  final SVGAnimatedBoolean externalResourcesRequired;
+
+  // From SVGFitToViewBox
+
+  /** @domName SVGFitToViewBox.preserveAspectRatio */
+  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+
+  /** @domName SVGFitToViewBox.viewBox */
+  final SVGAnimatedRect viewBox;
+
+  // From SVGZoomAndPan
+
+  /** @domName SVGZoomAndPan.zoomAndPan */
+  int zoomAndPan;
+}
+
+/// @domName SVGViewSpec
+class SVGViewSpec native "*SVGViewSpec" {
+
+  /** @domName SVGViewSpec.preserveAspectRatio */
+  final SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+
+  /** @domName SVGViewSpec.preserveAspectRatioString */
+  final String preserveAspectRatioString;
+
+  /** @domName SVGViewSpec.transform */
+  final SVGTransformList transform;
+
+  /** @domName SVGViewSpec.transformString */
+  final String transformString;
+
+  /** @domName SVGViewSpec.viewBox */
+  final SVGAnimatedRect viewBox;
+
+  /** @domName SVGViewSpec.viewBoxString */
+  final String viewBoxString;
+
+  /** @domName SVGViewSpec.viewTarget */
+  final SVGElement viewTarget;
+
+  /** @domName SVGViewSpec.viewTargetString */
+  final String viewTargetString;
+
+  /** @domName SVGViewSpec.zoomAndPan */
+  int zoomAndPan;
+}
+/// @domName SVGZoomAndPan
+abstract class SVGZoomAndPan {
+
+  static const int SVG_ZOOMANDPAN_DISABLE = 1;
+
+  static const int SVG_ZOOMANDPAN_MAGNIFY = 2;
+
+  static const int SVG_ZOOMANDPAN_UNKNOWN = 0;
+
+  int zoomAndPan;
+}
+
+/// @domName SVGZoomEvent
+class SVGZoomEvent extends UIEvent native "*SVGZoomEvent" {
+
+  /** @domName SVGZoomEvent.newScale */
+  final num newScale;
+
+  /** @domName SVGZoomEvent.newTranslate */
+  final SVGPoint newTranslate;
+
+  /** @domName SVGZoomEvent.previousScale */
+  final num previousScale;
+
+  /** @domName SVGZoomEvent.previousTranslate */
+  final SVGPoint previousTranslate;
+
+  /** @domName SVGZoomEvent.zoomRectScreen */
+  final SVGRect zoomRectScreen;
+}
+
+/// @domName Screen
+class Screen native "*Screen" {
+
+  /** @domName Screen.availHeight */
+  final int availHeight;
+
+  /** @domName Screen.availLeft */
+  final int availLeft;
+
+  /** @domName Screen.availTop */
+  final int availTop;
+
+  /** @domName Screen.availWidth */
+  final int availWidth;
+
+  /** @domName Screen.colorDepth */
+  final int colorDepth;
+
+  /** @domName Screen.height */
+  final int height;
+
+  /** @domName Screen.pixelDepth */
+  final int pixelDepth;
+
+  /** @domName Screen.width */
+  final int width;
+}
+
+/// @domName HTMLScriptElement
+class ScriptElement extends Element implements Element native "*HTMLScriptElement" {
+
+  factory ScriptElement() => _Elements.createScriptElement();
+
+  /** @domName HTMLScriptElement.async */
+  bool async;
+
+  /** @domName HTMLScriptElement.charset */
+  String charset;
+
+  /** @domName HTMLScriptElement.crossOrigin */
+  String crossOrigin;
+
+  /** @domName HTMLScriptElement.defer */
+  bool defer;
+
+  /** @domName HTMLScriptElement.event */
+  String event;
+
+  /** @domName HTMLScriptElement.htmlFor */
+  String htmlFor;
+
+  /** @domName HTMLScriptElement.src */
+  String src;
+
+  /** @domName HTMLScriptElement.type */
+  String type;
+}
+
+/// @domName ScriptProcessorNode
+class ScriptProcessorNode extends AudioNode implements EventTarget native "*ScriptProcessorNode" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  ScriptProcessorNodeEvents get on =>
+    new ScriptProcessorNodeEvents(this);
+
+  /** @domName ScriptProcessorNode.bufferSize */
+  final int bufferSize;
+}
+
+class ScriptProcessorNodeEvents extends Events {
+  ScriptProcessorNodeEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get audioProcess => this['audioprocess'];
+}
+
+/// @domName ScriptProfile
+class ScriptProfile native "*ScriptProfile" {
+
+  /** @domName ScriptProfile.head */
+  final ScriptProfileNode head;
+
+  /** @domName ScriptProfile.title */
+  final String title;
+
+  /** @domName ScriptProfile.uid */
+  final int uid;
+}
+
+/// @domName ScriptProfileNode
+class ScriptProfileNode native "*ScriptProfileNode" {
+
+  /** @domName ScriptProfileNode.callUID */
+  final int callUID;
+
+  /** @domName ScriptProfileNode.functionName */
+  final String functionName;
+
+  /** @domName ScriptProfileNode.lineNumber */
+  final int lineNumber;
+
+  /** @domName ScriptProfileNode.numberOfCalls */
+  final int numberOfCalls;
+
+  /** @domName ScriptProfileNode.selfTime */
+  final num selfTime;
+
+  /** @domName ScriptProfileNode.totalTime */
+  final num totalTime;
+
+  /** @domName ScriptProfileNode.url */
+  final String url;
+
+  /** @domName ScriptProfileNode.visible */
+  final bool visible;
+
+  /** @domName ScriptProfileNode.children */
+  List<ScriptProfileNode> children() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class SelectElement extends Element implements Element native "*HTMLSelectElement" {
+
+  factory SelectElement() => _Elements.createSelectElement();
+
+  /** @domName HTMLSelectElement.autofocus */
+  bool autofocus;
+
+  /** @domName HTMLSelectElement.disabled */
+  bool disabled;
+
+  /** @domName HTMLSelectElement.form */
+  final FormElement form;
+
+  /** @domName HTMLSelectElement.labels */
+  final List<Node> labels;
+
+  /** @domName HTMLSelectElement.length */
+  int length;
+
+  /** @domName HTMLSelectElement.multiple */
+  bool multiple;
+
+  /** @domName HTMLSelectElement.name */
+  String name;
+
+  /** @domName HTMLSelectElement.required */
+  bool required;
+
+  /** @domName HTMLSelectElement.selectedIndex */
+  int selectedIndex;
+
+  /** @domName HTMLSelectElement.size */
+  int size;
+
+  /** @domName HTMLSelectElement.type */
+  final String type;
+
+  /** @domName HTMLSelectElement.validationMessage */
+  final String validationMessage;
+
+  /** @domName HTMLSelectElement.validity */
+  final ValidityState validity;
+
+  /** @domName HTMLSelectElement.value */
+  String value;
+
+  /** @domName HTMLSelectElement.willValidate */
+  final bool willValidate;
+
+  /** @domName HTMLSelectElement.checkValidity */
+  bool checkValidity() native;
+
+  /** @domName HTMLSelectElement.item */
+  Node item(int index) native;
+
+  /** @domName HTMLSelectElement.namedItem */
+  Node namedItem(String name) native;
+
+  /** @domName HTMLSelectElement.setCustomValidity */
+  void setCustomValidity(String error) native;
+
+
+  // Override default options, since IE returns SelectElement itself and it
+  // does not operate as a List.
+  List<OptionElement> get options {
+    return this.elements.filter((e) => e is OptionElement);
+  }
+
+  List<OptionElement> get selectedOptions {
+    // IE does not change the selected flag for single-selection items.
+    if (this.multiple) {
+      return this.options.filter((o) => o.selected);
+    } else {
+      return [this.options[this.selectedIndex]];
+    }
+  }
+}
+
+/// @domName SessionDescription
+class SessionDescription native "*SessionDescription" {
+
+  factory SessionDescription(String sdp) => _SessionDescriptionFactoryProvider.createSessionDescription(sdp);
+
+  /** @domName SessionDescription.addCandidate */
+  void addCandidate(IceCandidate candidate) native;
+
+  /** @domName SessionDescription.toSdp */
+  String toSdp() native;
+}
+
+/// @domName HTMLShadowElement
+class ShadowElement extends Element implements Element native "*HTMLShadowElement" {
+
+  /** @domName HTMLShadowElement.resetStyleInheritance */
+  bool resetStyleInheritance;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+class ShadowRoot extends DocumentFragment native "*ShadowRoot" {
+
+  factory ShadowRoot(Element host) => _ShadowRootFactoryProvider.createShadowRoot(host);
+
+  /** @domName ShadowRoot.activeElement */
+  final Element activeElement;
+
+  /** @domName ShadowRoot.applyAuthorStyles */
+  bool applyAuthorStyles;
+
+  /** @domName ShadowRoot.innerHTML */
+  String innerHTML;
+
+  /** @domName ShadowRoot.resetStyleInheritance */
+  bool resetStyleInheritance;
+
+  /** @domName ShadowRoot.cloneNode */
+  Node clone(bool deep) native "cloneNode";
+
+  /** @domName ShadowRoot.getElementById */
+  Element $dom_getElementById(String elementId) native "getElementById";
+
+  /** @domName ShadowRoot.getElementsByClassName */
+  List<Node> $dom_getElementsByClassName(String className) native "getElementsByClassName";
+
+  /** @domName ShadowRoot.getElementsByTagName */
+  List<Node> $dom_getElementsByTagName(String tagName) native "getElementsByTagName";
+
+  /** @domName ShadowRoot.getSelection */
+  DOMSelection getSelection() native;
+
+  static bool get supported =>
+      JS('bool', '!!(window.ShadowRoot || window.WebKitShadowRoot)');
+}
+
+/// @domName SharedWorker
+class SharedWorker extends AbstractWorker native "*SharedWorker" {
+
+  factory SharedWorker(String scriptURL, [String name]) {
+    if (!?name) {
+      return _SharedWorkerFactoryProvider.createSharedWorker(scriptURL);
+    }
+    return _SharedWorkerFactoryProvider.createSharedWorker(scriptURL, name);
+  }
+
+  /** @domName SharedWorker.port */
+  final MessagePort port;
+}
+
+/// @domName SharedWorkerContext
+class SharedWorkerContext extends WorkerContext native "*SharedWorkerContext" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  SharedWorkerContextEvents get on =>
+    new SharedWorkerContextEvents(this);
+
+  /** @domName SharedWorkerContext.name */
+  final String name;
+}
+
+class SharedWorkerContextEvents extends WorkerContextEvents {
+  SharedWorkerContextEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get connect => this['connect'];
+}
+
+/// @domName SourceBuffer
+class SourceBuffer native "*SourceBuffer" {
+
+  /** @domName SourceBuffer.buffered */
+  final TimeRanges buffered;
+
+  /** @domName SourceBuffer.timestampOffset */
+  num timestampOffset;
+
+  /** @domName SourceBuffer.abort */
+  void abort() native;
+
+  /** @domName SourceBuffer.append */
+  void append(Uint8Array data) native;
+}
+
+/// @domName SourceBufferList
+class SourceBufferList extends EventTarget implements JavaScriptIndexingBehavior, List<SourceBuffer> native "*SourceBufferList" {
+
+  /** @domName SourceBufferList.length */
+  final int length;
+
+  SourceBuffer operator[](int index) => JS("SourceBuffer", "#[#]", this, index);
+
+  void operator[]=(int index, SourceBuffer value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SourceBuffer> mixins.
+  // SourceBuffer is the element type.
+
+  // From Iterable<SourceBuffer>:
+
+  Iterator<SourceBuffer> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SourceBuffer>(this);
+  }
+
+  // From Collection<SourceBuffer>:
+
+  void add(SourceBuffer value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SourceBuffer value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SourceBuffer> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SourceBuffer element) => _Collections.contains(this, element);
+
+  void forEach(void f(SourceBuffer element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SourceBuffer element)) => _Collections.map(this, [], f);
+
+  Collection<SourceBuffer> filter(bool f(SourceBuffer element)) =>
+     _Collections.filter(this, <SourceBuffer>[], f);
+
+  bool every(bool f(SourceBuffer element)) => _Collections.every(this, f);
+
+  bool some(bool f(SourceBuffer element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SourceBuffer>:
+
+  void sort([Comparator<SourceBuffer> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SourceBuffer element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SourceBuffer element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SourceBuffer get last => this[length - 1];
+
+  SourceBuffer removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SourceBuffer> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SourceBuffer initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SourceBuffer> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SourceBuffer>[]);
+
+  // -- end List<SourceBuffer> mixins.
+
+  /** @domName SourceBufferList.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName SourceBufferList.dispatchEvent */
+  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+
+  /** @domName SourceBufferList.item */
+  SourceBuffer item(int index) native;
+
+  /** @domName SourceBufferList.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+/// @domName HTMLSourceElement
+class SourceElement extends Element implements Element native "*HTMLSourceElement" {
+
+  factory SourceElement() => _Elements.createSourceElement();
+
+  /** @domName HTMLSourceElement.media */
+  String media;
+
+  /** @domName HTMLSourceElement.src */
+  String src;
+
+  /** @domName HTMLSourceElement.type */
+  String type;
+}
+
+/// @domName HTMLSpanElement
+class SpanElement extends Element implements Element native "*HTMLSpanElement" {
+
+  factory SpanElement() => _Elements.createSpanElement();
+}
+
+/// @domName SpeechGrammar
+class SpeechGrammar native "*SpeechGrammar" {
+
+  factory SpeechGrammar() => _SpeechGrammarFactoryProvider.createSpeechGrammar();
+
+  /** @domName SpeechGrammar.src */
+  String src;
+
+  /** @domName SpeechGrammar.weight */
+  num weight;
+}
+
+/// @domName SpeechGrammarList
+class SpeechGrammarList implements JavaScriptIndexingBehavior, List<SpeechGrammar> native "*SpeechGrammarList" {
+
+  factory SpeechGrammarList() => _SpeechGrammarListFactoryProvider.createSpeechGrammarList();
+
+  /** @domName SpeechGrammarList.length */
+  final int length;
+
+  SpeechGrammar operator[](int index) => JS("SpeechGrammar", "#[#]", this, index);
+
+  void operator[]=(int index, SpeechGrammar value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SpeechGrammar> mixins.
+  // SpeechGrammar is the element type.
+
+  // From Iterable<SpeechGrammar>:
+
+  Iterator<SpeechGrammar> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SpeechGrammar>(this);
+  }
+
+  // From Collection<SpeechGrammar>:
+
+  void add(SpeechGrammar value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SpeechGrammar value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SpeechGrammar> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SpeechGrammar element) => _Collections.contains(this, element);
+
+  void forEach(void f(SpeechGrammar element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SpeechGrammar element)) => _Collections.map(this, [], f);
+
+  Collection<SpeechGrammar> filter(bool f(SpeechGrammar element)) =>
+     _Collections.filter(this, <SpeechGrammar>[], f);
+
+  bool every(bool f(SpeechGrammar element)) => _Collections.every(this, f);
+
+  bool some(bool f(SpeechGrammar element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SpeechGrammar>:
+
+  void sort([Comparator<SpeechGrammar> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SpeechGrammar element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SpeechGrammar element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SpeechGrammar get last => this[length - 1];
+
+  SpeechGrammar removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SpeechGrammar> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SpeechGrammar initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SpeechGrammar> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SpeechGrammar>[]);
+
+  // -- end List<SpeechGrammar> mixins.
+
+  /** @domName SpeechGrammarList.addFromString */
+  void addFromString(String string, [num weight]) native;
+
+  /** @domName SpeechGrammarList.addFromUri */
+  void addFromUri(String src, [num weight]) native;
+
+  /** @domName SpeechGrammarList.item */
+  SpeechGrammar item(int index) native;
+}
+
+/// @domName SpeechInputEvent
+class SpeechInputEvent extends Event native "*SpeechInputEvent" {
+
+  /** @domName SpeechInputEvent.results */
+  final List<SpeechInputResult> results;
+}
+
+/// @domName SpeechInputResult
+class SpeechInputResult native "*SpeechInputResult" {
+
+  /** @domName SpeechInputResult.confidence */
+  final num confidence;
+
+  /** @domName SpeechInputResult.utterance */
+  final String utterance;
+}
+
+/// @domName SpeechRecognition
+class SpeechRecognition extends EventTarget native "*SpeechRecognition" {
+
+  factory SpeechRecognition() => _SpeechRecognitionFactoryProvider.createSpeechRecognition();
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  SpeechRecognitionEvents get on =>
+    new SpeechRecognitionEvents(this);
+
+  /** @domName SpeechRecognition.continuous */
+  bool continuous;
+
+  /** @domName SpeechRecognition.grammars */
+  SpeechGrammarList grammars;
+
+  /** @domName SpeechRecognition.interimResults */
+  bool interimResults;
+
+  /** @domName SpeechRecognition.lang */
+  String lang;
+
+  /** @domName SpeechRecognition.maxAlternatives */
+  int maxAlternatives;
+
+  /** @domName SpeechRecognition.abort */
+  void abort() native;
+
+  /** @domName SpeechRecognition.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName SpeechRecognition.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName SpeechRecognition.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName SpeechRecognition.start */
+  void start() native;
+
+  /** @domName SpeechRecognition.stop */
+  void stop() native;
+}
+
+class SpeechRecognitionEvents extends Events {
+  SpeechRecognitionEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get audioEnd => this['audioend'];
+
+  EventListenerList get audioStart => this['audiostart'];
+
+  EventListenerList get end => this['end'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get noMatch => this['nomatch'];
+
+  EventListenerList get result => this['result'];
+
+  EventListenerList get soundEnd => this['soundend'];
+
+  EventListenerList get soundStart => this['soundstart'];
+
+  EventListenerList get speechEnd => this['speechend'];
+
+  EventListenerList get speechStart => this['speechstart'];
+
+  EventListenerList get start => this['start'];
+}
+
+/// @domName SpeechRecognitionAlternative
+class SpeechRecognitionAlternative native "*SpeechRecognitionAlternative" {
+
+  /** @domName SpeechRecognitionAlternative.confidence */
+  final num confidence;
+
+  /** @domName SpeechRecognitionAlternative.transcript */
+  final String transcript;
+}
+
+/// @domName SpeechRecognitionError
+class SpeechRecognitionError extends Event native "*SpeechRecognitionError" {
+
+  static const int ABORTED = 2;
+
+  static const int AUDIO_CAPTURE = 3;
+
+  static const int BAD_GRAMMAR = 7;
+
+  static const int LANGUAGE_NOT_SUPPORTED = 8;
+
+  static const int NETWORK = 4;
+
+  static const int NOT_ALLOWED = 5;
+
+  static const int NO_SPEECH = 1;
+
+  static const int OTHER = 0;
+
+  static const int SERVICE_NOT_ALLOWED = 6;
+
+  /** @domName SpeechRecognitionError.code */
+  final int code;
+
+  /** @domName SpeechRecognitionError.message */
+  final String message;
+}
+
+/// @domName SpeechRecognitionEvent
+class SpeechRecognitionEvent extends Event native "*SpeechRecognitionEvent" {
+
+  /** @domName SpeechRecognitionEvent.result */
+  final SpeechRecognitionResult result;
+
+  /** @domName SpeechRecognitionEvent.resultHistory */
+  final List<SpeechRecognitionResult> resultHistory;
+
+  /** @domName SpeechRecognitionEvent.resultIndex */
+  final int resultIndex;
+}
+
+/// @domName SpeechRecognitionResult
+class SpeechRecognitionResult native "*SpeechRecognitionResult" {
+
+  /** @domName SpeechRecognitionResult.emma */
+  final Document emma;
+
+  /** @domName SpeechRecognitionResult.finalValue */
+  bool get finalValue => JS("bool", "#.final", this);
+
+  /** @domName SpeechRecognitionResult.length */
+  final int length;
+
+  /** @domName SpeechRecognitionResult.item */
+  SpeechRecognitionAlternative item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Storage implements Map<String, String>  native "*Storage" {
+
+  // TODO(nweiz): update this when maps support lazy iteration
+  bool containsValue(String value) => values.some((e) => e == value);
+
+  bool containsKey(String key) => $dom_getItem(key) != null;
+
+  String operator [](String key) => $dom_getItem(key);
+
+  void operator []=(String key, String value) => $dom_setItem(key, value);
+
+  String putIfAbsent(String key, String ifAbsent()) {
+    if (!containsKey(key)) this[key] = ifAbsent();
+    return this[key];
+  }
+
+  String remove(String key) {
+    final value = this[key];
+    $dom_removeItem(key);
+    return value;
+  }
+
+  void clear() => $dom_clear();
+
+  void forEach(void f(String key, String value)) {
+    for (var i = 0; true; i++) {
+      final key = $dom_key(i);
+      if (key == null) return;
+
+      f(key, this[key]);
+    }
+  }
+
+  Collection<String> get keys {
+    final keys = [];
+    forEach((k, v) => keys.add(k));
+    return keys;
+  }
+
+  Collection<String> get values {
+    final values = [];
+    forEach((k, v) => values.add(v));
+    return values;
+  }
+
+  int get length => $dom_length;
+
+  bool get isEmpty => $dom_key(0) == null;
+
+  /** @domName Storage.length */
+  int get $dom_length => JS("int", "#.length", this);
+
+  /** @domName Storage.clear */
+  void $dom_clear() native "clear";
+
+  /** @domName Storage.getItem */
+  String $dom_getItem(String key) native "getItem";
+
+  /** @domName Storage.key */
+  String $dom_key(int index) native "key";
+
+  /** @domName Storage.removeItem */
+  void $dom_removeItem(String key) native "removeItem";
+
+  /** @domName Storage.setItem */
+  void $dom_setItem(String key, String data) native "setItem";
+
+}
+
+/// @domName StorageEvent
+class StorageEvent extends Event native "*StorageEvent" {
+
+  /** @domName StorageEvent.key */
+  final String key;
+
+  /** @domName StorageEvent.newValue */
+  final String newValue;
+
+  /** @domName StorageEvent.oldValue */
+  final String oldValue;
+
+  /** @domName StorageEvent.storageArea */
+  final Storage storageArea;
+
+  /** @domName StorageEvent.url */
+  final String url;
+
+  /** @domName StorageEvent.initStorageEvent */
+  void initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) native;
+}
+
+/// @domName StorageInfo
+class StorageInfo native "*StorageInfo" {
+
+  static const int PERSISTENT = 1;
+
+  static const int TEMPORARY = 0;
+
+  /** @domName StorageInfo.queryUsageAndQuota */
+  void queryUsageAndQuota(int storageType, [StorageInfoUsageCallback usageCallback, StorageInfoErrorCallback errorCallback]) native;
+
+  /** @domName StorageInfo.requestQuota */
+  void requestQuota(int storageType, int newQuotaInBytes, [StorageInfoQuotaCallback quotaCallback, StorageInfoErrorCallback errorCallback]) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void StorageInfoErrorCallback(DOMException error);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void StorageInfoQuotaCallback(int grantedQuotaInBytes);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void StorageInfoUsageCallback(int currentUsageInBytes, int currentQuotaInBytes);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void StringCallback(String data);
+
+/// @domName HTMLStyleElement
+class StyleElement extends Element implements Element native "*HTMLStyleElement" {
+
+  factory StyleElement() => _Elements.createStyleElement();
+
+  /** @domName HTMLStyleElement.disabled */
+  bool disabled;
+
+  /** @domName HTMLStyleElement.media */
+  String media;
+
+  /** @domName HTMLStyleElement.scoped */
+  bool scoped;
+
+  /** @domName HTMLStyleElement.sheet */
+  final StyleSheet sheet;
+
+  /** @domName HTMLStyleElement.type */
+  String type;
+}
+
+/// @domName StyleMedia
+class StyleMedia native "*StyleMedia" {
+
+  /** @domName StyleMedia.type */
+  final String type;
+
+  /** @domName StyleMedia.matchMedium */
+  bool matchMedium(String mediaquery) native;
+}
+
+/// @domName StyleSheet
+class StyleSheet native "*StyleSheet" {
+
+  /** @domName StyleSheet.disabled */
+  bool disabled;
+
+  /** @domName StyleSheet.href */
+  final String href;
+
+  /** @domName StyleSheet.media */
+  final MediaList media;
+
+  /** @domName StyleSheet.ownerNode */
+  final Node ownerNode;
+
+  /** @domName StyleSheet.parentStyleSheet */
+  final StyleSheet parentStyleSheet;
+
+  /** @domName StyleSheet.title */
+  final String title;
+
+  /** @domName StyleSheet.type */
+  final String type;
+}
+
+/// @domName HTMLTableCaptionElement
+class TableCaptionElement extends Element implements Element native "*HTMLTableCaptionElement" {
+
+  factory TableCaptionElement() => _Elements.createTableCaptionElement();
+
+  /** @domName HTMLTableCaptionElement.align */
+  String align;
+}
+
+/// @domName HTMLTableCellElement
+class TableCellElement extends Element implements Element native "*HTMLTableCellElement" {
+
+  factory TableCellElement() => _Elements.createTableCellElement();
+
+  /** @domName HTMLTableCellElement.abbr */
+  String abbr;
+
+  /** @domName HTMLTableCellElement.align */
+  String align;
+
+  /** @domName HTMLTableCellElement.axis */
+  String axis;
+
+  /** @domName HTMLTableCellElement.bgColor */
+  String bgColor;
+
+  /** @domName HTMLTableCellElement.cellIndex */
+  final int cellIndex;
+
+  /** @domName HTMLTableCellElement.ch */
+  String ch;
+
+  /** @domName HTMLTableCellElement.chOff */
+  String chOff;
+
+  /** @domName HTMLTableCellElement.colSpan */
+  int colSpan;
+
+  /** @domName HTMLTableCellElement.headers */
+  String headers;
+
+  /** @domName HTMLTableCellElement.height */
+  String height;
+
+  /** @domName HTMLTableCellElement.noWrap */
+  bool noWrap;
+
+  /** @domName HTMLTableCellElement.rowSpan */
+  int rowSpan;
+
+  /** @domName HTMLTableCellElement.scope */
+  String scope;
+
+  /** @domName HTMLTableCellElement.vAlign */
+  String vAlign;
+
+  /** @domName HTMLTableCellElement.width */
+  String width;
+}
+
+/// @domName HTMLTableColElement
+class TableColElement extends Element implements Element native "*HTMLTableColElement" {
+
+  factory TableColElement() => _Elements.createTableColElement();
+
+  /** @domName HTMLTableColElement.align */
+  String align;
+
+  /** @domName HTMLTableColElement.ch */
+  String ch;
+
+  /** @domName HTMLTableColElement.chOff */
+  String chOff;
+
+  /** @domName HTMLTableColElement.span */
+  int span;
+
+  /** @domName HTMLTableColElement.vAlign */
+  String vAlign;
+
+  /** @domName HTMLTableColElement.width */
+  String width;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class TableElement extends Element implements Element native "*HTMLTableElement" {
+
+  factory TableElement() => _Elements.createTableElement();
+
+  /** @domName HTMLTableElement.align */
+  String align;
+
+  /** @domName HTMLTableElement.bgColor */
+  String bgColor;
+
+  /** @domName HTMLTableElement.border */
+  String border;
+
+  /** @domName HTMLTableElement.caption */
+  TableCaptionElement caption;
+
+  /** @domName HTMLTableElement.cellPadding */
+  String cellPadding;
+
+  /** @domName HTMLTableElement.cellSpacing */
+  String cellSpacing;
+
+  /** @domName HTMLTableElement.frame */
+  String frame;
+
+  /** @domName HTMLTableElement.rows */
+  final HTMLCollection rows;
+
+  /** @domName HTMLTableElement.rules */
+  String rules;
+
+  /** @domName HTMLTableElement.summary */
+  String summary;
+
+  /** @domName HTMLTableElement.tBodies */
+  final HTMLCollection tBodies;
+
+  /** @domName HTMLTableElement.tFoot */
+  TableSectionElement tFoot;
+
+  /** @domName HTMLTableElement.tHead */
+  TableSectionElement tHead;
+
+  /** @domName HTMLTableElement.width */
+  String width;
+
+  /** @domName HTMLTableElement.createCaption */
+  Element createCaption() native;
+
+  /** @domName HTMLTableElement.createTFoot */
+  Element createTFoot() native;
+
+  /** @domName HTMLTableElement.createTHead */
+  Element createTHead() native;
+
+  /** @domName HTMLTableElement.deleteCaption */
+  void deleteCaption() native;
+
+  /** @domName HTMLTableElement.deleteRow */
+  void deleteRow(int index) native;
+
+  /** @domName HTMLTableElement.deleteTFoot */
+  void deleteTFoot() native;
+
+  /** @domName HTMLTableElement.deleteTHead */
+  void deleteTHead() native;
+
+  /** @domName HTMLTableElement.insertRow */
+  Element insertRow(int index) native;
+
+
+  Element createTBody() {
+    if (JS('bool', '!!#.createTBody', this)) {
+      return this._createTBody();
+    }
+    var tbody = new Element.tag('tbody');
+    this.elements.add(tbody);
+    return tbody;
+  }
+
+  Element _createTBody() native 'createTBody';
+}
+
+/// @domName HTMLTableRowElement
+class TableRowElement extends Element implements Element native "*HTMLTableRowElement" {
+
+  factory TableRowElement() => _Elements.createTableRowElement();
+
+  /** @domName HTMLTableRowElement.align */
+  String align;
+
+  /** @domName HTMLTableRowElement.bgColor */
+  String bgColor;
+
+  /** @domName HTMLTableRowElement.cells */
+  final HTMLCollection cells;
+
+  /** @domName HTMLTableRowElement.ch */
+  String ch;
+
+  /** @domName HTMLTableRowElement.chOff */
+  String chOff;
+
+  /** @domName HTMLTableRowElement.rowIndex */
+  final int rowIndex;
+
+  /** @domName HTMLTableRowElement.sectionRowIndex */
+  final int sectionRowIndex;
+
+  /** @domName HTMLTableRowElement.vAlign */
+  String vAlign;
+
+  /** @domName HTMLTableRowElement.deleteCell */
+  void deleteCell(int index) native;
+
+  /** @domName HTMLTableRowElement.insertCell */
+  Element insertCell(int index) native;
+}
+
+/// @domName HTMLTableSectionElement
+class TableSectionElement extends Element implements Element native "*HTMLTableSectionElement" {
+
+  /** @domName HTMLTableSectionElement.align */
+  String align;
+
+  /** @domName HTMLTableSectionElement.ch */
+  String ch;
+
+  /** @domName HTMLTableSectionElement.chOff */
+  String chOff;
+
+  /** @domName HTMLTableSectionElement.rows */
+  final HTMLCollection rows;
+
+  /** @domName HTMLTableSectionElement.vAlign */
+  String vAlign;
+
+  /** @domName HTMLTableSectionElement.deleteRow */
+  void deleteRow(int index) native;
+
+  /** @domName HTMLTableSectionElement.insertRow */
+  Element insertRow(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+class Text extends CharacterData native "*Text" {
+  factory Text(String data) => _TextFactoryProvider.createText(data);
+
+  /** @domName Text.wholeText */
+  final String wholeText;
+
+  /** @domName Text.replaceWholeText */
+  Text replaceWholeText(String content) native;
+
+  /** @domName Text.splitText */
+  Text splitText(int offset) native;
+
+}
+
+/// @domName HTMLTextAreaElement
+class TextAreaElement extends Element implements Element native "*HTMLTextAreaElement" {
+
+  factory TextAreaElement() => _Elements.createTextAreaElement();
+
+  /** @domName HTMLTextAreaElement.autofocus */
+  bool autofocus;
+
+  /** @domName HTMLTextAreaElement.cols */
+  int cols;
+
+  /** @domName HTMLTextAreaElement.defaultValue */
+  String defaultValue;
+
+  /** @domName HTMLTextAreaElement.dirName */
+  String dirName;
+
+  /** @domName HTMLTextAreaElement.disabled */
+  bool disabled;
+
+  /** @domName HTMLTextAreaElement.form */
+  final FormElement form;
+
+  /** @domName HTMLTextAreaElement.labels */
+  final List<Node> labels;
+
+  /** @domName HTMLTextAreaElement.maxLength */
+  int maxLength;
+
+  /** @domName HTMLTextAreaElement.name */
+  String name;
+
+  /** @domName HTMLTextAreaElement.placeholder */
+  String placeholder;
+
+  /** @domName HTMLTextAreaElement.readOnly */
+  bool readOnly;
+
+  /** @domName HTMLTextAreaElement.required */
+  bool required;
+
+  /** @domName HTMLTextAreaElement.rows */
+  int rows;
+
+  /** @domName HTMLTextAreaElement.selectionDirection */
+  String selectionDirection;
+
+  /** @domName HTMLTextAreaElement.selectionEnd */
+  int selectionEnd;
+
+  /** @domName HTMLTextAreaElement.selectionStart */
+  int selectionStart;
+
+  /** @domName HTMLTextAreaElement.textLength */
+  final int textLength;
+
+  /** @domName HTMLTextAreaElement.type */
+  final String type;
+
+  /** @domName HTMLTextAreaElement.validationMessage */
+  final String validationMessage;
+
+  /** @domName HTMLTextAreaElement.validity */
+  final ValidityState validity;
+
+  /** @domName HTMLTextAreaElement.value */
+  String value;
+
+  /** @domName HTMLTextAreaElement.willValidate */
+  final bool willValidate;
+
+  /** @domName HTMLTextAreaElement.wrap */
+  String wrap;
+
+  /** @domName HTMLTextAreaElement.checkValidity */
+  bool checkValidity() native;
+
+  /** @domName HTMLTextAreaElement.select */
+  void select() native;
+
+  /** @domName HTMLTextAreaElement.setCustomValidity */
+  void setCustomValidity(String error) native;
+
+  /** @domName HTMLTextAreaElement.setRangeText */
+  void setRangeText(String replacement, [int start, int end, String selectionMode]) native;
+
+  /** @domName HTMLTextAreaElement.setSelectionRange */
+  void setSelectionRange(int start, int end, [String direction]) native;
+}
+
+/// @domName TextEvent
+class TextEvent extends UIEvent native "*TextEvent" {
+
+  /** @domName TextEvent.data */
+  final String data;
+
+  /** @domName TextEvent.initTextEvent */
+  void initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg) native;
+}
+
+/// @domName TextMetrics
+class TextMetrics native "*TextMetrics" {
+
+  /** @domName TextMetrics.width */
+  final num width;
+}
+
+/// @domName TextTrack
+class TextTrack extends EventTarget native "*TextTrack" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  TextTrackEvents get on =>
+    new TextTrackEvents(this);
+
+  /** @domName TextTrack.activeCues */
+  final TextTrackCueList activeCues;
+
+  /** @domName TextTrack.cues */
+  final TextTrackCueList cues;
+
+  /** @domName TextTrack.kind */
+  final String kind;
+
+  /** @domName TextTrack.label */
+  final String label;
+
+  /** @domName TextTrack.language */
+  final String language;
+
+  /** @domName TextTrack.mode */
+  String mode;
+
+  /** @domName TextTrack.addCue */
+  void addCue(TextTrackCue cue) native;
+
+  /** @domName TextTrack.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName TextTrack.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName TextTrack.removeCue */
+  void removeCue(TextTrackCue cue) native;
+
+  /** @domName TextTrack.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+class TextTrackEvents extends Events {
+  TextTrackEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get cueChange => this['cuechange'];
+}
+
+/// @domName TextTrackCue
+class TextTrackCue extends EventTarget native "*TextTrackCue" {
+
+  factory TextTrackCue(num startTime, num endTime, String text) => _TextTrackCueFactoryProvider.createTextTrackCue(startTime, endTime, text);
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  TextTrackCueEvents get on =>
+    new TextTrackCueEvents(this);
+
+  /** @domName TextTrackCue.align */
+  String align;
+
+  /** @domName TextTrackCue.endTime */
+  num endTime;
+
+  /** @domName TextTrackCue.id */
+  String id;
+
+  /** @domName TextTrackCue.line */
+  int line;
+
+  /** @domName TextTrackCue.pauseOnExit */
+  bool pauseOnExit;
+
+  /** @domName TextTrackCue.position */
+  int position;
+
+  /** @domName TextTrackCue.size */
+  int size;
+
+  /** @domName TextTrackCue.snapToLines */
+  bool snapToLines;
+
+  /** @domName TextTrackCue.startTime */
+  num startTime;
+
+  /** @domName TextTrackCue.text */
+  String text;
+
+  /** @domName TextTrackCue.track */
+  final TextTrack track;
+
+  /** @domName TextTrackCue.vertical */
+  String vertical;
+
+  /** @domName TextTrackCue.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName TextTrackCue.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName TextTrackCue.getCueAsHTML */
+  DocumentFragment getCueAsHTML() native;
+
+  /** @domName TextTrackCue.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+class TextTrackCueEvents extends Events {
+  TextTrackCueEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get enter => this['enter'];
+
+  EventListenerList get exit => this['exit'];
+}
+
+/// @domName TextTrackCueList
+class TextTrackCueList implements List<TextTrackCue>, JavaScriptIndexingBehavior native "*TextTrackCueList" {
+
+  /** @domName TextTrackCueList.length */
+  final int length;
+
+  TextTrackCue operator[](int index) => JS("TextTrackCue", "#[#]", this, index);
+
+  void operator[]=(int index, TextTrackCue value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<TextTrackCue> mixins.
+  // TextTrackCue is the element type.
+
+  // From Iterable<TextTrackCue>:
+
+  Iterator<TextTrackCue> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<TextTrackCue>(this);
+  }
+
+  // From Collection<TextTrackCue>:
+
+  void add(TextTrackCue value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(TextTrackCue value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<TextTrackCue> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(TextTrackCue element) => _Collections.contains(this, element);
+
+  void forEach(void f(TextTrackCue element)) => _Collections.forEach(this, f);
+
+  Collection map(f(TextTrackCue element)) => _Collections.map(this, [], f);
+
+  Collection<TextTrackCue> filter(bool f(TextTrackCue element)) =>
+     _Collections.filter(this, <TextTrackCue>[], f);
+
+  bool every(bool f(TextTrackCue element)) => _Collections.every(this, f);
+
+  bool some(bool f(TextTrackCue element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<TextTrackCue>:
+
+  void sort([Comparator<TextTrackCue> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(TextTrackCue element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(TextTrackCue element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  TextTrackCue get last => this[length - 1];
+
+  TextTrackCue removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<TextTrackCue> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [TextTrackCue initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<TextTrackCue> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <TextTrackCue>[]);
+
+  // -- end List<TextTrackCue> mixins.
+
+  /** @domName TextTrackCueList.getCueById */
+  TextTrackCue getCueById(String id) native;
+
+  /** @domName TextTrackCueList.item */
+  TextTrackCue item(int index) native;
+}
+
+/// @domName TextTrackList
+class TextTrackList extends EventTarget implements JavaScriptIndexingBehavior, List<TextTrack> native "*TextTrackList" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  TextTrackListEvents get on =>
+    new TextTrackListEvents(this);
+
+  /** @domName TextTrackList.length */
+  final int length;
+
+  TextTrack operator[](int index) => JS("TextTrack", "#[#]", this, index);
+
+  void operator[]=(int index, TextTrack value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<TextTrack> mixins.
+  // TextTrack is the element type.
+
+  // From Iterable<TextTrack>:
+
+  Iterator<TextTrack> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<TextTrack>(this);
+  }
+
+  // From Collection<TextTrack>:
+
+  void add(TextTrack value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(TextTrack value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<TextTrack> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(TextTrack element) => _Collections.contains(this, element);
+
+  void forEach(void f(TextTrack element)) => _Collections.forEach(this, f);
+
+  Collection map(f(TextTrack element)) => _Collections.map(this, [], f);
+
+  Collection<TextTrack> filter(bool f(TextTrack element)) =>
+     _Collections.filter(this, <TextTrack>[], f);
+
+  bool every(bool f(TextTrack element)) => _Collections.every(this, f);
+
+  bool some(bool f(TextTrack element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<TextTrack>:
+
+  void sort([Comparator<TextTrack> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(TextTrack element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(TextTrack element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  TextTrack get last => this[length - 1];
+
+  TextTrack removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<TextTrack> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [TextTrack initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<TextTrack> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <TextTrack>[]);
+
+  // -- end List<TextTrack> mixins.
+
+  /** @domName TextTrackList.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName TextTrackList.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName TextTrackList.item */
+  TextTrack item(int index) native;
+
+  /** @domName TextTrackList.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+
+class TextTrackListEvents extends Events {
+  TextTrackListEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get addTrack => this['addtrack'];
+}
+
+/// @domName TimeRanges
+class TimeRanges native "*TimeRanges" {
+
+  /** @domName TimeRanges.length */
+  final int length;
+
+  /** @domName TimeRanges.end */
+  num end(int index) native;
+
+  /** @domName TimeRanges.start */
+  num start(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void TimeoutHandler();
+
+/// @domName HTMLTitleElement
+class TitleElement extends Element implements Element native "*HTMLTitleElement" {
+
+  factory TitleElement() => _Elements.createTitleElement();
+}
+
+/// @domName Touch
+class Touch native "*Touch" {
+
+  /** @domName Touch.clientX */
+  final int clientX;
+
+  /** @domName Touch.clientY */
+  final int clientY;
+
+  /** @domName Touch.identifier */
+  final int identifier;
+
+  /** @domName Touch.pageX */
+  final int pageX;
+
+  /** @domName Touch.pageY */
+  final int pageY;
+
+  /** @domName Touch.screenX */
+  final int screenX;
+
+  /** @domName Touch.screenY */
+  final int screenY;
+
+  /** @domName Touch.target */
+  EventTarget get target => _convertNativeToDart_EventTarget(this._target);
+  EventTarget get _target => JS("EventTarget", "#.target", this);
+
+  /** @domName Touch.webkitForce */
+  final num webkitForce;
+
+  /** @domName Touch.webkitRadiusX */
+  final int webkitRadiusX;
+
+  /** @domName Touch.webkitRadiusY */
+  final int webkitRadiusY;
+
+  /** @domName Touch.webkitRotationAngle */
+  final num webkitRotationAngle;
+}
+
+/// @domName TouchEvent
+class TouchEvent extends UIEvent native "*TouchEvent" {
+
+  /** @domName TouchEvent.altKey */
+  final bool altKey;
+
+  /** @domName TouchEvent.changedTouches */
+  final TouchList changedTouches;
+
+  /** @domName TouchEvent.ctrlKey */
+  final bool ctrlKey;
+
+  /** @domName TouchEvent.metaKey */
+  final bool metaKey;
+
+  /** @domName TouchEvent.shiftKey */
+  final bool shiftKey;
+
+  /** @domName TouchEvent.targetTouches */
+  final TouchList targetTouches;
+
+  /** @domName TouchEvent.touches */
+  final TouchList touches;
+
+  /** @domName TouchEvent.initTouchEvent */
+  void initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native;
+}
+
+/// @domName TouchList
+class TouchList implements JavaScriptIndexingBehavior, List<Touch> native "*TouchList" {
+
+  /** @domName TouchList.length */
+  final int length;
+
+  Touch operator[](int index) => JS("Touch", "#[#]", this, index);
+
+  void operator[]=(int index, Touch value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<Touch> mixins.
+  // Touch is the element type.
+
+  // From Iterable<Touch>:
+
+  Iterator<Touch> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<Touch>(this);
+  }
+
+  // From Collection<Touch>:
+
+  void add(Touch value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(Touch value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<Touch> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(Touch element) => _Collections.contains(this, element);
+
+  void forEach(void f(Touch element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Touch element)) => _Collections.map(this, [], f);
+
+  Collection<Touch> filter(bool f(Touch element)) =>
+     _Collections.filter(this, <Touch>[], f);
+
+  bool every(bool f(Touch element)) => _Collections.every(this, f);
+
+  bool some(bool f(Touch element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Touch>:
+
+  void sort([Comparator<Touch> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Touch element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Touch element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  Touch get last => this[length - 1];
+
+  Touch removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<Touch> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [Touch initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<Touch> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Touch>[]);
+
+  // -- end List<Touch> mixins.
+
+  /** @domName TouchList.item */
+  Touch item(int index) native;
+}
+
+/// @domName HTMLTrackElement
+class TrackElement extends Element implements Element native "*HTMLTrackElement" {
+
+  factory TrackElement() => _Elements.createTrackElement();
+
+  static const int ERROR = 3;
+
+  static const int LOADED = 2;
+
+  static const int LOADING = 1;
+
+  static const int NONE = 0;
+
+  /** @domName HTMLTrackElement.defaultValue */
+  bool get defaultValue => JS("bool", "#.default", this);
+
+  /** @domName HTMLTrackElement.defaultValue */
+  void set defaultValue(bool value) {
+    JS("void", "#.default = #", this, value);
+  }
+
+  /** @domName HTMLTrackElement.kind */
+  String kind;
+
+  /** @domName HTMLTrackElement.label */
+  String label;
+
+  /** @domName HTMLTrackElement.readyState */
+  final int readyState;
+
+  /** @domName HTMLTrackElement.src */
+  String src;
+
+  /** @domName HTMLTrackElement.srclang */
+  String srclang;
+
+  /** @domName HTMLTrackElement.track */
+  final TextTrack track;
+}
+
+/// @domName TrackEvent
+class TrackEvent extends Event native "*TrackEvent" {
+
+  /** @domName TrackEvent.track */
+  final Object track;
+}
+
+/// @domName WebKitTransitionEvent
+class TransitionEvent extends Event native "*WebKitTransitionEvent" {
+
+  /** @domName WebKitTransitionEvent.elapsedTime */
+  final num elapsedTime;
+
+  /** @domName WebKitTransitionEvent.propertyName */
+  final String propertyName;
+}
+
+/// @domName TreeWalker
+class TreeWalker native "*TreeWalker" {
+
+  /** @domName TreeWalker.currentNode */
+  Node currentNode;
+
+  /** @domName TreeWalker.expandEntityReferences */
+  final bool expandEntityReferences;
+
+  /** @domName TreeWalker.filter */
+  final NodeFilter filter;
+
+  /** @domName TreeWalker.root */
+  final Node root;
+
+  /** @domName TreeWalker.whatToShow */
+  final int whatToShow;
+
+  /** @domName TreeWalker.firstChild */
+  Node firstChild() native;
+
+  /** @domName TreeWalker.lastChild */
+  Node lastChild() native;
+
+  /** @domName TreeWalker.nextNode */
+  Node nextNode() native;
+
+  /** @domName TreeWalker.nextSibling */
+  Node nextSibling() native;
+
+  /** @domName TreeWalker.parentNode */
+  Node parentNode() native;
+
+  /** @domName TreeWalker.previousNode */
+  Node previousNode() native;
+
+  /** @domName TreeWalker.previousSibling */
+  Node previousSibling() native;
+}
+
+/// @domName UIEvent
+class UIEvent extends Event native "*UIEvent" {
+
+  /** @domName UIEvent.charCode */
+  final int charCode;
+
+  /** @domName UIEvent.detail */
+  final int detail;
+
+  /** @domName UIEvent.keyCode */
+  final int keyCode;
+
+  /** @domName UIEvent.layerX */
+  final int layerX;
+
+  /** @domName UIEvent.layerY */
+  final int layerY;
+
+  /** @domName UIEvent.pageX */
+  final int pageX;
+
+  /** @domName UIEvent.pageY */
+  final int pageY;
+
+  /** @domName UIEvent.view */
+  Window get view => _convertNativeToDart_Window(this._view);
+  Window get _view => JS("Window", "#.view", this);
+
+  /** @domName UIEvent.which */
+  final int which;
+
+  /** @domName UIEvent.initUIEvent */
+  void initUIEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail) native;
+}
+
+/// @domName HTMLUListElement
+class UListElement extends Element implements Element native "*HTMLUListElement" {
+
+  factory UListElement() => _Elements.createUListElement();
+
+  /** @domName HTMLUListElement.compact */
+  bool compact;
+
+  /** @domName HTMLUListElement.type */
+  String type;
+}
+
+/// @domName Uint16Array
+class Uint16Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Uint16Array" {
+
+  factory Uint16Array(int length) =>
+    _TypedArrayFactoryProvider.createUint16Array(length);
+
+  factory Uint16Array.fromList(List<int> list) =>
+    _TypedArrayFactoryProvider.createUint16Array_fromList(list);
+
+  factory Uint16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
+    _TypedArrayFactoryProvider.createUint16Array_fromBuffer(buffer, byteOffset, length);
+
+  static const int BYTES_PER_ELEMENT = 2;
+
+  /** @domName Uint16Array.length */
+  final int length;
+
+  int operator[](int index) => JS("int", "#[#]", this, index);
+
+  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
+  // -- start List<int> mixins.
+  // int is the element type.
+
+  // From Iterable<int>:
+
+  Iterator<int> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<int>(this);
+  }
+
+  // From Collection<int>:
+
+  void add(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<int> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(int element) => _Collections.contains(this, element);
+
+  void forEach(void f(int element)) => _Collections.forEach(this, f);
+
+  Collection map(f(int element)) => _Collections.map(this, [], f);
+
+  Collection<int> filter(bool f(int element)) =>
+     _Collections.filter(this, <int>[], f);
+
+  bool every(bool f(int element)) => _Collections.every(this, f);
+
+  bool some(bool f(int element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<int>:
+
+  void sort([Comparator<int> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(int element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(int element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  int get last => this[length - 1];
+
+  int removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [int initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<int> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <int>[]);
+
+  // -- end List<int> mixins.
+
+  /** @domName Uint16Array.setElements */
+  void setElements(Object array, [int offset]) native "set";
+
+  /** @domName Uint16Array.subarray */
+  Uint16Array subarray(int start, [int end]) native;
+}
+
+/// @domName Uint32Array
+class Uint32Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Uint32Array" {
+
+  factory Uint32Array(int length) =>
+    _TypedArrayFactoryProvider.createUint32Array(length);
+
+  factory Uint32Array.fromList(List<int> list) =>
+    _TypedArrayFactoryProvider.createUint32Array_fromList(list);
+
+  factory Uint32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
+    _TypedArrayFactoryProvider.createUint32Array_fromBuffer(buffer, byteOffset, length);
+
+  static const int BYTES_PER_ELEMENT = 4;
+
+  /** @domName Uint32Array.length */
+  final int length;
+
+  int operator[](int index) => JS("int", "#[#]", this, index);
+
+  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
+  // -- start List<int> mixins.
+  // int is the element type.
+
+  // From Iterable<int>:
+
+  Iterator<int> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<int>(this);
+  }
+
+  // From Collection<int>:
+
+  void add(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<int> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(int element) => _Collections.contains(this, element);
+
+  void forEach(void f(int element)) => _Collections.forEach(this, f);
+
+  Collection map(f(int element)) => _Collections.map(this, [], f);
+
+  Collection<int> filter(bool f(int element)) =>
+     _Collections.filter(this, <int>[], f);
+
+  bool every(bool f(int element)) => _Collections.every(this, f);
+
+  bool some(bool f(int element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<int>:
+
+  void sort([Comparator<int> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(int element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(int element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  int get last => this[length - 1];
+
+  int removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [int initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<int> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <int>[]);
+
+  // -- end List<int> mixins.
+
+  /** @domName Uint32Array.setElements */
+  void setElements(Object array, [int offset]) native "set";
+
+  /** @domName Uint32Array.subarray */
+  Uint32Array subarray(int start, [int end]) native;
+}
+
+/// @domName Uint8Array
+class Uint8Array extends ArrayBufferView implements JavaScriptIndexingBehavior, List<int> native "*Uint8Array" {
+
+  factory Uint8Array(int length) =>
+    _TypedArrayFactoryProvider.createUint8Array(length);
+
+  factory Uint8Array.fromList(List<int> list) =>
+    _TypedArrayFactoryProvider.createUint8Array_fromList(list);
+
+  factory Uint8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
+    _TypedArrayFactoryProvider.createUint8Array_fromBuffer(buffer, byteOffset, length);
+
+  static const int BYTES_PER_ELEMENT = 1;
+
+  /** @domName Uint8Array.length */
+  final int length;
+
+  int operator[](int index) => JS("int", "#[#]", this, index);
+
+  void operator[]=(int index, int value) => JS("void", "#[#] = #", this, index, value);
+  // -- start List<int> mixins.
+  // int is the element type.
+
+  // From Iterable<int>:
+
+  Iterator<int> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<int>(this);
+  }
+
+  // From Collection<int>:
+
+  void add(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(int value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<int> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(int element) => _Collections.contains(this, element);
+
+  void forEach(void f(int element)) => _Collections.forEach(this, f);
+
+  Collection map(f(int element)) => _Collections.map(this, [], f);
+
+  Collection<int> filter(bool f(int element)) =>
+     _Collections.filter(this, <int>[], f);
+
+  bool every(bool f(int element)) => _Collections.every(this, f);
+
+  bool some(bool f(int element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<int>:
+
+  void sort([Comparator<int> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(int element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(int element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  int get last => this[length - 1];
+
+  int removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [int initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<int> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <int>[]);
+
+  // -- end List<int> mixins.
+
+  /** @domName Uint8Array.setElements */
+  void setElements(Object array, [int offset]) native "set";
+
+  /** @domName Uint8Array.subarray */
+  Uint8Array subarray(int start, [int end]) native;
+}
+
+/// @domName Uint8ClampedArray
+class Uint8ClampedArray extends Uint8Array native "*Uint8ClampedArray" {
+
+  factory Uint8ClampedArray(int length) =>
+    _TypedArrayFactoryProvider.createUint8ClampedArray(length);
+
+  factory Uint8ClampedArray.fromList(List<int> list) =>
+    _TypedArrayFactoryProvider.createUint8ClampedArray_fromList(list);
+
+  factory Uint8ClampedArray.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
+    _TypedArrayFactoryProvider.createUint8ClampedArray_fromBuffer(buffer, byteOffset, length);
+
+  // Use implementation from Uint8Array.
+  // final int length;
+
+  /** @domName Uint8ClampedArray.setElements */
+  void setElements(Object array, [int offset]) native "set";
+
+  /** @domName Uint8ClampedArray.subarray */
+  Uint8ClampedArray subarray(int start, [int end]) native;
+}
+
+/// @domName HTMLUnknownElement
+class UnknownElement extends Element implements Element native "*HTMLUnknownElement" {
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Url native "*URL" {
+
+  static String createObjectUrl(blob_OR_source_OR_stream) =>
+      JS('String',
+         '(window.URL || window.webkitURL).createObjectURL(#)',
+         blob_OR_source_OR_stream);
+
+  static void revokeObjectUrl(String objectUrl) =>
+      JS('void',
+         '(window.URL || window.webkitURL).revokeObjectURL(#)', objectUrl);
+
+}
+
+/// @domName ValidityState
+class ValidityState native "*ValidityState" {
+
+  /** @domName ValidityState.customError */
+  final bool customError;
+
+  /** @domName ValidityState.patternMismatch */
+  final bool patternMismatch;
+
+  /** @domName ValidityState.rangeOverflow */
+  final bool rangeOverflow;
+
+  /** @domName ValidityState.rangeUnderflow */
+  final bool rangeUnderflow;
+
+  /** @domName ValidityState.stepMismatch */
+  final bool stepMismatch;
+
+  /** @domName ValidityState.tooLong */
+  final bool tooLong;
+
+  /** @domName ValidityState.typeMismatch */
+  final bool typeMismatch;
+
+  /** @domName ValidityState.valid */
+  final bool valid;
+
+  /** @domName ValidityState.valueMissing */
+  final bool valueMissing;
+}
+
+/// @domName HTMLVideoElement
+class VideoElement extends MediaElement native "*HTMLVideoElement" {
+
+  factory VideoElement() => _Elements.createVideoElement();
+
+  /** @domName HTMLVideoElement.height */
+  int height;
+
+  /** @domName HTMLVideoElement.poster */
+  String poster;
+
+  /** @domName HTMLVideoElement.videoHeight */
+  final int videoHeight;
+
+  /** @domName HTMLVideoElement.videoWidth */
+  final int videoWidth;
+
+  /** @domName HTMLVideoElement.webkitDecodedFrameCount */
+  final int webkitDecodedFrameCount;
+
+  /** @domName HTMLVideoElement.webkitDisplayingFullscreen */
+  final bool webkitDisplayingFullscreen;
+
+  /** @domName HTMLVideoElement.webkitDroppedFrameCount */
+  final int webkitDroppedFrameCount;
+
+  /** @domName HTMLVideoElement.webkitSupportsFullscreen */
+  final bool webkitSupportsFullscreen;
+
+  /** @domName HTMLVideoElement.width */
+  int width;
+
+  /** @domName HTMLVideoElement.webkitEnterFullScreen */
+  void webkitEnterFullScreen() native;
+
+  /** @domName HTMLVideoElement.webkitEnterFullscreen */
+  void webkitEnterFullscreen() native;
+
+  /** @domName HTMLVideoElement.webkitExitFullScreen */
+  void webkitExitFullScreen() native;
+
+  /** @domName HTMLVideoElement.webkitExitFullscreen */
+  void webkitExitFullscreen() native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+typedef void VoidCallback();
+
+/// @domName WaveShaperNode
+class WaveShaperNode extends AudioNode native "*WaveShaperNode" {
+
+  /** @domName WaveShaperNode.curve */
+  Float32Array curve;
+}
+
+/// @domName WaveTable
+class WaveTable native "*WaveTable" {
+}
+
+/// @domName WebGLActiveInfo
+class WebGLActiveInfo native "*WebGLActiveInfo" {
+
+  /** @domName WebGLActiveInfo.name */
+  final String name;
+
+  /** @domName WebGLActiveInfo.size */
+  final int size;
+
+  /** @domName WebGLActiveInfo.type */
+  final int type;
+}
+
+/// @domName WebGLBuffer
+class WebGLBuffer native "*WebGLBuffer" {
+}
+
+/// @domName WebGLCompressedTextureS3TC
+class WebGLCompressedTextureS3TC native "*WebGLCompressedTextureS3TC" {
+
+  static const int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;
+
+  static const int COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2;
+
+  static const int COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;
+
+  static const int COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;
+}
+
+/// @domName WebGLContextAttributes
+class WebGLContextAttributes native "*WebGLContextAttributes" {
+
+  /** @domName WebGLContextAttributes.alpha */
+  bool alpha;
+
+  /** @domName WebGLContextAttributes.antialias */
+  bool antialias;
+
+  /** @domName WebGLContextAttributes.depth */
+  bool depth;
+
+  /** @domName WebGLContextAttributes.premultipliedAlpha */
+  bool premultipliedAlpha;
+
+  /** @domName WebGLContextAttributes.preserveDrawingBuffer */
+  bool preserveDrawingBuffer;
+
+  /** @domName WebGLContextAttributes.stencil */
+  bool stencil;
+}
+
+/// @domName WebGLContextEvent
+class WebGLContextEvent extends Event native "*WebGLContextEvent" {
+
+  /** @domName WebGLContextEvent.statusMessage */
+  final String statusMessage;
+}
+
+/// @domName WebGLDebugRendererInfo
+class WebGLDebugRendererInfo native "*WebGLDebugRendererInfo" {
+
+  static const int UNMASKED_RENDERER_WEBGL = 0x9246;
+
+  static const int UNMASKED_VENDOR_WEBGL = 0x9245;
+}
+
+/// @domName WebGLDebugShaders
+class WebGLDebugShaders native "*WebGLDebugShaders" {
+
+  /** @domName WebGLDebugShaders.getTranslatedShaderSource */
+  String getTranslatedShaderSource(WebGLShader shader) native;
+}
+
+/// @domName WebGLDepthTexture
+class WebGLDepthTexture native "*WebGLDepthTexture" {
+
+  static const int UNSIGNED_INT_24_8_WEBGL = 0x84FA;
+}
+
+/// @domName WebGLFramebuffer
+class WebGLFramebuffer native "*WebGLFramebuffer" {
+}
+
+/// @domName WebGLLoseContext
+class WebGLLoseContext native "*WebGLLoseContext" {
+
+  /** @domName WebGLLoseContext.loseContext */
+  void loseContext() native;
+
+  /** @domName WebGLLoseContext.restoreContext */
+  void restoreContext() native;
+}
+
+/// @domName WebGLProgram
+class WebGLProgram native "*WebGLProgram" {
+}
+
+/// @domName WebGLRenderbuffer
+class WebGLRenderbuffer native "*WebGLRenderbuffer" {
+}
+
+/// @domName WebGLRenderingContext
+class WebGLRenderingContext extends CanvasRenderingContext native "*WebGLRenderingContext" {
+
+  static const int ACTIVE_ATTRIBUTES = 0x8B89;
+
+  static const int ACTIVE_TEXTURE = 0x84E0;
+
+  static const int ACTIVE_UNIFORMS = 0x8B86;
+
+  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;
+
+  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;
+
+  static const int ALPHA = 0x1906;
+
+  static const int ALPHA_BITS = 0x0D55;
+
+  static const int ALWAYS = 0x0207;
+
+  static const int ARRAY_BUFFER = 0x8892;
+
+  static const int ARRAY_BUFFER_BINDING = 0x8894;
+
+  static const int ATTACHED_SHADERS = 0x8B85;
+
+  static const int BACK = 0x0405;
+
+  static const int BLEND = 0x0BE2;
+
+  static const int BLEND_COLOR = 0x8005;
+
+  static const int BLEND_DST_ALPHA = 0x80CA;
+
+  static const int BLEND_DST_RGB = 0x80C8;
+
+  static const int BLEND_EQUATION = 0x8009;
+
+  static const int BLEND_EQUATION_ALPHA = 0x883D;
+
+  static const int BLEND_EQUATION_RGB = 0x8009;
+
+  static const int BLEND_SRC_ALPHA = 0x80CB;
+
+  static const int BLEND_SRC_RGB = 0x80C9;
+
+  static const int BLUE_BITS = 0x0D54;
+
+  static const int BOOL = 0x8B56;
+
+  static const int BOOL_VEC2 = 0x8B57;
+
+  static const int BOOL_VEC3 = 0x8B58;
+
+  static const int BOOL_VEC4 = 0x8B59;
+
+  static const int BROWSER_DEFAULT_WEBGL = 0x9244;
+
+  static const int BUFFER_SIZE = 0x8764;
+
+  static const int BUFFER_USAGE = 0x8765;
+
+  static const int BYTE = 0x1400;
+
+  static const int CCW = 0x0901;
+
+  static const int CLAMP_TO_EDGE = 0x812F;
+
+  static const int COLOR_ATTACHMENT0 = 0x8CE0;
+
+  static const int COLOR_BUFFER_BIT = 0x00004000;
+
+  static const int COLOR_CLEAR_VALUE = 0x0C22;
+
+  static const int COLOR_WRITEMASK = 0x0C23;
+
+  static const int COMPILE_STATUS = 0x8B81;
+
+  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;
+
+  static const int CONSTANT_ALPHA = 0x8003;
+
+  static const int CONSTANT_COLOR = 0x8001;
+
+  static const int CONTEXT_LOST_WEBGL = 0x9242;
+
+  static const int CULL_FACE = 0x0B44;
+
+  static const int CULL_FACE_MODE = 0x0B45;
+
+  static const int CURRENT_PROGRAM = 0x8B8D;
+
+  static const int CURRENT_VERTEX_ATTRIB = 0x8626;
+
+  static const int CW = 0x0900;
+
+  static const int DECR = 0x1E03;
+
+  static const int DECR_WRAP = 0x8508;
+
+  static const int DELETE_STATUS = 0x8B80;
+
+  static const int DEPTH_ATTACHMENT = 0x8D00;
+
+  static const int DEPTH_BITS = 0x0D56;
+
+  static const int DEPTH_BUFFER_BIT = 0x00000100;
+
+  static const int DEPTH_CLEAR_VALUE = 0x0B73;
+
+  static const int DEPTH_COMPONENT = 0x1902;
+
+  static const int DEPTH_COMPONENT16 = 0x81A5;
+
+  static const int DEPTH_FUNC = 0x0B74;
+
+  static const int DEPTH_RANGE = 0x0B70;
+
+  static const int DEPTH_STENCIL = 0x84F9;
+
+  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;
+
+  static const int DEPTH_TEST = 0x0B71;
+
+  static const int DEPTH_WRITEMASK = 0x0B72;
+
+  static const int DITHER = 0x0BD0;
+
+  static const int DONT_CARE = 0x1100;
+
+  static const int DST_ALPHA = 0x0304;
+
+  static const int DST_COLOR = 0x0306;
+
+  static const int DYNAMIC_DRAW = 0x88E8;
+
+  static const int ELEMENT_ARRAY_BUFFER = 0x8893;
+
+  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;
+
+  static const int EQUAL = 0x0202;
+
+  static const int FASTEST = 0x1101;
+
+  static const int FLOAT = 0x1406;
+
+  static const int FLOAT_MAT2 = 0x8B5A;
+
+  static const int FLOAT_MAT3 = 0x8B5B;
+
+  static const int FLOAT_MAT4 = 0x8B5C;
+
+  static const int FLOAT_VEC2 = 0x8B50;
+
+  static const int FLOAT_VEC3 = 0x8B51;
+
+  static const int FLOAT_VEC4 = 0x8B52;
+
+  static const int FRAGMENT_SHADER = 0x8B30;
+
+  static const int FRAMEBUFFER = 0x8D40;
+
+  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
+
+  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
+
+  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
+
+  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
+
+  static const int FRAMEBUFFER_BINDING = 0x8CA6;
+
+  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;
+
+  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
+
+  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;
+
+  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
+
+  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;
+
+  static const int FRONT = 0x0404;
+
+  static const int FRONT_AND_BACK = 0x0408;
+
+  static const int FRONT_FACE = 0x0B46;
+
+  static const int FUNC_ADD = 0x8006;
+
+  static const int FUNC_REVERSE_SUBTRACT = 0x800B;
+
+  static const int FUNC_SUBTRACT = 0x800A;
+
+  static const int GENERATE_MIPMAP_HINT = 0x8192;
+
+  static const int GEQUAL = 0x0206;
+
+  static const int GREATER = 0x0204;
+
+  static const int GREEN_BITS = 0x0D53;
+
+  static const int HIGH_FLOAT = 0x8DF2;
+
+  static const int HIGH_INT = 0x8DF5;
+
+  static const int INCR = 0x1E02;
+
+  static const int INCR_WRAP = 0x8507;
+
+  static const int INT = 0x1404;
+
+  static const int INT_VEC2 = 0x8B53;
+
+  static const int INT_VEC3 = 0x8B54;
+
+  static const int INT_VEC4 = 0x8B55;
+
+  static const int INVALID_ENUM = 0x0500;
+
+  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;
+
+  static const int INVALID_OPERATION = 0x0502;
+
+  static const int INVALID_VALUE = 0x0501;
+
+  static const int INVERT = 0x150A;
+
+  static const int KEEP = 0x1E00;
+
+  static const int LEQUAL = 0x0203;
+
+  static const int LESS = 0x0201;
+
+  static const int LINEAR = 0x2601;
+
+  static const int LINEAR_MIPMAP_LINEAR = 0x2703;
+
+  static const int LINEAR_MIPMAP_NEAREST = 0x2701;
+
+  static const int LINES = 0x0001;
+
+  static const int LINE_LOOP = 0x0002;
+
+  static const int LINE_STRIP = 0x0003;
+
+  static const int LINE_WIDTH = 0x0B21;
+
+  static const int LINK_STATUS = 0x8B82;
+
+  static const int LOW_FLOAT = 0x8DF0;
+
+  static const int LOW_INT = 0x8DF3;
+
+  static const int LUMINANCE = 0x1909;
+
+  static const int LUMINANCE_ALPHA = 0x190A;
+
+  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
+
+  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;
+
+  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;
+
+  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;
+
+  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;
+
+  static const int MAX_TEXTURE_SIZE = 0x0D33;
+
+  static const int MAX_VARYING_VECTORS = 0x8DFC;
+
+  static const int MAX_VERTEX_ATTRIBS = 0x8869;
+
+  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
+
+  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;
+
+  static const int MAX_VIEWPORT_DIMS = 0x0D3A;
+
+  static const int MEDIUM_FLOAT = 0x8DF1;
+
+  static const int MEDIUM_INT = 0x8DF4;
+
+  static const int MIRRORED_REPEAT = 0x8370;
+
+  static const int NEAREST = 0x2600;
+
+  static const int NEAREST_MIPMAP_LINEAR = 0x2702;
+
+  static const int NEAREST_MIPMAP_NEAREST = 0x2700;
+
+  static const int NEVER = 0x0200;
+
+  static const int NICEST = 0x1102;
+
+  static const int NONE = 0;
+
+  static const int NOTEQUAL = 0x0205;
+
+  static const int NO_ERROR = 0;
+
+  static const int ONE = 1;
+
+  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;
+
+  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;
+
+  static const int ONE_MINUS_DST_ALPHA = 0x0305;
+
+  static const int ONE_MINUS_DST_COLOR = 0x0307;
+
+  static const int ONE_MINUS_SRC_ALPHA = 0x0303;
+
+  static const int ONE_MINUS_SRC_COLOR = 0x0301;
+
+  static const int OUT_OF_MEMORY = 0x0505;
+
+  static const int PACK_ALIGNMENT = 0x0D05;
+
+  static const int POINTS = 0x0000;
+
+  static const int POLYGON_OFFSET_FACTOR = 0x8038;
+
+  static const int POLYGON_OFFSET_FILL = 0x8037;
+
+  static const int POLYGON_OFFSET_UNITS = 0x2A00;
+
+  static const int RED_BITS = 0x0D52;
+
+  static const int RENDERBUFFER = 0x8D41;
+
+  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;
+
+  static const int RENDERBUFFER_BINDING = 0x8CA7;
+
+  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;
+
+  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;
+
+  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;
+
+  static const int RENDERBUFFER_HEIGHT = 0x8D43;
+
+  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;
+
+  static const int RENDERBUFFER_RED_SIZE = 0x8D50;
+
+  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;
+
+  static const int RENDERBUFFER_WIDTH = 0x8D42;
+
+  static const int RENDERER = 0x1F01;
+
+  static const int REPEAT = 0x2901;
+
+  static const int REPLACE = 0x1E01;
+
+  static const int RGB = 0x1907;
+
+  static const int RGB565 = 0x8D62;
+
+  static const int RGB5_A1 = 0x8057;
+
+  static const int RGBA = 0x1908;
+
+  static const int RGBA4 = 0x8056;
+
+  static const int SAMPLER_2D = 0x8B5E;
+
+  static const int SAMPLER_CUBE = 0x8B60;
+
+  static const int SAMPLES = 0x80A9;
+
+  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
+
+  static const int SAMPLE_BUFFERS = 0x80A8;
+
+  static const int SAMPLE_COVERAGE = 0x80A0;
+
+  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;
+
+  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;
+
+  static const int SCISSOR_BOX = 0x0C10;
+
+  static const int SCISSOR_TEST = 0x0C11;
+
+  static const int SHADER_TYPE = 0x8B4F;
+
+  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;
+
+  static const int SHORT = 0x1402;
+
+  static const int SRC_ALPHA = 0x0302;
+
+  static const int SRC_ALPHA_SATURATE = 0x0308;
+
+  static const int SRC_COLOR = 0x0300;
+
+  static const int STATIC_DRAW = 0x88E4;
+
+  static const int STENCIL_ATTACHMENT = 0x8D20;
+
+  static const int STENCIL_BACK_FAIL = 0x8801;
+
+  static const int STENCIL_BACK_FUNC = 0x8800;
+
+  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;
+
+  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;
+
+  static const int STENCIL_BACK_REF = 0x8CA3;
+
+  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;
+
+  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;
+
+  static const int STENCIL_BITS = 0x0D57;
+
+  static const int STENCIL_BUFFER_BIT = 0x00000400;
+
+  static const int STENCIL_CLEAR_VALUE = 0x0B91;
+
+  static const int STENCIL_FAIL = 0x0B94;
+
+  static const int STENCIL_FUNC = 0x0B92;
+
+  static const int STENCIL_INDEX = 0x1901;
+
+  static const int STENCIL_INDEX8 = 0x8D48;
+
+  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;
+
+  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;
+
+  static const int STENCIL_REF = 0x0B97;
+
+  static const int STENCIL_TEST = 0x0B90;
+
+  static const int STENCIL_VALUE_MASK = 0x0B93;
+
+  static const int STENCIL_WRITEMASK = 0x0B98;
+
+  static const int STREAM_DRAW = 0x88E0;
+
+  static const int SUBPIXEL_BITS = 0x0D50;
+
+  static const int TEXTURE = 0x1702;
+
+  static const int TEXTURE0 = 0x84C0;
+
+  static const int TEXTURE1 = 0x84C1;
+
+  static const int TEXTURE10 = 0x84CA;
+
+  static const int TEXTURE11 = 0x84CB;
+
+  static const int TEXTURE12 = 0x84CC;
+
+  static const int TEXTURE13 = 0x84CD;
+
+  static const int TEXTURE14 = 0x84CE;
+
+  static const int TEXTURE15 = 0x84CF;
+
+  static const int TEXTURE16 = 0x84D0;
+
+  static const int TEXTURE17 = 0x84D1;
+
+  static const int TEXTURE18 = 0x84D2;
+
+  static const int TEXTURE19 = 0x84D3;
+
+  static const int TEXTURE2 = 0x84C2;
+
+  static const int TEXTURE20 = 0x84D4;
+
+  static const int TEXTURE21 = 0x84D5;
+
+  static const int TEXTURE22 = 0x84D6;
+
+  static const int TEXTURE23 = 0x84D7;
+
+  static const int TEXTURE24 = 0x84D8;
+
+  static const int TEXTURE25 = 0x84D9;
+
+  static const int TEXTURE26 = 0x84DA;
+
+  static const int TEXTURE27 = 0x84DB;
+
+  static const int TEXTURE28 = 0x84DC;
+
+  static const int TEXTURE29 = 0x84DD;
+
+  static const int TEXTURE3 = 0x84C3;
+
+  static const int TEXTURE30 = 0x84DE;
+
+  static const int TEXTURE31 = 0x84DF;
+
+  static const int TEXTURE4 = 0x84C4;
+
+  static const int TEXTURE5 = 0x84C5;
+
+  static const int TEXTURE6 = 0x84C6;
+
+  static const int TEXTURE7 = 0x84C7;
+
+  static const int TEXTURE8 = 0x84C8;
+
+  static const int TEXTURE9 = 0x84C9;
+
+  static const int TEXTURE_2D = 0x0DE1;
+
+  static const int TEXTURE_BINDING_2D = 0x8069;
+
+  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;
+
+  static const int TEXTURE_CUBE_MAP = 0x8513;
+
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
+
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
+
+  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
+
+  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
+
+  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
+
+  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
+
+  static const int TEXTURE_MAG_FILTER = 0x2800;
+
+  static const int TEXTURE_MIN_FILTER = 0x2801;
+
+  static const int TEXTURE_WRAP_S = 0x2802;
+
+  static const int TEXTURE_WRAP_T = 0x2803;
+
+  static const int TRIANGLES = 0x0004;
+
+  static const int TRIANGLE_FAN = 0x0006;
+
+  static const int TRIANGLE_STRIP = 0x0005;
+
+  static const int UNPACK_ALIGNMENT = 0x0CF5;
+
+  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
+
+  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;
+
+  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;
+
+  static const int UNSIGNED_BYTE = 0x1401;
+
+  static const int UNSIGNED_INT = 0x1405;
+
+  static const int UNSIGNED_SHORT = 0x1403;
+
+  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;
+
+  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;
+
+  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;
+
+  static const int VALIDATE_STATUS = 0x8B83;
+
+  static const int VENDOR = 0x1F00;
+
+  static const int VERSION = 0x1F02;
+
+  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
+
+  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;
+
+  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
+
+  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;
+
+  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;
+
+  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;
+
+  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;
+
+  static const int VERTEX_SHADER = 0x8B31;
+
+  static const int VIEWPORT = 0x0BA2;
+
+  static const int ZERO = 0;
+
+  /** @domName WebGLRenderingContext.drawingBufferHeight */
+  final int drawingBufferHeight;
+
+  /** @domName WebGLRenderingContext.drawingBufferWidth */
+  final int drawingBufferWidth;
+
+  /** @domName WebGLRenderingContext.activeTexture */
+  void activeTexture(int texture) native;
+
+  /** @domName WebGLRenderingContext.attachShader */
+  void attachShader(WebGLProgram program, WebGLShader shader) native;
+
+  /** @domName WebGLRenderingContext.bindAttribLocation */
+  void bindAttribLocation(WebGLProgram program, int index, String name) native;
+
+  /** @domName WebGLRenderingContext.bindBuffer */
+  void bindBuffer(int target, WebGLBuffer buffer) native;
+
+  /** @domName WebGLRenderingContext.bindFramebuffer */
+  void bindFramebuffer(int target, WebGLFramebuffer framebuffer) native;
+
+  /** @domName WebGLRenderingContext.bindRenderbuffer */
+  void bindRenderbuffer(int target, WebGLRenderbuffer renderbuffer) native;
+
+  /** @domName WebGLRenderingContext.bindTexture */
+  void bindTexture(int target, WebGLTexture texture) native;
+
+  /** @domName WebGLRenderingContext.blendColor */
+  void blendColor(num red, num green, num blue, num alpha) native;
+
+  /** @domName WebGLRenderingContext.blendEquation */
+  void blendEquation(int mode) native;
+
+  /** @domName WebGLRenderingContext.blendEquationSeparate */
+  void blendEquationSeparate(int modeRGB, int modeAlpha) native;
+
+  /** @domName WebGLRenderingContext.blendFunc */
+  void blendFunc(int sfactor, int dfactor) native;
+
+  /** @domName WebGLRenderingContext.blendFuncSeparate */
+  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native;
+
+  /** @domName WebGLRenderingContext.bufferData */
+  void bufferData(int target, data_OR_size, int usage) native;
+
+  /** @domName WebGLRenderingContext.bufferSubData */
+  void bufferSubData(int target, int offset, data) native;
+
+  /** @domName WebGLRenderingContext.checkFramebufferStatus */
+  int checkFramebufferStatus(int target) native;
+
+  /** @domName WebGLRenderingContext.clear */
+  void clear(int mask) native;
+
+  /** @domName WebGLRenderingContext.clearColor */
+  void clearColor(num red, num green, num blue, num alpha) native;
+
+  /** @domName WebGLRenderingContext.clearDepth */
+  void clearDepth(num depth) native;
+
+  /** @domName WebGLRenderingContext.clearStencil */
+  void clearStencil(int s) native;
+
+  /** @domName WebGLRenderingContext.colorMask */
+  void colorMask(bool red, bool green, bool blue, bool alpha) native;
+
+  /** @domName WebGLRenderingContext.compileShader */
+  void compileShader(WebGLShader shader) native;
+
+  /** @domName WebGLRenderingContext.compressedTexImage2D */
+  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ArrayBufferView data) native;
+
+  /** @domName WebGLRenderingContext.compressedTexSubImage2D */
+  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ArrayBufferView data) native;
+
+  /** @domName WebGLRenderingContext.copyTexImage2D */
+  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) native;
+
+  /** @domName WebGLRenderingContext.copyTexSubImage2D */
+  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) native;
+
+  /** @domName WebGLRenderingContext.createBuffer */
+  WebGLBuffer createBuffer() native;
+
+  /** @domName WebGLRenderingContext.createFramebuffer */
+  WebGLFramebuffer createFramebuffer() native;
+
+  /** @domName WebGLRenderingContext.createProgram */
+  WebGLProgram createProgram() native;
+
+  /** @domName WebGLRenderingContext.createRenderbuffer */
+  WebGLRenderbuffer createRenderbuffer() native;
+
+  /** @domName WebGLRenderingContext.createShader */
+  WebGLShader createShader(int type) native;
+
+  /** @domName WebGLRenderingContext.createTexture */
+  WebGLTexture createTexture() native;
+
+  /** @domName WebGLRenderingContext.cullFace */
+  void cullFace(int mode) native;
+
+  /** @domName WebGLRenderingContext.deleteBuffer */
+  void deleteBuffer(WebGLBuffer buffer) native;
+
+  /** @domName WebGLRenderingContext.deleteFramebuffer */
+  void deleteFramebuffer(WebGLFramebuffer framebuffer) native;
+
+  /** @domName WebGLRenderingContext.deleteProgram */
+  void deleteProgram(WebGLProgram program) native;
+
+  /** @domName WebGLRenderingContext.deleteRenderbuffer */
+  void deleteRenderbuffer(WebGLRenderbuffer renderbuffer) native;
+
+  /** @domName WebGLRenderingContext.deleteShader */
+  void deleteShader(WebGLShader shader) native;
+
+  /** @domName WebGLRenderingContext.deleteTexture */
+  void deleteTexture(WebGLTexture texture) native;
+
+  /** @domName WebGLRenderingContext.depthFunc */
+  void depthFunc(int func) native;
+
+  /** @domName WebGLRenderingContext.depthMask */
+  void depthMask(bool flag) native;
+
+  /** @domName WebGLRenderingContext.depthRange */
+  void depthRange(num zNear, num zFar) native;
+
+  /** @domName WebGLRenderingContext.detachShader */
+  void detachShader(WebGLProgram program, WebGLShader shader) native;
+
+  /** @domName WebGLRenderingContext.disable */
+  void disable(int cap) native;
+
+  /** @domName WebGLRenderingContext.disableVertexAttribArray */
+  void disableVertexAttribArray(int index) native;
+
+  /** @domName WebGLRenderingContext.drawArrays */
+  void drawArrays(int mode, int first, int count) native;
+
+  /** @domName WebGLRenderingContext.drawElements */
+  void drawElements(int mode, int count, int type, int offset) native;
+
+  /** @domName WebGLRenderingContext.enable */
+  void enable(int cap) native;
+
+  /** @domName WebGLRenderingContext.enableVertexAttribArray */
+  void enableVertexAttribArray(int index) native;
+
+  /** @domName WebGLRenderingContext.finish */
+  void finish() native;
+
+  /** @domName WebGLRenderingContext.flush */
+  void flush() native;
+
+  /** @domName WebGLRenderingContext.framebufferRenderbuffer */
+  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, WebGLRenderbuffer renderbuffer) native;
+
+  /** @domName WebGLRenderingContext.framebufferTexture2D */
+  void framebufferTexture2D(int target, int attachment, int textarget, WebGLTexture texture, int level) native;
+
+  /** @domName WebGLRenderingContext.frontFace */
+  void frontFace(int mode) native;
+
+  /** @domName WebGLRenderingContext.generateMipmap */
+  void generateMipmap(int target) native;
+
+  /** @domName WebGLRenderingContext.getActiveAttrib */
+  WebGLActiveInfo getActiveAttrib(WebGLProgram program, int index) native;
+
+  /** @domName WebGLRenderingContext.getActiveUniform */
+  WebGLActiveInfo getActiveUniform(WebGLProgram program, int index) native;
+
+  /** @domName WebGLRenderingContext.getAttachedShaders */
+  void getAttachedShaders(WebGLProgram program) native;
+
+  /** @domName WebGLRenderingContext.getAttribLocation */
+  int getAttribLocation(WebGLProgram program, String name) native;
+
+  /** @domName WebGLRenderingContext.getBufferParameter */
+  Object getBufferParameter(int target, int pname) native;
+
+  /** @domName WebGLRenderingContext.getContextAttributes */
+  WebGLContextAttributes getContextAttributes() native;
+
+  /** @domName WebGLRenderingContext.getError */
+  int getError() native;
+
+  /** @domName WebGLRenderingContext.getExtension */
+  Object getExtension(String name) native;
+
+  /** @domName WebGLRenderingContext.getFramebufferAttachmentParameter */
+  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native;
+
+  /** @domName WebGLRenderingContext.getParameter */
+  Object getParameter(int pname) native;
+
+  /** @domName WebGLRenderingContext.getProgramInfoLog */
+  String getProgramInfoLog(WebGLProgram program) native;
+
+  /** @domName WebGLRenderingContext.getProgramParameter */
+  Object getProgramParameter(WebGLProgram program, int pname) native;
+
+  /** @domName WebGLRenderingContext.getRenderbufferParameter */
+  Object getRenderbufferParameter(int target, int pname) native;
+
+  /** @domName WebGLRenderingContext.getShaderInfoLog */
+  String getShaderInfoLog(WebGLShader shader) native;
+
+  /** @domName WebGLRenderingContext.getShaderParameter */
+  Object getShaderParameter(WebGLShader shader, int pname) native;
+
+  /** @domName WebGLRenderingContext.getShaderPrecisionFormat */
+  WebGLShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) native;
+
+  /** @domName WebGLRenderingContext.getShaderSource */
+  String getShaderSource(WebGLShader shader) native;
+
+  /** @domName WebGLRenderingContext.getSupportedExtensions */
+  List<String> getSupportedExtensions() native;
+
+  /** @domName WebGLRenderingContext.getTexParameter */
+  Object getTexParameter(int target, int pname) native;
+
+  /** @domName WebGLRenderingContext.getUniform */
+  Object getUniform(WebGLProgram program, WebGLUniformLocation location) native;
+
+  /** @domName WebGLRenderingContext.getUniformLocation */
+  WebGLUniformLocation getUniformLocation(WebGLProgram program, String name) native;
+
+  /** @domName WebGLRenderingContext.getVertexAttrib */
+  Object getVertexAttrib(int index, int pname) native;
+
+  /** @domName WebGLRenderingContext.getVertexAttribOffset */
+  int getVertexAttribOffset(int index, int pname) native;
+
+  /** @domName WebGLRenderingContext.hint */
+  void hint(int target, int mode) native;
+
+  /** @domName WebGLRenderingContext.isBuffer */
+  bool isBuffer(WebGLBuffer buffer) native;
+
+  /** @domName WebGLRenderingContext.isContextLost */
+  bool isContextLost() native;
+
+  /** @domName WebGLRenderingContext.isEnabled */
+  bool isEnabled(int cap) native;
+
+  /** @domName WebGLRenderingContext.isFramebuffer */
+  bool isFramebuffer(WebGLFramebuffer framebuffer) native;
+
+  /** @domName WebGLRenderingContext.isProgram */
+  bool isProgram(WebGLProgram program) native;
+
+  /** @domName WebGLRenderingContext.isRenderbuffer */
+  bool isRenderbuffer(WebGLRenderbuffer renderbuffer) native;
+
+  /** @domName WebGLRenderingContext.isShader */
+  bool isShader(WebGLShader shader) native;
+
+  /** @domName WebGLRenderingContext.isTexture */
+  bool isTexture(WebGLTexture texture) native;
+
+  /** @domName WebGLRenderingContext.lineWidth */
+  void lineWidth(num width) native;
+
+  /** @domName WebGLRenderingContext.linkProgram */
+  void linkProgram(WebGLProgram program) native;
+
+  /** @domName WebGLRenderingContext.pixelStorei */
+  void pixelStorei(int pname, int param) native;
+
+  /** @domName WebGLRenderingContext.polygonOffset */
+  void polygonOffset(num factor, num units) native;
+
+  /** @domName WebGLRenderingContext.readPixels */
+  void readPixels(int x, int y, int width, int height, int format, int type, ArrayBufferView pixels) native;
+
+  /** @domName WebGLRenderingContext.releaseShaderCompiler */
+  void releaseShaderCompiler() native;
+
+  /** @domName WebGLRenderingContext.renderbufferStorage */
+  void renderbufferStorage(int target, int internalformat, int width, int height) native;
+
+  /** @domName WebGLRenderingContext.sampleCoverage */
+  void sampleCoverage(num value, bool invert) native;
+
+  /** @domName WebGLRenderingContext.scissor */
+  void scissor(int x, int y, int width, int height) native;
+
+  /** @domName WebGLRenderingContext.shaderSource */
+  void shaderSource(WebGLShader shader, String string) native;
+
+  /** @domName WebGLRenderingContext.stencilFunc */
+  void stencilFunc(int func, int ref, int mask) native;
+
+  /** @domName WebGLRenderingContext.stencilFuncSeparate */
+  void stencilFuncSeparate(int face, int func, int ref, int mask) native;
+
+  /** @domName WebGLRenderingContext.stencilMask */
+  void stencilMask(int mask) native;
+
+  /** @domName WebGLRenderingContext.stencilMaskSeparate */
+  void stencilMaskSeparate(int face, int mask) native;
+
+  /** @domName WebGLRenderingContext.stencilOp */
+  void stencilOp(int fail, int zfail, int zpass) native;
+
+  /** @domName WebGLRenderingContext.stencilOpSeparate */
+  void stencilOpSeparate(int face, int fail, int zfail, int zpass) native;
+
+  /** @domName WebGLRenderingContext.texImage2D */
+  void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [format, type, pixels]) {
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) &&
+        (format is int || format == null) &&
+        (type is int || type == null) &&
+        (pixels is ArrayBufferView || pixels == null)) {
+      _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) &&
+        !?format &&
+        !?type &&
+        !?pixels) {
+      var pixels_1 = _convertDartToNative_ImageData(border_OR_canvas_OR_image_OR_pixels_OR_video);
+      _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, pixels_1);
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) &&
+        !?format &&
+        !?type &&
+        !?pixels) {
+      _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) &&
+        !?format &&
+        !?type &&
+        !?pixels) {
+      _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) &&
+        !?format &&
+        !?type &&
+        !?pixels) {
+      _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  void _texImage2D_1(target, level, internalformat, width, height, int border, int format, int type, ArrayBufferView pixels) native "texImage2D";
+  void _texImage2D_2(target, level, internalformat, format, type, pixels) native "texImage2D";
+  void _texImage2D_3(target, level, internalformat, format, type, ImageElement image) native "texImage2D";
+  void _texImage2D_4(target, level, internalformat, format, type, CanvasElement canvas) native "texImage2D";
+  void _texImage2D_5(target, level, internalformat, format, type, VideoElement video) native "texImage2D";
+
+  /** @domName WebGLRenderingContext.texParameterf */
+  void texParameterf(int target, int pname, num param) native;
+
+  /** @domName WebGLRenderingContext.texParameteri */
+  void texParameteri(int target, int pname, int param) native;
+
+  /** @domName WebGLRenderingContext.texSubImage2D */
+  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [type, pixels]) {
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) &&
+        (type is int || type == null) &&
+        (pixels is ArrayBufferView || pixels == null)) {
+      _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) &&
+        !?type &&
+        !?pixels) {
+      var pixels_1 = _convertDartToNative_ImageData(canvas_OR_format_OR_image_OR_pixels_OR_video);
+      _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, pixels_1);
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) &&
+        !?type &&
+        !?pixels) {
+      _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) &&
+        !?type &&
+        !?pixels) {
+      _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) &&
+        !?type &&
+        !?pixels) {
+      _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      return;
+    }
+    throw const Exception("Incorrect number or type of arguments");
+  }
+  void _texSubImage2D_1(target, level, xoffset, yoffset, width, height, int format, int type, ArrayBufferView pixels) native "texSubImage2D";
+  void _texSubImage2D_2(target, level, xoffset, yoffset, format, type, pixels) native "texSubImage2D";
+  void _texSubImage2D_3(target, level, xoffset, yoffset, format, type, ImageElement image) native "texSubImage2D";
+  void _texSubImage2D_4(target, level, xoffset, yoffset, format, type, CanvasElement canvas) native "texSubImage2D";
+  void _texSubImage2D_5(target, level, xoffset, yoffset, format, type, VideoElement video) native "texSubImage2D";
+
+  /** @domName WebGLRenderingContext.uniform1f */
+  void uniform1f(WebGLUniformLocation location, num x) native;
+
+  /** @domName WebGLRenderingContext.uniform1fv */
+  void uniform1fv(WebGLUniformLocation location, Float32Array v) native;
+
+  /** @domName WebGLRenderingContext.uniform1i */
+  void uniform1i(WebGLUniformLocation location, int x) native;
+
+  /** @domName WebGLRenderingContext.uniform1iv */
+  void uniform1iv(WebGLUniformLocation location, Int32Array v) native;
+
+  /** @domName WebGLRenderingContext.uniform2f */
+  void uniform2f(WebGLUniformLocation location, num x, num y) native;
+
+  /** @domName WebGLRenderingContext.uniform2fv */
+  void uniform2fv(WebGLUniformLocation location, Float32Array v) native;
+
+  /** @domName WebGLRenderingContext.uniform2i */
+  void uniform2i(WebGLUniformLocation location, int x, int y) native;
+
+  /** @domName WebGLRenderingContext.uniform2iv */
+  void uniform2iv(WebGLUniformLocation location, Int32Array v) native;
+
+  /** @domName WebGLRenderingContext.uniform3f */
+  void uniform3f(WebGLUniformLocation location, num x, num y, num z) native;
+
+  /** @domName WebGLRenderingContext.uniform3fv */
+  void uniform3fv(WebGLUniformLocation location, Float32Array v) native;
+
+  /** @domName WebGLRenderingContext.uniform3i */
+  void uniform3i(WebGLUniformLocation location, int x, int y, int z) native;
+
+  /** @domName WebGLRenderingContext.uniform3iv */
+  void uniform3iv(WebGLUniformLocation location, Int32Array v) native;
+
+  /** @domName WebGLRenderingContext.uniform4f */
+  void uniform4f(WebGLUniformLocation location, num x, num y, num z, num w) native;
+
+  /** @domName WebGLRenderingContext.uniform4fv */
+  void uniform4fv(WebGLUniformLocation location, Float32Array v) native;
+
+  /** @domName WebGLRenderingContext.uniform4i */
+  void uniform4i(WebGLUniformLocation location, int x, int y, int z, int w) native;
+
+  /** @domName WebGLRenderingContext.uniform4iv */
+  void uniform4iv(WebGLUniformLocation location, Int32Array v) native;
+
+  /** @domName WebGLRenderingContext.uniformMatrix2fv */
+  void uniformMatrix2fv(WebGLUniformLocation location, bool transpose, Float32Array array) native;
+
+  /** @domName WebGLRenderingContext.uniformMatrix3fv */
+  void uniformMatrix3fv(WebGLUniformLocation location, bool transpose, Float32Array array) native;
+
+  /** @domName WebGLRenderingContext.uniformMatrix4fv */
+  void uniformMatrix4fv(WebGLUniformLocation location, bool transpose, Float32Array array) native;
+
+  /** @domName WebGLRenderingContext.useProgram */
+  void useProgram(WebGLProgram program) native;
+
+  /** @domName WebGLRenderingContext.validateProgram */
+  void validateProgram(WebGLProgram program) native;
+
+  /** @domName WebGLRenderingContext.vertexAttrib1f */
+  void vertexAttrib1f(int indx, num x) native;
+
+  /** @domName WebGLRenderingContext.vertexAttrib1fv */
+  void vertexAttrib1fv(int indx, Float32Array values) native;
+
+  /** @domName WebGLRenderingContext.vertexAttrib2f */
+  void vertexAttrib2f(int indx, num x, num y) native;
+
+  /** @domName WebGLRenderingContext.vertexAttrib2fv */
+  void vertexAttrib2fv(int indx, Float32Array values) native;
+
+  /** @domName WebGLRenderingContext.vertexAttrib3f */
+  void vertexAttrib3f(int indx, num x, num y, num z) native;
+
+  /** @domName WebGLRenderingContext.vertexAttrib3fv */
+  void vertexAttrib3fv(int indx, Float32Array values) native;
+
+  /** @domName WebGLRenderingContext.vertexAttrib4f */
+  void vertexAttrib4f(int indx, num x, num y, num z, num w) native;
+
+  /** @domName WebGLRenderingContext.vertexAttrib4fv */
+  void vertexAttrib4fv(int indx, Float32Array values) native;
+
+  /** @domName WebGLRenderingContext.vertexAttribPointer */
+  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) native;
+
+  /** @domName WebGLRenderingContext.viewport */
+  void viewport(int x, int y, int width, int height) native;
+}
+
+/// @domName WebGLShader
+class WebGLShader native "*WebGLShader" {
+}
+
+/// @domName WebGLShaderPrecisionFormat
+class WebGLShaderPrecisionFormat native "*WebGLShaderPrecisionFormat" {
+
+  /** @domName WebGLShaderPrecisionFormat.precision */
+  final int precision;
+
+  /** @domName WebGLShaderPrecisionFormat.rangeMax */
+  final int rangeMax;
+
+  /** @domName WebGLShaderPrecisionFormat.rangeMin */
+  final int rangeMin;
+}
+
+/// @domName WebGLTexture
+class WebGLTexture native "*WebGLTexture" {
+}
+
+/// @domName WebGLUniformLocation
+class WebGLUniformLocation native "*WebGLUniformLocation" {
+}
+
+/// @domName WebGLVertexArrayObjectOES
+class WebGLVertexArrayObjectOES native "*WebGLVertexArrayObjectOES" {
+}
+
+/// @domName WebKitCSSFilterValue
+class WebKitCSSFilterValue extends _CSSValueList native "*WebKitCSSFilterValue" {
+
+  static const int CSS_FILTER_BLUR = 10;
+
+  static const int CSS_FILTER_BRIGHTNESS = 8;
+
+  static const int CSS_FILTER_CONTRAST = 9;
+
+  static const int CSS_FILTER_CUSTOM = 12;
+
+  static const int CSS_FILTER_DROP_SHADOW = 11;
+
+  static const int CSS_FILTER_GRAYSCALE = 2;
+
+  static const int CSS_FILTER_HUE_ROTATE = 5;
+
+  static const int CSS_FILTER_INVERT = 6;
+
+  static const int CSS_FILTER_OPACITY = 7;
+
+  static const int CSS_FILTER_REFERENCE = 1;
+
+  static const int CSS_FILTER_SATURATE = 4;
+
+  static const int CSS_FILTER_SEPIA = 3;
+
+  /** @domName WebKitCSSFilterValue.operationType */
+  final int operationType;
+}
+
+/// @domName WebKitNamedFlow
+class WebKitNamedFlow extends EventTarget native "*WebKitNamedFlow" {
+
+  /** @domName WebKitNamedFlow.firstEmptyRegionIndex */
+  final int firstEmptyRegionIndex;
+
+  /** @domName WebKitNamedFlow.name */
+  final String name;
+
+  /** @domName WebKitNamedFlow.overset */
+  final bool overset;
+
+  /** @domName WebKitNamedFlow.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName WebKitNamedFlow.dispatchEvent */
+  bool $dom_dispatchEvent(Event event) native "dispatchEvent";
+
+  /** @domName WebKitNamedFlow.getContent */
+  List<Node> getContent() native;
+
+  /** @domName WebKitNamedFlow.getRegions */
+  List<Node> getRegions() native;
+
+  /** @domName WebKitNamedFlow.getRegionsByContent */
+  List<Node> getRegionsByContent(Node contentNode) native;
+
+  /** @domName WebKitNamedFlow.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+class WebSocket extends EventTarget native "*WebSocket" {
+  factory WebSocket(String url) => _WebSocketFactoryProvider.createWebSocket(url);
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  WebSocketEvents get on =>
+    new WebSocketEvents(this);
+
+  static const int CLOSED = 3;
+
+  static const int CLOSING = 2;
+
+  static const int CONNECTING = 0;
+
+  static const int OPEN = 1;
+
+  /** @domName WebSocket.URL */
+  final String URL;
+
+  /** @domName WebSocket.binaryType */
+  String binaryType;
+
+  /** @domName WebSocket.bufferedAmount */
+  final int bufferedAmount;
+
+  /** @domName WebSocket.extensions */
+  final String extensions;
+
+  /** @domName WebSocket.protocol */
+  final String protocol;
+
+  /** @domName WebSocket.readyState */
+  final int readyState;
+
+  /** @domName WebSocket.url */
+  final String url;
+
+  /** @domName WebSocket.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName WebSocket.close */
+  void close([int code, String reason]) native;
+
+  /** @domName WebSocket.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName WebSocket.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName WebSocket.send */
+  void send(data) native;
+
+}
+
+class WebSocketEvents extends Events {
+  WebSocketEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get close => this['close'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get message => this['message'];
+
+  EventListenerList get open => this['open'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class WheelEvent extends MouseEvent native "*WheelEvent" {
+
+  /** @domName WheelEvent.webkitDirectionInvertedFromDevice */
+  final bool webkitDirectionInvertedFromDevice;
+
+  /** @domName WheelEvent.initWebKitWheelEvent */
+  void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native;
+
+
+  /** @domName WheelEvent.deltaY */
+  num get deltaY {
+    if (JS('bool', '#.deltaY !== undefined', this)) {
+      // W3C WheelEvent
+      return this._deltaY;
+    } else if (JS('bool', '#.wheelDelta !== undefined', this)) {
+      // Chrome and IE
+      return this._wheelDelta;
+    } else if (JS('bool', '#.detail !== undefined', this)) {
+      // Firefox
+
+      // Handle DOMMouseScroll case where it uses detail and the axis to
+      // differentiate.
+      if (JS('bool', '#.axis == MouseScrollEvent.VERTICAL_AXIS', this)) {
+        var detail = this._detail;
+        // Firefox is normally the number of lines to scale (normally 3)
+        // so multiply it by 40 to get pixels to move, matching IE & WebKit.
+        if (detail < 100) {
+          return detail * 40;
+        }
+        return detail;
+      }
+      return 0;
+    }
+    throw new UnsupportedError(
+        'deltaY is not supported');
+  }
+
+  /** @domName WheelEvent.deltaX */
+  num get deltaX {
+    if (JS('bool', '#.deltaX !== undefined', this)) {
+      // W3C WheelEvent
+      return this._deltaX;
+    } else if (JS('bool', '#.wheelDeltaX !== undefined', this)) {
+      // Chrome
+      return this._wheelDeltaX;
+    } else if (JS('bool', '#.detail !== undefined', this)) {
+      // Firefox and IE.
+      // IE will have detail set but will not set axis.
+
+      // Handle DOMMouseScroll case where it uses detail and the axis to
+      // differentiate.
+      if (JS('bool', '#.axis !== undefined && #.axis == MouseScrollEvent.HORIZONTAL_AXIS', this, this)) {
+        var detail = this._detail;
+        // Firefox is normally the number of lines to scale (normally 3)
+        // so multiply it by 40 to get pixels to move, matching IE & WebKit.
+        if (detail < 100) {
+          return detail * 40;
+        }
+        return detail;
+      }
+      return 0;
+    }
+    throw new UnsupportedError(
+        'deltaX is not supported');
+  }
+
+  int get deltaMode {
+    if (JS('bool', '!!#.deltaMode', this)) {
+      // If not available then we're poly-filling and doing pixel scroll.
+      return 0;
+    }
+    return this._deltaMode;
+  }
+
+  num get _deltaY => JS('num', '#.deltaY', this);
+  num get _deltaX => JS('num', '#.deltaX', this);
+  num get _wheelDelta => JS('num', '#.wheelDelta', this);
+  num get _wheelDeltaX => JS('num', '#.wheelDeltaX', this);
+  num get _detail => JS('num', '#.detail', this);
+  int get _deltaMode => JS('int', '#.deltaMode', this);
+
+}
+
+/// @domName Worker
+class Worker extends AbstractWorker native "*Worker" {
+
+  factory Worker(String scriptUrl) => _WorkerFactoryProvider.createWorker(scriptUrl);
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  WorkerEvents get on =>
+    new WorkerEvents(this);
+
+  /** @domName Worker.postMessage */
+  void postMessage(/*SerializedScriptValue*/ message, [messagePorts]) {
+    if (?messagePorts) {
+      var message_1 = _convertDartToNative_SerializedScriptValue(message);
+      _postMessage_1(message_1, messagePorts);
+      return;
+    }
+    var message_2 = _convertDartToNative_SerializedScriptValue(message);
+    _postMessage_2(message_2);
+    return;
+  }
+  void _postMessage_1(message, List messagePorts) native "postMessage";
+  void _postMessage_2(message) native "postMessage";
+
+  /** @domName Worker.terminate */
+  void terminate() native;
+}
+
+class WorkerEvents extends AbstractWorkerEvents {
+  WorkerEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get message => this['message'];
+}
+
+/// @domName WorkerContext
+class WorkerContext extends EventTarget native "*WorkerContext" {
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  WorkerContextEvents get on =>
+    new WorkerContextEvents(this);
+
+  static const int PERSISTENT = 1;
+
+  static const int TEMPORARY = 0;
+
+  /** @domName WorkerContext.indexedDB */
+  final IDBFactory indexedDB;
+
+  /** @domName WorkerContext.location */
+  final WorkerLocation location;
+
+  /** @domName WorkerContext.navigator */
+  final WorkerNavigator navigator;
+
+  /** @domName WorkerContext.self */
+  final WorkerContext self;
+
+  /** @domName WorkerContext.webkitIndexedDB */
+  final IDBFactory webkitIndexedDB;
+
+  /** @domName WorkerContext.webkitNotifications */
+  final NotificationCenter webkitNotifications;
+
+  /** @domName WorkerContext.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "addEventListener";
+
+  /** @domName WorkerContext.clearInterval */
+  void clearInterval(int handle) native;
+
+  /** @domName WorkerContext.clearTimeout */
+  void clearTimeout(int handle) native;
+
+  /** @domName WorkerContext.close */
+  void close() native;
+
+  /** @domName WorkerContext.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "dispatchEvent";
+
+  /** @domName WorkerContext.importScripts */
+  void importScripts() native;
+
+  /** @domName WorkerContext.openDatabase */
+  Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
+
+  /** @domName WorkerContext.openDatabaseSync */
+  DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
+
+  /** @domName WorkerContext.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "removeEventListener";
+
+  /** @domName WorkerContext.setInterval */
+  int setInterval(TimeoutHandler handler, int timeout) native;
+
+  /** @domName WorkerContext.setTimeout */
+  int setTimeout(TimeoutHandler handler, int timeout) native;
+
+  /** @domName WorkerContext.webkitRequestFileSystem */
+  void webkitRequestFileSystem(int type, int size, [FileSystemCallback successCallback, ErrorCallback errorCallback]) native;
+
+  /** @domName WorkerContext.webkitRequestFileSystemSync */
+  DOMFileSystemSync webkitRequestFileSystemSync(int type, int size) native;
+
+  /** @domName WorkerContext.webkitResolveLocalFileSystemSyncURL */
+  EntrySync webkitResolveLocalFileSystemSyncURL(String url) native;
+
+  /** @domName WorkerContext.webkitResolveLocalFileSystemURL */
+  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native;
+}
+
+class WorkerContextEvents extends Events {
+  WorkerContextEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get error => this['error'];
+}
+
+/// @domName WorkerLocation
+class WorkerLocation native "*WorkerLocation" {
+
+  /** @domName WorkerLocation.hash */
+  final String hash;
+
+  /** @domName WorkerLocation.host */
+  final String host;
+
+  /** @domName WorkerLocation.hostname */
+  final String hostname;
+
+  /** @domName WorkerLocation.href */
+  final String href;
+
+  /** @domName WorkerLocation.pathname */
+  final String pathname;
+
+  /** @domName WorkerLocation.port */
+  final String port;
+
+  /** @domName WorkerLocation.protocol */
+  final String protocol;
+
+  /** @domName WorkerLocation.search */
+  final String search;
+
+  /** @domName WorkerLocation.toString */
+  String toString() native;
+}
+
+/// @domName WorkerNavigator
+class WorkerNavigator native "*WorkerNavigator" {
+
+  /** @domName WorkerNavigator.appName */
+  final String appName;
+
+  /** @domName WorkerNavigator.appVersion */
+  final String appVersion;
+
+  /** @domName WorkerNavigator.onLine */
+  final bool onLine;
+
+  /** @domName WorkerNavigator.platform */
+  final String platform;
+
+  /** @domName WorkerNavigator.userAgent */
+  final String userAgent;
+}
+
+/// @domName XMLSerializer
+class XMLSerializer native "*XMLSerializer" {
+
+  factory XMLSerializer() => _XMLSerializerFactoryProvider.createXMLSerializer();
+
+  /** @domName XMLSerializer.serializeToString */
+  String serializeToString(Node node) native;
+}
+
+/// @domName XPathEvaluator
+class XPathEvaluator native "*XPathEvaluator" {
+
+  factory XPathEvaluator() => _XPathEvaluatorFactoryProvider.createXPathEvaluator();
+
+  /** @domName XPathEvaluator.createExpression */
+  XPathExpression createExpression(String expression, XPathNSResolver resolver) native;
+
+  /** @domName XPathEvaluator.createNSResolver */
+  XPathNSResolver createNSResolver(Node nodeResolver) native;
+
+  /** @domName XPathEvaluator.evaluate */
+  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) native;
+}
+
+/// @domName XPathException
+class XPathException native "*XPathException" {
+
+  static const int INVALID_EXPRESSION_ERR = 51;
+
+  static const int TYPE_ERR = 52;
+
+  /** @domName XPathException.code */
+  final int code;
+
+  /** @domName XPathException.message */
+  final String message;
+
+  /** @domName XPathException.name */
+  final String name;
+
+  /** @domName XPathException.toString */
+  String toString() native;
+}
+
+/// @domName XPathExpression
+class XPathExpression native "*XPathExpression" {
+
+  /** @domName XPathExpression.evaluate */
+  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) native;
+}
+
+/// @domName XPathNSResolver
+class XPathNSResolver native "*XPathNSResolver" {
+
+  /** @domName XPathNSResolver.lookupNamespaceURI */
+  String lookupNamespaceURI(String prefix) native;
+}
+
+/// @domName XPathResult
+class XPathResult native "*XPathResult" {
+
+  static const int ANY_TYPE = 0;
+
+  static const int ANY_UNORDERED_NODE_TYPE = 8;
+
+  static const int BOOLEAN_TYPE = 3;
+
+  static const int FIRST_ORDERED_NODE_TYPE = 9;
+
+  static const int NUMBER_TYPE = 1;
+
+  static const int ORDERED_NODE_ITERATOR_TYPE = 5;
+
+  static const int ORDERED_NODE_SNAPSHOT_TYPE = 7;
+
+  static const int STRING_TYPE = 2;
+
+  static const int UNORDERED_NODE_ITERATOR_TYPE = 4;
+
+  static const int UNORDERED_NODE_SNAPSHOT_TYPE = 6;
+
+  /** @domName XPathResult.booleanValue */
+  final bool booleanValue;
+
+  /** @domName XPathResult.invalidIteratorState */
+  final bool invalidIteratorState;
+
+  /** @domName XPathResult.numberValue */
+  final num numberValue;
+
+  /** @domName XPathResult.resultType */
+  final int resultType;
+
+  /** @domName XPathResult.singleNodeValue */
+  final Node singleNodeValue;
+
+  /** @domName XPathResult.snapshotLength */
+  final int snapshotLength;
+
+  /** @domName XPathResult.stringValue */
+  final String stringValue;
+
+  /** @domName XPathResult.iterateNext */
+  Node iterateNext() native;
+
+  /** @domName XPathResult.snapshotItem */
+  Node snapshotItem(int index) native;
+}
+
+/// @domName XSLTProcessor
+class XSLTProcessor native "*XSLTProcessor" {
+
+  factory XSLTProcessor() => _XSLTProcessorFactoryProvider.createXSLTProcessor();
+
+  /** @domName XSLTProcessor.clearParameters */
+  void clearParameters() native;
+
+  /** @domName XSLTProcessor.getParameter */
+  String getParameter(String namespaceURI, String localName) native;
+
+  /** @domName XSLTProcessor.importStylesheet */
+  void importStylesheet(Node stylesheet) native;
+
+  /** @domName XSLTProcessor.removeParameter */
+  void removeParameter(String namespaceURI, String localName) native;
+
+  /** @domName XSLTProcessor.reset */
+  void reset() native;
+
+  /** @domName XSLTProcessor.setParameter */
+  void setParameter(String namespaceURI, String localName, String value) native;
+
+  /** @domName XSLTProcessor.transformToDocument */
+  Document transformToDocument(Node source) native;
+
+  /** @domName XSLTProcessor.transformToFragment */
+  DocumentFragment transformToFragment(Node source, Document docVal) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _ArrayBufferFactoryProvider {
+  static ArrayBuffer createArrayBuffer(int length) =>
+      JS('ArrayBuffer', 'new ArrayBuffer(#)', length);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _AudioElementFactoryProvider {
+  static AudioElement createAudioElement([String src = null]) {
+    if (src == null) return JS('AudioElement', 'new Audio()');
+    return JS('AudioElement', 'new Audio(#)', src);
+  }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _BlobFactoryProvider {
+  static Blob createBlob([List blobParts = null, String type, String endings]) {
+    // TODO: validate that blobParts is a JS Array and convert if not.
+    // TODO: any coercions on the elements of blobParts, e.g. coerce a typed
+    // array to ArrayBuffer if it is a total view.
+    if (type == null && endings == null) {
+      return _create_1(blobParts);
+    }
+    var bag = _create_bag();
+    if (type != null) _bag_set(bag, 'type', type);
+    if (endings != null) _bag_set(bag, 'endings', endings);
+    return _create_2(blobParts, bag);
+  }
+
+  static _create_1(parts) => JS('Blob', 'new Blob(#)', parts);
+  static _create_2(parts, bag) => JS('Blob', 'new Blob(#, #)', parts, bag);
+
+  static _create_bag() => JS('var', '{}');
+  static _bag_set(bag, key, value) { JS('void', '#[#] = #', bag, key, value); }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _CSSMatrixFactoryProvider {
+  static CSSMatrix createCSSMatrix([String cssValue = '']) =>
+      JS('CSSMatrix', 'new WebKitCSSMatrix(#)', cssValue);
+}
+
+/// @domName CSSRuleList
+class _CSSRuleList implements JavaScriptIndexingBehavior, List<CSSRule> native "*CSSRuleList" {
+
+  /** @domName CSSRuleList.length */
+  final int length;
+
+  CSSRule operator[](int index) => JS("CSSRule", "#[#]", this, index);
+
+  void operator[]=(int index, CSSRule value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<CSSRule> mixins.
+  // CSSRule is the element type.
+
+  // From Iterable<CSSRule>:
+
+  Iterator<CSSRule> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<CSSRule>(this);
+  }
+
+  // From Collection<CSSRule>:
+
+  void add(CSSRule value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(CSSRule value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<CSSRule> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(CSSRule element) => _Collections.contains(this, element);
+
+  void forEach(void f(CSSRule element)) => _Collections.forEach(this, f);
+
+  Collection map(f(CSSRule element)) => _Collections.map(this, [], f);
+
+  Collection<CSSRule> filter(bool f(CSSRule element)) =>
+     _Collections.filter(this, <CSSRule>[], f);
+
+  bool every(bool f(CSSRule element)) => _Collections.every(this, f);
+
+  bool some(bool f(CSSRule element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<CSSRule>:
+
+  void sort([Comparator<CSSRule> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(CSSRule element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(CSSRule element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  CSSRule get last => this[length - 1];
+
+  CSSRule removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<CSSRule> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [CSSRule initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<CSSRule> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <CSSRule>[]);
+
+  // -- end List<CSSRule> mixins.
+
+  /** @domName CSSRuleList.item */
+  CSSRule item(int index) native;
+}
+
+/// @domName CSSValueList
+class _CSSValueList extends CSSValue implements List<CSSValue>, JavaScriptIndexingBehavior native "*CSSValueList" {
+
+  /** @domName CSSValueList.length */
+  final int length;
+
+  CSSValue operator[](int index) => JS("CSSValue", "#[#]", this, index);
+
+  void operator[]=(int index, CSSValue value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<CSSValue> mixins.
+  // CSSValue is the element type.
+
+  // From Iterable<CSSValue>:
+
+  Iterator<CSSValue> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<CSSValue>(this);
+  }
+
+  // From Collection<CSSValue>:
+
+  void add(CSSValue value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(CSSValue value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<CSSValue> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(CSSValue element) => _Collections.contains(this, element);
+
+  void forEach(void f(CSSValue element)) => _Collections.forEach(this, f);
+
+  Collection map(f(CSSValue element)) => _Collections.map(this, [], f);
+
+  Collection<CSSValue> filter(bool f(CSSValue element)) =>
+     _Collections.filter(this, <CSSValue>[], f);
+
+  bool every(bool f(CSSValue element)) => _Collections.every(this, f);
+
+  bool some(bool f(CSSValue element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<CSSValue>:
+
+  void sort([Comparator<CSSValue> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(CSSValue element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(CSSValue element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  CSSValue get last => this[length - 1];
+
+  CSSValue removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<CSSValue> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [CSSValue initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<CSSValue> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <CSSValue>[]);
+
+  // -- end List<CSSValue> mixins.
+
+  /** @domName CSSValueList.item */
+  CSSValue item(int index) native;
+}
+
+/// @domName ClientRectList
+class _ClientRectList implements JavaScriptIndexingBehavior, List<ClientRect> native "*ClientRectList" {
+
+  /** @domName ClientRectList.length */
+  final int length;
+
+  ClientRect operator[](int index) => JS("ClientRect", "#[#]", this, index);
+
+  void operator[]=(int index, ClientRect value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<ClientRect> mixins.
+  // ClientRect is the element type.
+
+  // From Iterable<ClientRect>:
+
+  Iterator<ClientRect> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<ClientRect>(this);
+  }
+
+  // From Collection<ClientRect>:
+
+  void add(ClientRect value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(ClientRect value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<ClientRect> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(ClientRect element) => _Collections.contains(this, element);
+
+  void forEach(void f(ClientRect element)) => _Collections.forEach(this, f);
+
+  Collection map(f(ClientRect element)) => _Collections.map(this, [], f);
+
+  Collection<ClientRect> filter(bool f(ClientRect element)) =>
+     _Collections.filter(this, <ClientRect>[], f);
+
+  bool every(bool f(ClientRect element)) => _Collections.every(this, f);
+
+  bool some(bool f(ClientRect element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<ClientRect>:
+
+  void sort([Comparator<ClientRect> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(ClientRect element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(ClientRect element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  ClientRect get last => this[length - 1];
+
+  ClientRect removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<ClientRect> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [ClientRect initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<ClientRect> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <ClientRect>[]);
+
+  // -- end List<ClientRect> mixins.
+
+  /** @domName ClientRectList.item */
+  ClientRect item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _DOMParserFactoryProvider {
+  static DOMParser createDOMParser() =>
+      JS('DOMParser', 'new DOMParser()' );
+}
+
+/// @domName DOMStringList
+class _DOMStringList implements JavaScriptIndexingBehavior, List<String> native "*DOMStringList" {
+
+  /** @domName DOMStringList.length */
+  final int length;
+
+  String operator[](int index) => JS("String", "#[#]", this, index);
+
+  void operator[]=(int index, String value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<String> mixins.
+  // String is the element type.
+
+  // From Iterable<String>:
+
+  Iterator<String> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<String>(this);
+  }
+
+  // From Collection<String>:
+
+  void add(String value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(String value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<String> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  // contains() defined by IDL.
+
+  void forEach(void f(String element)) => _Collections.forEach(this, f);
+
+  Collection map(f(String element)) => _Collections.map(this, [], f);
+
+  Collection<String> filter(bool f(String element)) =>
+     _Collections.filter(this, <String>[], f);
+
+  bool every(bool f(String element)) => _Collections.every(this, f);
+
+  bool some(bool f(String element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<String>:
+
+  void sort([Comparator<String> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(String element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(String element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  String get last => this[length - 1];
+
+  String removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [String initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<String> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <String>[]);
+
+  // -- end List<String> mixins.
+
+  /** @domName DOMStringList.contains */
+  bool contains(String string) native;
+
+  /** @domName DOMStringList.item */
+  String item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _DataViewFactoryProvider {
+  static DataView createDataView(
+      ArrayBuffer buffer, [int byteOffset = null, int byteLength = null]) {
+    if (byteOffset == null) {
+      return JS('DataView', 'new DataView(#)', buffer);
+    }
+    if (byteLength == null) {
+      return JS('DataView', 'new DataView(#,#)', buffer, byteOffset);
+    }
+    return JS('DataView', 'new DataView(#,#,#)', buffer, byteOffset, byteLength);
+  }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+class _Elements {
+
+
+  static AnchorElement createAnchorElement([String href]) {
+    AnchorElement _e = document.$dom_createElement("a");
+    if (href != null) _e.href = href;
+    return _e;
+  }
+
+  static AreaElement createAreaElement() {
+    AreaElement _e = document.$dom_createElement("area");
+    return _e;
+  }
+
+  static BRElement createBRElement() {
+    BRElement _e = document.$dom_createElement("br");
+    return _e;
+  }
+
+  static BaseElement createBaseElement() {
+    BaseElement _e = document.$dom_createElement("base");
+    return _e;
+  }
+
+  static BodyElement createBodyElement() {
+    BodyElement _e = document.$dom_createElement("body");
+    return _e;
+  }
+
+  static ButtonElement createButtonElement() {
+    ButtonElement _e = document.$dom_createElement("button");
+    return _e;
+  }
+
+  static CanvasElement createCanvasElement([int width, int height]) {
+    CanvasElement _e = document.$dom_createElement("canvas");
+    if (width != null) _e.width = width;
+    if (height != null) _e.height = height;
+    return _e;
+  }
+
+  static ContentElement createContentElement() {
+    ContentElement _e = document.$dom_createElement("content");
+    return _e;
+  }
+
+  static DListElement createDListElement() {
+    DListElement _e = document.$dom_createElement("dl");
+    return _e;
+  }
+
+  static DataListElement createDataListElement() {
+    DataListElement _e = document.$dom_createElement("datalist");
+    return _e;
+  }
+
+  static DetailsElement createDetailsElement() {
+    DetailsElement _e = document.$dom_createElement("details");
+    return _e;
+  }
+
+  static DivElement createDivElement() {
+    DivElement _e = document.$dom_createElement("div");
+    return _e;
+  }
+
+  static EmbedElement createEmbedElement() {
+    EmbedElement _e = document.$dom_createElement("embed");
+    return _e;
+  }
+
+  static FieldSetElement createFieldSetElement() {
+    FieldSetElement _e = document.$dom_createElement("fieldset");
+    return _e;
+  }
+
+  static FormElement createFormElement() {
+    FormElement _e = document.$dom_createElement("form");
+    return _e;
+  }
+
+  static HRElement createHRElement() {
+    HRElement _e = document.$dom_createElement("hr");
+    return _e;
+  }
+
+  static HeadElement createHeadElement() {
+    HeadElement _e = document.$dom_createElement("head");
+    return _e;
+  }
+
+  static HeadingElement createHeadingElement_h1() {
+    HeadingElement _e = document.$dom_createElement("h1");
+    return _e;
+  }
+
+  static HeadingElement createHeadingElement_h2() {
+    HeadingElement _e = document.$dom_createElement("h2");
+    return _e;
+  }
+
+  static HeadingElement createHeadingElement_h3() {
+    HeadingElement _e = document.$dom_createElement("h3");
+    return _e;
+  }
+
+  static HeadingElement createHeadingElement_h4() {
+    HeadingElement _e = document.$dom_createElement("h4");
+    return _e;
+  }
+
+  static HeadingElement createHeadingElement_h5() {
+    HeadingElement _e = document.$dom_createElement("h5");
+    return _e;
+  }
+
+  static HeadingElement createHeadingElement_h6() {
+    HeadingElement _e = document.$dom_createElement("h6");
+    return _e;
+  }
+
+  static HtmlElement createHtmlElement() {
+    HtmlElement _e = document.$dom_createElement("html");
+    return _e;
+  }
+
+  static IFrameElement createIFrameElement() {
+    IFrameElement _e = document.$dom_createElement("iframe");
+    return _e;
+  }
+
+  static ImageElement createImageElement([String src, int width, int height]) {
+    ImageElement _e = document.$dom_createElement("img");
+    if (src != null) _e.src = src;
+    if (width != null) _e.width = width;
+    if (height != null) _e.height = height;
+    return _e;
+  }
+
+  static InputElement createInputElement([String type]) {
+    InputElement _e = document.$dom_createElement("input");
+    if (type != null) _e.type = type;
+    return _e;
+  }
+
+  static KeygenElement createKeygenElement() {
+    KeygenElement _e = document.$dom_createElement("keygen");
+    return _e;
+  }
+
+  static LIElement createLIElement() {
+    LIElement _e = document.$dom_createElement("li");
+    return _e;
+  }
+
+  static LabelElement createLabelElement() {
+    LabelElement _e = document.$dom_createElement("label");
+    return _e;
+  }
+
+  static LegendElement createLegendElement() {
+    LegendElement _e = document.$dom_createElement("legend");
+    return _e;
+  }
+
+  static LinkElement createLinkElement() {
+    LinkElement _e = document.$dom_createElement("link");
+    return _e;
+  }
+
+  static MapElement createMapElement() {
+    MapElement _e = document.$dom_createElement("map");
+    return _e;
+  }
+
+  static MenuElement createMenuElement() {
+    MenuElement _e = document.$dom_createElement("menu");
+    return _e;
+  }
+
+  static MeterElement createMeterElement() {
+    MeterElement _e = document.$dom_createElement("meter");
+    return _e;
+  }
+
+  static OListElement createOListElement() {
+    OListElement _e = document.$dom_createElement("ol");
+    return _e;
+  }
+
+  static ObjectElement createObjectElement() {
+    ObjectElement _e = document.$dom_createElement("object");
+    return _e;
+  }
+
+  static OptGroupElement createOptGroupElement() {
+    OptGroupElement _e = document.$dom_createElement("optgroup");
+    return _e;
+  }
+
+  static OutputElement createOutputElement() {
+    OutputElement _e = document.$dom_createElement("output");
+    return _e;
+  }
+
+  static ParagraphElement createParagraphElement() {
+    ParagraphElement _e = document.$dom_createElement("p");
+    return _e;
+  }
+
+  static ParamElement createParamElement() {
+    ParamElement _e = document.$dom_createElement("param");
+    return _e;
+  }
+
+  static PreElement createPreElement() {
+    PreElement _e = document.$dom_createElement("pre");
+    return _e;
+  }
+
+  static ProgressElement createProgressElement() {
+    ProgressElement _e = document.$dom_createElement("progress");
+    return _e;
+  }
+
+  static ScriptElement createScriptElement() {
+    ScriptElement _e = document.$dom_createElement("script");
+    return _e;
+  }
+
+  static SelectElement createSelectElement() {
+    SelectElement _e = document.$dom_createElement("select");
+    return _e;
+  }
+
+  static SourceElement createSourceElement() {
+    SourceElement _e = document.$dom_createElement("source");
+    return _e;
+  }
+
+  static SpanElement createSpanElement() {
+    SpanElement _e = document.$dom_createElement("span");
+    return _e;
+  }
+
+  static StyleElement createStyleElement() {
+    StyleElement _e = document.$dom_createElement("style");
+    return _e;
+  }
+
+  static TableCaptionElement createTableCaptionElement() {
+    TableCaptionElement _e = document.$dom_createElement("caption");
+    return _e;
+  }
+
+  static TableCellElement createTableCellElement() {
+    TableCellElement _e = document.$dom_createElement("td");
+    return _e;
+  }
+
+  static TableColElement createTableColElement() {
+    TableColElement _e = document.$dom_createElement("col");
+    return _e;
+  }
+
+  static TableElement createTableElement() {
+    TableElement _e = document.$dom_createElement("table");
+    return _e;
+  }
+
+  static TableRowElement createTableRowElement() {
+    TableRowElement _e = document.$dom_createElement("tr");
+    return _e;
+  }
+
+  static TextAreaElement createTextAreaElement() {
+    TextAreaElement _e = document.$dom_createElement("textarea");
+    return _e;
+  }
+
+  static TitleElement createTitleElement() {
+    TitleElement _e = document.$dom_createElement("title");
+    return _e;
+  }
+
+  static TrackElement createTrackElement() {
+    TrackElement _e = document.$dom_createElement("track");
+    return _e;
+  }
+
+  static UListElement createUListElement() {
+    UListElement _e = document.$dom_createElement("ul");
+    return _e;
+  }
+
+  static VideoElement createVideoElement() {
+    VideoElement _e = document.$dom_createElement("video");
+    return _e;
+  }
+}
+
+/// @domName EntryArray
+class _EntryArray implements JavaScriptIndexingBehavior, List<Entry> native "*EntryArray" {
+
+  /** @domName EntryArray.length */
+  final int length;
+
+  Entry operator[](int index) => JS("Entry", "#[#]", this, index);
+
+  void operator[]=(int index, Entry value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<Entry> mixins.
+  // Entry is the element type.
+
+  // From Iterable<Entry>:
+
+  Iterator<Entry> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<Entry>(this);
+  }
+
+  // From Collection<Entry>:
+
+  void add(Entry value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(Entry value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<Entry> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(Entry element) => _Collections.contains(this, element);
+
+  void forEach(void f(Entry element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Entry element)) => _Collections.map(this, [], f);
+
+  Collection<Entry> filter(bool f(Entry element)) =>
+     _Collections.filter(this, <Entry>[], f);
+
+  bool every(bool f(Entry element)) => _Collections.every(this, f);
+
+  bool some(bool f(Entry element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Entry>:
+
+  void sort([Comparator<Entry> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Entry element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Entry element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  Entry get last => this[length - 1];
+
+  Entry removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<Entry> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [Entry initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<Entry> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Entry>[]);
+
+  // -- end List<Entry> mixins.
+
+  /** @domName EntryArray.item */
+  Entry item(int index) native;
+}
+
+/// @domName EntryArraySync
+class _EntryArraySync implements JavaScriptIndexingBehavior, List<EntrySync> native "*EntryArraySync" {
+
+  /** @domName EntryArraySync.length */
+  final int length;
+
+  EntrySync operator[](int index) => JS("EntrySync", "#[#]", this, index);
+
+  void operator[]=(int index, EntrySync value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<EntrySync> mixins.
+  // EntrySync is the element type.
+
+  // From Iterable<EntrySync>:
+
+  Iterator<EntrySync> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<EntrySync>(this);
+  }
+
+  // From Collection<EntrySync>:
+
+  void add(EntrySync value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(EntrySync value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<EntrySync> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(EntrySync element) => _Collections.contains(this, element);
+
+  void forEach(void f(EntrySync element)) => _Collections.forEach(this, f);
+
+  Collection map(f(EntrySync element)) => _Collections.map(this, [], f);
+
+  Collection<EntrySync> filter(bool f(EntrySync element)) =>
+     _Collections.filter(this, <EntrySync>[], f);
+
+  bool every(bool f(EntrySync element)) => _Collections.every(this, f);
+
+  bool some(bool f(EntrySync element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<EntrySync>:
+
+  void sort([Comparator<EntrySync> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(EntrySync element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(EntrySync element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  EntrySync get last => this[length - 1];
+
+  EntrySync removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<EntrySync> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [EntrySync initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<EntrySync> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <EntrySync>[]);
+
+  // -- end List<EntrySync> mixins.
+
+  /** @domName EntryArraySync.item */
+  EntrySync item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _EventSourceFactoryProvider {
+  static EventSource createEventSource(String scriptUrl) =>
+      JS('EventSource', 'new EventSource(#)', scriptUrl);
+}
+
+/// @domName FileList
+class _FileList implements JavaScriptIndexingBehavior, List<File> native "*FileList" {
+
+  /** @domName FileList.length */
+  final int length;
+
+  File operator[](int index) => JS("File", "#[#]", this, index);
+
+  void operator[]=(int index, File value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<File> mixins.
+  // File is the element type.
+
+  // From Iterable<File>:
+
+  Iterator<File> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<File>(this);
+  }
+
+  // From Collection<File>:
+
+  void add(File value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(File value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<File> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(File element) => _Collections.contains(this, element);
+
+  void forEach(void f(File element)) => _Collections.forEach(this, f);
+
+  Collection map(f(File element)) => _Collections.map(this, [], f);
+
+  Collection<File> filter(bool f(File element)) =>
+     _Collections.filter(this, <File>[], f);
+
+  bool every(bool f(File element)) => _Collections.every(this, f);
+
+  bool some(bool f(File element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<File>:
+
+  void sort([Comparator<File> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(File element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(File element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  File get last => this[length - 1];
+
+  File removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<File> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [File initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<File> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <File>[]);
+
+  // -- end List<File> mixins.
+
+  /** @domName FileList.item */
+  File item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _FileReaderFactoryProvider {
+  static FileReader createFileReader() =>
+      JS('FileReader', 'new FileReader()' );
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _FileReaderSyncFactoryProvider {
+  static FileReaderSync createFileReaderSync() =>
+      JS('FileReaderSync', 'new FileReaderSync()' );
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _FormDataFactoryProvider {
+  static FormData createFormData([FormElement form = null]) {
+    if (form == null) return JS('FormData', 'new FormData()');
+    return JS('FormData', 'new FormData(#)', form);
+  }
+}
+
+/// @domName GamepadList
+class _GamepadList implements JavaScriptIndexingBehavior, List<Gamepad> native "*GamepadList" {
+
+  /** @domName GamepadList.length */
+  final int length;
+
+  Gamepad operator[](int index) => JS("Gamepad", "#[#]", this, index);
+
+  void operator[]=(int index, Gamepad value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<Gamepad> mixins.
+  // Gamepad is the element type.
+
+  // From Iterable<Gamepad>:
+
+  Iterator<Gamepad> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<Gamepad>(this);
+  }
+
+  // From Collection<Gamepad>:
+
+  void add(Gamepad value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(Gamepad value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<Gamepad> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(Gamepad element) => _Collections.contains(this, element);
+
+  void forEach(void f(Gamepad element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Gamepad element)) => _Collections.map(this, [], f);
+
+  Collection<Gamepad> filter(bool f(Gamepad element)) =>
+     _Collections.filter(this, <Gamepad>[], f);
+
+  bool every(bool f(Gamepad element)) => _Collections.every(this, f);
+
+  bool some(bool f(Gamepad element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Gamepad>:
+
+  void sort([Comparator<Gamepad> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Gamepad element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Gamepad element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  Gamepad get last => this[length - 1];
+
+  Gamepad removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<Gamepad> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [Gamepad initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<Gamepad> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Gamepad>[]);
+
+  // -- end List<Gamepad> mixins.
+
+  /** @domName GamepadList.item */
+  Gamepad item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _HttpRequestFactoryProvider {
+  static HttpRequest createHttpRequest() =>
+      JS('HttpRequest', 'new XMLHttpRequest()');
+
+  static HttpRequest createHttpRequest_get(String url,
+      onSuccess(HttpRequest request)) =>
+      _HttpRequestUtils.get(url, onSuccess, false);
+
+  static HttpRequest createHttpRequest_getWithCredentials(String url,
+      onSuccess(HttpRequest request)) =>
+      _HttpRequestUtils.get(url, onSuccess, true);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _IceCandidateFactoryProvider {
+  static IceCandidate createIceCandidate(String label, String candidateLine) =>
+      JS('IceCandidate', 'new IceCandidate(#,#)', label, candidateLine);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _MediaControllerFactoryProvider {
+  static MediaController createMediaController() =>
+      JS('MediaController', 'new MediaController()' );
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _MediaSourceFactoryProvider {
+  static MediaSource createMediaSource() =>
+      JS('MediaSource', 'new MediaSource()' );
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _MediaStreamFactoryProvider {
+  static MediaStream createMediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) =>
+      JS('MediaStream', 'new MediaStream(#,#)', audioTracks, videoTracks);
+}
+
+/// @domName MediaStreamList
+class _MediaStreamList implements JavaScriptIndexingBehavior, List<MediaStream> native "*MediaStreamList" {
+
+  /** @domName MediaStreamList.length */
+  final int length;
+
+  MediaStream operator[](int index) => JS("MediaStream", "#[#]", this, index);
+
+  void operator[]=(int index, MediaStream value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<MediaStream> mixins.
+  // MediaStream is the element type.
+
+  // From Iterable<MediaStream>:
+
+  Iterator<MediaStream> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<MediaStream>(this);
+  }
+
+  // From Collection<MediaStream>:
+
+  void add(MediaStream value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(MediaStream value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<MediaStream> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(MediaStream element) => _Collections.contains(this, element);
+
+  void forEach(void f(MediaStream element)) => _Collections.forEach(this, f);
+
+  Collection map(f(MediaStream element)) => _Collections.map(this, [], f);
+
+  Collection<MediaStream> filter(bool f(MediaStream element)) =>
+     _Collections.filter(this, <MediaStream>[], f);
+
+  bool every(bool f(MediaStream element)) => _Collections.every(this, f);
+
+  bool some(bool f(MediaStream element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<MediaStream>:
+
+  void sort([Comparator<MediaStream> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(MediaStream element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(MediaStream element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  MediaStream get last => this[length - 1];
+
+  MediaStream removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<MediaStream> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [MediaStream initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<MediaStream> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <MediaStream>[]);
+
+  // -- end List<MediaStream> mixins.
+
+  /** @domName MediaStreamList.item */
+  MediaStream item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _MessageChannelFactoryProvider {
+  static MessageChannel createMessageChannel() =>
+      JS('MessageChannel', 'new MessageChannel()' );
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _MutationObserverFactoryProvider {
+  static MutationObserver createMutationObserver(MutationCallback callback) native '''
+    var constructor =
+        window.MutationObserver || window.WebKitMutationObserver ||
+        window.MozMutationObserver;
+    return new constructor(callback);
+  ''';
+
+  // TODO(sra): Dart2js inserts a conversion when a Dart function (i.e. an
+  // object with a call method) is passed to a native method.  This is so the
+  // native code sees a JavaScript function.
+  //
+  // This does not happen when a function is 'passed' to a JS-form so it is not
+  // possible to rewrite the above code to, e.g. (simplified):
+  //
+  // static createMutationObserver(MutationCallback callback) =>
+  //    JS('var', 'new (window.MutationObserver)(#)', callback);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _NotificationFactoryProvider {
+  static Notification createNotification(String title, [Map options]) =>
+      JS('Notification', 'new Notification(#,#)', title, options);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _OptionElementFactoryProvider {
+  static OptionElement createOptionElement(
+      [String data, String value, bool defaultSelected, bool selected]) {
+    if (data == null) {
+      return JS('OptionElement', 'new Option()');
+    }
+    if (value == null) {
+      return JS('OptionElement', 'new Option(#)', data);
+    }
+    if (defaultSelected == null) {
+      return JS('OptionElement', 'new Option(#,#)', data, value);
+    }
+    if (selected == null) {
+      return JS('OptionElement', 'new Option(#,#,#)',
+                data, value, defaultSelected);
+    }
+    return JS('OptionElement', 'new Option(#,#,#,#)',
+              data, value, defaultSelected, selected);
+  }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _PeerConnection00FactoryProvider {
+  static PeerConnection00 createPeerConnection00(String serverConfiguration, IceCallback iceCallback) =>
+      JS('PeerConnection00', 'new PeerConnection00(#,#)', serverConfiguration, iceCallback);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _RTCIceCandidateFactoryProvider {
+  static RTCIceCandidate createRTCIceCandidate(Map dictionary) =>
+      JS('RTCIceCandidate', 'new RTCIceCandidate(#)', dictionary);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _RTCPeerConnectionFactoryProvider {
+  static RTCPeerConnection createRTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) =>
+      JS('RTCPeerConnection', 'new RTCPeerConnection(#,#)', rtcIceServers, mediaConstraints);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _RTCSessionDescriptionFactoryProvider {
+  static RTCSessionDescription createRTCSessionDescription(Map dictionary) =>
+      JS('RTCSessionDescription', 'new RTCSessionDescription(#)', dictionary);
+}
+
+/// @domName SVGElementInstanceList
+class _SVGElementInstanceList implements JavaScriptIndexingBehavior, List<SVGElementInstance> native "*SVGElementInstanceList" {
+
+  /** @domName SVGElementInstanceList.length */
+  final int length;
+
+  SVGElementInstance operator[](int index) => JS("SVGElementInstance", "#[#]", this, index);
+
+  void operator[]=(int index, SVGElementInstance value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SVGElementInstance> mixins.
+  // SVGElementInstance is the element type.
+
+  // From Iterable<SVGElementInstance>:
+
+  Iterator<SVGElementInstance> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SVGElementInstance>(this);
+  }
+
+  // From Collection<SVGElementInstance>:
+
+  void add(SVGElementInstance value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SVGElementInstance value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SVGElementInstance> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SVGElementInstance element) => _Collections.contains(this, element);
+
+  void forEach(void f(SVGElementInstance element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SVGElementInstance element)) => _Collections.map(this, [], f);
+
+  Collection<SVGElementInstance> filter(bool f(SVGElementInstance element)) =>
+     _Collections.filter(this, <SVGElementInstance>[], f);
+
+  bool every(bool f(SVGElementInstance element)) => _Collections.every(this, f);
+
+  bool some(bool f(SVGElementInstance element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SVGElementInstance>:
+
+  void sort([Comparator<SVGElementInstance> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SVGElementInstance element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SVGElementInstance element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SVGElementInstance get last => this[length - 1];
+
+  SVGElementInstance removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SVGElementInstance> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SVGElementInstance initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SVGElementInstance> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SVGElementInstance>[]);
+
+  // -- end List<SVGElementInstance> mixins.
+
+  /** @domName SVGElementInstanceList.item */
+  SVGElementInstance item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _SessionDescriptionFactoryProvider {
+  static SessionDescription createSessionDescription(String sdp) =>
+      JS('SessionDescription', 'new SessionDescription(#)', sdp);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _ShadowRootFactoryProvider {
+  static ShadowRoot createShadowRoot(Element host) =>
+      JS('ShadowRoot',
+         'new (window.ShadowRoot || window.WebKitShadowRoot)(#)', host);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _SharedWorkerFactoryProvider {
+  static SharedWorker createSharedWorker(String scriptURL, [String name]) {
+    if (name == null) return JS('SharedWorker', 'new SharedWorker(#)', scriptURL);
+    return JS('SharedWorker', 'new SharedWorker(#,#)', scriptURL, name);
+  }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _SpeechGrammarFactoryProvider {
+  static SpeechGrammar createSpeechGrammar() =>
+      JS('SpeechGrammar', 'new SpeechGrammar()' );
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _SpeechGrammarListFactoryProvider {
+  static SpeechGrammarList createSpeechGrammarList() =>
+      JS('SpeechGrammarList', 'new SpeechGrammarList()' );
+}
+
+/// @domName SpeechInputResultList
+class _SpeechInputResultList implements JavaScriptIndexingBehavior, List<SpeechInputResult> native "*SpeechInputResultList" {
+
+  /** @domName SpeechInputResultList.length */
+  final int length;
+
+  SpeechInputResult operator[](int index) => JS("SpeechInputResult", "#[#]", this, index);
+
+  void operator[]=(int index, SpeechInputResult value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SpeechInputResult> mixins.
+  // SpeechInputResult is the element type.
+
+  // From Iterable<SpeechInputResult>:
+
+  Iterator<SpeechInputResult> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SpeechInputResult>(this);
+  }
+
+  // From Collection<SpeechInputResult>:
+
+  void add(SpeechInputResult value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SpeechInputResult value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SpeechInputResult> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SpeechInputResult element) => _Collections.contains(this, element);
+
+  void forEach(void f(SpeechInputResult element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SpeechInputResult element)) => _Collections.map(this, [], f);
+
+  Collection<SpeechInputResult> filter(bool f(SpeechInputResult element)) =>
+     _Collections.filter(this, <SpeechInputResult>[], f);
+
+  bool every(bool f(SpeechInputResult element)) => _Collections.every(this, f);
+
+  bool some(bool f(SpeechInputResult element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SpeechInputResult>:
+
+  void sort([Comparator<SpeechInputResult> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SpeechInputResult element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SpeechInputResult element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SpeechInputResult get last => this[length - 1];
+
+  SpeechInputResult removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SpeechInputResult> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SpeechInputResult initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SpeechInputResult> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SpeechInputResult>[]);
+
+  // -- end List<SpeechInputResult> mixins.
+
+  /** @domName SpeechInputResultList.item */
+  SpeechInputResult item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _SpeechRecognitionFactoryProvider {
+  static SpeechRecognition createSpeechRecognition() =>
+      JS('SpeechRecognition', 'new SpeechRecognition()' );
+}
+
+/// @domName SpeechRecognitionResultList
+class _SpeechRecognitionResultList implements JavaScriptIndexingBehavior, List<SpeechRecognitionResult> native "*SpeechRecognitionResultList" {
+
+  /** @domName SpeechRecognitionResultList.length */
+  final int length;
+
+  SpeechRecognitionResult operator[](int index) => JS("SpeechRecognitionResult", "#[#]", this, index);
+
+  void operator[]=(int index, SpeechRecognitionResult value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SpeechRecognitionResult> mixins.
+  // SpeechRecognitionResult is the element type.
+
+  // From Iterable<SpeechRecognitionResult>:
+
+  Iterator<SpeechRecognitionResult> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SpeechRecognitionResult>(this);
+  }
+
+  // From Collection<SpeechRecognitionResult>:
+
+  void add(SpeechRecognitionResult value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SpeechRecognitionResult value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SpeechRecognitionResult> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SpeechRecognitionResult element) => _Collections.contains(this, element);
+
+  void forEach(void f(SpeechRecognitionResult element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SpeechRecognitionResult element)) => _Collections.map(this, [], f);
+
+  Collection<SpeechRecognitionResult> filter(bool f(SpeechRecognitionResult element)) =>
+     _Collections.filter(this, <SpeechRecognitionResult>[], f);
+
+  bool every(bool f(SpeechRecognitionResult element)) => _Collections.every(this, f);
+
+  bool some(bool f(SpeechRecognitionResult element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SpeechRecognitionResult>:
+
+  void sort([Comparator<SpeechRecognitionResult> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SpeechRecognitionResult element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SpeechRecognitionResult element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SpeechRecognitionResult get last => this[length - 1];
+
+  SpeechRecognitionResult removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SpeechRecognitionResult> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SpeechRecognitionResult initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SpeechRecognitionResult> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SpeechRecognitionResult>[]);
+
+  // -- end List<SpeechRecognitionResult> mixins.
+
+  /** @domName SpeechRecognitionResultList.item */
+  SpeechRecognitionResult item(int index) native;
+}
+
+/// @domName StyleSheetList
+class _StyleSheetList implements JavaScriptIndexingBehavior, List<StyleSheet> native "*StyleSheetList" {
+
+  /** @domName StyleSheetList.length */
+  final int length;
+
+  StyleSheet operator[](int index) => JS("StyleSheet", "#[#]", this, index);
+
+  void operator[]=(int index, StyleSheet value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<StyleSheet> mixins.
+  // StyleSheet is the element type.
+
+  // From Iterable<StyleSheet>:
+
+  Iterator<StyleSheet> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<StyleSheet>(this);
+  }
+
+  // From Collection<StyleSheet>:
+
+  void add(StyleSheet value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(StyleSheet value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<StyleSheet> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(StyleSheet element) => _Collections.contains(this, element);
+
+  void forEach(void f(StyleSheet element)) => _Collections.forEach(this, f);
+
+  Collection map(f(StyleSheet element)) => _Collections.map(this, [], f);
+
+  Collection<StyleSheet> filter(bool f(StyleSheet element)) =>
+     _Collections.filter(this, <StyleSheet>[], f);
+
+  bool every(bool f(StyleSheet element)) => _Collections.every(this, f);
+
+  bool some(bool f(StyleSheet element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<StyleSheet>:
+
+  void sort([Comparator<StyleSheet> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(StyleSheet element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(StyleSheet element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  StyleSheet get last => this[length - 1];
+
+  StyleSheet removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<StyleSheet> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [StyleSheet initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<StyleSheet> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <StyleSheet>[]);
+
+  // -- end List<StyleSheet> mixins.
+
+  /** @domName StyleSheetList.item */
+  StyleSheet item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _TextTrackCueFactoryProvider {
+  static TextTrackCue createTextTrackCue(
+      String id, num startTime, num endTime, String text,
+      [String settings, bool pauseOnExit]) {
+        if (settings == null) {
+          return JS('TextTrackCue',
+                    'new TextTrackCue(#,#,#,#)',
+                    id, startTime, endTime, text);
+        }
+        if (pauseOnExit == null) {
+          return JS('TextTrackCue',
+                    'new TextTrackCue(#,#,#,#,#)',
+                    id, startTime, endTime, text, settings);
+        }
+        return JS('TextTrackCue',
+                  'new TextTrackCue(#,#,#,#,#,#)',
+                  id, startTime, endTime, text, settings, pauseOnExit);
+  }
+}
+
+/// @domName WebKitAnimationList
+class _WebKitAnimationList implements JavaScriptIndexingBehavior, List<Animation> native "*WebKitAnimationList" {
+
+  /** @domName WebKitAnimationList.length */
+  final int length;
+
+  Animation operator[](int index) => JS("Animation", "#[#]", this, index);
+
+  void operator[]=(int index, Animation value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<Animation> mixins.
+  // Animation is the element type.
+
+  // From Iterable<Animation>:
+
+  Iterator<Animation> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<Animation>(this);
+  }
+
+  // From Collection<Animation>:
+
+  void add(Animation value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(Animation value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<Animation> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(Animation element) => _Collections.contains(this, element);
+
+  void forEach(void f(Animation element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Animation element)) => _Collections.map(this, [], f);
+
+  Collection<Animation> filter(bool f(Animation element)) =>
+     _Collections.filter(this, <Animation>[], f);
+
+  bool every(bool f(Animation element)) => _Collections.every(this, f);
+
+  bool some(bool f(Animation element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Animation>:
+
+  void sort([Comparator<Animation> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Animation element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Animation element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  Animation get last => this[length - 1];
+
+  Animation removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<Animation> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [Animation initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<Animation> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Animation>[]);
+
+  // -- end List<Animation> mixins.
+
+  /** @domName WebKitAnimationList.item */
+  Animation item(int index) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _WorkerFactoryProvider {
+  static Worker createWorker(String scriptUrl) =>
+      JS('Worker', 'new Worker(#)', scriptUrl);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _XMLSerializerFactoryProvider {
+  static XMLSerializer createXMLSerializer() =>
+      JS('XMLSerializer', 'new XMLSerializer()' );
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _XPathEvaluatorFactoryProvider {
+  static XPathEvaluator createXPathEvaluator() =>
+      JS('XPathEvaluator', 'new XPathEvaluator()' );
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _XSLTProcessorFactoryProvider {
+  static XSLTProcessor createXSLTProcessor() =>
+      JS('XSLTProcessor', 'new XSLTProcessor()' );
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+abstract class Window {
+  // Fields.
+  Location get location;
+  History get history;
+
+  bool get closed;
+  Window get opener;
+  Window get parent;
+  Window get top;
+
+  // Methods.
+  void focus();
+  void blur();
+  void close();
+  void postMessage(var message, String targetOrigin, [List messagePorts = null]);
+}
+
+abstract class Location {
+  void set href(String val);
+}
+
+abstract class History {
+  void back();
+  void forward();
+  void go(int distance);
+}
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef void EventListener(Event event);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Defines the keycode values for keys that are returned by 
+ * KeyboardEvent.keyCode.
+ * 
+ * Important note: There is substantial divergence in how different browsers
+ * handle keycodes and their variants in different locales/keyboard layouts. We
+ * provide these constants to help make code processing keys more readable.
+ */
+abstract class KeyCode {
+  // These constant names were borrowed from Closure's Keycode enumeration
+  // class.
+  // http://closure-library.googlecode.com/svn/docs/closure_goog_events_keycodes.js.source.html  
+  static final int WIN_KEY_FF_LINUX = 0;
+  static final int MAC_ENTER = 3;
+  static final int BACKSPACE = 8;
+  static final int TAB = 9;
+  /** NUM_CENTER is also NUMLOCK for FF and Safari on Mac. */
+  static final int NUM_CENTER = 12;
+  static final int ENTER = 13;
+  static final int SHIFT = 16;
+  static final int CTRL = 17;
+  static final int ALT = 18;
+  static final int PAUSE = 19;
+  static final int CAPS_LOCK = 20;
+  static final int ESC = 27;
+  static final int SPACE = 32;
+  static final int PAGE_UP = 33;
+  static final int PAGE_DOWN = 34;
+  static final int END = 35;
+  static final int HOME = 36;
+  static final int LEFT = 37;
+  static final int UP = 38;
+  static final int RIGHT = 39;
+  static final int DOWN = 40;
+  static final int NUM_NORTH_EAST = 33;
+  static final int NUM_SOUTH_EAST = 34;
+  static final int NUM_SOUTH_WEST = 35;
+  static final int NUM_NORTH_WEST = 36;
+  static final int NUM_WEST = 37;
+  static final int NUM_NORTH = 38;
+  static final int NUM_EAST = 39;
+  static final int NUM_SOUTH = 40;
+  static final int PRINT_SCREEN = 44;
+  static final int INSERT = 45;
+  static final int NUM_INSERT = 45;
+  static final int DELETE = 46;
+  static final int NUM_DELETE = 46;
+  static final int ZERO = 48;
+  static final int ONE = 49;
+  static final int TWO = 50;
+  static final int THREE = 51;
+  static final int FOUR = 52;
+  static final int FIVE = 53;
+  static final int SIX = 54;
+  static final int SEVEN = 55;
+  static final int EIGHT = 56;
+  static final int NINE = 57;
+  static final int FF_SEMICOLON = 59;
+  static final int FF_EQUALS = 61;
+  /**
+   * CAUTION: The question mark is for US-keyboard layouts. It varies
+   * for other locales and keyboard layouts.
+   */
+  static final int QUESTION_MARK = 63;
+  static final int A = 65;
+  static final int B = 66;
+  static final int C = 67;
+  static final int D = 68;
+  static final int E = 69;
+  static final int F = 70;
+  static final int G = 71;
+  static final int H = 72;
+  static final int I = 73;
+  static final int J = 74;
+  static final int K = 75;
+  static final int L = 76;
+  static final int M = 77;
+  static final int N = 78;
+  static final int O = 79;
+  static final int P = 80;
+  static final int Q = 81;
+  static final int R = 82;
+  static final int S = 83;
+  static final int T = 84;
+  static final int U = 85;
+  static final int V = 86;
+  static final int W = 87;
+  static final int X = 88;
+  static final int Y = 89;
+  static final int Z = 90;
+  static final int META = 91;
+  static final int WIN_KEY_LEFT = 91;
+  static final int WIN_KEY_RIGHT = 92;
+  static final int CONTEXT_MENU = 93;
+  static final int NUM_ZERO = 96;
+  static final int NUM_ONE = 97;
+  static final int NUM_TWO = 98;
+  static final int NUM_THREE = 99;
+  static final int NUM_FOUR = 100;
+  static final int NUM_FIVE = 101;
+  static final int NUM_SIX = 102;
+  static final int NUM_SEVEN = 103;
+  static final int NUM_EIGHT = 104;
+  static final int NUM_NINE = 105;
+  static final int NUM_MULTIPLY = 106;
+  static final int NUM_PLUS = 107;
+  static final int NUM_MINUS = 109;
+  static final int NUM_PERIOD = 110;
+  static final int NUM_DIVISION = 111;
+  static final int F1 = 112;
+  static final int F2 = 113;
+  static final int F3 = 114;
+  static final int F4 = 115;
+  static final int F5 = 116;
+  static final int F6 = 117;
+  static final int F7 = 118;
+  static final int F8 = 119;
+  static final int F9 = 120;
+  static final int F10 = 121;
+  static final int F11 = 122;
+  static final int F12 = 123;
+  static final int NUMLOCK = 144;
+  static final int SCROLL_LOCK = 145;
+
+  // OS-specific media keys like volume controls and browser controls.
+  static final int FIRST_MEDIA_KEY = 166;
+  static final int LAST_MEDIA_KEY = 183;
+
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int SEMICOLON = 186;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int DASH = 189;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int EQUALS = 187;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int COMMA = 188;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int PERIOD = 190;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int SLASH = 191;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int APOSTROPHE = 192;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int TILDE = 192;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int SINGLE_QUOTE = 222;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int OPEN_SQUARE_BRACKET = 219;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int BACKSLASH = 220;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int CLOSE_SQUARE_BRACKET = 221;
+  static final int WIN_KEY = 224;
+  static final int MAC_FF_META = 224;
+  static final int WIN_IME = 229;
+}
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Defines the standard key locations returned by
+ * KeyboardEvent.getKeyLocation.
+ */
+abstract class KeyLocation {
+
+  /**
+   * The event key is not distinguished as the left or right version
+   * of the key, and did not originate from the numeric keypad (or did not
+   * originate with a virtual key corresponding to the numeric keypad).
+   */
+  static const int STANDARD = 0;
+
+  /**
+   * The event key is in the left key location.
+   */
+  static const int LEFT = 1;
+
+  /**
+   * The event key is in the right key location.
+   */
+  static const int RIGHT = 2;
+
+  /**
+   * The event key originated on the numeric keypad or with a virtual key
+   * corresponding to the numeric keypad.
+   */
+  static const int NUMPAD = 3;
+
+  /**
+   * The event key originated on a mobile device, either on a physical
+   * keypad or a virtual keyboard.
+   */
+  static const int MOBILE = 4;
+
+  /**
+   * The event key originated on a game controller or a joystick on a mobile
+   * device.
+   */
+  static const int JOYSTICK = 5;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Defines the standard keyboard identifier names for keys that are returned
+ * by KeyEvent.getKeyboardIdentifier when the key does not have a direct
+ * unicode mapping.
+ */
+abstract class KeyName {
+
+  /** The Accept (Commit, OK) key */
+  static const String ACCEPT = "Accept";
+
+  /** The Add key */
+  static const String ADD = "Add";
+
+  /** The Again key */
+  static const String AGAIN = "Again";
+
+  /** The All Candidates key */
+  static const String ALL_CANDIDATES = "AllCandidates";
+
+  /** The Alphanumeric key */
+  static const String ALPHANUMERIC = "Alphanumeric";
+
+  /** The Alt (Menu) key */
+  static const String ALT = "Alt";
+
+  /** The Alt-Graph key */
+  static const String ALT_GRAPH = "AltGraph";
+
+  /** The Application key */
+  static const String APPS = "Apps";
+
+  /** The ATTN key */
+  static const String ATTN = "Attn";
+
+  /** The Browser Back key */
+  static const String BROWSER_BACK = "BrowserBack";
+
+  /** The Browser Favorites key */
+  static const String BROWSER_FAVORTIES = "BrowserFavorites";
+
+  /** The Browser Forward key */
+  static const String BROWSER_FORWARD = "BrowserForward";
+
+  /** The Browser Home key */
+  static const String BROWSER_NAME = "BrowserHome";
+
+  /** The Browser Refresh key */
+  static const String BROWSER_REFRESH = "BrowserRefresh";
+
+  /** The Browser Search key */
+  static const String BROWSER_SEARCH = "BrowserSearch";
+
+  /** The Browser Stop key */
+  static const String BROWSER_STOP = "BrowserStop";
+
+  /** The Camera key */
+  static const String CAMERA = "Camera";
+
+  /** The Caps Lock (Capital) key */
+  static const String CAPS_LOCK = "CapsLock";
+
+  /** The Clear key */
+  static const String CLEAR = "Clear";
+
+  /** The Code Input key */
+  static const String CODE_INPUT = "CodeInput";
+
+  /** The Compose key */
+  static const String COMPOSE = "Compose";
+
+  /** The Control (Ctrl) key */
+  static const String CONTROL = "Control";
+
+  /** The Crsel key */
+  static const String CRSEL = "Crsel";
+
+  /** The Convert key */
+  static const String CONVERT = "Convert";
+
+  /** The Copy key */
+  static const String COPY = "Copy";
+
+  /** The Cut key */
+  static const String CUT = "Cut";
+
+  /** The Decimal key */
+  static const String DECIMAL = "Decimal";
+
+  /** The Divide key */
+  static const String DIVIDE = "Divide";
+
+  /** The Down Arrow key */
+  static const String DOWN = "Down";
+
+  /** The diagonal Down-Left Arrow key */
+  static const String DOWN_LEFT = "DownLeft";
+
+  /** The diagonal Down-Right Arrow key */
+  static const String DOWN_RIGHT = "DownRight";
+
+  /** The Eject key */
+  static const String EJECT = "Eject";
+
+  /** The End key */
+  static const String END = "End";
+
+  /**
+   * The Enter key. Note: This key value must also be used for the Return
+   *  (Macintosh numpad) key
+   */
+  static const String ENTER = "Enter";
+
+  /** The Erase EOF key */
+  static const String ERASE_EOF= "EraseEof";
+
+  /** The Execute key */
+  static const String EXECUTE = "Execute";
+
+  /** The Exsel key */
+  static const String EXSEL = "Exsel";
+
+  /** The Function switch key */
+  static const String FN = "Fn";
+
+  /** The F1 key */
+  static const String F1 = "F1";
+
+  /** The F2 key */
+  static const String F2 = "F2";
+
+  /** The F3 key */
+  static const String F3 = "F3";
+
+  /** The F4 key */
+  static const String F4 = "F4";
+
+  /** The F5 key */
+  static const String F5 = "F5";
+
+  /** The F6 key */
+  static const String F6 = "F6";
+
+  /** The F7 key */
+  static const String F7 = "F7";
+
+  /** The F8 key */
+  static const String F8 = "F8";
+
+  /** The F9 key */
+  static const String F9 = "F9";
+
+  /** The F10 key */
+  static const String F10 = "F10";
+
+  /** The F11 key */
+  static const String F11 = "F11";
+
+  /** The F12 key */
+  static const String F12 = "F12";
+
+  /** The F13 key */
+  static const String F13 = "F13";
+
+  /** The F14 key */
+  static const String F14 = "F14";
+
+  /** The F15 key */
+  static const String F15 = "F15";
+
+  /** The F16 key */
+  static const String F16 = "F16";
+
+  /** The F17 key */
+  static const String F17 = "F17";
+
+  /** The F18 key */
+  static const String F18 = "F18";
+
+  /** The F19 key */
+  static const String F19 = "F19";
+
+  /** The F20 key */
+  static const String F20 = "F20";
+
+  /** The F21 key */
+  static const String F21 = "F21";
+
+  /** The F22 key */
+  static const String F22 = "F22";
+
+  /** The F23 key */
+  static const String F23 = "F23";
+
+  /** The F24 key */
+  static const String F24 = "F24";
+
+  /** The Final Mode (Final) key used on some asian keyboards */
+  static const String FINAL_MODE = "FinalMode";
+
+  /** The Find key */
+  static const String FIND = "Find";
+
+  /** The Full-Width Characters key */
+  static const String FULL_WIDTH = "FullWidth";
+
+  /** The Half-Width Characters key */
+  static const String HALF_WIDTH = "HalfWidth";
+
+  /** The Hangul (Korean characters) Mode key */
+  static const String HANGUL_MODE = "HangulMode";
+
+  /** The Hanja (Korean characters) Mode key */
+  static const String HANJA_MODE = "HanjaMode";
+
+  /** The Help key */
+  static const String HELP = "Help";
+
+  /** The Hiragana (Japanese Kana characters) key */
+  static const String HIRAGANA = "Hiragana";
+
+  /** The Home key */
+  static const String HOME = "Home";
+
+  /** The Insert (Ins) key */
+  static const String INSERT = "Insert";
+
+  /** The Japanese-Hiragana key */
+  static const String JAPANESE_HIRAGANA = "JapaneseHiragana";
+
+  /** The Japanese-Katakana key */
+  static const String JAPANESE_KATAKANA = "JapaneseKatakana";
+
+  /** The Japanese-Romaji key */
+  static const String JAPANESE_ROMAJI = "JapaneseRomaji";
+
+  /** The Junja Mode key */
+  static const String JUNJA_MODE = "JunjaMode";
+
+  /** The Kana Mode (Kana Lock) key */
+  static const String KANA_MODE = "KanaMode";
+
+  /**
+   * The Kanji (Japanese name for ideographic characters of Chinese origin)
+   * Mode key
+   */
+  static const String KANJI_MODE = "KanjiMode";
+
+  /** The Katakana (Japanese Kana characters) key */
+  static const String KATAKANA = "Katakana";
+
+  /** The Start Application One key */
+  static const String LAUNCH_APPLICATION_1 = "LaunchApplication1";
+
+  /** The Start Application Two key */
+  static const String LAUNCH_APPLICATION_2 = "LaunchApplication2";
+
+  /** The Start Mail key */
+  static const String LAUNCH_MAIL = "LaunchMail";
+
+  /** The Left Arrow key */
+  static const String LEFT = "Left";
+
+  /** The Menu key */
+  static const String MENU = "Menu";
+
+  /**
+   * The Meta key. Note: This key value shall be also used for the Apple
+   * Command key
+   */
+  static const String META = "Meta";
+
+  /** The Media Next Track key */
+  static const String MEDIA_NEXT_TRACK = "MediaNextTrack";
+
+  /** The Media Play Pause key */
+  static const String MEDIA_PAUSE_PLAY = "MediaPlayPause";
+
+  /** The Media Previous Track key */
+  static const String MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";
+
+  /** The Media Stop key */
+  static const String MEDIA_STOP = "MediaStop";
+
+  /** The Mode Change key */
+  static const String MODE_CHANGE = "ModeChange";
+
+  /** The Next Candidate function key */
+  static const String NEXT_CANDIDATE = "NextCandidate";
+
+  /** The Nonconvert (Don't Convert) key */
+  static const String NON_CONVERT = "Nonconvert";
+
+  /** The Number Lock key */
+  static const String NUM_LOCK = "NumLock";
+
+  /** The Page Down (Next) key */
+  static const String PAGE_DOWN = "PageDown";
+
+  /** The Page Up key */
+  static const String PAGE_UP = "PageUp";
+
+  /** The Paste key */
+  static const String PASTE = "Paste";
+
+  /** The Pause key */
+  static const String PAUSE = "Pause";
+
+  /** The Play key */
+  static const String PLAY = "Play";
+
+  /**
+   * The Power key. Note: Some devices may not expose this key to the
+   * operating environment
+   */
+  static const String POWER = "Power";
+
+  /** The Previous Candidate function key */
+  static const String PREVIOUS_CANDIDATE = "PreviousCandidate";
+
+  /** The Print Screen (PrintScrn, SnapShot) key */
+  static const String PRINT_SCREEN = "PrintScreen";
+
+  /** The Process key */
+  static const String PROCESS = "Process";
+
+  /** The Props key */
+  static const String PROPS = "Props";
+
+  /** The Right Arrow key */
+  static const String RIGHT = "Right";
+
+  /** The Roman Characters function key */
+  static const String ROMAN_CHARACTERS = "RomanCharacters";
+
+  /** The Scroll Lock key */
+  static const String SCROLL = "Scroll";
+
+  /** The Select key */
+  static const String SELECT = "Select";
+
+  /** The Select Media key */
+  static const String SELECT_MEDIA = "SelectMedia";
+
+  /** The Separator key */
+  static const String SEPARATOR = "Separator";
+
+  /** The Shift key */
+  static const String SHIFT = "Shift";
+
+  /** The Soft1 key */
+  static const String SOFT_1 = "Soft1";
+
+  /** The Soft2 key */
+  static const String SOFT_2 = "Soft2";
+
+  /** The Soft3 key */
+  static const String SOFT_3 = "Soft3";
+
+  /** The Soft4 key */
+  static const String SOFT_4 = "Soft4";
+
+  /** The Stop key */
+  static const String STOP = "Stop";
+
+  /** The Subtract key */
+  static const String SUBTRACT = "Subtract";
+
+  /** The Symbol Lock key */
+  static const String SYMBOL_LOCK = "SymbolLock";
+
+  /** The Up Arrow key */
+  static const String UP = "Up";
+
+  /** The diagonal Up-Left Arrow key */
+  static const String UP_LEFT = "UpLeft";
+
+  /** The diagonal Up-Right Arrow key */
+  static const String UP_RIGHT = "UpRight";
+
+  /** The Undo key */
+  static const String UNDO = "Undo";
+
+  /** The Volume Down key */
+  static const String VOLUME_DOWN = "VolumeDown";
+
+  /** The Volume Mute key */
+  static const String VOLUMN_MUTE = "VolumeMute";
+
+  /** The Volume Up key */
+  static const String VOLUMN_UP = "VolumeUp";
+
+  /** The Windows Logo key */
+  static const String WIN = "Win";
+
+  /** The Zoom key */
+  static const String ZOOM = "Zoom";
+
+  /**
+   * The Backspace (Back) key. Note: This key value shall be also used for the
+   * key labeled 'delete' MacOS keyboards when not modified by the 'Fn' key
+   */
+  static const String BACKSPACE = "Backspace";
+
+  /** The Horizontal Tabulation (Tab) key */
+  static const String TAB = "Tab";
+
+  /** The Cancel key */
+  static const String CANCEL = "Cancel";
+
+  /** The Escape (Esc) key */
+  static const String ESC = "Esc";
+
+  /** The Space (Spacebar) key:   */
+  static const String SPACEBAR = "Spacebar";
+
+  /**
+   * The Delete (Del) Key. Note: This key value shall be also used for the key
+   * labeled 'delete' MacOS keyboards when modified by the 'Fn' key
+   */
+  static const String DEL = "Del";
+
+  /** The Combining Grave Accent (Greek Varia, Dead Grave) key */
+  static const String DEAD_GRAVE = "DeadGrave";
+
+  /**
+   * The Combining Acute Accent (Stress Mark, Greek Oxia, Tonos, Dead Eacute)
+   * key
+   */
+  static const String DEAD_EACUTE = "DeadEacute";
+
+  /** The Combining Circumflex Accent (Hat, Dead Circumflex) key */
+  static const String DEAD_CIRCUMFLEX = "DeadCircumflex";
+
+  /** The Combining Tilde (Dead Tilde) key */
+  static const String DEAD_TILDE = "DeadTilde";
+
+  /** The Combining Macron (Long, Dead Macron) key */
+  static const String DEAD_MACRON = "DeadMacron";
+
+  /** The Combining Breve (Short, Dead Breve) key */
+  static const String DEAD_BREVE = "DeadBreve";
+
+  /** The Combining Dot Above (Derivative, Dead Above Dot) key */
+  static const String DEAD_ABOVE_DOT = "DeadAboveDot";
+
+  /**
+   * The Combining Diaeresis (Double Dot Abode, Umlaut, Greek Dialytika,
+   * Double Derivative, Dead Diaeresis) key
+   */
+  static const String DEAD_UMLAUT = "DeadUmlaut";
+
+  /** The Combining Ring Above (Dead Above Ring) key */
+  static const String DEAD_ABOVE_RING = "DeadAboveRing";
+
+  /** The Combining Double Acute Accent (Dead Doubleacute) key */
+  static const String DEAD_DOUBLEACUTE = "DeadDoubleacute";
+
+  /** The Combining Caron (Hacek, V Above, Dead Caron) key */
+  static const String DEAD_CARON = "DeadCaron";
+
+  /** The Combining Cedilla (Dead Cedilla) key */
+  static const String DEAD_CEDILLA = "DeadCedilla";
+
+  /** The Combining Ogonek (Nasal Hook, Dead Ogonek) key */
+  static const String DEAD_OGONEK = "DeadOgonek";
+
+  /**
+   * The Combining Greek Ypogegrammeni (Greek Non-Spacing Iota Below, Iota
+   * Subscript, Dead Iota) key
+   */
+  static const String DEAD_IOTA = "DeadIota";
+
+  /**
+   * The Combining Katakana-Hiragana Voiced Sound Mark (Dead Voiced Sound) key
+   */
+  static const String DEAD_VOICED_SOUND = "DeadVoicedSound";
+
+  /**
+   * The Combining Katakana-Hiragana Semi-Voiced Sound Mark (Dead Semivoiced
+   * Sound) key
+   */
+  static const String DEC_SEMIVOICED_SOUND= "DeadSemivoicedSound";
+
+  /**
+   * Key value used when an implementation is unable to identify another key
+   * value, due to either hardware, platform, or software constraints
+   */
+  static const String UNIDENTIFIED = "Unidentified";
+}
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Contains the set of standard values returned by HTMLDocument.getReadyState.
+ */
+abstract class ReadyState {
+  /**
+   * Indicates the document is still loading and parsing.
+   */
+  static const String LOADING = "loading";
+
+  /**
+   * Indicates the document is finished parsing but is still loading
+   * subresources.
+   */
+  static const String INTERACTIVE = "interactive";
+
+  /**
+   * Indicates the document and all subresources have been loaded.
+   */
+  static const String COMPLETE = "complete";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(antonm): support not DOM isolates too.
+class _Timer implements Timer {
+  final canceller;
+
+  _Timer(this.canceller);
+
+  void cancel() { canceller(); }
+}
+
+get _timerFactoryClosure => (int milliSeconds, void callback(Timer timer), bool repeating) {
+  var maker;
+  var canceller;
+  if (repeating) {
+    maker = window.setInterval;
+    canceller = window.clearInterval;
+  } else {
+    maker = window.setTimeout;
+    canceller = window.clearTimeout;
+  }
+  Timer timer;
+  final int id = maker(() { callback(timer); }, milliSeconds);
+  timer = new _Timer(() { canceller(id); });
+  return timer;
+};
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * The [Collections] class implements static methods useful when
+ * writing a class that implements [Collection] and the [iterator]
+ * method.
+ */
+class _Collections {
+  static bool contains(Iterable<Object> iterable, Object element) {
+    for (final e in iterable) {
+      if (e == element) return true;
+    }
+    return false;
+  }
+
+  static void forEach(Iterable<Object> iterable, void f(Object o)) {
+    for (final e in iterable) {
+      f(e);
+    }
+  }
+
+  static List map(Iterable<Object> source,
+                  List<Object> destination,
+                  f(o)) {
+    for (final e in source) {
+      destination.add(f(e));
+    }
+    return destination;
+  }
+
+  static bool some(Iterable<Object> iterable, bool f(Object o)) {
+    for (final e in iterable) {
+      if (f(e)) return true;
+    }
+    return false;
+  }
+
+  static bool every(Iterable<Object> iterable, bool f(Object o)) {
+    for (final e in iterable) {
+      if (!f(e)) return false;
+    }
+    return true;
+  }
+
+  static List filter(Iterable<Object> source,
+                     List<Object> destination,
+                     bool f(o)) {
+    for (final e in source) {
+      if (f(e)) destination.add(e);
+    }
+    return destination;
+  }
+
+  static bool isEmpty(Iterable<Object> iterable) {
+    return !iterable.iterator().hasNext;
+  }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _HttpRequestUtils {
+
+  // Helper for factory HttpRequest.get
+  static HttpRequest get(String url,
+                            onSuccess(HttpRequest request),
+                            bool withCredentials) {
+    final request = new HttpRequest();
+    request.open('GET', url, true);
+
+    request.withCredentials = withCredentials;
+
+    // Status 0 is for local XHR request.
+    request.on.readyStateChange.add((e) {
+      if (request.readyState == HttpRequest.DONE &&
+          (request.status == 200 || request.status == 0)) {
+        onSuccess(request);
+      }
+    });
+
+    request.send();
+
+    return request;
+  }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+_serialize(var message) {
+  return new _JsSerializer().traverse(message);
+}
+
+class _JsSerializer extends _Serializer {
+
+  visitSendPortSync(SendPortSync x) {
+    if (x is _JsSendPortSync) return visitJsSendPortSync(x);
+    if (x is _LocalSendPortSync) return visitLocalSendPortSync(x);
+    if (x is _RemoteSendPortSync) return visitRemoteSendPortSync(x);
+    throw "Unknown port type $x";
+  }
+
+  visitJsSendPortSync(_JsSendPortSync x) {
+    return [ 'sendport', 'nativejs', x._id ];
+  }
+
+  visitLocalSendPortSync(_LocalSendPortSync x) {
+    return [ 'sendport', 'dart',
+             ReceivePortSync._isolateId, x._receivePort._portId ];
+  }
+
+  visitRemoteSendPortSync(_RemoteSendPortSync x) {
+    return [ 'sendport', 'dart',
+             x._receivePort._isolateId, x._receivePort._portId ];
+  }
+}
+
+_deserialize(var message) {
+  return new _JsDeserializer().deserialize(message);
+}
+
+
+class _JsDeserializer extends _Deserializer {
+
+  static const _UNSPECIFIED = const Object();
+
+  deserializeSendPort(List x) {
+    String tag = x[1];
+    switch (tag) {
+      case 'nativejs':
+        num id = x[2];
+        return new _JsSendPortSync(id);
+      case 'dart':
+        num isolateId = x[2];
+        num portId = x[3];
+        return ReceivePortSync._lookup(isolateId, portId);
+      default:
+        throw 'Illegal SendPortSync type: $tag';
+    }
+  }
+}
+
+// The receiver is JS.
+class _JsSendPortSync implements SendPortSync {
+
+  num _id;
+  _JsSendPortSync(this._id);
+
+  callSync(var message) {
+    var serialized = _serialize(message);
+    var result = _callPortSync(_id, serialized);
+    return _deserialize(result);
+  }
+
+}
+
+// TODO(vsm): Differentiate between Dart2Js and Dartium isolates.
+// The receiver is a different Dart isolate, compiled to JS.
+class _RemoteSendPortSync implements SendPortSync {
+
+  int _isolateId;
+  int _portId;
+  _RemoteSendPortSync(this._isolateId, this._portId);
+
+  callSync(var message) {
+    var serialized = _serialize(message);
+    var result = _call(_isolateId, _portId, serialized);
+    return _deserialize(result);
+  }
+
+  static _call(int isolateId, int portId, var message) {
+    var target = 'dart-port-$isolateId-$portId'; 
+    // TODO(vsm): Make this re-entrant.
+    // TODO(vsm): Set this up set once, on the first call.
+    var source = '$target-result';
+    var result = null;
+    var listener = (Event e) {
+      result = JSON.parse(_getPortSyncEventData(e));
+    };
+    window.on[source].add(listener);
+    _dispatchEvent(target, [source, message]);
+    window.on[source].remove(listener);
+    return result;
+  }
+}
+
+// The receiver is in the same Dart isolate, compiled to JS.
+class _LocalSendPortSync implements SendPortSync {
+
+  ReceivePortSync _receivePort;
+
+  _LocalSendPortSync._internal(this._receivePort);
+
+  callSync(var message) {
+    // TODO(vsm): Do a more efficient deep copy.
+    var copy = _deserialize(_serialize(message));
+    var result = _receivePort._callback(copy);
+    return _deserialize(_serialize(result));
+  }
+}
+
+// TODO(vsm): Move this to dart:isolate.  This will take some
+// refactoring as there are dependences here on the DOM.  Users
+// interact with this class (or interface if we change it) directly -
+// new ReceivePortSync.  I think most of the DOM logic could be
+// delayed until the corresponding SendPort is registered on the
+// window.
+
+// A Dart ReceivePortSync (tagged 'dart' when serialized) is
+// identifiable / resolvable by the combination of its isolateid and
+// portid.  When a corresponding SendPort is used within the same
+// isolate, the _portMap below can be used to obtain the
+// ReceivePortSync directly.  Across isolates (or from JS), an
+// EventListener can be used to communicate with the port indirectly.
+class ReceivePortSync {
+
+  static Map<int, ReceivePortSync> _portMap;
+  static int _portIdCount;
+  static int _cachedIsolateId;
+
+  num _portId;
+  Function _callback;
+  EventListener _listener;
+
+  ReceivePortSync() {
+    if (_portIdCount == null) {
+      _portIdCount = 0;
+      _portMap = new Map<int, ReceivePortSync>();
+    }
+    _portId = _portIdCount++;
+    _portMap[_portId] = this;
+  }
+
+  static int get _isolateId {
+    // TODO(vsm): Make this coherent with existing isolate code.
+    if (_cachedIsolateId == null) {
+      _cachedIsolateId = _getNewIsolateId();      
+    }
+    return _cachedIsolateId;
+  }
+
+  static String _getListenerName(isolateId, portId) =>
+      'dart-port-$isolateId-$portId'; 
+  String get _listenerName => _getListenerName(_isolateId, _portId);
+
+  void receive(callback(var message)) {
+    _callback = callback;
+    if (_listener == null) {
+      _listener = (Event e) {
+        var data = JSON.parse(_getPortSyncEventData(e));
+        var replyTo = data[0];
+        var message = _deserialize(data[1]);
+        var result = _callback(message);
+        _dispatchEvent(replyTo, _serialize(result));
+      };
+      window.on[_listenerName].add(_listener);
+    }
+  }
+
+  void close() {
+    _portMap.remove(_portId);
+    if (_listener != null) window.on[_listenerName].remove(_listener);
+  }
+
+  SendPortSync toSendPort() {
+    return new _LocalSendPortSync._internal(this);
+  }
+
+  static SendPortSync _lookup(int isolateId, int portId) {
+    if (isolateId == _isolateId) {
+      return _portMap[portId].toSendPort();
+    } else {
+      return new _RemoteSendPortSync(isolateId, portId);
+    }
+  }
+}
+
+get _isolateId => ReceivePortSync._isolateId;
+
+void _dispatchEvent(String receiver, var message) {
+  var event = new CustomEvent(receiver, false, false, JSON.stringify(message));
+  window.$dom_dispatchEvent(event);
+}
+
+String _getPortSyncEventData(CustomEvent event) => event.detail;
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef Object ComputeValue();
+
+class _MeasurementRequest<T> {
+  final ComputeValue computeValue;
+  final Completer<T> completer;
+  Object value;
+  bool exception = false;
+  _MeasurementRequest(this.computeValue, this.completer);
+}
+
+typedef void _MeasurementCallback();
+
+
+/**
+ * This class attempts to invoke a callback as soon as the current event stack
+ * unwinds, but before the browser repaints.
+ */
+abstract class _MeasurementScheduler {
+  bool _nextMeasurementFrameScheduled = false;
+  _MeasurementCallback _callback;
+
+  _MeasurementScheduler(this._callback);
+
+  /**
+   * Creates the best possible measurement scheduler for the current platform.
+   */
+  factory _MeasurementScheduler.best(_MeasurementCallback callback) {
+    if (_isMutationObserverSupported()) {
+      return new _MutationObserverScheduler(callback);
+    }
+    return new _PostMessageScheduler(callback);
+  }
+
+  /**
+   * Schedules a measurement callback if one has not been scheduled already.
+   */
+  void maybeSchedule() {
+    if (this._nextMeasurementFrameScheduled) {
+      return;
+    }
+    this._nextMeasurementFrameScheduled = true;
+    this._schedule();
+  }
+
+  /**
+   * Does the actual scheduling of the callback.
+   */
+  void _schedule();
+
+  /**
+   * Handles the measurement callback and forwards it if necessary.
+   */
+  void _onCallback() {
+    // Ignore spurious messages.
+    if (!_nextMeasurementFrameScheduled) {
+      return;
+    }
+    _nextMeasurementFrameScheduled = false;
+    this._callback();
+  }
+}
+
+/**
+ * Scheduler which uses window.postMessage to schedule events.
+ */
+class _PostMessageScheduler extends _MeasurementScheduler {
+  const _MEASUREMENT_MESSAGE = "DART-MEASURE";
+
+  _PostMessageScheduler(_MeasurementCallback callback): super(callback) {
+      // Messages from other windows do not cause a security risk as
+      // all we care about is that _handleMessage is called
+      // after the current event loop is unwound and calling the function is
+      // a noop when zero requests are pending.
+      window.on.message.add(this._handleMessage);
+  }
+
+  void _schedule() {
+    window.postMessage(_MEASUREMENT_MESSAGE, "*");
+  }
+
+  _handleMessage(e) {
+    this._onCallback();
+  }
+}
+
+/**
+ * Scheduler which uses a MutationObserver to schedule events.
+ */
+class _MutationObserverScheduler extends _MeasurementScheduler {
+  MutationObserver _observer;
+  Element _dummy;
+
+  _MutationObserverScheduler(_MeasurementCallback callback): super(callback) {
+    // Mutation events get fired as soon as the current event stack is unwound
+    // so we just make a dummy event and listen for that.
+    _observer = new MutationObserver(this._handleMutation);
+    _dummy = new DivElement();
+    _observer.observe(_dummy, attributes: true);
+  }
+
+  void _schedule() {
+    // Toggle it to trigger the mutation event.
+    _dummy.hidden = !_dummy.hidden;
+  }
+
+  _handleMutation(List<MutationRecord> mutations, MutationObserver observer) {
+    this._onCallback();
+  }
+}
+
+
+List<_MeasurementRequest> _pendingRequests;
+List<TimeoutHandler> _pendingMeasurementFrameCallbacks;
+_MeasurementScheduler _measurementScheduler = null;
+
+void _maybeScheduleMeasurementFrame() {
+  if (_measurementScheduler == null) {
+    _measurementScheduler =
+      new _MeasurementScheduler.best(_completeMeasurementFutures);
+  }
+  _measurementScheduler.maybeSchedule();
+}
+
+/**
+ * Registers a [callback] which is called after the next batch of measurements
+ * completes. Even if no measurements completed, the callback is triggered
+ * when they would have completed to avoid confusing bugs if it happened that
+ * no measurements were actually requested.
+ */
+void _addMeasurementFrameCallback(TimeoutHandler callback) {
+  if (_pendingMeasurementFrameCallbacks == null) {
+    _pendingMeasurementFrameCallbacks = <TimeoutHandler>[];
+    _maybeScheduleMeasurementFrame();
+  }
+  _pendingMeasurementFrameCallbacks.add(callback);
+}
+
+/**
+ * Returns a [Future] whose value will be the result of evaluating
+ * [computeValue] during the next safe measurement interval.
+ * The next safe measurement interval is after the current event loop has
+ * unwound but before the browser has rendered the page.
+ * It is important that the [computeValue] function only queries the html
+ * layout and html in any way.
+ */
+Future _createMeasurementFuture(ComputeValue computeValue,
+                                Completer completer) {
+  if (_pendingRequests == null) {
+    _pendingRequests = <_MeasurementRequest>[];
+    _maybeScheduleMeasurementFrame();
+  }
+  _pendingRequests.add(new _MeasurementRequest(computeValue, completer));
+  return completer.future;
+}
+
+/**
+ * Complete all pending measurement futures evaluating them in a single batch
+ * so that the the browser is guaranteed to avoid multiple layouts.
+ */
+void _completeMeasurementFutures() {
+  // We must compute all new values before fulfilling the futures as
+  // the onComplete callbacks for the futures could modify the DOM making
+  // subsequent measurement calculations expensive to compute.
+  if (_pendingRequests != null) {
+    for (_MeasurementRequest request in _pendingRequests) {
+      try {
+        request.value = request.computeValue();
+      } catch (e) {
+        request.value = e;
+        request.exception = true;
+      }
+    }
+  }
+
+  final completedRequests = _pendingRequests;
+  final readyMeasurementFrameCallbacks = _pendingMeasurementFrameCallbacks;
+  _pendingRequests = null;
+  _pendingMeasurementFrameCallbacks = null;
+  if (completedRequests != null) {
+    for (_MeasurementRequest request in completedRequests) {
+      if (request.exception) {
+        request.completer.completeException(request.value);
+      } else {
+        request.completer.complete(request.value);
+      }
+    }
+  }
+
+  if (readyMeasurementFrameCallbacks != null) {
+    for (TimeoutHandler handler in readyMeasurementFrameCallbacks) {
+      // TODO(jacobr): wrap each call to a handler in a try-catch block.
+      handler();
+    }
+  }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Patch file for the dart:isolate library.
+
+/********************************************************
+  Inserted from lib/isolate/serialization.dart
+ ********************************************************/
+
+class _MessageTraverserVisitedMap {
+
+  operator[](var object) => null;
+  void operator[]=(var object, var info) { }
+
+  void reset() { }
+  void cleanup() { }
+
+}
+
+/** Abstract visitor for dart objects that can be sent as isolate messages. */
+class _MessageTraverser {
+
+  _MessageTraverserVisitedMap _visited;
+  _MessageTraverser() : _visited = new _MessageTraverserVisitedMap();
+
+  /** Visitor's entry point. */
+  traverse(var x) {
+    if (isPrimitive(x)) return visitPrimitive(x);
+    _visited.reset();
+    var result;
+    try {
+      result = _dispatch(x);
+    } finally {
+      _visited.cleanup();
+    }
+    return result;
+  }
+
+  _dispatch(var x) {
+    if (isPrimitive(x)) return visitPrimitive(x);
+    if (x is List) return visitList(x);
+    if (x is Map) return visitMap(x);
+    if (x is SendPort) return visitSendPort(x);
+    if (x is SendPortSync) return visitSendPortSync(x);
+
+    // Overridable fallback.
+    return visitObject(x);
+  }
+
+  abstract visitPrimitive(x);
+  abstract visitList(List x);
+  abstract visitMap(Map x);
+  abstract visitSendPort(SendPort x);
+  abstract visitSendPortSync(SendPortSync x);
+
+  visitObject(Object x) {
+    // TODO(floitsch): make this a real exception. (which one)?
+    throw "Message serialization: Illegal value $x passed";
+  }
+
+  static bool isPrimitive(x) {
+    return (x == null) || (x is String) || (x is num) || (x is bool);
+  }
+}
+
+
+/** A visitor that recursively copies a message. */
+class _Copier extends _MessageTraverser {
+
+  visitPrimitive(x) => x;
+
+  List visitList(List list) {
+    List copy = _visited[list];
+    if (copy != null) return copy;
+
+    int len = list.length;
+
+    // TODO(floitsch): we loose the generic type of the List.
+    copy = new List(len);
+    _visited[list] = copy;
+    for (int i = 0; i < len; i++) {
+      copy[i] = _dispatch(list[i]);
+    }
+    return copy;
+  }
+
+  Map visitMap(Map map) {
+    Map copy = _visited[map];
+    if (copy != null) return copy;
+
+    // TODO(floitsch): we loose the generic type of the map.
+    copy = new Map();
+    _visited[map] = copy;
+    map.forEach((key, val) {
+      copy[_dispatch(key)] = _dispatch(val);
+    });
+    return copy;
+  }
+
+}
+
+/** Visitor that serializes a message as a JSON array. */
+class _Serializer extends _MessageTraverser {
+  int _nextFreeRefId = 0;
+
+  visitPrimitive(x) => x;
+
+  visitList(List list) {
+    int copyId = _visited[list];
+    if (copyId != null) return ['ref', copyId];
+
+    int id = _nextFreeRefId++;
+    _visited[list] = id;
+    var jsArray = _serializeList(list);
+    // TODO(floitsch): we are losing the generic type.
+    return ['list', id, jsArray];
+  }
+
+  visitMap(Map map) {
+    int copyId = _visited[map];
+    if (copyId != null) return ['ref', copyId];
+
+    int id = _nextFreeRefId++;
+    _visited[map] = id;
+    var keys = _serializeList(map.keys);
+    var values = _serializeList(map.values);
+    // TODO(floitsch): we are losing the generic type.
+    return ['map', id, keys, values];
+  }
+
+  _serializeList(List list) {
+    int len = list.length;
+    var result = new List(len);
+    for (int i = 0; i < len; i++) {
+      result[i] = _dispatch(list[i]);
+    }
+    return result;
+  }
+}
+
+/** Deserializes arrays created with [_Serializer]. */
+class _Deserializer {
+  Map<int, dynamic> _deserialized;
+
+  _Deserializer();
+
+  static bool isPrimitive(x) {
+    return (x == null) || (x is String) || (x is num) || (x is bool);
+  }
+
+  deserialize(x) {
+    if (isPrimitive(x)) return x;
+    // TODO(floitsch): this should be new HashMap<int, dynamic>()
+    _deserialized = new HashMap();
+    return _deserializeHelper(x);
+  }
+
+  _deserializeHelper(x) {
+    if (isPrimitive(x)) return x;
+    assert(x is List);
+    switch (x[0]) {
+      case 'ref': return _deserializeRef(x);
+      case 'list': return _deserializeList(x);
+      case 'map': return _deserializeMap(x);
+      case 'sendport': return deserializeSendPort(x);
+      default: return deserializeObject(x);
+    }
+  }
+
+  _deserializeRef(List x) {
+    int id = x[1];
+    var result = _deserialized[id];
+    assert(result != null);
+    return result;
+  }
+
+  List _deserializeList(List x) {
+    int id = x[1];
+    // We rely on the fact that Dart-lists are directly mapped to Js-arrays.
+    List dartList = x[2];
+    _deserialized[id] = dartList;
+    int len = dartList.length;
+    for (int i = 0; i < len; i++) {
+      dartList[i] = _deserializeHelper(dartList[i]);
+    }
+    return dartList;
+  }
+
+  Map _deserializeMap(List x) {
+    Map result = new Map();
+    int id = x[1];
+    _deserialized[id] = result;
+    List keys = x[2];
+    List values = x[3];
+    int len = keys.length;
+    assert(len == values.length);
+    for (int i = 0; i < len; i++) {
+      var key = _deserializeHelper(keys[i]);
+      var value = _deserializeHelper(values[i]);
+      result[key] = value;
+    }
+    return result;
+  }
+
+  abstract deserializeSendPort(List x);
+
+  deserializeObject(List x) {
+    // TODO(floitsch): Use real exception (which one?).
+    throw "Unexpected serialized object";
+  }
+}
+
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _CustomEventFactoryProvider {
+  static CustomEvent createCustomEvent(String type, [bool canBubble = true,
+      bool cancelable = true, Object detail = null]) {
+    final CustomEvent e = document.$dom_createEvent("CustomEvent");
+    e.$dom_initCustomEvent(type, canBubble, cancelable, detail);
+    return e;
+  }
+}
+
+class _EventFactoryProvider {
+  static Event createEvent(String type, [bool canBubble = true,
+      bool cancelable = true]) {
+    final Event e = document.$dom_createEvent("Event");
+    e.$dom_initEvent(type, canBubble, cancelable);
+    return e;
+  }
+}
+
+class _MouseEventFactoryProvider {
+  static MouseEvent createMouseEvent(String type, Window view, int detail,
+      int screenX, int screenY, int clientX, int clientY, int button,
+      [bool canBubble = true, bool cancelable = true, bool ctrlKey = false,
+      bool altKey = false, bool shiftKey = false, bool metaKey = false,
+      EventTarget relatedTarget = null]) {
+    final e = document.$dom_createEvent("MouseEvent");
+    e.$dom_initMouseEvent(type, canBubble, cancelable, view, detail,
+        screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
+        button, relatedTarget);
+    return e;
+  }
+}
+
+class _CSSStyleDeclarationFactoryProvider {
+  static CSSStyleDeclaration createCSSStyleDeclaration_css(String css) {
+    final style = new Element.tag('div').style;
+    style.cssText = css;
+    return style;
+  }
+
+  static CSSStyleDeclaration createCSSStyleDeclaration() {
+    return new CSSStyleDeclaration.css('');
+  }
+}
+
+class _DocumentFragmentFactoryProvider {
+  /** @domName Document.createDocumentFragment */
+  static DocumentFragment createDocumentFragment() =>
+      document.createDocumentFragment();
+
+  static DocumentFragment createDocumentFragment_html(String html) {
+    final fragment = new DocumentFragment();
+    fragment.innerHTML = html;
+    return fragment;
+  }
+
+  // TODO(nweiz): enable this when XML is ported.
+  // factory DocumentFragment.xml(String xml) {
+  //   final fragment = new DocumentFragment();
+  //   final e = new XMLElement.tag("xml");
+  //   e.innerHTML = xml;
+  //
+  //   // Copy list first since we don't want liveness during iteration.
+  //   final List nodes = new List.from(e.nodes);
+  //   fragment.nodes.addAll(nodes);
+  //   return fragment;
+  // }
+
+  static DocumentFragment createDocumentFragment_svg(String svg) {
+    final fragment = new DocumentFragment();
+    final e = new SVGSVGElement();
+    e.innerHTML = svg;
+
+    // Copy list first since we don't want liveness during iteration.
+    final List nodes = new List.from(e.nodes);
+    fragment.nodes.addAll(nodes);
+    return fragment;
+  }
+}
+
+class _SVGElementFactoryProvider {
+  static SVGElement createSVGElement_tag(String tag) {
+    final Element temp =
+      document.$dom_createElementNS("http://www.w3.org/2000/svg", tag);
+    return temp;
+  }
+
+  static SVGElement createSVGElement_svg(String svg) {
+    Element parentTag;
+    final match = _START_TAG_REGEXP.firstMatch(svg);
+    if (match != null && match.group(1).toLowerCase() == 'svg') {
+      parentTag = new Element.tag('div');
+    } else {
+      parentTag = new SVGSVGElement();
+    }
+
+    parentTag.innerHTML = svg;
+    if (parentTag.elements.length == 1) return parentTag.elements.removeLast();
+
+    throw new ArgumentError(
+        'SVG had ${parentTag.elements.length} '
+        'top-level elements but 1 expected');
+  }
+}
+
+class _SVGSVGElementFactoryProvider {
+  static SVGSVGElement createSVGSVGElement() {
+    final el = new SVGElement.tag("svg");
+    // The SVG spec requires the version attribute to match the spec version
+    el.attributes['version'] = "1.1";
+    return el;
+  }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+// Conversions for IDBKey.
+//
+// Per http://www.w3.org/TR/IndexedDB/#key-construct
+//
+// "A value is said to be a valid key if it is one of the following types: Array
+// JavaScript objects [ECMA-262], DOMString [WEBIDL], Date [ECMA-262] or float
+// [WEBIDL]. However Arrays are only valid keys if every item in the array is
+// defined and is a valid key (i.e. sparse arrays can not be valid keys) and if
+// the Array doesn't directly or indirectly contain itself. Any non-numeric
+// properties are ignored, and thus does not affect whether the Array is a valid
+// key. Additionally, if the value is of type float, it is only a valid key if
+// it is not NaN, and if the value is of type Date it is only a valid key if its
+// [[PrimitiveValue]] internal property, as defined by [ECMA-262], is not NaN."
+
+// What is required is to ensure that an Lists in the key are actually
+// JavaScript arrays, and any Dates are JavaScript Dates.
+
+// Conversions for Window.  These check if the window is the local
+// window, and if it's not, wraps or unwraps it with a secure wrapper.
+// We need to test for EventTarget here as well as it's a base type.
+// We omit an unwrapper for Window as no methods take a non-local
+// window as a parameter.
+
+Window _convertNativeToDart_Window(win) {
+  return _DOMWindowCrossFrame._createSafe(win);
+}
+
+EventTarget _convertNativeToDart_EventTarget(e) {
+  // Assume it's a Window if it contains the setInterval property.  It may be
+  // from a different frame - without a patched prototype - so we cannot
+  // rely on Dart type checking.
+  if (JS('bool', r'"setInterval" in #', e))
+    return _DOMWindowCrossFrame._createSafe(e);
+  else
+    return e;
+}
+
+EventTarget _convertDartToNative_EventTarget(e) {
+  if (e is _DOMWindowCrossFrame) {
+    return e._window;
+  } else {
+    return e;
+  }
+}
+
+// Conversions for ImageData
+//
+// On Firefox, the returned ImageData is a plain object.
+
+class _TypedImageData implements ImageData {
+  final Uint8ClampedArray data;
+  final int height;
+  final int width;
+
+  _TypedImageData(this.data, this.height, this.width);
+}
+
+ImageData _convertNativeToDart_ImageData(nativeImageData) {
+  if (nativeImageData is ImageData) return nativeImageData;
+
+  // On Firefox the above test fails because imagedata is a plain object.
+  // So we create a _TypedImageData.
+
+  return new _TypedImageData(
+      JS('var', '#.data', nativeImageData),
+      JS('var', '#.height', nativeImageData),
+      JS('var', '#.width', nativeImageData));
+}
+
+// We can get rid of this conversion if _TypedImageData implements the fields
+// with native names.
+_convertDartToNative_ImageData(ImageData imageData) {
+  if (imageData is _TypedImageData) {
+    return JS('Object', '{data: #, height: #, width: #}',
+        imageData.data, imageData.height, imageData.width);
+  }
+  return imageData;
+}
+
+
+/// Converts a JavaScript object with properties into a Dart Map.
+/// Not suitable for nested objects.
+Map _convertNativeToDart_Dictionary(object) {
+  if (object == null) return null;
+  var dict = {};
+  for (final key in JS('List', 'Object.getOwnPropertyNames(#)', object)) {
+    dict[key] = JS('var', '#[#]', object, key);
+  }
+  return dict;
+}
+
+/// Converts a flat Dart map into a JavaScript object with properties.
+_convertDartToNative_Dictionary(Map dict) {
+  if (dict == null) return null;
+  var object = JS('var', '{}');
+  dict.forEach((String key, value) {
+      JS('void', '#[#] = #', object, key, value);
+    });
+  return object;
+}
+
+
+/**
+ * Ensures that the input is a JavaScript Array.
+ *
+ * Creates a new JavaScript array if necessary, otherwise returns the original.
+ */
+List _convertDartToNative_StringArray(List<String> input) {
+  // TODO(sra).  Implement this.
+  return input;
+}
+
+
+// -----------------------------------------------------------------------------
+
+/**
+ * Converts a native IDBKey into a Dart object.
+ *
+ * May return the original input.  May mutate the original input (but will be
+ * idempotent if mutation occurs).  It is assumed that this conversion happens
+ * on native IDBKeys on all paths that return IDBKeys from native DOM calls.
+ *
+ * If necessary, JavaScript Dates are converted into Dart Dates.
+ */
+_convertNativeToDart_IDBKey(nativeKey) {
+  containsDate(object) {
+    if (_isJavaScriptDate(object)) return true;
+    if (object is List) {
+      for (int i = 0; i < object.length; i++) {
+        if (containsDate(object[i])) return true;
+      }
+    }
+    return false;  // number, string.
+  }
+  if (containsDate(nativeKey)) {
+    throw new UnimplementedError('IDBKey containing Date');
+  }
+  // TODO: Cache conversion somewhere?
+  return nativeKey;
+}
+
+/**
+ * Converts a Dart object into a valid IDBKey.
+ *
+ * May return the original input.  Does not mutate input.
+ *
+ * If necessary, [dartKey] may be copied to ensure all lists are converted into
+ * JavaScript Arrays and Dart Dates into JavaScript Dates.
+ */
+_convertDartToNative_IDBKey(dartKey) {
+  // TODO: Implement.
+  return dartKey;
+}
+
+
+
+/// May modify original.  If so, action is idempotent.
+_convertNativeToDart_IDBAny(object) {
+  return _convertNativeToDart_AcceptStructuredClone(object, mustCopy: false);
+}
+
+/// Converts a Dart value into a JavaScript SerializedScriptValue.
+_convertDartToNative_SerializedScriptValue(value) {
+  return _convertDartToNative_PrepareForStructuredClone(value);
+}
+
+/// Since the source object may be viewed via a JavaScript event listener the
+/// original may not be modified.
+_convertNativeToDart_SerializedScriptValue(object) {
+  return _convertNativeToDart_AcceptStructuredClone(object, mustCopy: true);
+}
+
+
+/**
+ * Converts a Dart value into a JavaScript SerializedScriptValue.  Returns the
+ * original input or a functional 'copy'.  Does not mutate the original.
+ *
+ * The main transformation is the translation of Dart Maps are converted to
+ * JavaScript Objects.
+ *
+ * The algorithm is essentially a dry-run of the structured clone algorithm
+ * described at
+ * http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#structured-clone
+ * https://www.khronos.org/registry/typedarray/specs/latest/#9
+ *
+ * Since the result of this function is expected to be passed only to JavaScript
+ * operations that perform the structured clone algorithm which does not mutate
+ * its output, the result may share structure with the input [value].
+ */
+_convertDartToNative_PrepareForStructuredClone(value) {
+
+  // TODO(sra): Replace slots with identity hash table.
+  var values = [];
+  var copies = [];  // initially 'null', 'true' during initial DFS, then a copy.
+
+  int findSlot(value) {
+    int length = values.length;
+    for (int i = 0; i < length; i++) {
+      if (identical(values[i], value)) return i;
+    }
+    values.add(value);
+    copies.add(null);
+    return length;
+  }
+  readSlot(int i) => copies[i];
+  writeSlot(int i, x) { copies[i] = x; }
+  cleanupSlots() {}  // Will be needed if we mark objects with a property.
+
+  // Returns the input, or a clone of the input.
+  walk(e) {
+    if (e == null) return e;
+    if (e is bool) return e;
+    if (e is num) return e;
+    if (e is String) return e;
+    if (e is Date) {
+      // TODO(sra).
+      throw new UnimplementedError('structured clone of Date');
+    }
+    if (e is RegExp) {
+      // TODO(sra).
+      throw new UnimplementedError('structured clone of RegExp');
+    }
+
+    // The browser's internal structured cloning algorithm will copy certain
+    // types of object, but it will copy only its own implementations and not
+    // just any Dart implementations of the interface.
+
+    // TODO(sra): The JavaScript objects suitable for direct cloning by the
+    // structured clone algorithm could be tagged with an private interface.
+
+    if (e is File) return e;
+    if (e is Blob) return e;
+    if (e is _FileList) return e;
+
+    // TODO(sra): Firefox: How to convert _TypedImageData on the other end?
+    if (e is ImageData) return e;
+    if (e is ArrayBuffer) return e;
+
+    if (e is ArrayBufferView) return e;
+
+    if (e is Map) {
+      var slot = findSlot(e);
+      var copy = readSlot(slot);
+      if (copy != null) return copy;
+      copy = JS('var', '{}');
+      writeSlot(slot, copy);
+      e.forEach((key, value) {
+          JS('void', '#[#] = #', copy, key, walk(value));
+        });
+      return copy;
+    }
+
+    if (e is List) {
+      // Since a JavaScript Array is an instance of Dart List it is possible to
+      // avoid making a copy of the list if there is no need to copy anything
+      // reachable from the array.  We defer creating a new array until a cycle
+      // is detected or a subgraph was copied.
+      int length = e.length;
+      var slot = findSlot(e);
+      var copy = readSlot(slot);
+      if (copy != null) {
+        if (true == copy) {  // Cycle, so commit to making a copy.
+          copy = JS('List', 'new Array(#)', length);
+          writeSlot(slot, copy);
+        }
+        return copy;
+      }
+
+      int i = 0;
+
+      if (_isJavaScriptArray(e) &&
+          // We have to copy immutable lists, otherwise the structured clone
+          // algorithm will copy the .immutable$list marker property, making the
+          // list immutable when received!
+          !_isImmutableJavaScriptArray(e)) {
+        writeSlot(slot, true);  // Deferred copy.
+        for ( ; i < length; i++) {
+          var element = e[i];
+          var elementCopy = walk(element);
+          if (!identical(elementCopy, element)) {
+            copy = readSlot(slot);   // Cyclic reference may have created it.
+            if (true == copy) {
+              copy = JS('List', 'new Array(#)', length);
+              writeSlot(slot, copy);
+            }
+            for (int j = 0; j < i; j++) {
+              copy[j] = e[j];
+            }
+            copy[i] = elementCopy;
+            i++;
+            break;
+          }
+        }
+        if (copy == null) {
+          copy = e;
+          writeSlot(slot, copy);
+        }
+      } else {
+        // Not a JavaScript Array.  We are forced to make a copy.
+        copy = JS('List', 'new Array(#)', length);
+        writeSlot(slot, copy);
+      }
+
+      for ( ; i < length; i++) {
+        copy[i] = walk(e[i]);
+      }
+      return copy;
+    }
+
+    throw new UnimplementedError('structured clone of other type');
+  }
+
+  var copy = walk(value);
+  cleanupSlots();
+  return copy;
+}
+
+/**
+ * Converts a native value into a Dart object.
+ *
+ * If [mustCopy] is [:false:], may return the original input.  May mutate the
+ * original input (but will be idempotent if mutation occurs).  It is assumed
+ * that this conversion happens on native serializable script values such values
+ * from native DOM calls.
+ *
+ * [object] is the result of a structured clone operation.
+ *
+ * If necessary, JavaScript Dates are converted into Dart Dates.
+ *
+ * If [mustCopy] is [:true:], the entire object is copied and the original input
+ * is not mutated.  This should be the case where Dart and JavaScript code can
+ * access the value, for example, via multiple event listeners for
+ * MessageEvents.  Mutating the object to make it more 'Dart-like' would corrupt
+ * the value as seen from the JavaScript listeners.
+ */
+_convertNativeToDart_AcceptStructuredClone(object, {mustCopy = false}) {
+
+  // TODO(sra): Replace slots with identity hash table that works on non-dart
+  // objects.
+  var values = [];
+  var copies = [];
+
+  int findSlot(value) {
+    int length = values.length;
+    for (int i = 0; i < length; i++) {
+      if (identical(values[i], value)) return i;
+    }
+    values.add(value);
+    copies.add(null);
+    return length;
+  }
+  readSlot(int i) => copies[i];
+  writeSlot(int i, x) { copies[i] = x; }
+
+  walk(e) {
+    if (e == null) return e;
+    if (e is bool) return e;
+    if (e is num) return e;
+    if (e is String) return e;
+
+    if (_isJavaScriptDate(e)) {
+      // TODO(sra).
+      throw new UnimplementedError('structured clone of Date');
+    }
+
+    if (_isJavaScriptRegExp(e)) {
+      // TODO(sra).
+      throw new UnimplementedError('structured clone of RegExp');
+    }
+
+    if (_isJavaScriptSimpleObject(e)) {
+      // TODO(sra): If mustCopy is false, swizzle the prototype for one of a Map
+      // implementation that uses the properies as storage.
+      var slot = findSlot(e);
+      var copy = readSlot(slot);
+      if (copy != null) return copy;
+      copy = {};
+
+      writeSlot(slot, copy);
+      for (final key in JS('List', 'Object.keys(#)', e)) {
+        copy[key] = walk(JS('var', '#[#]', e, key));
+      }
+      return copy;
+    }
+
+    if (_isJavaScriptArray(e)) {
+      var slot = findSlot(e);
+      var copy = readSlot(slot);
+      if (copy != null) return copy;
+
+      int length = e.length;
+      // Since a JavaScript Array is an instance of Dart List, we can modify it
+      // in-place unless we must copy.
+      copy = mustCopy ? JS('List', 'new Array(#)', length) : e;
+      writeSlot(slot, copy);
+
+      for (int i = 0; i < length; i++) {
+        copy[i] = walk(e[i]);
+      }
+      return copy;
+    }
+
+    // Assume anything else is already a valid Dart object, either by having
+    // already been processed, or e.g. a clonable native class.
+    return e;
+  }
+
+  var copy = walk(object);
+  return copy;
+}
+
+
+bool _isJavaScriptDate(value) => JS('bool', '# instanceof Date', value);
+bool _isJavaScriptRegExp(value) => JS('bool', '# instanceof RegExp', value);
+bool _isJavaScriptArray(value) => JS('bool', '# instanceof Array', value);
+bool _isJavaScriptSimpleObject(value) =>
+    JS('bool', 'Object.getPrototypeOf(#) === Object.prototype', value);
+bool _isImmutableJavaScriptArray(value) =>
+    JS('bool', r'!!(#.immutable$list)', value);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(vsm): Unify with Dartium version.
+class _DOMWindowCrossFrame implements Window {
+  // Private window.  Note, this is a window in another frame, so it
+  // cannot be typed as "Window" as its prototype is not patched
+  // properly.  Its fields and methods can only be accessed via JavaScript.
+  var _window;
+
+  // Fields.
+  History get history =>
+    _HistoryCrossFrame._createSafe(JS('History', '#.history', _window));
+  Location get location =>
+    _LocationCrossFrame._createSafe(JS('Location', '#.location', _window));
+
+  // TODO(vsm): Add frames to navigate subframes.  See 2312.
+
+  bool get closed => JS('bool', '#.closed', _window);
+
+  Window get opener => _createSafe(JS('Window', '#.opener', _window));
+
+  Window get parent => _createSafe(JS('Window', '#.parent', _window));
+
+  Window get top => _createSafe(JS('Window', '#.top', _window));
+
+  // Methods.
+  void focus() => JS('void', '#.focus()', _window);
+
+  void blur() => JS('void', '#.blur()', _window);
+
+  void close() => JS('void', '#.close()', _window);
+
+  void postMessage(var message, String targetOrigin, [List messagePorts = null]) {
+    if (messagePorts == null) {
+      JS('void', '#.postMessage(#,#)', _window, message, targetOrigin);
+    } else {
+      JS('void', '#.postMessage(#,#,#)', _window, message, targetOrigin, messagePorts);
+    }
+  }
+
+  // Implementation support.
+  _DOMWindowCrossFrame(this._window);
+
+  static Window _createSafe(w) {
+    if (identical(w, window)) {
+      return w;
+    } else {
+      // TODO(vsm): Cache or implement equality.
+      return new _DOMWindowCrossFrame(w);
+    }
+  }
+}
+
+class _LocationCrossFrame implements Location {
+  // Private location.  Note, this is a location object in another frame, so it
+  // cannot be typed as "Location" as its prototype is not patched
+  // properly.  Its fields and methods can only be accessed via JavaScript.
+  var _location;
+
+  void set href(String val) => _setHref(_location, val);
+  static void _setHref(location, val) {
+    JS('void', '#.href = #', location, val);
+  }
+
+  // Implementation support.
+  _LocationCrossFrame(this._location);
+
+  static Location _createSafe(location) {
+    if (identical(location, window.location)) {
+      return location;
+    } else {
+      // TODO(vsm): Cache or implement equality.
+      return new _LocationCrossFrame(location);
+    }
+  }
+}
+
+class _HistoryCrossFrame implements History {
+  // Private history.  Note, this is a history object in another frame, so it
+  // cannot be typed as "History" as its prototype is not patched
+  // properly.  Its fields and methods can only be accessed via JavaScript.
+  var _history;
+
+  void back() => JS('void', '#.back()', _history);
+
+  void forward() => JS('void', '#.forward()', _history);
+
+  void go(int distance) => JS('void', '#.go(#)', _history, distance);
+
+  // Implementation support.
+  _HistoryCrossFrame(this._history);
+
+  static History _createSafe(h) {
+    if (identical(h, window.history)) {
+      return h;
+    } else {
+      // TODO(vsm): Cache or implement equality.
+      return new _HistoryCrossFrame(h);
+    }
+  }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _AudioContextFactoryProvider {
+
+  static AudioContext createAudioContext() {
+    return JS('AudioContext',
+              'new (window.AudioContext || window.webkitAudioContext)()');
+  }
+}
+
+class _PointFactoryProvider {
+  static Point createPoint(num x, num y) =>
+      JS('Point', 'new WebKitPoint(#, #)', x, y);
+}
+
+class _WebSocketFactoryProvider {
+  static WebSocket createWebSocket(String url) =>
+      JS('WebSocket', 'new WebSocket(#)', url);
+}
+
+class _TextFactoryProvider {
+  static Text createText(String data) =>
+      JS('Text', 'document.createTextNode(#)', data);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _IDBKeyRangeFactoryProvider {
+
+  static IDBKeyRange createIDBKeyRange_only(/*IDBKey*/ value) =>
+      _only(_class(), _translateKey(value));
+
+  static IDBKeyRange createIDBKeyRange_lowerBound(
+      /*IDBKey*/ bound, [bool open = false]) =>
+      _lowerBound(_class(), _translateKey(bound), open);
+
+  static IDBKeyRange createIDBKeyRange_upperBound(
+      /*IDBKey*/ bound, [bool open = false]) =>
+      _upperBound(_class(), _translateKey(bound), open);
+
+  static IDBKeyRange createIDBKeyRange_bound(/*IDBKey*/ lower, /*IDBKey*/ upper,
+      [bool lowerOpen = false, bool upperOpen = false]) =>
+      _bound(_class(), _translateKey(lower), _translateKey(upper),
+             lowerOpen, upperOpen);
+
+  static var _cachedClass;
+
+  static _class() {
+    if (_cachedClass != null) return _cachedClass;
+    return _cachedClass = _uncachedClass();
+  }
+
+  static _uncachedClass() =>
+    JS('var',
+       '''window.webkitIDBKeyRange || window.mozIDBKeyRange ||
+          window.msIDBKeyRange || window.IDBKeyRange''');
+
+  static _translateKey(idbkey) => idbkey;  // TODO: fixme.
+
+  static IDBKeyRange _only(cls, value) =>
+       JS('IDBKeyRange', '#.only(#)', cls, value);
+
+  static IDBKeyRange _lowerBound(cls, bound, open) =>
+       JS('IDBKeyRange', '#.lowerBound(#, #)', cls, bound, open);
+
+  static IDBKeyRange _upperBound(cls, bound, open) =>
+       JS('IDBKeyRange', '#.upperBound(#, #)', cls, bound, open);
+
+  static IDBKeyRange _bound(cls, lower, upper, lowerOpen, upperOpen) =>
+       JS('IDBKeyRange', '#.bound(#, #, #, #)',
+          cls, lower, upper, lowerOpen, upperOpen);
+}
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+// On Firefox 11, the object obtained from 'window.location' is very strange.
+// It can't be monkey-patched and seems immune to putting methods on
+// Object.prototype.  We are forced to wrap the object.
+
+class _LocationWrapper implements LocalLocation {
+
+  final _ptr;  // Opaque reference to real location.
+
+  _LocationWrapper(this._ptr);
+
+  // TODO(sra): Replace all the _set and _get calls with 'JS' forms.
+
+  // final List<String> ancestorOrigins;
+  List<String> get ancestorOrigins => _get(_ptr, 'ancestorOrigins');
+
+  // String hash;
+  String get hash => _get(_ptr, 'hash');
+  void set hash(String value) => _set(_ptr, 'hash', value);
+
+  // String host;
+  String get host => _get(_ptr, 'host');
+  void set host(String value) => _set(_ptr, 'host', value);
+
+  // String hostname;
+  String get hostname => _get(_ptr, 'hostname');
+  void set hostname(String value) => _set(_ptr, 'hostname', value);
+
+  // String href;
+  String get href => _get(_ptr, 'href');
+  void set href(String value) => _set(_ptr, 'href', value);
+
+  // final String origin;
+  String get origin => _get(_ptr, 'origin');
+
+  // String pathname;
+  String get pathname => _get(_ptr, 'pathname');
+  void set pathname(String value) => _set(_ptr, 'pathname', value);
+
+  // String port;
+  String get port => _get(_ptr, 'port');
+  void set port(String value) => _set(_ptr, 'port', value);
+
+  // String protocol;
+  String get protocol => _get(_ptr, 'protocol');
+  void set protocol(String value) => _set(_ptr, 'protocol', value);
+
+  // String search;
+  String get search => _get(_ptr, 'search');
+  void set search(String value) => _set(_ptr, 'search', value);
+
+
+  void assign(String url) => JS('void', '#.assign(#)', _ptr, url);
+
+  void reload() => JS('void', '#.reload()', _ptr);
+
+  void replace(String url) => JS('void', '#.replace(#)', _ptr, url);
+
+  String toString() => JS('String', '#.toString()', _ptr);
+
+
+  static _get(p, m) => JS('var', '#[#]', p, m);
+  static _set(p, m, v) => JS('void', '#[#] = #', p, m, v);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Checks to see if the mutation observer API is supported on the current
+ * platform.
+ */
+bool _isMutationObserverSupported() =>
+  JS('bool', '!!(window.MutationObserver || window.WebKitMutationObserver)');
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _TypedArrayFactoryProvider {
+
+  static Float32Array createFloat32Array(int length) => _F32(length);
+  static Float32Array createFloat32Array_fromList(List<num> list) =>
+      _F32(ensureNative(list));
+  static Float32Array createFloat32Array_fromBuffer(ArrayBuffer buffer,
+                                  [int byteOffset = 0, int length]) {
+    if (length == null) return _F32_2(buffer, byteOffset);
+    return _F32_3(buffer, byteOffset, length);
+  }
+
+  static Float64Array createFloat64Array(int length) => _F64(length);
+  static Float64Array createFloat64Array_fromList(List<num> list) =>
+      _F64(ensureNative(list));
+  static Float64Array createFloat64Array_fromBuffer(ArrayBuffer buffer,
+      [int byteOffset = 0, int length]) {
+    if (length == null) return _F64_2(buffer, byteOffset);
+    return _F64_3(buffer, byteOffset, length);
+  }
+
+  static Int8Array createInt8Array(int length) => _I8(length);
+  static Int8Array createInt8Array_fromList(List<num> list) =>
+      _I8(ensureNative(list));
+  static Int8Array createInt8Array_fromBuffer(ArrayBuffer buffer,
+      [int byteOffset = 0, int length]) {
+    if (length == null) return _I8_2(buffer, byteOffset);
+    return _I8_3(buffer, byteOffset, length);
+  }
+
+  static Int16Array createInt16Array(int length) => _I16(length);
+  static Int16Array createInt16Array_fromList(List<num> list) =>
+      _I16(ensureNative(list));
+  static Int16Array createInt16Array_fromBuffer(ArrayBuffer buffer,
+      [int byteOffset = 0, int length]) {
+    if (length == null) return _I16_2(buffer, byteOffset);
+    return _I16_3(buffer, byteOffset, length);
+  }
+
+  static Int32Array createInt32Array(int length) => _I32(length);
+  static Int32Array createInt32Array_fromList(List<num> list) =>
+      _I32(ensureNative(list));
+  static Int32Array createInt32Array_fromBuffer(ArrayBuffer buffer,
+      [int byteOffset = 0, int length]) {
+    if (length == null) return _I32_2(buffer, byteOffset);
+    return _I32_3(buffer, byteOffset, length);
+  }
+
+  static Uint8Array createUint8Array(int length) => _U8(length);
+  static Uint8Array createUint8Array_fromList(List<num> list) =>
+      _U8(ensureNative(list));
+  static Uint8Array createUint8Array_fromBuffer(ArrayBuffer buffer,
+      [int byteOffset = 0, int length]) {
+    if (length == null) return _U8_2(buffer, byteOffset);
+    return _U8_3(buffer, byteOffset, length);
+  }
+
+  static Uint16Array createUint16Array(int length) => _U16(length);
+  static Uint16Array createUint16Array_fromList(List<num> list) =>
+      _U16(ensureNative(list));
+  static Uint16Array createUint16Array_fromBuffer(ArrayBuffer buffer,
+      [int byteOffset = 0, int length]) {
+    if (length == null) return _U16_2(buffer, byteOffset);
+    return _U16_3(buffer, byteOffset, length);
+  }
+
+  static Uint32Array createUint32Array(int length) => _U32(length);
+  static Uint32Array createUint32Array_fromList(List<num> list) =>
+      _U32(ensureNative(list));
+  static Uint32Array createUint32Array_fromBuffer(ArrayBuffer buffer,
+      [int byteOffset = 0, int length]) {
+    if (length == null) return _U32_2(buffer, byteOffset);
+    return _U32_3(buffer, byteOffset, length);
+  }
+
+  static Uint8ClampedArray createUint8ClampedArray(int length) => _U8C(length);
+  static Uint8ClampedArray createUint8ClampedArray_fromList(List<num> list) =>
+      _U8C(ensureNative(list));
+  static Uint8ClampedArray createUint8ClampedArray_fromBuffer(
+        ArrayBuffer buffer, [int byteOffset = 0, int length]) {
+    if (length == null) return _U8C_2(buffer, byteOffset);
+    return _U8C_3(buffer, byteOffset, length);
+  }
+
+  static Float32Array _F32(arg) =>
+      JS('Float32Array', 'new Float32Array(#)', arg);
+  static Float64Array _F64(arg) =>
+      JS('Float64Array', 'new Float64Array(#)', arg);
+  static Int8Array _I8(arg) =>
+      JS('Int8Array', 'new Int8Array(#)', arg);
+  static Int16Array _I16(arg) =>
+      JS('Int16Array', 'new Int16Array(#)', arg);
+  static Int32Array _I32(arg) =>
+      JS('Int32Array', 'new Int32Array(#)', arg);
+  static Uint8Array _U8(arg) =>
+      JS('Uint8Array', 'new Uint8Array(#)', arg);
+  static Uint16Array _U16(arg) =>
+      JS('Uint16Array', 'new Uint16Array(#)', arg);
+  static Uint32Array _U32(arg) =>
+      JS('Uint32Array', 'new Uint32Array(#)', arg);
+  static Uint8ClampedArray _U8C(arg) =>
+      JS('Uint8ClampedArray', 'new Uint8ClampedArray(#)', arg);
+
+  static Float32Array _F32_2(arg1, arg2) =>
+      JS('Float32Array', 'new Float32Array(#, #)', arg1, arg2);
+  static Float64Array _F64_2(arg1, arg2) =>
+      JS('Float64Array', 'new Float64Array(#, #)', arg1, arg2);
+  static Int8Array _I8_2(arg1, arg2) =>
+      JS('Int8Array', 'new Int8Array(#, #)', arg1, arg2);
+  static Int16Array _I16_2(arg1, arg2) =>
+      JS('Int16Array', 'new Int16Array(#, #)', arg1, arg2);
+  static Int32Array _I32_2(arg1, arg2) =>
+      JS('Int32Array', 'new Int32Array(#, #)', arg1, arg2);
+  static Uint8Array _U8_2(arg1, arg2) =>
+      JS('Uint8Array', 'new Uint8Array(#, #)', arg1, arg2);
+  static Uint16Array _U16_2(arg1, arg2) =>
+      JS('Uint16Array', 'new Uint16Array(#, #)', arg1, arg2);
+  static Uint32Array _U32_2(arg1, arg2) =>
+      JS('Uint32Array', 'new Uint32Array(#, #)', arg1, arg2);
+  static Uint8ClampedArray _U8C_2(arg1, arg2) =>
+      JS('Uint8ClampedArray', 'new Uint8ClampedArray(#, #)', arg1, arg2);
+
+  static Float32Array _F32_3(arg1, arg2, arg3) =>
+      JS('Float32Array', 'new Float32Array(#, #, #)', arg1, arg2, arg3);
+  static Float64Array _F64_3(arg1, arg2, arg3) =>
+      JS('Float64Array', 'new Float64Array(#, #, #)', arg1, arg2, arg3);
+  static Int8Array _I8_3(arg1, arg2, arg3) =>
+      JS('Int8Array', 'new Int8Array(#, #, #)', arg1, arg2, arg3);
+  static Int16Array _I16_3(arg1, arg2, arg3) =>
+      JS('Int16Array', 'new Int16Array(#, #, #)', arg1, arg2, arg3);
+  static Int32Array _I32_3(arg1, arg2, arg3) =>
+      JS('Int32Array', 'new Int32Array(#, #, #)', arg1, arg2, arg3);
+  static Uint8Array _U8_3(arg1, arg2, arg3) =>
+      JS('Uint8Array', 'new Uint8Array(#, #, #)', arg1, arg2, arg3);
+  static Uint16Array _U16_3(arg1, arg2, arg3) =>
+      JS('Uint16Array', 'new Uint16Array(#, #, #)', arg1, arg2, arg3);
+  static Uint32Array _U32_3(arg1, arg2, arg3) =>
+      JS('Uint32Array', 'new Uint32Array(#, #, #)', arg1, arg2, arg3);
+  static Uint8ClampedArray _U8C_3(arg1, arg2, arg3) =>
+      JS('Uint8ClampedArray', 'new Uint8ClampedArray(#, #, #)', arg1, arg2, arg3);
+
+
+  // Ensures that [list] is a JavaScript Array or a typed array.  If necessary,
+  // copies the list.
+  static ensureNative(List list) => list;  // TODO: make sure.
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(rnystrom): add a way to supress public classes from DartDoc output.
+// TODO(jacobr): we can remove this class now that we are using the $dom_
+// convention for deprecated methods rather than truly private methods.
+/**
+ * This class is intended for testing purposes only.
+ */
+class Testing {
+  static void addEventListener(EventTarget target, String type, EventListener listener, bool useCapture) {
+    target.$dom_addEventListener(type, listener, useCapture);
+  }
+  static void removeEventListener(EventTarget target, String type, EventListener listener, bool useCapture) {
+    target.$dom_removeEventListener(type, listener, useCapture);
+  }
+
+}// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Utils for device detection.
+ */
+class _Device {
+  /**
+   * Gets the browser's user agent. Using this function allows tests to inject
+   * the user agent.
+   * Returns the user agent.
+   */
+  static String get userAgent => window.navigator.userAgent;
+
+  /**
+   * Determines if the current device is running Opera.
+   */
+  static bool get isOpera => userAgent.contains("Opera", 0);
+
+  /**
+   * Determines if the current device is running Internet Explorer.
+   */
+  static bool get isIE => !isOpera && userAgent.contains("MSIE", 0);
+
+  /**
+   * Determines if the current device is running Firefox.
+   */
+  static bool get isFirefox => userAgent.contains("Firefox", 0);
+
+  /**
+   * Determines if the current device is running WebKit.
+   */
+  static bool get isWebKit => !isOpera && userAgent.contains("WebKit", 0);
+}
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Iterator for arrays with fixed size.
+class _FixedSizeListIterator<T> extends _VariableSizeListIterator<T> {
+  _FixedSizeListIterator(List<T> array)
+      : super(array),
+        _length = array.length;
+
+  bool get hasNext => _length > _pos;
+
+  final int _length;  // Cache array length for faster access.
+}
+
+// Iterator for arrays with variable size.
+class _VariableSizeListIterator<T> implements Iterator<T> {
+  _VariableSizeListIterator(List<T> array)
+      : _array = array,
+        _pos = 0;
+
+  bool get hasNext => _array.length > _pos;
+
+  T next() {
+    if (!hasNext) {
+      throw new StateError("No more elements");
+    }
+    return _array[_pos++];
+  }
+
+  final List<T> _array;
+  int _pos;
+}
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _Lists {
+
+  /**
+   * Returns the index in the array [a] of the given [element], starting
+   * the search at index [startIndex] to [endIndex] (exclusive).
+   * Returns -1 if [element] is not found.
+   */
+  static int indexOf(List a,
+                     Object element,
+                     int startIndex,
+                     int endIndex) {
+    if (startIndex >= a.length) {
+      return -1;
+    }
+    if (startIndex < 0) {
+      startIndex = 0;
+    }
+    for (int i = startIndex; i < endIndex; i++) {
+      if (a[i] == element) {
+        return i;
+      }
+    }
+    return -1;
+  }
+
+  /**
+   * Returns the last index in the array [a] of the given [element], starting
+   * the search at index [startIndex] to 0.
+   * Returns -1 if [element] is not found.
+   */
+  static int lastIndexOf(List a, Object element, int startIndex) {
+    if (startIndex < 0) {
+      return -1;
+    }
+    if (startIndex >= a.length) {
+      startIndex = a.length - 1;
+    }
+    for (int i = startIndex; i >= 0; i--) {
+      if (a[i] == element) {
+        return i;
+      }
+    }
+    return -1;
+  }
+
+  /**
+   * Returns a sub list copy of this list, from [start] to
+   * [:start + length:].
+   * Returns an empty list if [length] is 0.
+   * Throws an [ArgumentError] if [length] is negative.
+   * Throws a [RangeError] if [start] or [:start + length:] are out of range.
+   */
+  static List getRange(List a, int start, int length, List accumulator) {
+    if (length < 0) throw new ArgumentError('length');
+    if (start < 0) throw new RangeError.value(start);
+    int end = start + length;
+    if (end > a.length) throw new RangeError.value(end);
+    for (int i = start; i < end; i++) {
+      accumulator.add(a[i]);
+    }
+    return accumulator;
+  }
+}
diff --git a/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
similarity index 72%
rename from lib/html/dartium/html_dartium.dart
rename to sdk/lib/html/dartium/html_dartium.dart
index 88f1eef..1cfc879 100644
--- a/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -16,6 +16,7 @@
 
 
 
+// FIXME (blois): Rename to _window (ditto __document).
 LocalWindow __window;
 
 LocalWindow get window {
@@ -26,22 +27,19 @@
   return __window;
 }
 
-LocalWindow get _window native "Utils_window";
-
 Document __document;
 
 Document get document {
   if (__document != null) {
     return __document;
   }
-  __document = _document;
+  __document = window.document;
   return __document;
 }
 
-Document get _document => _window.document;
 
-Element query(String selector) => _document.query(selector);
-List<Element> queryAll(String selector) => _document.queryAll(selector);
+Element query(String selector) => document.query(selector);
+List<Element> queryAll(String selector) => document.queryAll(selector);
 
 int _getNewIsolateId() => _Utils._getNewIsolateId();
 
@@ -68,48 +66,31 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName AbstractWorker
-abstract class AbstractWorker implements EventTarget {
+class AbstractWorker extends EventTarget {
+  AbstractWorker.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  AbstractWorkerEvents get on;
+  AbstractWorkerEvents get on =>
+    new AbstractWorkerEvents(this);
+
 
   /** @domName AbstractWorker.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName AbstractWorker.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName AbstractWorker.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class AbstractWorkerEvents implements Events {
-
-  EventListenerList get error;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AbstractWorkerImpl extends _EventTargetImpl implements AbstractWorker {
-
-  _AbstractWorkerEventsImpl get on =>
-    new _AbstractWorkerEventsImpl(this);
-
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "AbstractWorker_addEventListener_Callback";
 
+
+  /** @domName AbstractWorker.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "AbstractWorker_dispatchEvent_Callback";
 
+
+  /** @domName AbstractWorker.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "AbstractWorker_removeEventListener_Callback";
 
 }
 
-class _AbstractWorkerEventsImpl extends _EventsImpl implements AbstractWorkerEvents {
-  _AbstractWorkerEventsImpl(_ptr) : super(_ptr);
+class AbstractWorkerEvents extends Events {
+  AbstractWorkerEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get error => this['error'];
 }
@@ -120,62 +101,55 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName AnalyserNode
-abstract class AnalyserNode implements AudioNode {
+class AnalyserNode extends AudioNode {
+  AnalyserNode.internal(): super.internal();
+
 
   /** @domName AnalyserNode.fftSize */
-  int fftSize;
-
-  /** @domName AnalyserNode.frequencyBinCount */
-  int get frequencyBinCount;
-
-  /** @domName AnalyserNode.maxDecibels */
-  num maxDecibels;
-
-  /** @domName AnalyserNode.minDecibels */
-  num minDecibels;
-
-  /** @domName AnalyserNode.smoothingTimeConstant */
-  num smoothingTimeConstant;
-
-  /** @domName AnalyserNode.getByteFrequencyData */
-  void getByteFrequencyData(Uint8Array array);
-
-  /** @domName AnalyserNode.getByteTimeDomainData */
-  void getByteTimeDomainData(Uint8Array array);
-
-  /** @domName AnalyserNode.getFloatFrequencyData */
-  void getFloatFrequencyData(Float32Array array);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AnalyserNodeImpl extends _AudioNodeImpl implements AnalyserNode {
-
   int get fftSize native "AnalyserNode_fftSize_Getter";
 
+
+  /** @domName AnalyserNode.fftSize */
   void set fftSize(int value) native "AnalyserNode_fftSize_Setter";
 
+
+  /** @domName AnalyserNode.frequencyBinCount */
   int get frequencyBinCount native "AnalyserNode_frequencyBinCount_Getter";
 
+
+  /** @domName AnalyserNode.maxDecibels */
   num get maxDecibels native "AnalyserNode_maxDecibels_Getter";
 
+
+  /** @domName AnalyserNode.maxDecibels */
   void set maxDecibels(num value) native "AnalyserNode_maxDecibels_Setter";
 
+
+  /** @domName AnalyserNode.minDecibels */
   num get minDecibels native "AnalyserNode_minDecibels_Getter";
 
+
+  /** @domName AnalyserNode.minDecibels */
   void set minDecibels(num value) native "AnalyserNode_minDecibels_Setter";
 
+
+  /** @domName AnalyserNode.smoothingTimeConstant */
   num get smoothingTimeConstant native "AnalyserNode_smoothingTimeConstant_Getter";
 
+
+  /** @domName AnalyserNode.smoothingTimeConstant */
   void set smoothingTimeConstant(num value) native "AnalyserNode_smoothingTimeConstant_Setter";
 
+
+  /** @domName AnalyserNode.getByteFrequencyData */
   void getByteFrequencyData(Uint8Array array) native "AnalyserNode_getByteFrequencyData_Callback";
 
+
+  /** @domName AnalyserNode.getByteTimeDomainData */
   void getByteTimeDomainData(Uint8Array array) native "AnalyserNode_getByteTimeDomainData_Callback";
 
+
+  /** @domName AnalyserNode.getFloatFrequencyData */
   void getFloatFrequencyData(Float32Array array) native "AnalyserNode_getFloatFrequencyData_Callback";
 
 }
@@ -186,7 +160,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLAnchorElement
-abstract class AnchorElement implements Element {
+class AnchorElement extends _Element_Merged {
 
   factory AnchorElement({String href}) {
     if (!?href) {
@@ -194,156 +168,166 @@
     }
     return _Elements.createAnchorElement(href);
   }
+  AnchorElement.internal(): super.internal();
+
 
   /** @domName HTMLAnchorElement.charset */
-  String charset;
-
-  /** @domName HTMLAnchorElement.coords */
-  String coords;
-
-  /** @domName HTMLAnchorElement.download */
-  String download;
-
-  /** @domName HTMLAnchorElement.hash */
-  String hash;
-
-  /** @domName HTMLAnchorElement.host */
-  String host;
-
-  /** @domName HTMLAnchorElement.hostname */
-  String hostname;
-
-  /** @domName HTMLAnchorElement.href */
-  String href;
-
-  /** @domName HTMLAnchorElement.hreflang */
-  String hreflang;
-
-  /** @domName HTMLAnchorElement.name */
-  String name;
-
-  /** @domName HTMLAnchorElement.origin */
-  String get origin;
-
-  /** @domName HTMLAnchorElement.pathname */
-  String pathname;
-
-  /** @domName HTMLAnchorElement.ping */
-  String ping;
-
-  /** @domName HTMLAnchorElement.port */
-  String port;
-
-  /** @domName HTMLAnchorElement.protocol */
-  String protocol;
-
-  /** @domName HTMLAnchorElement.rel */
-  String rel;
-
-  /** @domName HTMLAnchorElement.rev */
-  String rev;
-
-  /** @domName HTMLAnchorElement.search */
-  String search;
-
-  /** @domName HTMLAnchorElement.shape */
-  String shape;
-
-  /** @domName HTMLAnchorElement.target */
-  String target;
-
-  /** @domName HTMLAnchorElement.type */
-  String type;
-
-  /** @domName HTMLAnchorElement.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AnchorElementImpl extends _ElementImpl_Merged implements AnchorElement {
-
   String get charset native "HTMLAnchorElement_charset_Getter";
 
+
+  /** @domName HTMLAnchorElement.charset */
   void set charset(String value) native "HTMLAnchorElement_charset_Setter";
 
+
+  /** @domName HTMLAnchorElement.coords */
   String get coords native "HTMLAnchorElement_coords_Getter";
 
+
+  /** @domName HTMLAnchorElement.coords */
   void set coords(String value) native "HTMLAnchorElement_coords_Setter";
 
+
+  /** @domName HTMLAnchorElement.download */
   String get download native "HTMLAnchorElement_download_Getter";
 
+
+  /** @domName HTMLAnchorElement.download */
   void set download(String value) native "HTMLAnchorElement_download_Setter";
 
+
+  /** @domName HTMLAnchorElement.hash */
   String get hash native "HTMLAnchorElement_hash_Getter";
 
+
+  /** @domName HTMLAnchorElement.hash */
   void set hash(String value) native "HTMLAnchorElement_hash_Setter";
 
+
+  /** @domName HTMLAnchorElement.host */
   String get host native "HTMLAnchorElement_host_Getter";
 
+
+  /** @domName HTMLAnchorElement.host */
   void set host(String value) native "HTMLAnchorElement_host_Setter";
 
+
+  /** @domName HTMLAnchorElement.hostname */
   String get hostname native "HTMLAnchorElement_hostname_Getter";
 
+
+  /** @domName HTMLAnchorElement.hostname */
   void set hostname(String value) native "HTMLAnchorElement_hostname_Setter";
 
+
+  /** @domName HTMLAnchorElement.href */
   String get href native "HTMLAnchorElement_href_Getter";
 
+
+  /** @domName HTMLAnchorElement.href */
   void set href(String value) native "HTMLAnchorElement_href_Setter";
 
+
+  /** @domName HTMLAnchorElement.hreflang */
   String get hreflang native "HTMLAnchorElement_hreflang_Getter";
 
+
+  /** @domName HTMLAnchorElement.hreflang */
   void set hreflang(String value) native "HTMLAnchorElement_hreflang_Setter";
 
+
+  /** @domName HTMLAnchorElement.name */
   String get name native "HTMLAnchorElement_name_Getter";
 
+
+  /** @domName HTMLAnchorElement.name */
   void set name(String value) native "HTMLAnchorElement_name_Setter";
 
+
+  /** @domName HTMLAnchorElement.origin */
   String get origin native "HTMLAnchorElement_origin_Getter";
 
+
+  /** @domName HTMLAnchorElement.pathname */
   String get pathname native "HTMLAnchorElement_pathname_Getter";
 
+
+  /** @domName HTMLAnchorElement.pathname */
   void set pathname(String value) native "HTMLAnchorElement_pathname_Setter";
 
+
+  /** @domName HTMLAnchorElement.ping */
   String get ping native "HTMLAnchorElement_ping_Getter";
 
+
+  /** @domName HTMLAnchorElement.ping */
   void set ping(String value) native "HTMLAnchorElement_ping_Setter";
 
+
+  /** @domName HTMLAnchorElement.port */
   String get port native "HTMLAnchorElement_port_Getter";
 
+
+  /** @domName HTMLAnchorElement.port */
   void set port(String value) native "HTMLAnchorElement_port_Setter";
 
+
+  /** @domName HTMLAnchorElement.protocol */
   String get protocol native "HTMLAnchorElement_protocol_Getter";
 
+
+  /** @domName HTMLAnchorElement.protocol */
   void set protocol(String value) native "HTMLAnchorElement_protocol_Setter";
 
+
+  /** @domName HTMLAnchorElement.rel */
   String get rel native "HTMLAnchorElement_rel_Getter";
 
+
+  /** @domName HTMLAnchorElement.rel */
   void set rel(String value) native "HTMLAnchorElement_rel_Setter";
 
+
+  /** @domName HTMLAnchorElement.rev */
   String get rev native "HTMLAnchorElement_rev_Getter";
 
+
+  /** @domName HTMLAnchorElement.rev */
   void set rev(String value) native "HTMLAnchorElement_rev_Setter";
 
+
+  /** @domName HTMLAnchorElement.search */
   String get search native "HTMLAnchorElement_search_Getter";
 
+
+  /** @domName HTMLAnchorElement.search */
   void set search(String value) native "HTMLAnchorElement_search_Setter";
 
+
+  /** @domName HTMLAnchorElement.shape */
   String get shape native "HTMLAnchorElement_shape_Getter";
 
+
+  /** @domName HTMLAnchorElement.shape */
   void set shape(String value) native "HTMLAnchorElement_shape_Setter";
 
+
+  /** @domName HTMLAnchorElement.target */
   String get target native "HTMLAnchorElement_target_Getter";
 
+
+  /** @domName HTMLAnchorElement.target */
   void set target(String value) native "HTMLAnchorElement_target_Setter";
 
+
+  /** @domName HTMLAnchorElement.type */
   String get type native "HTMLAnchorElement_type_Getter";
 
+
+  /** @domName HTMLAnchorElement.type */
   void set type(String value) native "HTMLAnchorElement_type_Setter";
 
+
+  /** @domName HTMLAnchorElement.toString */
   String toString() native "HTMLAnchorElement_toString_Callback";
 
 }
@@ -354,7 +338,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebKitAnimation
-abstract class Animation {
+class Animation extends NativeFieldWrapperClass1 {
+  Animation.internal();
 
   static const int DIRECTION_ALTERNATE = 1;
 
@@ -368,97 +353,52 @@
 
   static const int FILL_NONE = 0;
 
+
   /** @domName WebKitAnimation.delay */
-  num get delay;
-
-  /** @domName WebKitAnimation.direction */
-  int get direction;
-
-  /** @domName WebKitAnimation.duration */
-  num get duration;
-
-  /** @domName WebKitAnimation.elapsedTime */
-  num elapsedTime;
-
-  /** @domName WebKitAnimation.ended */
-  bool get ended;
-
-  /** @domName WebKitAnimation.fillMode */
-  int get fillMode;
-
-  /** @domName WebKitAnimation.iterationCount */
-  int get iterationCount;
-
-  /** @domName WebKitAnimation.name */
-  String get name;
-
-  /** @domName WebKitAnimation.paused */
-  bool get paused;
-
-  /** @domName WebKitAnimation.pause */
-  void pause();
-
-  /** @domName WebKitAnimation.play */
-  void play();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebKitAnimationEvent
-abstract class AnimationEvent implements Event {
-
-  /** @domName WebKitAnimationEvent.animationName */
-  String get animationName;
-
-  /** @domName WebKitAnimationEvent.elapsedTime */
-  num get elapsedTime;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AnimationEventImpl extends _EventImpl implements AnimationEvent {
-
-  String get animationName native "WebKitAnimationEvent_animationName_Getter";
-
-  num get elapsedTime native "WebKitAnimationEvent_elapsedTime_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AnimationImpl extends NativeFieldWrapperClass1 implements Animation {
-
   num get delay native "WebKitAnimation_delay_Getter";
 
+
+  /** @domName WebKitAnimation.direction */
   int get direction native "WebKitAnimation_direction_Getter";
 
+
+  /** @domName WebKitAnimation.duration */
   num get duration native "WebKitAnimation_duration_Getter";
 
+
+  /** @domName WebKitAnimation.elapsedTime */
   num get elapsedTime native "WebKitAnimation_elapsedTime_Getter";
 
+
+  /** @domName WebKitAnimation.elapsedTime */
   void set elapsedTime(num value) native "WebKitAnimation_elapsedTime_Setter";
 
+
+  /** @domName WebKitAnimation.ended */
   bool get ended native "WebKitAnimation_ended_Getter";
 
+
+  /** @domName WebKitAnimation.fillMode */
   int get fillMode native "WebKitAnimation_fillMode_Getter";
 
+
+  /** @domName WebKitAnimation.iterationCount */
   int get iterationCount native "WebKitAnimation_iterationCount_Getter";
 
+
+  /** @domName WebKitAnimation.name */
   String get name native "WebKitAnimation_name_Getter";
 
+
+  /** @domName WebKitAnimation.paused */
   bool get paused native "WebKitAnimation_paused_Getter";
 
+
+  /** @domName WebKitAnimation.pause */
   void pause() native "WebKitAnimation_pause_Callback";
 
+
+  /** @domName WebKitAnimation.play */
   void play() native "WebKitAnimation_play_Callback";
 
 }
@@ -468,41 +408,18 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName HTMLAppletElement
-abstract class AppletElement implements Element {
+/// @domName WebKitAnimationEvent
+class AnimationEvent extends Event {
+  AnimationEvent.internal(): super.internal();
 
-  /** @domName HTMLAppletElement.align */
-  String align;
 
-  /** @domName HTMLAppletElement.alt */
-  String alt;
+  /** @domName WebKitAnimationEvent.animationName */
+  String get animationName native "WebKitAnimationEvent_animationName_Getter";
 
-  /** @domName HTMLAppletElement.archive */
-  String archive;
 
-  /** @domName HTMLAppletElement.code */
-  String code;
+  /** @domName WebKitAnimationEvent.elapsedTime */
+  num get elapsedTime native "WebKitAnimationEvent_elapsedTime_Getter";
 
-  /** @domName HTMLAppletElement.codeBase */
-  String codeBase;
-
-  /** @domName HTMLAppletElement.height */
-  String height;
-
-  /** @domName HTMLAppletElement.hspace */
-  String hspace;
-
-  /** @domName HTMLAppletElement.name */
-  String name;
-
-  /** @domName HTMLAppletElement.object */
-  String object;
-
-  /** @domName HTMLAppletElement.vspace */
-  String vspace;
-
-  /** @domName HTMLAppletElement.width */
-  String width;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -510,50 +427,96 @@
 
 // WARNING: Do not edit - generated code.
 
-class _AppletElementImpl extends _ElementImpl_Merged implements AppletElement {
+/// @domName HTMLAppletElement
+class AppletElement extends _Element_Merged {
+  AppletElement.internal(): super.internal();
 
+
+  /** @domName HTMLAppletElement.align */
   String get align native "HTMLAppletElement_align_Getter";
 
+
+  /** @domName HTMLAppletElement.align */
   void set align(String value) native "HTMLAppletElement_align_Setter";
 
+
+  /** @domName HTMLAppletElement.alt */
   String get alt native "HTMLAppletElement_alt_Getter";
 
+
+  /** @domName HTMLAppletElement.alt */
   void set alt(String value) native "HTMLAppletElement_alt_Setter";
 
+
+  /** @domName HTMLAppletElement.archive */
   String get archive native "HTMLAppletElement_archive_Getter";
 
+
+  /** @domName HTMLAppletElement.archive */
   void set archive(String value) native "HTMLAppletElement_archive_Setter";
 
+
+  /** @domName HTMLAppletElement.code */
   String get code native "HTMLAppletElement_code_Getter";
 
+
+  /** @domName HTMLAppletElement.code */
   void set code(String value) native "HTMLAppletElement_code_Setter";
 
+
+  /** @domName HTMLAppletElement.codeBase */
   String get codeBase native "HTMLAppletElement_codeBase_Getter";
 
+
+  /** @domName HTMLAppletElement.codeBase */
   void set codeBase(String value) native "HTMLAppletElement_codeBase_Setter";
 
+
+  /** @domName HTMLAppletElement.height */
   String get height native "HTMLAppletElement_height_Getter";
 
+
+  /** @domName HTMLAppletElement.height */
   void set height(String value) native "HTMLAppletElement_height_Setter";
 
+
+  /** @domName HTMLAppletElement.hspace */
   String get hspace native "HTMLAppletElement_hspace_Getter";
 
+
+  /** @domName HTMLAppletElement.hspace */
   void set hspace(String value) native "HTMLAppletElement_hspace_Setter";
 
+
+  /** @domName HTMLAppletElement.name */
   String get name native "HTMLAppletElement_name_Getter";
 
+
+  /** @domName HTMLAppletElement.name */
   void set name(String value) native "HTMLAppletElement_name_Setter";
 
+
+  /** @domName HTMLAppletElement.object */
   String get object native "HTMLAppletElement_object_Getter";
 
+
+  /** @domName HTMLAppletElement.object */
   void set object(String value) native "HTMLAppletElement_object_Setter";
 
+
+  /** @domName HTMLAppletElement.vspace */
   String get vspace native "HTMLAppletElement_vspace_Getter";
 
+
+  /** @domName HTMLAppletElement.vspace */
   void set vspace(String value) native "HTMLAppletElement_vspace_Setter";
 
+
+  /** @domName HTMLAppletElement.width */
   String get width native "HTMLAppletElement_width_Getter";
 
+
+  /** @domName HTMLAppletElement.width */
   void set width(String value) native "HTMLAppletElement_width_Setter";
 
 }
@@ -564,100 +527,93 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLAreaElement
-abstract class AreaElement implements Element {
+class AreaElement extends _Element_Merged {
 
   factory AreaElement() => _Elements.createAreaElement();
+  AreaElement.internal(): super.internal();
+
 
   /** @domName HTMLAreaElement.alt */
-  String alt;
-
-  /** @domName HTMLAreaElement.coords */
-  String coords;
-
-  /** @domName HTMLAreaElement.hash */
-  String get hash;
-
-  /** @domName HTMLAreaElement.host */
-  String get host;
-
-  /** @domName HTMLAreaElement.hostname */
-  String get hostname;
-
-  /** @domName HTMLAreaElement.href */
-  String href;
-
-  /** @domName HTMLAreaElement.noHref */
-  bool noHref;
-
-  /** @domName HTMLAreaElement.pathname */
-  String get pathname;
-
-  /** @domName HTMLAreaElement.ping */
-  String ping;
-
-  /** @domName HTMLAreaElement.port */
-  String get port;
-
-  /** @domName HTMLAreaElement.protocol */
-  String get protocol;
-
-  /** @domName HTMLAreaElement.search */
-  String get search;
-
-  /** @domName HTMLAreaElement.shape */
-  String shape;
-
-  /** @domName HTMLAreaElement.target */
-  String target;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AreaElementImpl extends _ElementImpl_Merged implements AreaElement {
-
   String get alt native "HTMLAreaElement_alt_Getter";
 
+
+  /** @domName HTMLAreaElement.alt */
   void set alt(String value) native "HTMLAreaElement_alt_Setter";
 
+
+  /** @domName HTMLAreaElement.coords */
   String get coords native "HTMLAreaElement_coords_Getter";
 
+
+  /** @domName HTMLAreaElement.coords */
   void set coords(String value) native "HTMLAreaElement_coords_Setter";
 
+
+  /** @domName HTMLAreaElement.hash */
   String get hash native "HTMLAreaElement_hash_Getter";
 
+
+  /** @domName HTMLAreaElement.host */
   String get host native "HTMLAreaElement_host_Getter";
 
+
+  /** @domName HTMLAreaElement.hostname */
   String get hostname native "HTMLAreaElement_hostname_Getter";
 
+
+  /** @domName HTMLAreaElement.href */
   String get href native "HTMLAreaElement_href_Getter";
 
+
+  /** @domName HTMLAreaElement.href */
   void set href(String value) native "HTMLAreaElement_href_Setter";
 
+
+  /** @domName HTMLAreaElement.noHref */
   bool get noHref native "HTMLAreaElement_noHref_Getter";
 
+
+  /** @domName HTMLAreaElement.noHref */
   void set noHref(bool value) native "HTMLAreaElement_noHref_Setter";
 
+
+  /** @domName HTMLAreaElement.pathname */
   String get pathname native "HTMLAreaElement_pathname_Getter";
 
+
+  /** @domName HTMLAreaElement.ping */
   String get ping native "HTMLAreaElement_ping_Getter";
 
+
+  /** @domName HTMLAreaElement.ping */
   void set ping(String value) native "HTMLAreaElement_ping_Setter";
 
+
+  /** @domName HTMLAreaElement.port */
   String get port native "HTMLAreaElement_port_Getter";
 
+
+  /** @domName HTMLAreaElement.protocol */
   String get protocol native "HTMLAreaElement_protocol_Getter";
 
+
+  /** @domName HTMLAreaElement.search */
   String get search native "HTMLAreaElement_search_Getter";
 
+
+  /** @domName HTMLAreaElement.shape */
   String get shape native "HTMLAreaElement_shape_Getter";
 
+
+  /** @domName HTMLAreaElement.shape */
   void set shape(String value) native "HTMLAreaElement_shape_Setter";
 
+
+  /** @domName HTMLAreaElement.target */
   String get target native "HTMLAreaElement_target_Getter";
 
+
+  /** @domName HTMLAreaElement.target */
   void set target(String value) native "HTMLAreaElement_target_Setter";
 
 }
@@ -668,24 +624,13 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ArrayBuffer
-abstract class ArrayBuffer {
+class ArrayBuffer extends NativeFieldWrapperClass1 {
 
   factory ArrayBuffer(int length) => _ArrayBufferFactoryProvider.createArrayBuffer(length);
+  ArrayBuffer.internal();
+
 
   /** @domName ArrayBuffer.byteLength */
-  int get byteLength;
-
-  /** @domName ArrayBuffer.slice */
-  ArrayBuffer slice(int begin, [int end]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ArrayBufferImpl extends NativeFieldWrapperClass1 implements ArrayBuffer {
-
   int get byteLength native "ArrayBuffer_byteLength_Getter";
 
   ArrayBuffer slice(/*long*/ begin, [/*long*/ end]) {
@@ -695,8 +640,12 @@
     return _slice_2(begin);
   }
 
+
+  /** @domName ArrayBuffer.slice_1 */
   ArrayBuffer _slice_1(begin, end) native "ArrayBuffer_slice_1_Callback";
 
+
+  /** @domName ArrayBuffer.slice_2 */
   ArrayBuffer _slice_2(begin) native "ArrayBuffer_slice_2_Callback";
 
 }
@@ -707,29 +656,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ArrayBufferView
-abstract class ArrayBufferView {
+class ArrayBufferView extends NativeFieldWrapperClass1 {
+  ArrayBufferView.internal();
+
 
   /** @domName ArrayBufferView.buffer */
-  ArrayBuffer get buffer;
-
-  /** @domName ArrayBufferView.byteLength */
-  int get byteLength;
-
-  /** @domName ArrayBufferView.byteOffset */
-  int get byteOffset;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ArrayBufferViewImpl extends NativeFieldWrapperClass1 implements ArrayBufferView {
-
   ArrayBuffer get buffer native "ArrayBufferView_buffer_Getter";
 
+
+  /** @domName ArrayBufferView.byteLength */
   int get byteLength native "ArrayBufferView_byteLength_Getter";
 
+
+  /** @domName ArrayBufferView.byteOffset */
   int get byteOffset native "ArrayBufferView_byteOffset_Getter";
 
 }
@@ -740,41 +679,31 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Attr
-abstract class Attr implements Node {
+class Attr extends Node {
+  Attr.internal(): super.internal();
+
 
   /** @domName Attr.isId */
-  bool get isId;
-
-  /** @domName Attr.name */
-  String get name;
-
-  /** @domName Attr.ownerElement */
-  Element get ownerElement;
-
-  /** @domName Attr.specified */
-  bool get specified;
-
-  /** @domName Attr.value */
-  String value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AttrImpl extends _NodeImpl implements Attr {
-
   bool get isId native "Attr_isId_Getter";
 
+
+  /** @domName Attr.name */
   String get name native "Attr_name_Getter";
 
+
+  /** @domName Attr.ownerElement */
   Element get ownerElement native "Attr_ownerElement_Getter";
 
+
+  /** @domName Attr.specified */
   bool get specified native "Attr_specified_Getter";
 
+
+  /** @domName Attr.value */
   String get value native "Attr_value_Getter";
 
+
+  /** @domName Attr.value */
   void set value(String value) native "Attr_value_Setter";
 
 }
@@ -785,25 +714,37 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName AudioBuffer
-abstract class AudioBuffer {
+class AudioBuffer extends NativeFieldWrapperClass1 {
+  AudioBuffer.internal();
+
 
   /** @domName AudioBuffer.duration */
-  num get duration;
+  num get duration native "AudioBuffer_duration_Getter";
+
 
   /** @domName AudioBuffer.gain */
-  num gain;
+  num get gain native "AudioBuffer_gain_Getter";
+
+
+  /** @domName AudioBuffer.gain */
+  void set gain(num value) native "AudioBuffer_gain_Setter";
+
 
   /** @domName AudioBuffer.length */
-  int get length;
+  int get length native "AudioBuffer_length_Getter";
+
 
   /** @domName AudioBuffer.numberOfChannels */
-  int get numberOfChannels;
+  int get numberOfChannels native "AudioBuffer_numberOfChannels_Getter";
+
 
   /** @domName AudioBuffer.sampleRate */
-  num get sampleRate;
+  num get sampleRate native "AudioBuffer_sampleRate_Getter";
+
 
   /** @domName AudioBuffer.getChannelData */
-  Float32Array getChannelData(int channelIndex);
+  Float32Array getChannelData(int channelIndex) native "AudioBuffer_getChannelData_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -819,31 +760,9 @@
 
 // WARNING: Do not edit - generated code.
 
-class _AudioBufferImpl extends NativeFieldWrapperClass1 implements AudioBuffer {
-
-  num get duration native "AudioBuffer_duration_Getter";
-
-  num get gain native "AudioBuffer_gain_Getter";
-
-  void set gain(num value) native "AudioBuffer_gain_Setter";
-
-  int get length native "AudioBuffer_length_Getter";
-
-  int get numberOfChannels native "AudioBuffer_numberOfChannels_Getter";
-
-  num get sampleRate native "AudioBuffer_sampleRate_Getter";
-
-  Float32Array getChannelData(int channelIndex) native "AudioBuffer_getChannelData_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName AudioBufferSourceNode
-abstract class AudioBufferSourceNode implements AudioSourceNode {
+class AudioBufferSourceNode extends AudioSourceNode {
+  AudioBufferSourceNode.internal(): super.internal();
 
   static const int FINISHED_STATE = 3;
 
@@ -853,61 +772,48 @@
 
   static const int UNSCHEDULED_STATE = 0;
 
+
   /** @domName AudioBufferSourceNode.buffer */
-  AudioBuffer buffer;
-
-  /** @domName AudioBufferSourceNode.gain */
-  AudioGain get gain;
-
-  /** @domName AudioBufferSourceNode.loop */
-  bool loop;
-
-  /** @domName AudioBufferSourceNode.loopEnd */
-  num loopEnd;
-
-  /** @domName AudioBufferSourceNode.loopStart */
-  num loopStart;
-
-  /** @domName AudioBufferSourceNode.playbackRate */
-  AudioParam get playbackRate;
-
-  /** @domName AudioBufferSourceNode.playbackState */
-  int get playbackState;
-
-  /** @domName AudioBufferSourceNode.start */
-  void start(num when, [num grainOffset, num grainDuration]);
-
-  /** @domName AudioBufferSourceNode.stop */
-  void stop(num when);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AudioBufferSourceNodeImpl extends _AudioSourceNodeImpl implements AudioBufferSourceNode {
-
   AudioBuffer get buffer native "AudioBufferSourceNode_buffer_Getter";
 
+
+  /** @domName AudioBufferSourceNode.buffer */
   void set buffer(AudioBuffer value) native "AudioBufferSourceNode_buffer_Setter";
 
+
+  /** @domName AudioBufferSourceNode.gain */
   AudioGain get gain native "AudioBufferSourceNode_gain_Getter";
 
+
+  /** @domName AudioBufferSourceNode.loop */
   bool get loop native "AudioBufferSourceNode_loop_Getter";
 
+
+  /** @domName AudioBufferSourceNode.loop */
   void set loop(bool value) native "AudioBufferSourceNode_loop_Setter";
 
+
+  /** @domName AudioBufferSourceNode.loopEnd */
   num get loopEnd native "AudioBufferSourceNode_loopEnd_Getter";
 
+
+  /** @domName AudioBufferSourceNode.loopEnd */
   void set loopEnd(num value) native "AudioBufferSourceNode_loopEnd_Setter";
 
+
+  /** @domName AudioBufferSourceNode.loopStart */
   num get loopStart native "AudioBufferSourceNode_loopStart_Getter";
 
+
+  /** @domName AudioBufferSourceNode.loopStart */
   void set loopStart(num value) native "AudioBufferSourceNode_loopStart_Setter";
 
+
+  /** @domName AudioBufferSourceNode.playbackRate */
   AudioParam get playbackRate native "AudioBufferSourceNode_playbackRate_Getter";
 
+
+  /** @domName AudioBufferSourceNode.playbackState */
   int get playbackState native "AudioBufferSourceNode_playbackState_Getter";
 
   void start(/*double*/ when, [/*double*/ grainOffset, /*double*/ grainDuration]) {
@@ -922,10 +828,16 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName AudioBufferSourceNode.start_1 */
   void _start_1(when) native "AudioBufferSourceNode_start_1_Callback";
 
+
+  /** @domName AudioBufferSourceNode.start_2 */
   void _start_2(when, grainOffset, grainDuration) native "AudioBufferSourceNode_start_2_Callback";
 
+
+  /** @domName AudioBufferSourceNode.stop */
   void stop(num when) native "AudioBufferSourceNode_stop_Callback";
 
 }
@@ -933,118 +845,42 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-
-/// @domName AudioContext
-abstract class AudioContext implements EventTarget {
+class AudioContext extends EventTarget {
   factory AudioContext() => _AudioContextFactoryProvider.createAudioContext();
+  AudioContext.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  AudioContextEvents get on;
+  AudioContextEvents get on =>
+    new AudioContextEvents(this);
+
 
   /** @domName AudioContext.activeSourceCount */
-  int get activeSourceCount;
-
-  /** @domName AudioContext.currentTime */
-  num get currentTime;
-
-  /** @domName AudioContext.destination */
-  AudioDestinationNode get destination;
-
-  /** @domName AudioContext.listener */
-  AudioListener get listener;
-
-  /** @domName AudioContext.sampleRate */
-  num get sampleRate;
-
-  /** @domName AudioContext.createAnalyser */
-  AnalyserNode createAnalyser();
-
-  /** @domName AudioContext.createBiquadFilter */
-  BiquadFilterNode createBiquadFilter();
-
-  /** @domName AudioContext.createBuffer */
-  AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [num sampleRate]);
-
-  /** @domName AudioContext.createBufferSource */
-  AudioBufferSourceNode createBufferSource();
-
-  /** @domName AudioContext.createChannelMerger */
-  ChannelMergerNode createChannelMerger([int numberOfInputs]);
-
-  /** @domName AudioContext.createChannelSplitter */
-  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]);
-
-  /** @domName AudioContext.createConvolver */
-  ConvolverNode createConvolver();
-
-  /** @domName AudioContext.createDelay */
-  DelayNode createDelay([num maxDelayTime]);
-
-  /** @domName AudioContext.createDynamicsCompressor */
-  DynamicsCompressorNode createDynamicsCompressor();
-
-  /** @domName AudioContext.createGain */
-  GainNode createGain();
-
-  /** @domName AudioContext.createMediaElementSource */
-  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement);
-
-  /** @domName AudioContext.createMediaStreamSource */
-  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream);
-
-  /** @domName AudioContext.createOscillator */
-  OscillatorNode createOscillator();
-
-  /** @domName AudioContext.createPanner */
-  PannerNode createPanner();
-
-  /** @domName AudioContext.createScriptProcessor */
-  ScriptProcessorNode createScriptProcessor(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]);
-
-  /** @domName AudioContext.createWaveShaper */
-  WaveShaperNode createWaveShaper();
-
-  /** @domName AudioContext.createWaveTable */
-  WaveTable createWaveTable(Float32Array real, Float32Array imag);
-
-  /** @domName AudioContext.decodeAudioData */
-  void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]);
-
-  /** @domName AudioContext.startRendering */
-  void startRendering();
-}
-
-abstract class AudioContextEvents implements Events {
-
-  EventListenerList get complete;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AudioContextImpl extends _EventTargetImpl implements AudioContext {
-
-  _AudioContextEventsImpl get on =>
-    new _AudioContextEventsImpl(this);
-
   int get activeSourceCount native "AudioContext_activeSourceCount_Getter";
 
+
+  /** @domName AudioContext.currentTime */
   num get currentTime native "AudioContext_currentTime_Getter";
 
+
+  /** @domName AudioContext.destination */
   AudioDestinationNode get destination native "AudioContext_destination_Getter";
 
+
+  /** @domName AudioContext.listener */
   AudioListener get listener native "AudioContext_listener_Getter";
 
+
+  /** @domName AudioContext.sampleRate */
   num get sampleRate native "AudioContext_sampleRate_Getter";
 
+
+  /** @domName AudioContext.createAnalyser */
   AnalyserNode createAnalyser() native "AudioContext_createAnalyser_Callback";
 
+
+  /** @domName AudioContext.createBiquadFilter */
   BiquadFilterNode createBiquadFilter() native "AudioContext_createBiquadFilter_Callback";
 
   AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [/*float*/ sampleRate]) {
@@ -1057,10 +893,16 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName AudioContext.createBuffer_1 */
   AudioBuffer _createBuffer_1(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, sampleRate) native "AudioContext_createBuffer_1_Callback";
 
+
+  /** @domName AudioContext.createBuffer_2 */
   AudioBuffer _createBuffer_2(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames) native "AudioContext_createBuffer_2_Callback";
 
+
+  /** @domName AudioContext.createBufferSource */
   AudioBufferSourceNode createBufferSource() native "AudioContext_createBufferSource_Callback";
 
   ChannelMergerNode createChannelMerger([/*unsigned long*/ numberOfInputs]) {
@@ -1070,8 +912,12 @@
     return _createChannelMerger_2();
   }
 
+
+  /** @domName AudioContext.createChannelMerger_1 */
   ChannelMergerNode _createChannelMerger_1(numberOfInputs) native "AudioContext_createChannelMerger_1_Callback";
 
+
+  /** @domName AudioContext.createChannelMerger_2 */
   ChannelMergerNode _createChannelMerger_2() native "AudioContext_createChannelMerger_2_Callback";
 
   ChannelSplitterNode createChannelSplitter([/*unsigned long*/ numberOfOutputs]) {
@@ -1081,10 +927,16 @@
     return _createChannelSplitter_2();
   }
 
+
+  /** @domName AudioContext.createChannelSplitter_1 */
   ChannelSplitterNode _createChannelSplitter_1(numberOfOutputs) native "AudioContext_createChannelSplitter_1_Callback";
 
+
+  /** @domName AudioContext.createChannelSplitter_2 */
   ChannelSplitterNode _createChannelSplitter_2() native "AudioContext_createChannelSplitter_2_Callback";
 
+
+  /** @domName AudioContext.createConvolver */
   ConvolverNode createConvolver() native "AudioContext_createConvolver_Callback";
 
   DelayNode createDelay([/*double*/ maxDelayTime]) {
@@ -1094,20 +946,36 @@
     return _createDelay_2();
   }
 
+
+  /** @domName AudioContext.createDelay_1 */
   DelayNode _createDelay_1(maxDelayTime) native "AudioContext_createDelay_1_Callback";
 
+
+  /** @domName AudioContext.createDelay_2 */
   DelayNode _createDelay_2() native "AudioContext_createDelay_2_Callback";
 
+
+  /** @domName AudioContext.createDynamicsCompressor */
   DynamicsCompressorNode createDynamicsCompressor() native "AudioContext_createDynamicsCompressor_Callback";
 
+
+  /** @domName AudioContext.createGain */
   GainNode createGain() native "AudioContext_createGain_Callback";
 
+
+  /** @domName AudioContext.createMediaElementSource */
   MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) native "AudioContext_createMediaElementSource_Callback";
 
+
+  /** @domName AudioContext.createMediaStreamSource */
   MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) native "AudioContext_createMediaStreamSource_Callback";
 
+
+  /** @domName AudioContext.createOscillator */
   OscillatorNode createOscillator() native "AudioContext_createOscillator_Callback";
 
+
+  /** @domName AudioContext.createPanner */
   PannerNode createPanner() native "AudioContext_createPanner_Callback";
 
   ScriptProcessorNode createScriptProcessor(/*unsigned long*/ bufferSize, [/*unsigned long*/ numberOfInputChannels, /*unsigned long*/ numberOfOutputChannels]) {
@@ -1120,24 +988,38 @@
     return _createScriptProcessor_3(bufferSize);
   }
 
+
+  /** @domName AudioContext.createScriptProcessor_1 */
   ScriptProcessorNode _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createScriptProcessor_1_Callback";
 
+
+  /** @domName AudioContext.createScriptProcessor_2 */
   ScriptProcessorNode _createScriptProcessor_2(bufferSize, numberOfInputChannels) native "AudioContext_createScriptProcessor_2_Callback";
 
+
+  /** @domName AudioContext.createScriptProcessor_3 */
   ScriptProcessorNode _createScriptProcessor_3(bufferSize) native "AudioContext_createScriptProcessor_3_Callback";
 
+
+  /** @domName AudioContext.createWaveShaper */
   WaveShaperNode createWaveShaper() native "AudioContext_createWaveShaper_Callback";
 
+
+  /** @domName AudioContext.createWaveTable */
   WaveTable createWaveTable(Float32Array real, Float32Array imag) native "AudioContext_createWaveTable_Callback";
 
+
+  /** @domName AudioContext.decodeAudioData */
   void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native "AudioContext_decodeAudioData_Callback";
 
+
+  /** @domName AudioContext.startRendering */
   void startRendering() native "AudioContext_startRendering_Callback";
 
 }
 
-class _AudioContextEventsImpl extends _EventsImpl implements AudioContextEvents {
-  _AudioContextEventsImpl(_ptr) : super(_ptr);
+class AudioContextEvents extends Events {
+  AudioContextEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get complete => this['complete'];
 }
@@ -1148,19 +1030,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName AudioDestinationNode
-abstract class AudioDestinationNode implements AudioNode {
+class AudioDestinationNode extends AudioNode {
+  AudioDestinationNode.internal(): super.internal();
+
 
   /** @domName AudioDestinationNode.numberOfChannels */
-  int get numberOfChannels;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AudioDestinationNodeImpl extends _AudioNodeImpl implements AudioDestinationNode {
-
   int get numberOfChannels native "AudioDestinationNode_numberOfChannels_Getter";
 
 }
@@ -1171,7 +1045,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLAudioElement
-abstract class AudioElement implements MediaElement {
+class AudioElement extends MediaElement {
 
   factory AudioElement([String src]) {
     if (!?src) {
@@ -1179,14 +1053,7 @@
     }
     return _AudioElementFactoryProvider.createAudioElement(src);
   }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AudioElementImpl extends _MediaElementImpl implements AudioElement {
+  AudioElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1196,15 +1063,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName AudioGain
-abstract class AudioGain implements AudioParam {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AudioGainImpl extends _AudioParamImpl implements AudioGain {
+class AudioGain extends AudioParam {
+  AudioGain.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1214,43 +1074,35 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName AudioListener
-abstract class AudioListener {
+class AudioListener extends NativeFieldWrapperClass1 {
+  AudioListener.internal();
+
 
   /** @domName AudioListener.dopplerFactor */
-  num dopplerFactor;
-
-  /** @domName AudioListener.speedOfSound */
-  num speedOfSound;
-
-  /** @domName AudioListener.setOrientation */
-  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp);
-
-  /** @domName AudioListener.setPosition */
-  void setPosition(num x, num y, num z);
-
-  /** @domName AudioListener.setVelocity */
-  void setVelocity(num x, num y, num z);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AudioListenerImpl extends NativeFieldWrapperClass1 implements AudioListener {
-
   num get dopplerFactor native "AudioListener_dopplerFactor_Getter";
 
+
+  /** @domName AudioListener.dopplerFactor */
   void set dopplerFactor(num value) native "AudioListener_dopplerFactor_Setter";
 
+
+  /** @domName AudioListener.speedOfSound */
   num get speedOfSound native "AudioListener_speedOfSound_Getter";
 
+
+  /** @domName AudioListener.speedOfSound */
   void set speedOfSound(num value) native "AudioListener_speedOfSound_Setter";
 
+
+  /** @domName AudioListener.setOrientation */
   void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native "AudioListener_setOrientation_Callback";
 
+
+  /** @domName AudioListener.setPosition */
   void setPosition(num x, num y, num z) native "AudioListener_setPosition_Callback";
 
+
+  /** @domName AudioListener.setVelocity */
   void setVelocity(num x, num y, num z) native "AudioListener_setVelocity_Callback";
 
 }
@@ -1261,35 +1113,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName AudioNode
-abstract class AudioNode {
+class AudioNode extends NativeFieldWrapperClass1 {
+  AudioNode.internal();
+
 
   /** @domName AudioNode.context */
-  AudioContext get context;
-
-  /** @domName AudioNode.numberOfInputs */
-  int get numberOfInputs;
-
-  /** @domName AudioNode.numberOfOutputs */
-  int get numberOfOutputs;
-
-  /** @domName AudioNode.connect */
-  void connect(destination, int output, [int input]);
-
-  /** @domName AudioNode.disconnect */
-  void disconnect(int output);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AudioNodeImpl extends NativeFieldWrapperClass1 implements AudioNode {
-
   AudioContext get context native "AudioNode_context_Getter";
 
+
+  /** @domName AudioNode.numberOfInputs */
   int get numberOfInputs native "AudioNode_numberOfInputs_Getter";
 
+
+  /** @domName AudioNode.numberOfOutputs */
   int get numberOfOutputs native "AudioNode_numberOfOutputs_Getter";
 
   void connect(destination, /*unsigned long*/ output, [/*unsigned long*/ input]) {
@@ -1304,10 +1140,16 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName AudioNode.connect_1 */
   void _connect_1(destination, output, input) native "AudioNode_connect_1_Callback";
 
+
+  /** @domName AudioNode.connect_2 */
   void _connect_2(destination, output) native "AudioNode_connect_2_Callback";
 
+
+  /** @domName AudioNode.disconnect */
   void disconnect(int output) native "AudioNode_disconnect_Callback";
 
 }
@@ -1318,76 +1160,59 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName AudioParam
-abstract class AudioParam {
+class AudioParam extends NativeFieldWrapperClass1 {
+  AudioParam.internal();
+
 
   /** @domName AudioParam.defaultValue */
-  num get defaultValue;
-
-  /** @domName AudioParam.maxValue */
-  num get maxValue;
-
-  /** @domName AudioParam.minValue */
-  num get minValue;
-
-  /** @domName AudioParam.name */
-  String get name;
-
-  /** @domName AudioParam.units */
-  int get units;
-
-  /** @domName AudioParam.value */
-  num value;
-
-  /** @domName AudioParam.cancelScheduledValues */
-  void cancelScheduledValues(num startTime);
-
-  /** @domName AudioParam.exponentialRampToValueAtTime */
-  void exponentialRampToValueAtTime(num value, num time);
-
-  /** @domName AudioParam.linearRampToValueAtTime */
-  void linearRampToValueAtTime(num value, num time);
-
-  /** @domName AudioParam.setTargetAtTime */
-  void setTargetAtTime(num target, num time, num timeConstant);
-
-  /** @domName AudioParam.setValueAtTime */
-  void setValueAtTime(num value, num time);
-
-  /** @domName AudioParam.setValueCurveAtTime */
-  void setValueCurveAtTime(Float32Array values, num time, num duration);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AudioParamImpl extends NativeFieldWrapperClass1 implements AudioParam {
-
   num get defaultValue native "AudioParam_defaultValue_Getter";
 
+
+  /** @domName AudioParam.maxValue */
   num get maxValue native "AudioParam_maxValue_Getter";
 
+
+  /** @domName AudioParam.minValue */
   num get minValue native "AudioParam_minValue_Getter";
 
+
+  /** @domName AudioParam.name */
   String get name native "AudioParam_name_Getter";
 
+
+  /** @domName AudioParam.units */
   int get units native "AudioParam_units_Getter";
 
+
+  /** @domName AudioParam.value */
   num get value native "AudioParam_value_Getter";
 
+
+  /** @domName AudioParam.value */
   void set value(num value) native "AudioParam_value_Setter";
 
+
+  /** @domName AudioParam.cancelScheduledValues */
   void cancelScheduledValues(num startTime) native "AudioParam_cancelScheduledValues_Callback";
 
+
+  /** @domName AudioParam.exponentialRampToValueAtTime */
   void exponentialRampToValueAtTime(num value, num time) native "AudioParam_exponentialRampToValueAtTime_Callback";
 
+
+  /** @domName AudioParam.linearRampToValueAtTime */
   void linearRampToValueAtTime(num value, num time) native "AudioParam_linearRampToValueAtTime_Callback";
 
+
+  /** @domName AudioParam.setTargetAtTime */
   void setTargetAtTime(num target, num time, num timeConstant) native "AudioParam_setTargetAtTime_Callback";
 
+
+  /** @domName AudioParam.setValueAtTime */
   void setValueAtTime(num value, num time) native "AudioParam_setValueAtTime_Callback";
 
+
+  /** @domName AudioParam.setValueCurveAtTime */
   void setValueCurveAtTime(Float32Array values, num time, num duration) native "AudioParam_setValueCurveAtTime_Callback";
 
 }
@@ -1398,24 +1223,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName AudioProcessingEvent
-abstract class AudioProcessingEvent implements Event {
+class AudioProcessingEvent extends Event {
+  AudioProcessingEvent.internal(): super.internal();
+
 
   /** @domName AudioProcessingEvent.inputBuffer */
-  AudioBuffer get inputBuffer;
-
-  /** @domName AudioProcessingEvent.outputBuffer */
-  AudioBuffer get outputBuffer;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AudioProcessingEventImpl extends _EventImpl implements AudioProcessingEvent {
-
   AudioBuffer get inputBuffer native "AudioProcessingEvent_inputBuffer_Getter";
 
+
+  /** @domName AudioProcessingEvent.outputBuffer */
   AudioBuffer get outputBuffer native "AudioProcessingEvent_outputBuffer_Getter";
 
 }
@@ -1426,15 +1242,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName AudioSourceNode
-abstract class AudioSourceNode implements AudioNode {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _AudioSourceNodeImpl extends _AudioNodeImpl implements AudioSourceNode {
+class AudioSourceNode extends AudioNode {
+  AudioSourceNode.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1444,23 +1253,17 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLBRElement
-abstract class BRElement implements Element {
+class BRElement extends _Element_Merged {
 
   factory BRElement() => _Elements.createBRElement();
+  BRElement.internal(): super.internal();
+
 
   /** @domName HTMLBRElement.clear */
-  String clear;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _BRElementImpl extends _ElementImpl_Merged implements BRElement {
-
   String get clear native "HTMLBRElement_clear_Getter";
 
+
+  /** @domName HTMLBRElement.clear */
   void set clear(String value) native "HTMLBRElement_clear_Setter";
 
 }
@@ -1471,19 +1274,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName BarInfo
-abstract class BarInfo {
+class BarInfo extends NativeFieldWrapperClass1 {
+  BarInfo.internal();
+
 
   /** @domName BarInfo.visible */
-  bool get visible;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _BarInfoImpl extends NativeFieldWrapperClass1 implements BarInfo {
-
   bool get visible native "BarInfo_visible_Getter";
 
 }
@@ -1494,30 +1289,25 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLBaseElement
-abstract class BaseElement implements Element {
+class BaseElement extends _Element_Merged {
 
   factory BaseElement() => _Elements.createBaseElement();
+  BaseElement.internal(): super.internal();
+
 
   /** @domName HTMLBaseElement.href */
-  String href;
-
-  /** @domName HTMLBaseElement.target */
-  String target;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _BaseElementImpl extends _ElementImpl_Merged implements BaseElement {
-
   String get href native "HTMLBaseElement_href_Getter";
 
+
+  /** @domName HTMLBaseElement.href */
   void set href(String value) native "HTMLBaseElement_href_Setter";
 
+
+  /** @domName HTMLBaseElement.target */
   String get target native "HTMLBaseElement_target_Getter";
 
+
+  /** @domName HTMLBaseElement.target */
   void set target(String value) native "HTMLBaseElement_target_Setter";
 
 }
@@ -1528,35 +1318,31 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLBaseFontElement
-abstract class BaseFontElement implements Element {
+class BaseFontElement extends _Element_Merged {
+  BaseFontElement.internal(): super.internal();
+
 
   /** @domName HTMLBaseFontElement.color */
-  String color;
-
-  /** @domName HTMLBaseFontElement.face */
-  String face;
-
-  /** @domName HTMLBaseFontElement.size */
-  int size;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _BaseFontElementImpl extends _ElementImpl_Merged implements BaseFontElement {
-
   String get color native "HTMLBaseFontElement_color_Getter";
 
+
+  /** @domName HTMLBaseFontElement.color */
   void set color(String value) native "HTMLBaseFontElement_color_Setter";
 
+
+  /** @domName HTMLBaseFontElement.face */
   String get face native "HTMLBaseFontElement_face_Getter";
 
+
+  /** @domName HTMLBaseFontElement.face */
   void set face(String value) native "HTMLBaseFontElement_face_Setter";
 
+
+  /** @domName HTMLBaseFontElement.size */
   int get size native "HTMLBaseFontElement_size_Getter";
 
+
+  /** @domName HTMLBaseFontElement.size */
   void set size(int value) native "HTMLBaseFontElement_size_Setter";
 
 }
@@ -1567,74 +1353,47 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName BatteryManager
-abstract class BatteryManager implements EventTarget {
+class BatteryManager extends EventTarget {
+  BatteryManager.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  BatteryManagerEvents get on;
+  BatteryManagerEvents get on =>
+    new BatteryManagerEvents(this);
+
 
   /** @domName BatteryManager.charging */
-  bool get charging;
-
-  /** @domName BatteryManager.chargingTime */
-  num get chargingTime;
-
-  /** @domName BatteryManager.dischargingTime */
-  num get dischargingTime;
-
-  /** @domName BatteryManager.level */
-  num get level;
-
-  /** @domName BatteryManager.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName BatteryManager.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName BatteryManager.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class BatteryManagerEvents implements Events {
-
-  EventListenerList get chargingChange;
-
-  EventListenerList get chargingTimeChange;
-
-  EventListenerList get dischargingTimeChange;
-
-  EventListenerList get levelChange;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _BatteryManagerImpl extends _EventTargetImpl implements BatteryManager {
-
-  _BatteryManagerEventsImpl get on =>
-    new _BatteryManagerEventsImpl(this);
-
   bool get charging native "BatteryManager_charging_Getter";
 
+
+  /** @domName BatteryManager.chargingTime */
   num get chargingTime native "BatteryManager_chargingTime_Getter";
 
+
+  /** @domName BatteryManager.dischargingTime */
   num get dischargingTime native "BatteryManager_dischargingTime_Getter";
 
+
+  /** @domName BatteryManager.level */
   num get level native "BatteryManager_level_Getter";
 
+
+  /** @domName BatteryManager.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "BatteryManager_addEventListener_Callback";
 
+
+  /** @domName BatteryManager.dispatchEvent */
   bool $dom_dispatchEvent(Event event) native "BatteryManager_dispatchEvent_Callback";
 
+
+  /** @domName BatteryManager.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "BatteryManager_removeEventListener_Callback";
 
 }
 
-class _BatteryManagerEventsImpl extends _EventsImpl implements BatteryManagerEvents {
-  _BatteryManagerEventsImpl(_ptr) : super(_ptr);
+class BatteryManagerEvents extends Events {
+  BatteryManagerEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get chargingChange => this['chargingchange'];
 
@@ -1651,19 +1410,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName BeforeLoadEvent
-abstract class BeforeLoadEvent implements Event {
+class BeforeLoadEvent extends Event {
+  BeforeLoadEvent.internal(): super.internal();
+
 
   /** @domName BeforeLoadEvent.url */
-  String get url;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _BeforeLoadEventImpl extends _EventImpl implements BeforeLoadEvent {
-
   String get url native "BeforeLoadEvent_url_Getter";
 
 }
@@ -1674,7 +1425,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName BiquadFilterNode
-abstract class BiquadFilterNode implements AudioNode {
+class BiquadFilterNode extends AudioNode {
+  BiquadFilterNode.internal(): super.internal();
 
   static const int ALLPASS = 7;
 
@@ -1692,39 +1444,28 @@
 
   static const int PEAKING = 5;
 
+
   /** @domName BiquadFilterNode.Q */
-  AudioParam get Q;
-
-  /** @domName BiquadFilterNode.frequency */
-  AudioParam get frequency;
-
-  /** @domName BiquadFilterNode.gain */
-  AudioParam get gain;
-
-  /** @domName BiquadFilterNode.type */
-  int type;
-
-  /** @domName BiquadFilterNode.getFrequencyResponse */
-  void getFrequencyResponse(Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _BiquadFilterNodeImpl extends _AudioNodeImpl implements BiquadFilterNode {
-
   AudioParam get Q native "BiquadFilterNode_Q_Getter";
 
+
+  /** @domName BiquadFilterNode.frequency */
   AudioParam get frequency native "BiquadFilterNode_frequency_Getter";
 
+
+  /** @domName BiquadFilterNode.gain */
   AudioParam get gain native "BiquadFilterNode_gain_Getter";
 
+
+  /** @domName BiquadFilterNode.type */
   int get type native "BiquadFilterNode_type_Getter";
 
+
+  /** @domName BiquadFilterNode.type */
   void set type(int value) native "BiquadFilterNode_type_Setter";
 
+
+  /** @domName BiquadFilterNode.getFrequencyResponse */
   void getFrequencyResponse(Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback";
 
 }
@@ -1735,7 +1476,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Blob
-abstract class Blob {
+class Blob extends NativeFieldWrapperClass1 {
 
   factory Blob(List blobParts, [String type, String endings]) {
     if (!?type) {
@@ -1746,26 +1487,14 @@
     }
     return _BlobFactoryProvider.createBlob(blobParts, type, endings);
   }
+  Blob.internal();
+
 
   /** @domName Blob.size */
-  int get size;
-
-  /** @domName Blob.type */
-  String get type;
-
-  /** @domName Blob.slice */
-  Blob slice([int start, int end, String contentType]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _BlobImpl extends NativeFieldWrapperClass1 implements Blob {
-
   int get size native "Blob_size_Getter";
 
+
+  /** @domName Blob.type */
   String get type native "Blob_type_Getter";
 
   Blob slice([/*long long*/ start, /*long long*/ end, /*DOMString*/ contentType]) {
@@ -1781,12 +1510,20 @@
     return _slice_4();
   }
 
+
+  /** @domName Blob.slice_1 */
   Blob _slice_1(start, end, contentType) native "Blob_slice_1_Callback";
 
+
+  /** @domName Blob.slice_2 */
   Blob _slice_2(start, end) native "Blob_slice_2_Callback";
 
+
+  /** @domName Blob.slice_3 */
   Blob _slice_3(start) native "Blob_slice_3_Callback";
 
+
+  /** @domName Blob.slice_4 */
   Blob _slice_4() native "Blob_slice_4_Callback";
 
 }
@@ -1797,94 +1534,61 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLBodyElement
-abstract class BodyElement implements Element {
+class BodyElement extends _Element_Merged {
 
   factory BodyElement() => _Elements.createBodyElement();
+  BodyElement.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  BodyElementEvents get on;
+  BodyElementEvents get on =>
+    new BodyElementEvents(this);
+
 
   /** @domName HTMLBodyElement.aLink */
-  String aLink;
-
-  /** @domName HTMLBodyElement.background */
-  String background;
-
-  /** @domName HTMLBodyElement.bgColor */
-  String bgColor;
-
-  /** @domName HTMLBodyElement.link */
-  String link;
-
-  /** @domName HTMLBodyElement.vLink */
-  String vLink;
-}
-
-abstract class BodyElementEvents implements ElementEvents {
-
-  EventListenerList get beforeUnload;
-
-  EventListenerList get blur;
-
-  EventListenerList get error;
-
-  EventListenerList get focus;
-
-  EventListenerList get hashChange;
-
-  EventListenerList get load;
-
-  EventListenerList get message;
-
-  EventListenerList get offline;
-
-  EventListenerList get online;
-
-  EventListenerList get popState;
-
-  EventListenerList get resize;
-
-  EventListenerList get storage;
-
-  EventListenerList get unload;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _BodyElementImpl extends _ElementImpl_Merged implements BodyElement {
-
-  _BodyElementEventsImpl get on =>
-    new _BodyElementEventsImpl(this);
-
   String get aLink native "HTMLBodyElement_aLink_Getter";
 
+
+  /** @domName HTMLBodyElement.aLink */
   void set aLink(String value) native "HTMLBodyElement_aLink_Setter";
 
+
+  /** @domName HTMLBodyElement.background */
   String get background native "HTMLBodyElement_background_Getter";
 
+
+  /** @domName HTMLBodyElement.background */
   void set background(String value) native "HTMLBodyElement_background_Setter";
 
+
+  /** @domName HTMLBodyElement.bgColor */
   String get bgColor native "HTMLBodyElement_bgColor_Getter";
 
+
+  /** @domName HTMLBodyElement.bgColor */
   void set bgColor(String value) native "HTMLBodyElement_bgColor_Setter";
 
+
+  /** @domName HTMLBodyElement.link */
   String get link native "HTMLBodyElement_link_Getter";
 
+
+  /** @domName HTMLBodyElement.link */
   void set link(String value) native "HTMLBodyElement_link_Setter";
 
+
+  /** @domName HTMLBodyElement.vLink */
   String get vLink native "HTMLBodyElement_vLink_Getter";
 
+
+  /** @domName HTMLBodyElement.vLink */
   void set vLink(String value) native "HTMLBodyElement_vLink_Setter";
 
 }
 
-class _BodyElementEventsImpl extends _ElementEventsImpl implements BodyElementEvents {
-  _BodyElementEventsImpl(_ptr) : super(_ptr);
+class BodyElementEvents extends ElementEvents {
+  BodyElementEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get beforeUnload => this['beforeunload'];
 
@@ -1919,121 +1623,117 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLButtonElement
-abstract class ButtonElement implements Element {
+class ButtonElement extends _Element_Merged {
 
   factory ButtonElement() => _Elements.createButtonElement();
+  ButtonElement.internal(): super.internal();
+
 
   /** @domName HTMLButtonElement.autofocus */
-  bool autofocus;
-
-  /** @domName HTMLButtonElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLButtonElement.form */
-  FormElement get form;
-
-  /** @domName HTMLButtonElement.formAction */
-  String formAction;
-
-  /** @domName HTMLButtonElement.formEnctype */
-  String formEnctype;
-
-  /** @domName HTMLButtonElement.formMethod */
-  String formMethod;
-
-  /** @domName HTMLButtonElement.formNoValidate */
-  bool formNoValidate;
-
-  /** @domName HTMLButtonElement.formTarget */
-  String formTarget;
-
-  /** @domName HTMLButtonElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLButtonElement.name */
-  String name;
-
-  /** @domName HTMLButtonElement.type */
-  String type;
-
-  /** @domName HTMLButtonElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLButtonElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLButtonElement.value */
-  String value;
-
-  /** @domName HTMLButtonElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLButtonElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLButtonElement.setCustomValidity */
-  void setCustomValidity(String error);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ButtonElementImpl extends _ElementImpl_Merged implements ButtonElement {
-
   bool get autofocus native "HTMLButtonElement_autofocus_Getter";
 
+
+  /** @domName HTMLButtonElement.autofocus */
   void set autofocus(bool value) native "HTMLButtonElement_autofocus_Setter";
 
+
+  /** @domName HTMLButtonElement.disabled */
   bool get disabled native "HTMLButtonElement_disabled_Getter";
 
+
+  /** @domName HTMLButtonElement.disabled */
   void set disabled(bool value) native "HTMLButtonElement_disabled_Setter";
 
+
+  /** @domName HTMLButtonElement.form */
   FormElement get form native "HTMLButtonElement_form_Getter";
 
+
+  /** @domName HTMLButtonElement.formAction */
   String get formAction native "HTMLButtonElement_formAction_Getter";
 
+
+  /** @domName HTMLButtonElement.formAction */
   void set formAction(String value) native "HTMLButtonElement_formAction_Setter";
 
+
+  /** @domName HTMLButtonElement.formEnctype */
   String get formEnctype native "HTMLButtonElement_formEnctype_Getter";
 
+
+  /** @domName HTMLButtonElement.formEnctype */
   void set formEnctype(String value) native "HTMLButtonElement_formEnctype_Setter";
 
+
+  /** @domName HTMLButtonElement.formMethod */
   String get formMethod native "HTMLButtonElement_formMethod_Getter";
 
+
+  /** @domName HTMLButtonElement.formMethod */
   void set formMethod(String value) native "HTMLButtonElement_formMethod_Setter";
 
+
+  /** @domName HTMLButtonElement.formNoValidate */
   bool get formNoValidate native "HTMLButtonElement_formNoValidate_Getter";
 
+
+  /** @domName HTMLButtonElement.formNoValidate */
   void set formNoValidate(bool value) native "HTMLButtonElement_formNoValidate_Setter";
 
+
+  /** @domName HTMLButtonElement.formTarget */
   String get formTarget native "HTMLButtonElement_formTarget_Getter";
 
+
+  /** @domName HTMLButtonElement.formTarget */
   void set formTarget(String value) native "HTMLButtonElement_formTarget_Setter";
 
+
+  /** @domName HTMLButtonElement.labels */
   List<Node> get labels native "HTMLButtonElement_labels_Getter";
 
+
+  /** @domName HTMLButtonElement.name */
   String get name native "HTMLButtonElement_name_Getter";
 
+
+  /** @domName HTMLButtonElement.name */
   void set name(String value) native "HTMLButtonElement_name_Setter";
 
+
+  /** @domName HTMLButtonElement.type */
   String get type native "HTMLButtonElement_type_Getter";
 
+
+  /** @domName HTMLButtonElement.type */
   void set type(String value) native "HTMLButtonElement_type_Setter";
 
+
+  /** @domName HTMLButtonElement.validationMessage */
   String get validationMessage native "HTMLButtonElement_validationMessage_Getter";
 
+
+  /** @domName HTMLButtonElement.validity */
   ValidityState get validity native "HTMLButtonElement_validity_Getter";
 
+
+  /** @domName HTMLButtonElement.value */
   String get value native "HTMLButtonElement_value_Getter";
 
+
+  /** @domName HTMLButtonElement.value */
   void set value(String value) native "HTMLButtonElement_value_Setter";
 
+
+  /** @domName HTMLButtonElement.willValidate */
   bool get willValidate native "HTMLButtonElement_willValidate_Getter";
 
+
+  /** @domName HTMLButtonElement.checkValidity */
   bool checkValidity() native "HTMLButtonElement_checkValidity_Callback";
 
+
+  /** @domName HTMLButtonElement.setCustomValidity */
   void setCustomValidity(String error) native "HTMLButtonElement_setCustomValidity_Callback";
 
 }
@@ -2044,15 +1744,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CDATASection
-abstract class CDATASection implements Text {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CDATASectionImpl extends _TextImpl implements CDATASection {
+class CDATASection extends Text {
+  CDATASection.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2062,21 +1755,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CSSCharsetRule
-abstract class CSSCharsetRule implements CSSRule {
+class CSSCharsetRule extends CSSRule {
+  CSSCharsetRule.internal(): super.internal();
+
 
   /** @domName CSSCharsetRule.encoding */
-  String encoding;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSCharsetRuleImpl extends _CSSRuleImpl implements CSSCharsetRule {
-
   String get encoding native "CSSCharsetRule_encoding_Getter";
 
+
+  /** @domName CSSCharsetRule.encoding */
   void set encoding(String value) native "CSSCharsetRule_encoding_Setter";
 
 }
@@ -2087,19 +1774,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CSSFontFaceRule
-abstract class CSSFontFaceRule implements CSSRule {
+class CSSFontFaceRule extends CSSRule {
+  CSSFontFaceRule.internal(): super.internal();
+
 
   /** @domName CSSFontFaceRule.style */
-  CSSStyleDeclaration get style;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSFontFaceRuleImpl extends _CSSRuleImpl implements CSSFontFaceRule {
-
   CSSStyleDeclaration get style native "CSSFontFaceRule_style_Getter";
 
 }
@@ -2110,29 +1789,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CSSImportRule
-abstract class CSSImportRule implements CSSRule {
+class CSSImportRule extends CSSRule {
+  CSSImportRule.internal(): super.internal();
+
 
   /** @domName CSSImportRule.href */
-  String get href;
-
-  /** @domName CSSImportRule.media */
-  MediaList get media;
-
-  /** @domName CSSImportRule.styleSheet */
-  CSSStyleSheet get styleSheet;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSImportRuleImpl extends _CSSRuleImpl implements CSSImportRule {
-
   String get href native "CSSImportRule_href_Getter";
 
+
+  /** @domName CSSImportRule.media */
   MediaList get media native "CSSImportRule_media_Getter";
 
+
+  /** @domName CSSImportRule.styleSheet */
   CSSStyleSheet get styleSheet native "CSSImportRule_styleSheet_Getter";
 
 }
@@ -2143,26 +1812,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebKitCSSKeyframeRule
-abstract class CSSKeyframeRule implements CSSRule {
+class CSSKeyframeRule extends CSSRule {
+  CSSKeyframeRule.internal(): super.internal();
+
 
   /** @domName WebKitCSSKeyframeRule.keyText */
-  String keyText;
-
-  /** @domName WebKitCSSKeyframeRule.style */
-  CSSStyleDeclaration get style;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSKeyframeRuleImpl extends _CSSRuleImpl implements CSSKeyframeRule {
-
   String get keyText native "WebKitCSSKeyframeRule_keyText_Getter";
 
+
+  /** @domName WebKitCSSKeyframeRule.keyText */
   void set keyText(String value) native "WebKitCSSKeyframeRule_keyText_Setter";
 
+
+  /** @domName WebKitCSSKeyframeRule.style */
   CSSStyleDeclaration get style native "WebKitCSSKeyframeRule_style_Getter";
 
 }
@@ -2173,41 +1835,31 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebKitCSSKeyframesRule
-abstract class CSSKeyframesRule implements CSSRule {
+class CSSKeyframesRule extends CSSRule {
+  CSSKeyframesRule.internal(): super.internal();
+
 
   /** @domName WebKitCSSKeyframesRule.cssRules */
-  List<CSSRule> get cssRules;
-
-  /** @domName WebKitCSSKeyframesRule.name */
-  String name;
-
-  /** @domName WebKitCSSKeyframesRule.deleteRule */
-  void deleteRule(String key);
-
-  /** @domName WebKitCSSKeyframesRule.findRule */
-  CSSKeyframeRule findRule(String key);
-
-  /** @domName WebKitCSSKeyframesRule.insertRule */
-  void insertRule(String rule);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSKeyframesRuleImpl extends _CSSRuleImpl implements CSSKeyframesRule {
-
   List<CSSRule> get cssRules native "WebKitCSSKeyframesRule_cssRules_Getter";
 
+
+  /** @domName WebKitCSSKeyframesRule.name */
   String get name native "WebKitCSSKeyframesRule_name_Getter";
 
+
+  /** @domName WebKitCSSKeyframesRule.name */
   void set name(String value) native "WebKitCSSKeyframesRule_name_Setter";
 
+
+  /** @domName WebKitCSSKeyframesRule.deleteRule */
   void deleteRule(String key) native "WebKitCSSKeyframesRule_deleteRule_Callback";
 
+
+  /** @domName WebKitCSSKeyframesRule.findRule */
   CSSKeyframeRule findRule(String key) native "WebKitCSSKeyframesRule_findRule_Callback";
 
+
+  /** @domName WebKitCSSKeyframesRule.insertRule */
   void insertRule(String rule) native "WebKitCSSKeyframesRule_insertRule_Callback";
 
 }
@@ -2218,7 +1870,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebKitCSSMatrix
-abstract class CSSMatrix {
+class CSSMatrix extends NativeFieldWrapperClass1 {
 
   factory CSSMatrix([String cssValue]) {
     if (!?cssValue) {
@@ -2226,217 +1878,222 @@
     }
     return _CSSMatrixFactoryProvider.createCSSMatrix(cssValue);
   }
+  CSSMatrix.internal();
+
 
   /** @domName WebKitCSSMatrix.a */
-  num a;
-
-  /** @domName WebKitCSSMatrix.b */
-  num b;
-
-  /** @domName WebKitCSSMatrix.c */
-  num c;
-
-  /** @domName WebKitCSSMatrix.d */
-  num d;
-
-  /** @domName WebKitCSSMatrix.e */
-  num e;
-
-  /** @domName WebKitCSSMatrix.f */
-  num f;
-
-  /** @domName WebKitCSSMatrix.m11 */
-  num m11;
-
-  /** @domName WebKitCSSMatrix.m12 */
-  num m12;
-
-  /** @domName WebKitCSSMatrix.m13 */
-  num m13;
-
-  /** @domName WebKitCSSMatrix.m14 */
-  num m14;
-
-  /** @domName WebKitCSSMatrix.m21 */
-  num m21;
-
-  /** @domName WebKitCSSMatrix.m22 */
-  num m22;
-
-  /** @domName WebKitCSSMatrix.m23 */
-  num m23;
-
-  /** @domName WebKitCSSMatrix.m24 */
-  num m24;
-
-  /** @domName WebKitCSSMatrix.m31 */
-  num m31;
-
-  /** @domName WebKitCSSMatrix.m32 */
-  num m32;
-
-  /** @domName WebKitCSSMatrix.m33 */
-  num m33;
-
-  /** @domName WebKitCSSMatrix.m34 */
-  num m34;
-
-  /** @domName WebKitCSSMatrix.m41 */
-  num m41;
-
-  /** @domName WebKitCSSMatrix.m42 */
-  num m42;
-
-  /** @domName WebKitCSSMatrix.m43 */
-  num m43;
-
-  /** @domName WebKitCSSMatrix.m44 */
-  num m44;
-
-  /** @domName WebKitCSSMatrix.inverse */
-  CSSMatrix inverse();
-
-  /** @domName WebKitCSSMatrix.multiply */
-  CSSMatrix multiply(CSSMatrix secondMatrix);
-
-  /** @domName WebKitCSSMatrix.rotate */
-  CSSMatrix rotate(num rotX, num rotY, num rotZ);
-
-  /** @domName WebKitCSSMatrix.rotateAxisAngle */
-  CSSMatrix rotateAxisAngle(num x, num y, num z, num angle);
-
-  /** @domName WebKitCSSMatrix.scale */
-  CSSMatrix scale(num scaleX, num scaleY, num scaleZ);
-
-  /** @domName WebKitCSSMatrix.setMatrixValue */
-  void setMatrixValue(String string);
-
-  /** @domName WebKitCSSMatrix.skewX */
-  CSSMatrix skewX(num angle);
-
-  /** @domName WebKitCSSMatrix.skewY */
-  CSSMatrix skewY(num angle);
-
-  /** @domName WebKitCSSMatrix.toString */
-  String toString();
-
-  /** @domName WebKitCSSMatrix.translate */
-  CSSMatrix translate(num x, num y, num z);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSMatrixImpl extends NativeFieldWrapperClass1 implements CSSMatrix {
-
   num get a native "WebKitCSSMatrix_a_Getter";
 
+
+  /** @domName WebKitCSSMatrix.a */
   void set a(num value) native "WebKitCSSMatrix_a_Setter";
 
+
+  /** @domName WebKitCSSMatrix.b */
   num get b native "WebKitCSSMatrix_b_Getter";
 
+
+  /** @domName WebKitCSSMatrix.b */
   void set b(num value) native "WebKitCSSMatrix_b_Setter";
 
+
+  /** @domName WebKitCSSMatrix.c */
   num get c native "WebKitCSSMatrix_c_Getter";
 
+
+  /** @domName WebKitCSSMatrix.c */
   void set c(num value) native "WebKitCSSMatrix_c_Setter";
 
+
+  /** @domName WebKitCSSMatrix.d */
   num get d native "WebKitCSSMatrix_d_Getter";
 
+
+  /** @domName WebKitCSSMatrix.d */
   void set d(num value) native "WebKitCSSMatrix_d_Setter";
 
+
+  /** @domName WebKitCSSMatrix.e */
   num get e native "WebKitCSSMatrix_e_Getter";
 
+
+  /** @domName WebKitCSSMatrix.e */
   void set e(num value) native "WebKitCSSMatrix_e_Setter";
 
+
+  /** @domName WebKitCSSMatrix.f */
   num get f native "WebKitCSSMatrix_f_Getter";
 
+
+  /** @domName WebKitCSSMatrix.f */
   void set f(num value) native "WebKitCSSMatrix_f_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m11 */
   num get m11 native "WebKitCSSMatrix_m11_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m11 */
   void set m11(num value) native "WebKitCSSMatrix_m11_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m12 */
   num get m12 native "WebKitCSSMatrix_m12_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m12 */
   void set m12(num value) native "WebKitCSSMatrix_m12_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m13 */
   num get m13 native "WebKitCSSMatrix_m13_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m13 */
   void set m13(num value) native "WebKitCSSMatrix_m13_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m14 */
   num get m14 native "WebKitCSSMatrix_m14_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m14 */
   void set m14(num value) native "WebKitCSSMatrix_m14_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m21 */
   num get m21 native "WebKitCSSMatrix_m21_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m21 */
   void set m21(num value) native "WebKitCSSMatrix_m21_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m22 */
   num get m22 native "WebKitCSSMatrix_m22_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m22 */
   void set m22(num value) native "WebKitCSSMatrix_m22_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m23 */
   num get m23 native "WebKitCSSMatrix_m23_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m23 */
   void set m23(num value) native "WebKitCSSMatrix_m23_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m24 */
   num get m24 native "WebKitCSSMatrix_m24_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m24 */
   void set m24(num value) native "WebKitCSSMatrix_m24_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m31 */
   num get m31 native "WebKitCSSMatrix_m31_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m31 */
   void set m31(num value) native "WebKitCSSMatrix_m31_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m32 */
   num get m32 native "WebKitCSSMatrix_m32_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m32 */
   void set m32(num value) native "WebKitCSSMatrix_m32_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m33 */
   num get m33 native "WebKitCSSMatrix_m33_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m33 */
   void set m33(num value) native "WebKitCSSMatrix_m33_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m34 */
   num get m34 native "WebKitCSSMatrix_m34_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m34 */
   void set m34(num value) native "WebKitCSSMatrix_m34_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m41 */
   num get m41 native "WebKitCSSMatrix_m41_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m41 */
   void set m41(num value) native "WebKitCSSMatrix_m41_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m42 */
   num get m42 native "WebKitCSSMatrix_m42_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m42 */
   void set m42(num value) native "WebKitCSSMatrix_m42_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m43 */
   num get m43 native "WebKitCSSMatrix_m43_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m43 */
   void set m43(num value) native "WebKitCSSMatrix_m43_Setter";
 
+
+  /** @domName WebKitCSSMatrix.m44 */
   num get m44 native "WebKitCSSMatrix_m44_Getter";
 
+
+  /** @domName WebKitCSSMatrix.m44 */
   void set m44(num value) native "WebKitCSSMatrix_m44_Setter";
 
+
+  /** @domName WebKitCSSMatrix.inverse */
   CSSMatrix inverse() native "WebKitCSSMatrix_inverse_Callback";
 
+
+  /** @domName WebKitCSSMatrix.multiply */
   CSSMatrix multiply(CSSMatrix secondMatrix) native "WebKitCSSMatrix_multiply_Callback";
 
+
+  /** @domName WebKitCSSMatrix.rotate */
   CSSMatrix rotate(num rotX, num rotY, num rotZ) native "WebKitCSSMatrix_rotate_Callback";
 
+
+  /** @domName WebKitCSSMatrix.rotateAxisAngle */
   CSSMatrix rotateAxisAngle(num x, num y, num z, num angle) native "WebKitCSSMatrix_rotateAxisAngle_Callback";
 
+
+  /** @domName WebKitCSSMatrix.scale */
   CSSMatrix scale(num scaleX, num scaleY, num scaleZ) native "WebKitCSSMatrix_scale_Callback";
 
+
+  /** @domName WebKitCSSMatrix.setMatrixValue */
   void setMatrixValue(String string) native "WebKitCSSMatrix_setMatrixValue_Callback";
 
+
+  /** @domName WebKitCSSMatrix.skewX */
   CSSMatrix skewX(num angle) native "WebKitCSSMatrix_skewX_Callback";
 
+
+  /** @domName WebKitCSSMatrix.skewY */
   CSSMatrix skewY(num angle) native "WebKitCSSMatrix_skewY_Callback";
 
+
+  /** @domName WebKitCSSMatrix.toString */
   String toString() native "WebKitCSSMatrix_toString_Callback";
 
+
+  /** @domName WebKitCSSMatrix.translate */
   CSSMatrix translate(num x, num y, num z) native "WebKitCSSMatrix_translate_Callback";
 
 }
@@ -2447,34 +2104,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CSSMediaRule
-abstract class CSSMediaRule implements CSSRule {
+class CSSMediaRule extends CSSRule {
+  CSSMediaRule.internal(): super.internal();
+
 
   /** @domName CSSMediaRule.cssRules */
-  List<CSSRule> get cssRules;
-
-  /** @domName CSSMediaRule.media */
-  MediaList get media;
-
-  /** @domName CSSMediaRule.deleteRule */
-  void deleteRule(int index);
-
-  /** @domName CSSMediaRule.insertRule */
-  int insertRule(String rule, int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSMediaRuleImpl extends _CSSRuleImpl implements CSSMediaRule {
-
   List<CSSRule> get cssRules native "CSSMediaRule_cssRules_Getter";
 
+
+  /** @domName CSSMediaRule.media */
   MediaList get media native "CSSMediaRule_media_Getter";
 
+
+  /** @domName CSSMediaRule.deleteRule */
   void deleteRule(int index) native "CSSMediaRule_deleteRule_Callback";
 
+
+  /** @domName CSSMediaRule.insertRule */
   int insertRule(String rule, int index) native "CSSMediaRule_insertRule_Callback";
 
 }
@@ -2485,26 +2131,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CSSPageRule
-abstract class CSSPageRule implements CSSRule {
+class CSSPageRule extends CSSRule {
+  CSSPageRule.internal(): super.internal();
+
 
   /** @domName CSSPageRule.selectorText */
-  String selectorText;
-
-  /** @domName CSSPageRule.style */
-  CSSStyleDeclaration get style;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSPageRuleImpl extends _CSSRuleImpl implements CSSPageRule {
-
   String get selectorText native "CSSPageRule_selectorText_Getter";
 
+
+  /** @domName CSSPageRule.selectorText */
   void set selectorText(String value) native "CSSPageRule_selectorText_Setter";
 
+
+  /** @domName CSSPageRule.style */
   CSSStyleDeclaration get style native "CSSPageRule_style_Getter";
 
 }
@@ -2515,7 +2154,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CSSPrimitiveValue
-abstract class CSSPrimitiveValue implements CSSValue {
+class CSSPrimitiveValue extends CSSValue {
+  CSSPrimitiveValue.internal(): super.internal();
 
   static const int CSS_ATTR = 22;
 
@@ -2575,52 +2215,36 @@
 
   static const int CSS_VW = 26;
 
+
   /** @domName CSSPrimitiveValue.primitiveType */
-  int get primitiveType;
-
-  /** @domName CSSPrimitiveValue.getCounterValue */
-  Counter getCounterValue();
-
-  /** @domName CSSPrimitiveValue.getFloatValue */
-  num getFloatValue(int unitType);
-
-  /** @domName CSSPrimitiveValue.getRGBColorValue */
-  RGBColor getRGBColorValue();
-
-  /** @domName CSSPrimitiveValue.getRectValue */
-  Rect getRectValue();
-
-  /** @domName CSSPrimitiveValue.getStringValue */
-  String getStringValue();
-
-  /** @domName CSSPrimitiveValue.setFloatValue */
-  void setFloatValue(int unitType, num floatValue);
-
-  /** @domName CSSPrimitiveValue.setStringValue */
-  void setStringValue(int stringType, String stringValue);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSPrimitiveValueImpl extends _CSSValueImpl implements CSSPrimitiveValue {
-
   int get primitiveType native "CSSPrimitiveValue_primitiveType_Getter";
 
+
+  /** @domName CSSPrimitiveValue.getCounterValue */
   Counter getCounterValue() native "CSSPrimitiveValue_getCounterValue_Callback";
 
+
+  /** @domName CSSPrimitiveValue.getFloatValue */
   num getFloatValue(int unitType) native "CSSPrimitiveValue_getFloatValue_Callback";
 
+
+  /** @domName CSSPrimitiveValue.getRGBColorValue */
   RGBColor getRGBColorValue() native "CSSPrimitiveValue_getRGBColorValue_Callback";
 
+
+  /** @domName CSSPrimitiveValue.getRectValue */
   Rect getRectValue() native "CSSPrimitiveValue_getRectValue_Callback";
 
+
+  /** @domName CSSPrimitiveValue.getStringValue */
   String getStringValue() native "CSSPrimitiveValue_getStringValue_Callback";
 
+
+  /** @domName CSSPrimitiveValue.setFloatValue */
   void setFloatValue(int unitType, num floatValue) native "CSSPrimitiveValue_setFloatValue_Callback";
 
+
+  /** @domName CSSPrimitiveValue.setStringValue */
   void setStringValue(int stringType, String stringValue) native "CSSPrimitiveValue_setStringValue_Callback";
 
 }
@@ -2631,7 +2255,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CSSRule
-abstract class CSSRule {
+class CSSRule extends NativeFieldWrapperClass1 {
+  CSSRule.internal();
 
   static const int CHARSET_RULE = 2;
 
@@ -2651,34 +2276,24 @@
 
   static const int WEBKIT_KEYFRAME_RULE = 8;
 
+
   /** @domName CSSRule.cssText */
-  String cssText;
-
-  /** @domName CSSRule.parentRule */
-  CSSRule get parentRule;
-
-  /** @domName CSSRule.parentStyleSheet */
-  CSSStyleSheet get parentStyleSheet;
-
-  /** @domName CSSRule.type */
-  int get type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSRuleImpl extends NativeFieldWrapperClass1 implements CSSRule {
-
   String get cssText native "CSSRule_cssText_Getter";
 
+
+  /** @domName CSSRule.cssText */
   void set cssText(String value) native "CSSRule_cssText_Setter";
 
+
+  /** @domName CSSRule.parentRule */
   CSSRule get parentRule native "CSSRule_parentRule_Getter";
 
+
+  /** @domName CSSRule.parentStyleSheet */
   CSSStyleSheet get parentStyleSheet native "CSSRule_parentStyleSheet_Getter";
 
+
+  /** @domName CSSRule.type */
   int get type native "CSSRule_type_Getter";
 
 }
@@ -2686,1991 +2301,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-class _CSSRuleListImpl extends NativeFieldWrapperClass1 implements List<CSSRule> {
-
-  int get length native "CSSRuleList_length_Getter";
-
-  CSSRule operator[](int index) native "CSSRuleList_item_Callback";
-
-  void operator[]=(int index, CSSRule value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<CSSRule> mixins.
-  // CSSRule is the element type.
-
-  // From Iterable<CSSRule>:
-
-  Iterator<CSSRule> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<CSSRule>(this);
-  }
-
-  // From Collection<CSSRule>:
-
-  void add(CSSRule value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(CSSRule value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<CSSRule> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(CSSRule element) => _Collections.contains(this, element);
-
-  void forEach(void f(CSSRule element)) => _Collections.forEach(this, f);
-
-  Collection map(f(CSSRule element)) => _Collections.map(this, [], f);
-
-  Collection<CSSRule> filter(bool f(CSSRule element)) =>
-     _Collections.filter(this, <CSSRule>[], f);
-
-  bool every(bool f(CSSRule element)) => _Collections.every(this, f);
-
-  bool some(bool f(CSSRule element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<CSSRule>:
-
-  void sort([Comparator<CSSRule> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(CSSRule element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(CSSRule element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  CSSRule get last => this[length - 1];
-
-  CSSRule removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<CSSRule> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [CSSRule initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<CSSRule> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <CSSRule>[]);
-
-  // -- end List<CSSRule> mixins.
-
-  CSSRule item(int index) native "CSSRuleList_item_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName CSSStyleDeclaration
-abstract class CSSStyleDeclaration  {
-  factory CSSStyleDeclaration() => _CSSStyleDeclarationFactoryProvider.createCSSStyleDeclaration();
-  factory CSSStyleDeclaration.css(String css) => _CSSStyleDeclarationFactoryProvider.createCSSStyleDeclaration_css(css);
-
-
-  /** @domName CSSStyleDeclaration.cssText */
-  String cssText;
-
-  /** @domName CSSStyleDeclaration.length */
-  int get length;
-
-  /** @domName CSSStyleDeclaration.parentRule */
-  CSSRule get parentRule;
-
-  /** @domName CSSStyleDeclaration.getPropertyCSSValue */
-  CSSValue getPropertyCSSValue(String propertyName);
-
-  /** @domName CSSStyleDeclaration.getPropertyPriority */
-  String getPropertyPriority(String propertyName);
-
-  /** @domName CSSStyleDeclaration.getPropertyShorthand */
-  String getPropertyShorthand(String propertyName);
-
-  /** @domName CSSStyleDeclaration.isPropertyImplicit */
-  bool isPropertyImplicit(String propertyName);
-
-  /** @domName CSSStyleDeclaration.item */
-  String item(int index);
-
-  /** @domName CSSStyleDeclaration.removeProperty */
-  String removeProperty(String propertyName);
-
-  /** @domName CSSStyleDeclaration.setProperty */
-  void setProperty(String propertyName, String value, [String priority]);
-
-
-  /** Gets the value of "animation" */
-  String get animation;
-
-  /** Sets the value of "animation" */
-  void set animation(var value);
-
-  /** Gets the value of "animation-delay" */
-  String get animationDelay;
-
-  /** Sets the value of "animation-delay" */
-  void set animationDelay(var value);
-
-  /** Gets the value of "animation-direction" */
-  String get animationDirection;
-
-  /** Sets the value of "animation-direction" */
-  void set animationDirection(var value);
-
-  /** Gets the value of "animation-duration" */
-  String get animationDuration;
-
-  /** Sets the value of "animation-duration" */
-  void set animationDuration(var value);
-
-  /** Gets the value of "animation-fill-mode" */
-  String get animationFillMode;
-
-  /** Sets the value of "animation-fill-mode" */
-  void set animationFillMode(var value);
-
-  /** Gets the value of "animation-iteration-count" */
-  String get animationIterationCount;
-
-  /** Sets the value of "animation-iteration-count" */
-  void set animationIterationCount(var value);
-
-  /** Gets the value of "animation-name" */
-  String get animationName;
-
-  /** Sets the value of "animation-name" */
-  void set animationName(var value);
-
-  /** Gets the value of "animation-play-state" */
-  String get animationPlayState;
-
-  /** Sets the value of "animation-play-state" */
-  void set animationPlayState(var value);
-
-  /** Gets the value of "animation-timing-function" */
-  String get animationTimingFunction;
-
-  /** Sets the value of "animation-timing-function" */
-  void set animationTimingFunction(var value);
-
-  /** Gets the value of "appearance" */
-  String get appearance;
-
-  /** Sets the value of "appearance" */
-  void set appearance(var value);
-
-  /** Gets the value of "backface-visibility" */
-  String get backfaceVisibility;
-
-  /** Sets the value of "backface-visibility" */
-  void set backfaceVisibility(var value);
-
-  /** Gets the value of "background" */
-  String get background;
-
-  /** Sets the value of "background" */
-  void set background(var value);
-
-  /** Gets the value of "background-attachment" */
-  String get backgroundAttachment;
-
-  /** Sets the value of "background-attachment" */
-  void set backgroundAttachment(var value);
-
-  /** Gets the value of "background-clip" */
-  String get backgroundClip;
-
-  /** Sets the value of "background-clip" */
-  void set backgroundClip(var value);
-
-  /** Gets the value of "background-color" */
-  String get backgroundColor;
-
-  /** Sets the value of "background-color" */
-  void set backgroundColor(var value);
-
-  /** Gets the value of "background-composite" */
-  String get backgroundComposite;
-
-  /** Sets the value of "background-composite" */
-  void set backgroundComposite(var value);
-
-  /** Gets the value of "background-image" */
-  String get backgroundImage;
-
-  /** Sets the value of "background-image" */
-  void set backgroundImage(var value);
-
-  /** Gets the value of "background-origin" */
-  String get backgroundOrigin;
-
-  /** Sets the value of "background-origin" */
-  void set backgroundOrigin(var value);
-
-  /** Gets the value of "background-position" */
-  String get backgroundPosition;
-
-  /** Sets the value of "background-position" */
-  void set backgroundPosition(var value);
-
-  /** Gets the value of "background-position-x" */
-  String get backgroundPositionX;
-
-  /** Sets the value of "background-position-x" */
-  void set backgroundPositionX(var value);
-
-  /** Gets the value of "background-position-y" */
-  String get backgroundPositionY;
-
-  /** Sets the value of "background-position-y" */
-  void set backgroundPositionY(var value);
-
-  /** Gets the value of "background-repeat" */
-  String get backgroundRepeat;
-
-  /** Sets the value of "background-repeat" */
-  void set backgroundRepeat(var value);
-
-  /** Gets the value of "background-repeat-x" */
-  String get backgroundRepeatX;
-
-  /** Sets the value of "background-repeat-x" */
-  void set backgroundRepeatX(var value);
-
-  /** Gets the value of "background-repeat-y" */
-  String get backgroundRepeatY;
-
-  /** Sets the value of "background-repeat-y" */
-  void set backgroundRepeatY(var value);
-
-  /** Gets the value of "background-size" */
-  String get backgroundSize;
-
-  /** Sets the value of "background-size" */
-  void set backgroundSize(var value);
-
-  /** Gets the value of "border" */
-  String get border;
-
-  /** Sets the value of "border" */
-  void set border(var value);
-
-  /** Gets the value of "border-after" */
-  String get borderAfter;
-
-  /** Sets the value of "border-after" */
-  void set borderAfter(var value);
-
-  /** Gets the value of "border-after-color" */
-  String get borderAfterColor;
-
-  /** Sets the value of "border-after-color" */
-  void set borderAfterColor(var value);
-
-  /** Gets the value of "border-after-style" */
-  String get borderAfterStyle;
-
-  /** Sets the value of "border-after-style" */
-  void set borderAfterStyle(var value);
-
-  /** Gets the value of "border-after-width" */
-  String get borderAfterWidth;
-
-  /** Sets the value of "border-after-width" */
-  void set borderAfterWidth(var value);
-
-  /** Gets the value of "border-before" */
-  String get borderBefore;
-
-  /** Sets the value of "border-before" */
-  void set borderBefore(var value);
-
-  /** Gets the value of "border-before-color" */
-  String get borderBeforeColor;
-
-  /** Sets the value of "border-before-color" */
-  void set borderBeforeColor(var value);
-
-  /** Gets the value of "border-before-style" */
-  String get borderBeforeStyle;
-
-  /** Sets the value of "border-before-style" */
-  void set borderBeforeStyle(var value);
-
-  /** Gets the value of "border-before-width" */
-  String get borderBeforeWidth;
-
-  /** Sets the value of "border-before-width" */
-  void set borderBeforeWidth(var value);
-
-  /** Gets the value of "border-bottom" */
-  String get borderBottom;
-
-  /** Sets the value of "border-bottom" */
-  void set borderBottom(var value);
-
-  /** Gets the value of "border-bottom-color" */
-  String get borderBottomColor;
-
-  /** Sets the value of "border-bottom-color" */
-  void set borderBottomColor(var value);
-
-  /** Gets the value of "border-bottom-left-radius" */
-  String get borderBottomLeftRadius;
-
-  /** Sets the value of "border-bottom-left-radius" */
-  void set borderBottomLeftRadius(var value);
-
-  /** Gets the value of "border-bottom-right-radius" */
-  String get borderBottomRightRadius;
-
-  /** Sets the value of "border-bottom-right-radius" */
-  void set borderBottomRightRadius(var value);
-
-  /** Gets the value of "border-bottom-style" */
-  String get borderBottomStyle;
-
-  /** Sets the value of "border-bottom-style" */
-  void set borderBottomStyle(var value);
-
-  /** Gets the value of "border-bottom-width" */
-  String get borderBottomWidth;
-
-  /** Sets the value of "border-bottom-width" */
-  void set borderBottomWidth(var value);
-
-  /** Gets the value of "border-collapse" */
-  String get borderCollapse;
-
-  /** Sets the value of "border-collapse" */
-  void set borderCollapse(var value);
-
-  /** Gets the value of "border-color" */
-  String get borderColor;
-
-  /** Sets the value of "border-color" */
-  void set borderColor(var value);
-
-  /** Gets the value of "border-end" */
-  String get borderEnd;
-
-  /** Sets the value of "border-end" */
-  void set borderEnd(var value);
-
-  /** Gets the value of "border-end-color" */
-  String get borderEndColor;
-
-  /** Sets the value of "border-end-color" */
-  void set borderEndColor(var value);
-
-  /** Gets the value of "border-end-style" */
-  String get borderEndStyle;
-
-  /** Sets the value of "border-end-style" */
-  void set borderEndStyle(var value);
-
-  /** Gets the value of "border-end-width" */
-  String get borderEndWidth;
-
-  /** Sets the value of "border-end-width" */
-  void set borderEndWidth(var value);
-
-  /** Gets the value of "border-fit" */
-  String get borderFit;
-
-  /** Sets the value of "border-fit" */
-  void set borderFit(var value);
-
-  /** Gets the value of "border-horizontal-spacing" */
-  String get borderHorizontalSpacing;
-
-  /** Sets the value of "border-horizontal-spacing" */
-  void set borderHorizontalSpacing(var value);
-
-  /** Gets the value of "border-image" */
-  String get borderImage;
-
-  /** Sets the value of "border-image" */
-  void set borderImage(var value);
-
-  /** Gets the value of "border-image-outset" */
-  String get borderImageOutset;
-
-  /** Sets the value of "border-image-outset" */
-  void set borderImageOutset(var value);
-
-  /** Gets the value of "border-image-repeat" */
-  String get borderImageRepeat;
-
-  /** Sets the value of "border-image-repeat" */
-  void set borderImageRepeat(var value);
-
-  /** Gets the value of "border-image-slice" */
-  String get borderImageSlice;
-
-  /** Sets the value of "border-image-slice" */
-  void set borderImageSlice(var value);
-
-  /** Gets the value of "border-image-source" */
-  String get borderImageSource;
-
-  /** Sets the value of "border-image-source" */
-  void set borderImageSource(var value);
-
-  /** Gets the value of "border-image-width" */
-  String get borderImageWidth;
-
-  /** Sets the value of "border-image-width" */
-  void set borderImageWidth(var value);
-
-  /** Gets the value of "border-left" */
-  String get borderLeft;
-
-  /** Sets the value of "border-left" */
-  void set borderLeft(var value);
-
-  /** Gets the value of "border-left-color" */
-  String get borderLeftColor;
-
-  /** Sets the value of "border-left-color" */
-  void set borderLeftColor(var value);
-
-  /** Gets the value of "border-left-style" */
-  String get borderLeftStyle;
-
-  /** Sets the value of "border-left-style" */
-  void set borderLeftStyle(var value);
-
-  /** Gets the value of "border-left-width" */
-  String get borderLeftWidth;
-
-  /** Sets the value of "border-left-width" */
-  void set borderLeftWidth(var value);
-
-  /** Gets the value of "border-radius" */
-  String get borderRadius;
-
-  /** Sets the value of "border-radius" */
-  void set borderRadius(var value);
-
-  /** Gets the value of "border-right" */
-  String get borderRight;
-
-  /** Sets the value of "border-right" */
-  void set borderRight(var value);
-
-  /** Gets the value of "border-right-color" */
-  String get borderRightColor;
-
-  /** Sets the value of "border-right-color" */
-  void set borderRightColor(var value);
-
-  /** Gets the value of "border-right-style" */
-  String get borderRightStyle;
-
-  /** Sets the value of "border-right-style" */
-  void set borderRightStyle(var value);
-
-  /** Gets the value of "border-right-width" */
-  String get borderRightWidth;
-
-  /** Sets the value of "border-right-width" */
-  void set borderRightWidth(var value);
-
-  /** Gets the value of "border-spacing" */
-  String get borderSpacing;
-
-  /** Sets the value of "border-spacing" */
-  void set borderSpacing(var value);
-
-  /** Gets the value of "border-start" */
-  String get borderStart;
-
-  /** Sets the value of "border-start" */
-  void set borderStart(var value);
-
-  /** Gets the value of "border-start-color" */
-  String get borderStartColor;
-
-  /** Sets the value of "border-start-color" */
-  void set borderStartColor(var value);
-
-  /** Gets the value of "border-start-style" */
-  String get borderStartStyle;
-
-  /** Sets the value of "border-start-style" */
-  void set borderStartStyle(var value);
-
-  /** Gets the value of "border-start-width" */
-  String get borderStartWidth;
-
-  /** Sets the value of "border-start-width" */
-  void set borderStartWidth(var value);
-
-  /** Gets the value of "border-style" */
-  String get borderStyle;
-
-  /** Sets the value of "border-style" */
-  void set borderStyle(var value);
-
-  /** Gets the value of "border-top" */
-  String get borderTop;
-
-  /** Sets the value of "border-top" */
-  void set borderTop(var value);
-
-  /** Gets the value of "border-top-color" */
-  String get borderTopColor;
-
-  /** Sets the value of "border-top-color" */
-  void set borderTopColor(var value);
-
-  /** Gets the value of "border-top-left-radius" */
-  String get borderTopLeftRadius;
-
-  /** Sets the value of "border-top-left-radius" */
-  void set borderTopLeftRadius(var value);
-
-  /** Gets the value of "border-top-right-radius" */
-  String get borderTopRightRadius;
-
-  /** Sets the value of "border-top-right-radius" */
-  void set borderTopRightRadius(var value);
-
-  /** Gets the value of "border-top-style" */
-  String get borderTopStyle;
-
-  /** Sets the value of "border-top-style" */
-  void set borderTopStyle(var value);
-
-  /** Gets the value of "border-top-width" */
-  String get borderTopWidth;
-
-  /** Sets the value of "border-top-width" */
-  void set borderTopWidth(var value);
-
-  /** Gets the value of "border-vertical-spacing" */
-  String get borderVerticalSpacing;
-
-  /** Sets the value of "border-vertical-spacing" */
-  void set borderVerticalSpacing(var value);
-
-  /** Gets the value of "border-width" */
-  String get borderWidth;
-
-  /** Sets the value of "border-width" */
-  void set borderWidth(var value);
-
-  /** Gets the value of "bottom" */
-  String get bottom;
-
-  /** Sets the value of "bottom" */
-  void set bottom(var value);
-
-  /** Gets the value of "box-align" */
-  String get boxAlign;
-
-  /** Sets the value of "box-align" */
-  void set boxAlign(var value);
-
-  /** Gets the value of "box-direction" */
-  String get boxDirection;
-
-  /** Sets the value of "box-direction" */
-  void set boxDirection(var value);
-
-  /** Gets the value of "box-flex" */
-  String get boxFlex;
-
-  /** Sets the value of "box-flex" */
-  void set boxFlex(var value);
-
-  /** Gets the value of "box-flex-group" */
-  String get boxFlexGroup;
-
-  /** Sets the value of "box-flex-group" */
-  void set boxFlexGroup(var value);
-
-  /** Gets the value of "box-lines" */
-  String get boxLines;
-
-  /** Sets the value of "box-lines" */
-  void set boxLines(var value);
-
-  /** Gets the value of "box-ordinal-group" */
-  String get boxOrdinalGroup;
-
-  /** Sets the value of "box-ordinal-group" */
-  void set boxOrdinalGroup(var value);
-
-  /** Gets the value of "box-orient" */
-  String get boxOrient;
-
-  /** Sets the value of "box-orient" */
-  void set boxOrient(var value);
-
-  /** Gets the value of "box-pack" */
-  String get boxPack;
-
-  /** Sets the value of "box-pack" */
-  void set boxPack(var value);
-
-  /** Gets the value of "box-reflect" */
-  String get boxReflect;
-
-  /** Sets the value of "box-reflect" */
-  void set boxReflect(var value);
-
-  /** Gets the value of "box-shadow" */
-  String get boxShadow;
-
-  /** Sets the value of "box-shadow" */
-  void set boxShadow(var value);
-
-  /** Gets the value of "box-sizing" */
-  String get boxSizing;
-
-  /** Sets the value of "box-sizing" */
-  void set boxSizing(var value);
-
-  /** Gets the value of "caption-side" */
-  String get captionSide;
-
-  /** Sets the value of "caption-side" */
-  void set captionSide(var value);
-
-  /** Gets the value of "clear" */
-  String get clear;
-
-  /** Sets the value of "clear" */
-  void set clear(var value);
-
-  /** Gets the value of "clip" */
-  String get clip;
-
-  /** Sets the value of "clip" */
-  void set clip(var value);
-
-  /** Gets the value of "color" */
-  String get color;
-
-  /** Sets the value of "color" */
-  void set color(var value);
-
-  /** Gets the value of "color-correction" */
-  String get colorCorrection;
-
-  /** Sets the value of "color-correction" */
-  void set colorCorrection(var value);
-
-  /** Gets the value of "column-break-after" */
-  String get columnBreakAfter;
-
-  /** Sets the value of "column-break-after" */
-  void set columnBreakAfter(var value);
-
-  /** Gets the value of "column-break-before" */
-  String get columnBreakBefore;
-
-  /** Sets the value of "column-break-before" */
-  void set columnBreakBefore(var value);
-
-  /** Gets the value of "column-break-inside" */
-  String get columnBreakInside;
-
-  /** Sets the value of "column-break-inside" */
-  void set columnBreakInside(var value);
-
-  /** Gets the value of "column-count" */
-  String get columnCount;
-
-  /** Sets the value of "column-count" */
-  void set columnCount(var value);
-
-  /** Gets the value of "column-gap" */
-  String get columnGap;
-
-  /** Sets the value of "column-gap" */
-  void set columnGap(var value);
-
-  /** Gets the value of "column-rule" */
-  String get columnRule;
-
-  /** Sets the value of "column-rule" */
-  void set columnRule(var value);
-
-  /** Gets the value of "column-rule-color" */
-  String get columnRuleColor;
-
-  /** Sets the value of "column-rule-color" */
-  void set columnRuleColor(var value);
-
-  /** Gets the value of "column-rule-style" */
-  String get columnRuleStyle;
-
-  /** Sets the value of "column-rule-style" */
-  void set columnRuleStyle(var value);
-
-  /** Gets the value of "column-rule-width" */
-  String get columnRuleWidth;
-
-  /** Sets the value of "column-rule-width" */
-  void set columnRuleWidth(var value);
-
-  /** Gets the value of "column-span" */
-  String get columnSpan;
-
-  /** Sets the value of "column-span" */
-  void set columnSpan(var value);
-
-  /** Gets the value of "column-width" */
-  String get columnWidth;
-
-  /** Sets the value of "column-width" */
-  void set columnWidth(var value);
-
-  /** Gets the value of "columns" */
-  String get columns;
-
-  /** Sets the value of "columns" */
-  void set columns(var value);
-
-  /** Gets the value of "content" */
-  String get content;
-
-  /** Sets the value of "content" */
-  void set content(var value);
-
-  /** Gets the value of "counter-increment" */
-  String get counterIncrement;
-
-  /** Sets the value of "counter-increment" */
-  void set counterIncrement(var value);
-
-  /** Gets the value of "counter-reset" */
-  String get counterReset;
-
-  /** Sets the value of "counter-reset" */
-  void set counterReset(var value);
-
-  /** Gets the value of "cursor" */
-  String get cursor;
-
-  /** Sets the value of "cursor" */
-  void set cursor(var value);
-
-  /** Gets the value of "direction" */
-  String get direction;
-
-  /** Sets the value of "direction" */
-  void set direction(var value);
-
-  /** Gets the value of "display" */
-  String get display;
-
-  /** Sets the value of "display" */
-  void set display(var value);
-
-  /** Gets the value of "empty-cells" */
-  String get emptyCells;
-
-  /** Sets the value of "empty-cells" */
-  void set emptyCells(var value);
-
-  /** Gets the value of "filter" */
-  String get filter;
-
-  /** Sets the value of "filter" */
-  void set filter(var value);
-
-  /** Gets the value of "flex-align" */
-  String get flexAlign;
-
-  /** Sets the value of "flex-align" */
-  void set flexAlign(var value);
-
-  /** Gets the value of "flex-flow" */
-  String get flexFlow;
-
-  /** Sets the value of "flex-flow" */
-  void set flexFlow(var value);
-
-  /** Gets the value of "flex-order" */
-  String get flexOrder;
-
-  /** Sets the value of "flex-order" */
-  void set flexOrder(var value);
-
-  /** Gets the value of "flex-pack" */
-  String get flexPack;
-
-  /** Sets the value of "flex-pack" */
-  void set flexPack(var value);
-
-  /** Gets the value of "float" */
-  String get float;
-
-  /** Sets the value of "float" */
-  void set float(var value);
-
-  /** Gets the value of "flow-from" */
-  String get flowFrom;
-
-  /** Sets the value of "flow-from" */
-  void set flowFrom(var value);
-
-  /** Gets the value of "flow-into" */
-  String get flowInto;
-
-  /** Sets the value of "flow-into" */
-  void set flowInto(var value);
-
-  /** Gets the value of "font" */
-  String get font;
-
-  /** Sets the value of "font" */
-  void set font(var value);
-
-  /** Gets the value of "font-family" */
-  String get fontFamily;
-
-  /** Sets the value of "font-family" */
-  void set fontFamily(var value);
-
-  /** Gets the value of "font-feature-settings" */
-  String get fontFeatureSettings;
-
-  /** Sets the value of "font-feature-settings" */
-  void set fontFeatureSettings(var value);
-
-  /** Gets the value of "font-size" */
-  String get fontSize;
-
-  /** Sets the value of "font-size" */
-  void set fontSize(var value);
-
-  /** Gets the value of "font-size-delta" */
-  String get fontSizeDelta;
-
-  /** Sets the value of "font-size-delta" */
-  void set fontSizeDelta(var value);
-
-  /** Gets the value of "font-smoothing" */
-  String get fontSmoothing;
-
-  /** Sets the value of "font-smoothing" */
-  void set fontSmoothing(var value);
-
-  /** Gets the value of "font-stretch" */
-  String get fontStretch;
-
-  /** Sets the value of "font-stretch" */
-  void set fontStretch(var value);
-
-  /** Gets the value of "font-style" */
-  String get fontStyle;
-
-  /** Sets the value of "font-style" */
-  void set fontStyle(var value);
-
-  /** Gets the value of "font-variant" */
-  String get fontVariant;
-
-  /** Sets the value of "font-variant" */
-  void set fontVariant(var value);
-
-  /** Gets the value of "font-weight" */
-  String get fontWeight;
-
-  /** Sets the value of "font-weight" */
-  void set fontWeight(var value);
-
-  /** @domName CSSStyleDeclaration.getPropertyValue. */
-  String getPropertyValue(String propertyName);
-
-  /** Gets the value of "height" */
-  String get height;
-
-  /** Sets the value of "height" */
-  void set height(var value);
-
-  /** Gets the value of "highlight" */
-  String get highlight;
-
-  /** Sets the value of "highlight" */
-  void set highlight(var value);
-
-  /** Gets the value of "hyphenate-character" */
-  String get hyphenateCharacter;
-
-  /** Sets the value of "hyphenate-character" */
-  void set hyphenateCharacter(var value);
-
-  /** Gets the value of "hyphenate-limit-after" */
-  String get hyphenateLimitAfter;
-
-  /** Sets the value of "hyphenate-limit-after" */
-  void set hyphenateLimitAfter(var value);
-
-  /** Gets the value of "hyphenate-limit-before" */
-  String get hyphenateLimitBefore;
-
-  /** Sets the value of "hyphenate-limit-before" */
-  void set hyphenateLimitBefore(var value);
-
-  /** Gets the value of "hyphenate-limit-lines" */
-  String get hyphenateLimitLines;
-
-  /** Sets the value of "hyphenate-limit-lines" */
-  void set hyphenateLimitLines(var value);
-
-  /** Gets the value of "hyphens" */
-  String get hyphens;
-
-  /** Sets the value of "hyphens" */
-  void set hyphens(var value);
-
-  /** Gets the value of "image-rendering" */
-  String get imageRendering;
-
-  /** Sets the value of "image-rendering" */
-  void set imageRendering(var value);
-
-  /** Gets the value of "left" */
-  String get left;
-
-  /** Sets the value of "left" */
-  void set left(var value);
-
-  /** Gets the value of "letter-spacing" */
-  String get letterSpacing;
-
-  /** Sets the value of "letter-spacing" */
-  void set letterSpacing(var value);
-
-  /** Gets the value of "line-box-contain" */
-  String get lineBoxContain;
-
-  /** Sets the value of "line-box-contain" */
-  void set lineBoxContain(var value);
-
-  /** Gets the value of "line-break" */
-  String get lineBreak;
-
-  /** Sets the value of "line-break" */
-  void set lineBreak(var value);
-
-  /** Gets the value of "line-clamp" */
-  String get lineClamp;
-
-  /** Sets the value of "line-clamp" */
-  void set lineClamp(var value);
-
-  /** Gets the value of "line-height" */
-  String get lineHeight;
-
-  /** Sets the value of "line-height" */
-  void set lineHeight(var value);
-
-  /** Gets the value of "list-style" */
-  String get listStyle;
-
-  /** Sets the value of "list-style" */
-  void set listStyle(var value);
-
-  /** Gets the value of "list-style-image" */
-  String get listStyleImage;
-
-  /** Sets the value of "list-style-image" */
-  void set listStyleImage(var value);
-
-  /** Gets the value of "list-style-position" */
-  String get listStylePosition;
-
-  /** Sets the value of "list-style-position" */
-  void set listStylePosition(var value);
-
-  /** Gets the value of "list-style-type" */
-  String get listStyleType;
-
-  /** Sets the value of "list-style-type" */
-  void set listStyleType(var value);
-
-  /** Gets the value of "locale" */
-  String get locale;
-
-  /** Sets the value of "locale" */
-  void set locale(var value);
-
-  /** Gets the value of "logical-height" */
-  String get logicalHeight;
-
-  /** Sets the value of "logical-height" */
-  void set logicalHeight(var value);
-
-  /** Gets the value of "logical-width" */
-  String get logicalWidth;
-
-  /** Sets the value of "logical-width" */
-  void set logicalWidth(var value);
-
-  /** Gets the value of "margin" */
-  String get margin;
-
-  /** Sets the value of "margin" */
-  void set margin(var value);
-
-  /** Gets the value of "margin-after" */
-  String get marginAfter;
-
-  /** Sets the value of "margin-after" */
-  void set marginAfter(var value);
-
-  /** Gets the value of "margin-after-collapse" */
-  String get marginAfterCollapse;
-
-  /** Sets the value of "margin-after-collapse" */
-  void set marginAfterCollapse(var value);
-
-  /** Gets the value of "margin-before" */
-  String get marginBefore;
-
-  /** Sets the value of "margin-before" */
-  void set marginBefore(var value);
-
-  /** Gets the value of "margin-before-collapse" */
-  String get marginBeforeCollapse;
-
-  /** Sets the value of "margin-before-collapse" */
-  void set marginBeforeCollapse(var value);
-
-  /** Gets the value of "margin-bottom" */
-  String get marginBottom;
-
-  /** Sets the value of "margin-bottom" */
-  void set marginBottom(var value);
-
-  /** Gets the value of "margin-bottom-collapse" */
-  String get marginBottomCollapse;
-
-  /** Sets the value of "margin-bottom-collapse" */
-  void set marginBottomCollapse(var value);
-
-  /** Gets the value of "margin-collapse" */
-  String get marginCollapse;
-
-  /** Sets the value of "margin-collapse" */
-  void set marginCollapse(var value);
-
-  /** Gets the value of "margin-end" */
-  String get marginEnd;
-
-  /** Sets the value of "margin-end" */
-  void set marginEnd(var value);
-
-  /** Gets the value of "margin-left" */
-  String get marginLeft;
-
-  /** Sets the value of "margin-left" */
-  void set marginLeft(var value);
-
-  /** Gets the value of "margin-right" */
-  String get marginRight;
-
-  /** Sets the value of "margin-right" */
-  void set marginRight(var value);
-
-  /** Gets the value of "margin-start" */
-  String get marginStart;
-
-  /** Sets the value of "margin-start" */
-  void set marginStart(var value);
-
-  /** Gets the value of "margin-top" */
-  String get marginTop;
-
-  /** Sets the value of "margin-top" */
-  void set marginTop(var value);
-
-  /** Gets the value of "margin-top-collapse" */
-  String get marginTopCollapse;
-
-  /** Sets the value of "margin-top-collapse" */
-  void set marginTopCollapse(var value);
-
-  /** Gets the value of "marquee" */
-  String get marquee;
-
-  /** Sets the value of "marquee" */
-  void set marquee(var value);
-
-  /** Gets the value of "marquee-direction" */
-  String get marqueeDirection;
-
-  /** Sets the value of "marquee-direction" */
-  void set marqueeDirection(var value);
-
-  /** Gets the value of "marquee-increment" */
-  String get marqueeIncrement;
-
-  /** Sets the value of "marquee-increment" */
-  void set marqueeIncrement(var value);
-
-  /** Gets the value of "marquee-repetition" */
-  String get marqueeRepetition;
-
-  /** Sets the value of "marquee-repetition" */
-  void set marqueeRepetition(var value);
-
-  /** Gets the value of "marquee-speed" */
-  String get marqueeSpeed;
-
-  /** Sets the value of "marquee-speed" */
-  void set marqueeSpeed(var value);
-
-  /** Gets the value of "marquee-style" */
-  String get marqueeStyle;
-
-  /** Sets the value of "marquee-style" */
-  void set marqueeStyle(var value);
-
-  /** Gets the value of "mask" */
-  String get mask;
-
-  /** Sets the value of "mask" */
-  void set mask(var value);
-
-  /** Gets the value of "mask-attachment" */
-  String get maskAttachment;
-
-  /** Sets the value of "mask-attachment" */
-  void set maskAttachment(var value);
-
-  /** Gets the value of "mask-box-image" */
-  String get maskBoxImage;
-
-  /** Sets the value of "mask-box-image" */
-  void set maskBoxImage(var value);
-
-  /** Gets the value of "mask-box-image-outset" */
-  String get maskBoxImageOutset;
-
-  /** Sets the value of "mask-box-image-outset" */
-  void set maskBoxImageOutset(var value);
-
-  /** Gets the value of "mask-box-image-repeat" */
-  String get maskBoxImageRepeat;
-
-  /** Sets the value of "mask-box-image-repeat" */
-  void set maskBoxImageRepeat(var value);
-
-  /** Gets the value of "mask-box-image-slice" */
-  String get maskBoxImageSlice;
-
-  /** Sets the value of "mask-box-image-slice" */
-  void set maskBoxImageSlice(var value);
-
-  /** Gets the value of "mask-box-image-source" */
-  String get maskBoxImageSource;
-
-  /** Sets the value of "mask-box-image-source" */
-  void set maskBoxImageSource(var value);
-
-  /** Gets the value of "mask-box-image-width" */
-  String get maskBoxImageWidth;
-
-  /** Sets the value of "mask-box-image-width" */
-  void set maskBoxImageWidth(var value);
-
-  /** Gets the value of "mask-clip" */
-  String get maskClip;
-
-  /** Sets the value of "mask-clip" */
-  void set maskClip(var value);
-
-  /** Gets the value of "mask-composite" */
-  String get maskComposite;
-
-  /** Sets the value of "mask-composite" */
-  void set maskComposite(var value);
-
-  /** Gets the value of "mask-image" */
-  String get maskImage;
-
-  /** Sets the value of "mask-image" */
-  void set maskImage(var value);
-
-  /** Gets the value of "mask-origin" */
-  String get maskOrigin;
-
-  /** Sets the value of "mask-origin" */
-  void set maskOrigin(var value);
-
-  /** Gets the value of "mask-position" */
-  String get maskPosition;
-
-  /** Sets the value of "mask-position" */
-  void set maskPosition(var value);
-
-  /** Gets the value of "mask-position-x" */
-  String get maskPositionX;
-
-  /** Sets the value of "mask-position-x" */
-  void set maskPositionX(var value);
-
-  /** Gets the value of "mask-position-y" */
-  String get maskPositionY;
-
-  /** Sets the value of "mask-position-y" */
-  void set maskPositionY(var value);
-
-  /** Gets the value of "mask-repeat" */
-  String get maskRepeat;
-
-  /** Sets the value of "mask-repeat" */
-  void set maskRepeat(var value);
-
-  /** Gets the value of "mask-repeat-x" */
-  String get maskRepeatX;
-
-  /** Sets the value of "mask-repeat-x" */
-  void set maskRepeatX(var value);
-
-  /** Gets the value of "mask-repeat-y" */
-  String get maskRepeatY;
-
-  /** Sets the value of "mask-repeat-y" */
-  void set maskRepeatY(var value);
-
-  /** Gets the value of "mask-size" */
-  String get maskSize;
-
-  /** Sets the value of "mask-size" */
-  void set maskSize(var value);
-
-  /** Gets the value of "match-nearest-mail-blockquote-color" */
-  String get matchNearestMailBlockquoteColor;
-
-  /** Sets the value of "match-nearest-mail-blockquote-color" */
-  void set matchNearestMailBlockquoteColor(var value);
-
-  /** Gets the value of "max-height" */
-  String get maxHeight;
-
-  /** Sets the value of "max-height" */
-  void set maxHeight(var value);
-
-  /** Gets the value of "max-logical-height" */
-  String get maxLogicalHeight;
-
-  /** Sets the value of "max-logical-height" */
-  void set maxLogicalHeight(var value);
-
-  /** Gets the value of "max-logical-width" */
-  String get maxLogicalWidth;
-
-  /** Sets the value of "max-logical-width" */
-  void set maxLogicalWidth(var value);
-
-  /** Gets the value of "max-width" */
-  String get maxWidth;
-
-  /** Sets the value of "max-width" */
-  void set maxWidth(var value);
-
-  /** Gets the value of "min-height" */
-  String get minHeight;
-
-  /** Sets the value of "min-height" */
-  void set minHeight(var value);
-
-  /** Gets the value of "min-logical-height" */
-  String get minLogicalHeight;
-
-  /** Sets the value of "min-logical-height" */
-  void set minLogicalHeight(var value);
-
-  /** Gets the value of "min-logical-width" */
-  String get minLogicalWidth;
-
-  /** Sets the value of "min-logical-width" */
-  void set minLogicalWidth(var value);
-
-  /** Gets the value of "min-width" */
-  String get minWidth;
-
-  /** Sets the value of "min-width" */
-  void set minWidth(var value);
-
-  /** Gets the value of "nbsp-mode" */
-  String get nbspMode;
-
-  /** Sets the value of "nbsp-mode" */
-  void set nbspMode(var value);
-
-  /** Gets the value of "opacity" */
-  String get opacity;
-
-  /** Sets the value of "opacity" */
-  void set opacity(var value);
-
-  /** Gets the value of "orphans" */
-  String get orphans;
-
-  /** Sets the value of "orphans" */
-  void set orphans(var value);
-
-  /** Gets the value of "outline" */
-  String get outline;
-
-  /** Sets the value of "outline" */
-  void set outline(var value);
-
-  /** Gets the value of "outline-color" */
-  String get outlineColor;
-
-  /** Sets the value of "outline-color" */
-  void set outlineColor(var value);
-
-  /** Gets the value of "outline-offset" */
-  String get outlineOffset;
-
-  /** Sets the value of "outline-offset" */
-  void set outlineOffset(var value);
-
-  /** Gets the value of "outline-style" */
-  String get outlineStyle;
-
-  /** Sets the value of "outline-style" */
-  void set outlineStyle(var value);
-
-  /** Gets the value of "outline-width" */
-  String get outlineWidth;
-
-  /** Sets the value of "outline-width" */
-  void set outlineWidth(var value);
-
-  /** Gets the value of "overflow" */
-  String get overflow;
-
-  /** Sets the value of "overflow" */
-  void set overflow(var value);
-
-  /** Gets the value of "overflow-x" */
-  String get overflowX;
-
-  /** Sets the value of "overflow-x" */
-  void set overflowX(var value);
-
-  /** Gets the value of "overflow-y" */
-  String get overflowY;
-
-  /** Sets the value of "overflow-y" */
-  void set overflowY(var value);
-
-  /** Gets the value of "padding" */
-  String get padding;
-
-  /** Sets the value of "padding" */
-  void set padding(var value);
-
-  /** Gets the value of "padding-after" */
-  String get paddingAfter;
-
-  /** Sets the value of "padding-after" */
-  void set paddingAfter(var value);
-
-  /** Gets the value of "padding-before" */
-  String get paddingBefore;
-
-  /** Sets the value of "padding-before" */
-  void set paddingBefore(var value);
-
-  /** Gets the value of "padding-bottom" */
-  String get paddingBottom;
-
-  /** Sets the value of "padding-bottom" */
-  void set paddingBottom(var value);
-
-  /** Gets the value of "padding-end" */
-  String get paddingEnd;
-
-  /** Sets the value of "padding-end" */
-  void set paddingEnd(var value);
-
-  /** Gets the value of "padding-left" */
-  String get paddingLeft;
-
-  /** Sets the value of "padding-left" */
-  void set paddingLeft(var value);
-
-  /** Gets the value of "padding-right" */
-  String get paddingRight;
-
-  /** Sets the value of "padding-right" */
-  void set paddingRight(var value);
-
-  /** Gets the value of "padding-start" */
-  String get paddingStart;
-
-  /** Sets the value of "padding-start" */
-  void set paddingStart(var value);
-
-  /** Gets the value of "padding-top" */
-  String get paddingTop;
-
-  /** Sets the value of "padding-top" */
-  void set paddingTop(var value);
-
-  /** Gets the value of "page" */
-  String get page;
-
-  /** Sets the value of "page" */
-  void set page(var value);
-
-  /** Gets the value of "page-break-after" */
-  String get pageBreakAfter;
-
-  /** Sets the value of "page-break-after" */
-  void set pageBreakAfter(var value);
-
-  /** Gets the value of "page-break-before" */
-  String get pageBreakBefore;
-
-  /** Sets the value of "page-break-before" */
-  void set pageBreakBefore(var value);
-
-  /** Gets the value of "page-break-inside" */
-  String get pageBreakInside;
-
-  /** Sets the value of "page-break-inside" */
-  void set pageBreakInside(var value);
-
-  /** Gets the value of "perspective" */
-  String get perspective;
-
-  /** Sets the value of "perspective" */
-  void set perspective(var value);
-
-  /** Gets the value of "perspective-origin" */
-  String get perspectiveOrigin;
-
-  /** Sets the value of "perspective-origin" */
-  void set perspectiveOrigin(var value);
-
-  /** Gets the value of "perspective-origin-x" */
-  String get perspectiveOriginX;
-
-  /** Sets the value of "perspective-origin-x" */
-  void set perspectiveOriginX(var value);
-
-  /** Gets the value of "perspective-origin-y" */
-  String get perspectiveOriginY;
-
-  /** Sets the value of "perspective-origin-y" */
-  void set perspectiveOriginY(var value);
-
-  /** Gets the value of "pointer-events" */
-  String get pointerEvents;
-
-  /** Sets the value of "pointer-events" */
-  void set pointerEvents(var value);
-
-  /** Gets the value of "position" */
-  String get position;
-
-  /** Sets the value of "position" */
-  void set position(var value);
-
-  /** Gets the value of "quotes" */
-  String get quotes;
-
-  /** Sets the value of "quotes" */
-  void set quotes(var value);
-
-  /** Gets the value of "region-break-after" */
-  String get regionBreakAfter;
-
-  /** Sets the value of "region-break-after" */
-  void set regionBreakAfter(var value);
-
-  /** Gets the value of "region-break-before" */
-  String get regionBreakBefore;
-
-  /** Sets the value of "region-break-before" */
-  void set regionBreakBefore(var value);
-
-  /** Gets the value of "region-break-inside" */
-  String get regionBreakInside;
-
-  /** Sets the value of "region-break-inside" */
-  void set regionBreakInside(var value);
-
-  /** Gets the value of "region-overflow" */
-  String get regionOverflow;
-
-  /** Sets the value of "region-overflow" */
-  void set regionOverflow(var value);
-
-  /** Gets the value of "resize" */
-  String get resize;
-
-  /** Sets the value of "resize" */
-  void set resize(var value);
-
-  /** Gets the value of "right" */
-  String get right;
-
-  /** Sets the value of "right" */
-  void set right(var value);
-
-  /** Gets the value of "rtl-ordering" */
-  String get rtlOrdering;
-
-  /** Sets the value of "rtl-ordering" */
-  void set rtlOrdering(var value);
-
-  /** Gets the value of "size" */
-  String get size;
-
-  /** Sets the value of "size" */
-  void set size(var value);
-
-  /** Gets the value of "speak" */
-  String get speak;
-
-  /** Sets the value of "speak" */
-  void set speak(var value);
-
-  /** Gets the value of "src" */
-  String get src;
-
-  /** Sets the value of "src" */
-  void set src(var value);
-
-  /** Gets the value of "table-layout" */
-  String get tableLayout;
-
-  /** Sets the value of "table-layout" */
-  void set tableLayout(var value);
-
-  /** Gets the value of "tap-highlight-color" */
-  String get tapHighlightColor;
-
-  /** Sets the value of "tap-highlight-color" */
-  void set tapHighlightColor(var value);
-
-  /** Gets the value of "text-align" */
-  String get textAlign;
-
-  /** Sets the value of "text-align" */
-  void set textAlign(var value);
-
-  /** Gets the value of "text-combine" */
-  String get textCombine;
-
-  /** Sets the value of "text-combine" */
-  void set textCombine(var value);
-
-  /** Gets the value of "text-decoration" */
-  String get textDecoration;
-
-  /** Sets the value of "text-decoration" */
-  void set textDecoration(var value);
-
-  /** Gets the value of "text-decorations-in-effect" */
-  String get textDecorationsInEffect;
-
-  /** Sets the value of "text-decorations-in-effect" */
-  void set textDecorationsInEffect(var value);
-
-  /** Gets the value of "text-emphasis" */
-  String get textEmphasis;
-
-  /** Sets the value of "text-emphasis" */
-  void set textEmphasis(var value);
-
-  /** Gets the value of "text-emphasis-color" */
-  String get textEmphasisColor;
-
-  /** Sets the value of "text-emphasis-color" */
-  void set textEmphasisColor(var value);
-
-  /** Gets the value of "text-emphasis-position" */
-  String get textEmphasisPosition;
-
-  /** Sets the value of "text-emphasis-position" */
-  void set textEmphasisPosition(var value);
-
-  /** Gets the value of "text-emphasis-style" */
-  String get textEmphasisStyle;
-
-  /** Sets the value of "text-emphasis-style" */
-  void set textEmphasisStyle(var value);
-
-  /** Gets the value of "text-fill-color" */
-  String get textFillColor;
-
-  /** Sets the value of "text-fill-color" */
-  void set textFillColor(var value);
-
-  /** Gets the value of "text-indent" */
-  String get textIndent;
-
-  /** Sets the value of "text-indent" */
-  void set textIndent(var value);
-
-  /** Gets the value of "text-line-through" */
-  String get textLineThrough;
-
-  /** Sets the value of "text-line-through" */
-  void set textLineThrough(var value);
-
-  /** Gets the value of "text-line-through-color" */
-  String get textLineThroughColor;
-
-  /** Sets the value of "text-line-through-color" */
-  void set textLineThroughColor(var value);
-
-  /** Gets the value of "text-line-through-mode" */
-  String get textLineThroughMode;
-
-  /** Sets the value of "text-line-through-mode" */
-  void set textLineThroughMode(var value);
-
-  /** Gets the value of "text-line-through-style" */
-  String get textLineThroughStyle;
-
-  /** Sets the value of "text-line-through-style" */
-  void set textLineThroughStyle(var value);
-
-  /** Gets the value of "text-line-through-width" */
-  String get textLineThroughWidth;
-
-  /** Sets the value of "text-line-through-width" */
-  void set textLineThroughWidth(var value);
-
-  /** Gets the value of "text-orientation" */
-  String get textOrientation;
-
-  /** Sets the value of "text-orientation" */
-  void set textOrientation(var value);
-
-  /** Gets the value of "text-overflow" */
-  String get textOverflow;
-
-  /** Sets the value of "text-overflow" */
-  void set textOverflow(var value);
-
-  /** Gets the value of "text-overline" */
-  String get textOverline;
-
-  /** Sets the value of "text-overline" */
-  void set textOverline(var value);
-
-  /** Gets the value of "text-overline-color" */
-  String get textOverlineColor;
-
-  /** Sets the value of "text-overline-color" */
-  void set textOverlineColor(var value);
-
-  /** Gets the value of "text-overline-mode" */
-  String get textOverlineMode;
-
-  /** Sets the value of "text-overline-mode" */
-  void set textOverlineMode(var value);
-
-  /** Gets the value of "text-overline-style" */
-  String get textOverlineStyle;
-
-  /** Sets the value of "text-overline-style" */
-  void set textOverlineStyle(var value);
-
-  /** Gets the value of "text-overline-width" */
-  String get textOverlineWidth;
-
-  /** Sets the value of "text-overline-width" */
-  void set textOverlineWidth(var value);
-
-  /** Gets the value of "text-rendering" */
-  String get textRendering;
-
-  /** Sets the value of "text-rendering" */
-  void set textRendering(var value);
-
-  /** Gets the value of "text-security" */
-  String get textSecurity;
-
-  /** Sets the value of "text-security" */
-  void set textSecurity(var value);
-
-  /** Gets the value of "text-shadow" */
-  String get textShadow;
-
-  /** Sets the value of "text-shadow" */
-  void set textShadow(var value);
-
-  /** Gets the value of "text-size-adjust" */
-  String get textSizeAdjust;
-
-  /** Sets the value of "text-size-adjust" */
-  void set textSizeAdjust(var value);
-
-  /** Gets the value of "text-stroke" */
-  String get textStroke;
-
-  /** Sets the value of "text-stroke" */
-  void set textStroke(var value);
-
-  /** Gets the value of "text-stroke-color" */
-  String get textStrokeColor;
-
-  /** Sets the value of "text-stroke-color" */
-  void set textStrokeColor(var value);
-
-  /** Gets the value of "text-stroke-width" */
-  String get textStrokeWidth;
-
-  /** Sets the value of "text-stroke-width" */
-  void set textStrokeWidth(var value);
-
-  /** Gets the value of "text-transform" */
-  String get textTransform;
-
-  /** Sets the value of "text-transform" */
-  void set textTransform(var value);
-
-  /** Gets the value of "text-underline" */
-  String get textUnderline;
-
-  /** Sets the value of "text-underline" */
-  void set textUnderline(var value);
-
-  /** Gets the value of "text-underline-color" */
-  String get textUnderlineColor;
-
-  /** Sets the value of "text-underline-color" */
-  void set textUnderlineColor(var value);
-
-  /** Gets the value of "text-underline-mode" */
-  String get textUnderlineMode;
-
-  /** Sets the value of "text-underline-mode" */
-  void set textUnderlineMode(var value);
-
-  /** Gets the value of "text-underline-style" */
-  String get textUnderlineStyle;
-
-  /** Sets the value of "text-underline-style" */
-  void set textUnderlineStyle(var value);
-
-  /** Gets the value of "text-underline-width" */
-  String get textUnderlineWidth;
-
-  /** Sets the value of "text-underline-width" */
-  void set textUnderlineWidth(var value);
-
-  /** Gets the value of "top" */
-  String get top;
-
-  /** Sets the value of "top" */
-  void set top(var value);
-
-  /** Gets the value of "transform" */
-  String get transform;
-
-  /** Sets the value of "transform" */
-  void set transform(var value);
-
-  /** Gets the value of "transform-origin" */
-  String get transformOrigin;
-
-  /** Sets the value of "transform-origin" */
-  void set transformOrigin(var value);
-
-  /** Gets the value of "transform-origin-x" */
-  String get transformOriginX;
-
-  /** Sets the value of "transform-origin-x" */
-  void set transformOriginX(var value);
-
-  /** Gets the value of "transform-origin-y" */
-  String get transformOriginY;
-
-  /** Sets the value of "transform-origin-y" */
-  void set transformOriginY(var value);
-
-  /** Gets the value of "transform-origin-z" */
-  String get transformOriginZ;
-
-  /** Sets the value of "transform-origin-z" */
-  void set transformOriginZ(var value);
-
-  /** Gets the value of "transform-style" */
-  String get transformStyle;
-
-  /** Sets the value of "transform-style" */
-  void set transformStyle(var value);
-
-  /** Gets the value of "transition" */
-  String get transition;
-
-  /** Sets the value of "transition" */
-  void set transition(var value);
-
-  /** Gets the value of "transition-delay" */
-  String get transitionDelay;
-
-  /** Sets the value of "transition-delay" */
-  void set transitionDelay(var value);
-
-  /** Gets the value of "transition-duration" */
-  String get transitionDuration;
-
-  /** Sets the value of "transition-duration" */
-  void set transitionDuration(var value);
-
-  /** Gets the value of "transition-property" */
-  String get transitionProperty;
-
-  /** Sets the value of "transition-property" */
-  void set transitionProperty(var value);
-
-  /** Gets the value of "transition-timing-function" */
-  String get transitionTimingFunction;
-
-  /** Sets the value of "transition-timing-function" */
-  void set transitionTimingFunction(var value);
-
-  /** Gets the value of "unicode-bidi" */
-  String get unicodeBidi;
-
-  /** Sets the value of "unicode-bidi" */
-  void set unicodeBidi(var value);
-
-  /** Gets the value of "unicode-range" */
-  String get unicodeRange;
-
-  /** Sets the value of "unicode-range" */
-  void set unicodeRange(var value);
-
-  /** Gets the value of "user-drag" */
-  String get userDrag;
-
-  /** Sets the value of "user-drag" */
-  void set userDrag(var value);
-
-  /** Gets the value of "user-modify" */
-  String get userModify;
-
-  /** Sets the value of "user-modify" */
-  void set userModify(var value);
-
-  /** Gets the value of "user-select" */
-  String get userSelect;
-
-  /** Sets the value of "user-select" */
-  void set userSelect(var value);
-
-  /** Gets the value of "vertical-align" */
-  String get verticalAlign;
-
-  /** Sets the value of "vertical-align" */
-  void set verticalAlign(var value);
-
-  /** Gets the value of "visibility" */
-  String get visibility;
-
-  /** Sets the value of "visibility" */
-  void set visibility(var value);
-
-  /** Gets the value of "white-space" */
-  String get whiteSpace;
-
-  /** Sets the value of "white-space" */
-  void set whiteSpace(var value);
-
-  /** Gets the value of "widows" */
-  String get widows;
-
-  /** Sets the value of "widows" */
-  void set widows(var value);
-
-  /** Gets the value of "width" */
-  String get width;
-
-  /** Sets the value of "width" */
-  void set width(var value);
-
-  /** Gets the value of "word-break" */
-  String get wordBreak;
-
-  /** Sets the value of "word-break" */
-  void set wordBreak(var value);
-
-  /** Gets the value of "word-spacing" */
-  String get wordSpacing;
-
-  /** Sets the value of "word-spacing" */
-  void set wordSpacing(var value);
-
-  /** Gets the value of "word-wrap" */
-  String get wordWrap;
-
-  /** Sets the value of "word-wrap" */
-  void set wordWrap(var value);
-
-  /** Gets the value of "wrap-shape" */
-  String get wrapShape;
-
-  /** Sets the value of "wrap-shape" */
-  void set wrapShape(var value);
-
-  /** Gets the value of "writing-mode" */
-  String get writingMode;
-
-  /** Sets the value of "writing-mode" */
-  void set writingMode(var value);
-
-  /** Gets the value of "z-index" */
-  String get zIndex;
-
-  /** Sets the value of "z-index" */
-  void set zIndex(var value);
-
-  /** Gets the value of "zoom" */
-  String get zoom;
-
-  /** Sets the value of "zoom" */
-  void set zoom(var value);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
 String _cachedBrowserPrefix;
 
 String get _browserPrefix {
@@ -4688,31 +2318,59 @@
   return _cachedBrowserPrefix;
 }
 
-class _CSSStyleDeclarationImpl extends NativeFieldWrapperClass1 implements CSSStyleDeclaration {
+class CSSStyleDeclaration extends NativeFieldWrapperClass1 {
+  factory CSSStyleDeclaration() => _CSSStyleDeclarationFactoryProvider.createCSSStyleDeclaration();
+  factory CSSStyleDeclaration.css(String css) =>
+      _CSSStyleDeclarationFactoryProvider.createCSSStyleDeclaration_css(css);
+
+  CSSStyleDeclaration.internal();
 
 
+  /** @domName CSSStyleDeclaration.cssText */
   String get cssText native "CSSStyleDeclaration_cssText_Getter";
 
+
+  /** @domName CSSStyleDeclaration.cssText */
   void set cssText(String value) native "CSSStyleDeclaration_cssText_Setter";
 
+
+  /** @domName CSSStyleDeclaration.length */
   int get length native "CSSStyleDeclaration_length_Getter";
 
+
+  /** @domName CSSStyleDeclaration.parentRule */
   CSSRule get parentRule native "CSSStyleDeclaration_parentRule_Getter";
 
+
+  /** @domName CSSStyleDeclaration.getPropertyCSSValue */
   CSSValue getPropertyCSSValue(String propertyName) native "CSSStyleDeclaration_getPropertyCSSValue_Callback";
 
+
+  /** @domName CSSStyleDeclaration.getPropertyPriority */
   String getPropertyPriority(String propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback";
 
+
+  /** @domName CSSStyleDeclaration.getPropertyShorthand */
   String getPropertyShorthand(String propertyName) native "CSSStyleDeclaration_getPropertyShorthand_Callback";
 
+
+  /** @domName CSSStyleDeclaration._getPropertyValue */
   String _getPropertyValue(String propertyName) native "CSSStyleDeclaration__getPropertyValue_Callback";
 
+
+  /** @domName CSSStyleDeclaration.isPropertyImplicit */
   bool isPropertyImplicit(String propertyName) native "CSSStyleDeclaration_isPropertyImplicit_Callback";
 
+
+  /** @domName CSSStyleDeclaration.item */
   String item(int index) native "CSSStyleDeclaration_item_Callback";
 
+
+  /** @domName CSSStyleDeclaration.removeProperty */
   String removeProperty(String propertyName) native "CSSStyleDeclaration_removeProperty_Callback";
 
+
+  /** @domName CSSStyleDeclaration.setProperty */
   void setProperty(String propertyName, String value, [String priority]) native "CSSStyleDeclaration_setProperty_Callback";
 
 
@@ -7493,26 +5151,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CSSStyleRule
-abstract class CSSStyleRule implements CSSRule {
+class CSSStyleRule extends CSSRule {
+  CSSStyleRule.internal(): super.internal();
+
 
   /** @domName CSSStyleRule.selectorText */
-  String selectorText;
-
-  /** @domName CSSStyleRule.style */
-  CSSStyleDeclaration get style;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSStyleRuleImpl extends _CSSRuleImpl implements CSSStyleRule {
-
   String get selectorText native "CSSStyleRule_selectorText_Getter";
 
+
+  /** @domName CSSStyleRule.selectorText */
   void set selectorText(String value) native "CSSStyleRule_selectorText_Setter";
 
+
+  /** @domName CSSStyleRule.style */
   CSSStyleDeclaration get style native "CSSStyleRule_style_Getter";
 
 }
@@ -7523,41 +5174,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CSSStyleSheet
-abstract class CSSStyleSheet implements StyleSheet {
+class CSSStyleSheet extends StyleSheet {
+  CSSStyleSheet.internal(): super.internal();
+
 
   /** @domName CSSStyleSheet.cssRules */
-  List<CSSRule> get cssRules;
-
-  /** @domName CSSStyleSheet.ownerRule */
-  CSSRule get ownerRule;
-
-  /** @domName CSSStyleSheet.rules */
-  List<CSSRule> get rules;
-
-  /** @domName CSSStyleSheet.addRule */
-  int addRule(String selector, String style, [int index]);
-
-  /** @domName CSSStyleSheet.deleteRule */
-  void deleteRule(int index);
-
-  /** @domName CSSStyleSheet.insertRule */
-  int insertRule(String rule, int index);
-
-  /** @domName CSSStyleSheet.removeRule */
-  void removeRule(int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSStyleSheetImpl extends _StyleSheetImpl implements CSSStyleSheet {
-
   List<CSSRule> get cssRules native "CSSStyleSheet_cssRules_Getter";
 
+
+  /** @domName CSSStyleSheet.ownerRule */
   CSSRule get ownerRule native "CSSStyleSheet_ownerRule_Getter";
 
+
+  /** @domName CSSStyleSheet.rules */
   List<CSSRule> get rules native "CSSStyleSheet_rules_Getter";
 
   int addRule(/*DOMString*/ selector, /*DOMString*/ style, [/*unsigned long*/ index]) {
@@ -7567,14 +5196,24 @@
     return _addRule_2(selector, style);
   }
 
+
+  /** @domName CSSStyleSheet.addRule_1 */
   int _addRule_1(selector, style, index) native "CSSStyleSheet_addRule_1_Callback";
 
+
+  /** @domName CSSStyleSheet.addRule_2 */
   int _addRule_2(selector, style) native "CSSStyleSheet_addRule_2_Callback";
 
+
+  /** @domName CSSStyleSheet.deleteRule */
   void deleteRule(int index) native "CSSStyleSheet_deleteRule_Callback";
 
+
+  /** @domName CSSStyleSheet.insertRule */
   int insertRule(String rule, int index) native "CSSStyleSheet_insertRule_Callback";
 
+
+  /** @domName CSSStyleSheet.removeRule */
   void removeRule(int index) native "CSSStyleSheet_removeRule_Callback";
 
 }
@@ -7585,7 +5224,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebKitCSSTransformValue
-abstract class CSSTransformValue implements List<CSSValue> {
+class CSSTransformValue extends _CSSValueList {
+  CSSTransformValue.internal(): super.internal();
 
   static const int CSS_MATRIX = 11;
 
@@ -7629,17 +5269,8 @@
 
   static const int CSS_TRANSLATEZ = 12;
 
+
   /** @domName WebKitCSSTransformValue.operationType */
-  int get operationType;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSTransformValueImpl extends _CSSValueListImpl implements CSSTransformValue {
-
   int get operationType native "WebKitCSSTransformValue_operationType_Getter";
 
 }
@@ -7650,15 +5281,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CSSUnknownRule
-abstract class CSSUnknownRule implements CSSRule {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSUnknownRuleImpl extends _CSSRuleImpl implements CSSUnknownRule {
+class CSSUnknownRule extends CSSRule {
+  CSSUnknownRule.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7668,7 +5292,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CSSValue
-abstract class CSSValue {
+class CSSValue extends NativeFieldWrapperClass1 {
+  CSSValue.internal();
 
   static const int CSS_CUSTOM = 3;
 
@@ -7678,24 +5303,16 @@
 
   static const int CSS_VALUE_LIST = 2;
 
+
   /** @domName CSSValue.cssText */
-  String cssText;
-
-  /** @domName CSSValue.cssValueType */
-  int get cssValueType;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CSSValueImpl extends NativeFieldWrapperClass1 implements CSSValue {
-
   String get cssText native "CSSValue_cssText_Getter";
 
+
+  /** @domName CSSValue.cssText */
   void set cssText(String value) native "CSSValue_cssText_Setter";
 
+
+  /** @domName CSSValue.cssValueType */
   int get cssValueType native "CSSValue_cssValueType_Getter";
 
 }
@@ -7703,107 +5320,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-class _CSSValueListImpl extends _CSSValueImpl implements List<CSSValue> {
-
-  int get length native "CSSValueList_length_Getter";
-
-  CSSValue operator[](int index) native "CSSValueList_item_Callback";
-
-  void operator[]=(int index, CSSValue value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<CSSValue> mixins.
-  // CSSValue is the element type.
-
-  // From Iterable<CSSValue>:
-
-  Iterator<CSSValue> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<CSSValue>(this);
-  }
-
-  // From Collection<CSSValue>:
-
-  void add(CSSValue value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(CSSValue value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<CSSValue> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(CSSValue element) => _Collections.contains(this, element);
-
-  void forEach(void f(CSSValue element)) => _Collections.forEach(this, f);
-
-  Collection map(f(CSSValue element)) => _Collections.map(this, [], f);
-
-  Collection<CSSValue> filter(bool f(CSSValue element)) =>
-     _Collections.filter(this, <CSSValue>[], f);
-
-  bool every(bool f(CSSValue element)) => _Collections.every(this, f);
-
-  bool some(bool f(CSSValue element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<CSSValue>:
-
-  void sort([Comparator<CSSValue> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(CSSValue element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(CSSValue element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  CSSValue get last => this[length - 1];
-
-  CSSValue removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<CSSValue> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [CSSValue initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<CSSValue> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <CSSValue>[]);
-
-  // -- end List<CSSValue> mixins.
-
-  CSSValue item(int index) native "CSSValueList_item_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName HTMLCanvasElement
-abstract class CanvasElement implements Element {
+class CanvasElement extends _Element_Merged {
 
   factory CanvasElement({int width, int height}) {
     if (!?width) {
@@ -7814,37 +5331,30 @@
     }
     return _Elements.createCanvasElement(width, height);
   }
+  CanvasElement.internal(): super.internal();
+
 
   /** @domName HTMLCanvasElement.height */
-  int height;
-
-  /** @domName HTMLCanvasElement.width */
-  int width;
-
-  /** @domName HTMLCanvasElement.getContext */
-  Object getContext(String contextId);
-
-  /** @domName HTMLCanvasElement.toDataURL */
-  String toDataURL(String type, [num quality]);
-
-  final CanvasRenderingContext2D context2d;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _CanvasElementImpl extends _ElementImpl_Merged implements CanvasElement {
-
   int get height native "HTMLCanvasElement_height_Getter";
 
+
+  /** @domName HTMLCanvasElement.height */
   void set height(int value) native "HTMLCanvasElement_height_Setter";
 
+
+  /** @domName HTMLCanvasElement.width */
   int get width native "HTMLCanvasElement_width_Getter";
 
+
+  /** @domName HTMLCanvasElement.width */
   void set width(int value) native "HTMLCanvasElement_width_Setter";
 
+
+  /** @domName HTMLCanvasElement.getContext */
   Object getContext(String contextId) native "HTMLCanvasElement_getContext_Callback";
 
+
+  /** @domName HTMLCanvasElement.toDataURL */
   String toDataURL(String type, [num quality]) native "HTMLCanvasElement_toDataURL_Callback";
 
 
@@ -7857,19 +5367,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CanvasGradient
-abstract class CanvasGradient {
+class CanvasGradient extends NativeFieldWrapperClass1 {
+  CanvasGradient.internal();
+
 
   /** @domName CanvasGradient.addColorStop */
-  void addColorStop(num offset, String color);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CanvasGradientImpl extends NativeFieldWrapperClass1 implements CanvasGradient {
-
   void addColorStop(num offset, String color) native "CanvasGradient_addColorStop_Callback";
 
 }
@@ -7880,15 +5382,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CanvasPattern
-abstract class CanvasPattern {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CanvasPatternImpl extends NativeFieldWrapperClass1 implements CanvasPattern {
+class CanvasPattern extends NativeFieldWrapperClass1 {
+  CanvasPattern.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7898,346 +5393,207 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CanvasRenderingContext
-abstract class CanvasRenderingContext {
+class CanvasRenderingContext extends NativeFieldWrapperClass1 {
+  CanvasRenderingContext.internal();
+
 
   /** @domName CanvasRenderingContext.canvas */
-  CanvasElement get canvas;
+  CanvasElement get canvas native "CanvasRenderingContext_canvas_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
+class CanvasRenderingContext2D extends CanvasRenderingContext {
+  CanvasRenderingContext2D.internal(): super.internal();
 
 
-/// @domName CanvasRenderingContext2D
-abstract class CanvasRenderingContext2D implements CanvasRenderingContext {
-
   /** @domName CanvasRenderingContext2D.fillStyle */
-  dynamic fillStyle;
-
-  /** @domName CanvasRenderingContext2D.font */
-  String font;
-
-  /** @domName CanvasRenderingContext2D.globalAlpha */
-  num globalAlpha;
-
-  /** @domName CanvasRenderingContext2D.globalCompositeOperation */
-  String globalCompositeOperation;
-
-  /** @domName CanvasRenderingContext2D.lineCap */
-  String lineCap;
-
-  /** @domName CanvasRenderingContext2D.lineDashOffset */
-  num lineDashOffset;
-
-  /** @domName CanvasRenderingContext2D.lineJoin */
-  String lineJoin;
-
-  /** @domName CanvasRenderingContext2D.lineWidth */
-  num lineWidth;
-
-  /** @domName CanvasRenderingContext2D.miterLimit */
-  num miterLimit;
-
-  /** @domName CanvasRenderingContext2D.shadowBlur */
-  num shadowBlur;
-
-  /** @domName CanvasRenderingContext2D.shadowColor */
-  String shadowColor;
-
-  /** @domName CanvasRenderingContext2D.shadowOffsetX */
-  num shadowOffsetX;
-
-  /** @domName CanvasRenderingContext2D.shadowOffsetY */
-  num shadowOffsetY;
-
-  /** @domName CanvasRenderingContext2D.strokeStyle */
-  dynamic strokeStyle;
-
-  /** @domName CanvasRenderingContext2D.textAlign */
-  String textAlign;
-
-  /** @domName CanvasRenderingContext2D.textBaseline */
-  String textBaseline;
-
-  /** @domName CanvasRenderingContext2D.webkitBackingStorePixelRatio */
-  num get webkitBackingStorePixelRatio;
-
-  /** @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled */
-  bool webkitImageSmoothingEnabled;
-
-  /** @domName CanvasRenderingContext2D.webkitLineDash */
-  List webkitLineDash;
-
-  /** @domName CanvasRenderingContext2D.webkitLineDashOffset */
-  num webkitLineDashOffset;
-
-  /** @domName CanvasRenderingContext2D.arc */
-  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise);
-
-  /** @domName CanvasRenderingContext2D.arcTo */
-  void arcTo(num x1, num y1, num x2, num y2, num radius);
-
-  /** @domName CanvasRenderingContext2D.beginPath */
-  void beginPath();
-
-  /** @domName CanvasRenderingContext2D.bezierCurveTo */
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y);
-
-  /** @domName CanvasRenderingContext2D.clearRect */
-  void clearRect(num x, num y, num width, num height);
-
-  /** @domName CanvasRenderingContext2D.clearShadow */
-  void clearShadow();
-
-  /** @domName CanvasRenderingContext2D.clip */
-  void clip();
-
-  /** @domName CanvasRenderingContext2D.closePath */
-  void closePath();
-
-  /** @domName CanvasRenderingContext2D.createImageData */
-  ImageData createImageData(imagedata_OR_sw, [num sh]);
-
-  /** @domName CanvasRenderingContext2D.createLinearGradient */
-  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1);
-
-  /** @domName CanvasRenderingContext2D.createPattern */
-  CanvasPattern createPattern(canvas_OR_image, String repetitionType);
-
-  /** @domName CanvasRenderingContext2D.createRadialGradient */
-  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1);
-
-  /** @domName CanvasRenderingContext2D.drawImage */
-  void drawImage(canvas_OR_image_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]);
-
-  /** @domName CanvasRenderingContext2D.drawImageFromRect */
-  void drawImageFromRect(ImageElement image, [num sx, num sy, num sw, num sh, num dx, num dy, num dw, num dh, String compositeOperation]);
-
-  /** @domName CanvasRenderingContext2D.fill */
-  void fill();
-
-  /** @domName CanvasRenderingContext2D.fillRect */
-  void fillRect(num x, num y, num width, num height);
-
-  /** @domName CanvasRenderingContext2D.fillText */
-  void fillText(String text, num x, num y, [num maxWidth]);
-
-  /** @domName CanvasRenderingContext2D.getImageData */
-  ImageData getImageData(num sx, num sy, num sw, num sh);
-
-  /** @domName CanvasRenderingContext2D.getLineDash */
-  List<num> getLineDash();
-
-  /** @domName CanvasRenderingContext2D.isPointInPath */
-  bool isPointInPath(num x, num y);
-
-  /** @domName CanvasRenderingContext2D.lineTo */
-  void lineTo(num x, num y);
-
-  /** @domName CanvasRenderingContext2D.measureText */
-  TextMetrics measureText(String text);
-
-  /** @domName CanvasRenderingContext2D.moveTo */
-  void moveTo(num x, num y);
-
-  /** @domName CanvasRenderingContext2D.putImageData */
-  void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]);
-
-  /** @domName CanvasRenderingContext2D.quadraticCurveTo */
-  void quadraticCurveTo(num cpx, num cpy, num x, num y);
-
-  /** @domName CanvasRenderingContext2D.rect */
-  void rect(num x, num y, num width, num height);
-
-  /** @domName CanvasRenderingContext2D.restore */
-  void restore();
-
-  /** @domName CanvasRenderingContext2D.rotate */
-  void rotate(num angle);
-
-  /** @domName CanvasRenderingContext2D.save */
-  void save();
-
-  /** @domName CanvasRenderingContext2D.scale */
-  void scale(num sx, num sy);
-
-  /** @domName CanvasRenderingContext2D.setAlpha */
-  void setAlpha(num alpha);
-
-  /** @domName CanvasRenderingContext2D.setCompositeOperation */
-  void setCompositeOperation(String compositeOperation);
-
-  /** @domName CanvasRenderingContext2D.setLineCap */
-  void setLineCap(String cap);
-
-  /** @domName CanvasRenderingContext2D.setLineDash */
-  void setLineDash(List<num> dash);
-
-  /** @domName CanvasRenderingContext2D.setLineJoin */
-  void setLineJoin(String join);
-
-  /** @domName CanvasRenderingContext2D.setLineWidth */
-  void setLineWidth(num width);
-
-  /** @domName CanvasRenderingContext2D.setMiterLimit */
-  void setMiterLimit(num limit);
-
-  /** @domName CanvasRenderingContext2D.setShadow */
-  void setShadow(num width, num height, num blur, [c_OR_color_OR_grayLevel_OR_r, num alpha_OR_g_OR_m, num b_OR_y, num a_OR_k, num a]);
-
-  /** @domName CanvasRenderingContext2D.setTransform */
-  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy);
-
-  /** @domName CanvasRenderingContext2D.stroke */
-  void stroke();
-
-  /** @domName CanvasRenderingContext2D.strokeRect */
-  void strokeRect(num x, num y, num width, num height, [num lineWidth]);
-
-  /** @domName CanvasRenderingContext2D.strokeText */
-  void strokeText(String text, num x, num y, [num maxWidth]);
-
-  /** @domName CanvasRenderingContext2D.transform */
-  void transform(num m11, num m12, num m21, num m22, num dx, num dy);
-
-  /** @domName CanvasRenderingContext2D.translate */
-  void translate(num tx, num ty);
-
-  /** @domName CanvasRenderingContext2D.webkitGetImageDataHD */
-  ImageData webkitGetImageDataHD(num sx, num sy, num sw, num sh);
-
-  /** @domName CanvasRenderingContext2D.webkitPutImageDataHD */
-  void webkitPutImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]);
-
-
-  /**
-   * Sets the color used inside shapes.
-   * [r], [g], [b] are 0-255, [a] is 0-1.
-   */
-  void setFillColorRgb(int r, int g, int b, [num a]);
-
-  /**
-   * Sets the color used inside shapes.
-   * [h] is in degrees, 0-360.
-   * [s], [l] are in percent, 0-100.
-   * [a] is 0-1.
-   */
-  void setFillColorHsl(int h, num s, num l, [num a]);
-
-  /**
-   * Sets the color used for stroking shapes.
-   * [r], [g], [b] are 0-255, [a] is 0-1.
-   */
-  void setStrokeColorRgb(int r, int g, int b, [num a]);
-
-  /**
-   * Sets the color used for stroking shapes.
-   * [h] is in degrees, 0-360.
-   * [s], [l] are in percent, 0-100.
-   * [a] is 0-1.
-   */
-  void setStrokeColorHsl(int h, num s, num l, [num a]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _CanvasRenderingContext2DImpl extends _CanvasRenderingContextImpl implements CanvasRenderingContext2D {
-
   dynamic get fillStyle native "CanvasRenderingContext2D_fillStyle_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.fillStyle */
   void set fillStyle(dynamic value) native "CanvasRenderingContext2D_fillStyle_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.font */
   String get font native "CanvasRenderingContext2D_font_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.font */
   void set font(String value) native "CanvasRenderingContext2D_font_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.globalAlpha */
   num get globalAlpha native "CanvasRenderingContext2D_globalAlpha_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.globalAlpha */
   void set globalAlpha(num value) native "CanvasRenderingContext2D_globalAlpha_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.globalCompositeOperation */
   String get globalCompositeOperation native "CanvasRenderingContext2D_globalCompositeOperation_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.globalCompositeOperation */
   void set globalCompositeOperation(String value) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.lineCap */
   String get lineCap native "CanvasRenderingContext2D_lineCap_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.lineCap */
   void set lineCap(String value) native "CanvasRenderingContext2D_lineCap_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.lineDashOffset */
   num get lineDashOffset native "CanvasRenderingContext2D_lineDashOffset_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.lineDashOffset */
   void set lineDashOffset(num value) native "CanvasRenderingContext2D_lineDashOffset_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.lineJoin */
   String get lineJoin native "CanvasRenderingContext2D_lineJoin_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.lineJoin */
   void set lineJoin(String value) native "CanvasRenderingContext2D_lineJoin_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.lineWidth */
   num get lineWidth native "CanvasRenderingContext2D_lineWidth_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.lineWidth */
   void set lineWidth(num value) native "CanvasRenderingContext2D_lineWidth_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.miterLimit */
   num get miterLimit native "CanvasRenderingContext2D_miterLimit_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.miterLimit */
   void set miterLimit(num value) native "CanvasRenderingContext2D_miterLimit_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.shadowBlur */
   num get shadowBlur native "CanvasRenderingContext2D_shadowBlur_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.shadowBlur */
   void set shadowBlur(num value) native "CanvasRenderingContext2D_shadowBlur_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.shadowColor */
   String get shadowColor native "CanvasRenderingContext2D_shadowColor_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.shadowColor */
   void set shadowColor(String value) native "CanvasRenderingContext2D_shadowColor_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.shadowOffsetX */
   num get shadowOffsetX native "CanvasRenderingContext2D_shadowOffsetX_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.shadowOffsetX */
   void set shadowOffsetX(num value) native "CanvasRenderingContext2D_shadowOffsetX_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.shadowOffsetY */
   num get shadowOffsetY native "CanvasRenderingContext2D_shadowOffsetY_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.shadowOffsetY */
   void set shadowOffsetY(num value) native "CanvasRenderingContext2D_shadowOffsetY_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.strokeStyle */
   dynamic get strokeStyle native "CanvasRenderingContext2D_strokeStyle_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.strokeStyle */
   void set strokeStyle(dynamic value) native "CanvasRenderingContext2D_strokeStyle_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.textAlign */
   String get textAlign native "CanvasRenderingContext2D_textAlign_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.textAlign */
   void set textAlign(String value) native "CanvasRenderingContext2D_textAlign_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.textBaseline */
   String get textBaseline native "CanvasRenderingContext2D_textBaseline_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.textBaseline */
   void set textBaseline(String value) native "CanvasRenderingContext2D_textBaseline_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.webkitBackingStorePixelRatio */
   num get webkitBackingStorePixelRatio native "CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled */
   bool get webkitImageSmoothingEnabled native "CanvasRenderingContext2D_webkitImageSmoothingEnabled_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled */
   void set webkitImageSmoothingEnabled(bool value) native "CanvasRenderingContext2D_webkitImageSmoothingEnabled_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.webkitLineDash */
   List get webkitLineDash native "CanvasRenderingContext2D_webkitLineDash_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.webkitLineDash */
   void set webkitLineDash(List value) native "CanvasRenderingContext2D_webkitLineDash_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.webkitLineDashOffset */
   num get webkitLineDashOffset native "CanvasRenderingContext2D_webkitLineDashOffset_Getter";
 
+
+  /** @domName CanvasRenderingContext2D.webkitLineDashOffset */
   void set webkitLineDashOffset(num value) native "CanvasRenderingContext2D_webkitLineDashOffset_Setter";
 
+
+  /** @domName CanvasRenderingContext2D.arc */
   void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native "CanvasRenderingContext2D_arc_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.arcTo */
   void arcTo(num x1, num y1, num x2, num y2, num radius) native "CanvasRenderingContext2D_arcTo_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.beginPath */
   void beginPath() native "CanvasRenderingContext2D_beginPath_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.bezierCurveTo */
   void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native "CanvasRenderingContext2D_bezierCurveTo_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.clearRect */
   void clearRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_clearRect_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.clearShadow */
   void clearShadow() native "CanvasRenderingContext2D_clearShadow_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.clip */
   void clip() native "CanvasRenderingContext2D_clip_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.closePath */
   void closePath() native "CanvasRenderingContext2D_closePath_Callback";
 
   ImageData createImageData(imagedata_OR_sw, [/*float*/ sh]) {
@@ -8250,10 +5606,16 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName CanvasRenderingContext2D.createImageData_1 */
   ImageData _createImageData_1(imagedata_OR_sw) native "CanvasRenderingContext2D_createImageData_1_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.createImageData_2 */
   ImageData _createImageData_2(imagedata_OR_sw, sh) native "CanvasRenderingContext2D_createImageData_2_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.createLinearGradient */
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native "CanvasRenderingContext2D_createLinearGradient_Callback";
 
   CanvasPattern createPattern(canvas_OR_image, /*DOMString*/ repetitionType) {
@@ -8266,10 +5628,16 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName CanvasRenderingContext2D.createPattern_1 */
   CanvasPattern _createPattern_1(canvas_OR_image, repetitionType) native "CanvasRenderingContext2D_createPattern_1_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.createPattern_2 */
   CanvasPattern _createPattern_2(canvas_OR_image, repetitionType) native "CanvasRenderingContext2D_createPattern_2_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.createRadialGradient */
   CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native "CanvasRenderingContext2D_createRadialGradient_Callback";
 
   void drawImage(canvas_OR_image_OR_video, /*float*/ sx_OR_x, /*float*/ sy_OR_y, [/*float*/ sw_OR_width, /*float*/ height_OR_sh, /*float*/ dx, /*float*/ dy, /*float*/ dw, /*float*/ dh]) {
@@ -8312,22 +5680,40 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName CanvasRenderingContext2D.drawImage_1 */
   void _drawImage_1(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_1_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImage_2 */
   void _drawImage_2(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_2_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImage_3 */
   void _drawImage_3(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_3_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImage_4 */
   void _drawImage_4(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_4_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImage_5 */
   void _drawImage_5(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_5_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImage_6 */
   void _drawImage_6(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_6_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImage_7 */
   void _drawImage_7(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_7_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImage_8 */
   void _drawImage_8(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_8_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImage_9 */
   void _drawImage_9(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_9_Callback";
 
   void drawImageFromRect(/*HTMLImageElement*/ image, [/*float*/ sx, /*float*/ sy, /*float*/ sw, /*float*/ sh, /*float*/ dx, /*float*/ dy, /*float*/ dw, /*float*/ dh, /*DOMString*/ compositeOperation]) {
@@ -8370,28 +5756,52 @@
     _drawImageFromRect_10(image);
   }
 
+
+  /** @domName CanvasRenderingContext2D.drawImageFromRect_1 */
   void _drawImageFromRect_1(image, sx, sy, sw, sh, dx, dy, dw, dh, compositeOperation) native "CanvasRenderingContext2D_drawImageFromRect_1_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImageFromRect_2 */
   void _drawImageFromRect_2(image, sx, sy, sw, sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImageFromRect_2_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImageFromRect_3 */
   void _drawImageFromRect_3(image, sx, sy, sw, sh, dx, dy, dw) native "CanvasRenderingContext2D_drawImageFromRect_3_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImageFromRect_4 */
   void _drawImageFromRect_4(image, sx, sy, sw, sh, dx, dy) native "CanvasRenderingContext2D_drawImageFromRect_4_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImageFromRect_5 */
   void _drawImageFromRect_5(image, sx, sy, sw, sh, dx) native "CanvasRenderingContext2D_drawImageFromRect_5_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImageFromRect_6 */
   void _drawImageFromRect_6(image, sx, sy, sw, sh) native "CanvasRenderingContext2D_drawImageFromRect_6_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImageFromRect_7 */
   void _drawImageFromRect_7(image, sx, sy, sw) native "CanvasRenderingContext2D_drawImageFromRect_7_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImageFromRect_8 */
   void _drawImageFromRect_8(image, sx, sy) native "CanvasRenderingContext2D_drawImageFromRect_8_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImageFromRect_9 */
   void _drawImageFromRect_9(image, sx) native "CanvasRenderingContext2D_drawImageFromRect_9_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.drawImageFromRect_10 */
   void _drawImageFromRect_10(image) native "CanvasRenderingContext2D_drawImageFromRect_10_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.fill */
   void fill() native "CanvasRenderingContext2D_fill_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.fillRect */
   void fillRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_fillRect_Callback";
 
   void fillText(/*DOMString*/ text, /*float*/ x, /*float*/ y, [/*float*/ maxWidth]) {
@@ -8402,20 +5812,36 @@
     _fillText_2(text, x, y);
   }
 
+
+  /** @domName CanvasRenderingContext2D.fillText_1 */
   void _fillText_1(text, x, y, maxWidth) native "CanvasRenderingContext2D_fillText_1_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.fillText_2 */
   void _fillText_2(text, x, y) native "CanvasRenderingContext2D_fillText_2_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.getImageData */
   ImageData getImageData(num sx, num sy, num sw, num sh) native "CanvasRenderingContext2D_getImageData_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.getLineDash */
   List<num> getLineDash() native "CanvasRenderingContext2D_getLineDash_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.isPointInPath */
   bool isPointInPath(num x, num y) native "CanvasRenderingContext2D_isPointInPath_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.lineTo */
   void lineTo(num x, num y) native "CanvasRenderingContext2D_lineTo_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.measureText */
   TextMetrics measureText(String text) native "CanvasRenderingContext2D_measureText_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.moveTo */
   void moveTo(num x, num y) native "CanvasRenderingContext2D_moveTo_Callback";
 
   void putImageData(/*ImageData*/ imagedata, /*float*/ dx, /*float*/ dy, [/*float*/ dirtyX, /*float*/ dirtyY, /*float*/ dirtyWidth, /*float*/ dirtyHeight]) {
@@ -8430,34 +5856,64 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName CanvasRenderingContext2D.putImageData_1 */
   void _putImageData_1(imagedata, dx, dy) native "CanvasRenderingContext2D_putImageData_1_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.putImageData_2 */
   void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_putImageData_2_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.quadraticCurveTo */
   void quadraticCurveTo(num cpx, num cpy, num x, num y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.rect */
   void rect(num x, num y, num width, num height) native "CanvasRenderingContext2D_rect_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.restore */
   void restore() native "CanvasRenderingContext2D_restore_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.rotate */
   void rotate(num angle) native "CanvasRenderingContext2D_rotate_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.save */
   void save() native "CanvasRenderingContext2D_save_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.scale */
   void scale(num sx, num sy) native "CanvasRenderingContext2D_scale_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setAlpha */
   void setAlpha(num alpha) native "CanvasRenderingContext2D_setAlpha_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setCompositeOperation */
   void setCompositeOperation(String compositeOperation) native "CanvasRenderingContext2D_setCompositeOperation_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setLineCap */
   void setLineCap(String cap) native "CanvasRenderingContext2D_setLineCap_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setLineDash */
   void setLineDash(List<num> dash) native "CanvasRenderingContext2D_setLineDash_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setLineJoin */
   void setLineJoin(String join) native "CanvasRenderingContext2D_setLineJoin_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setLineWidth */
   void setLineWidth(num width) native "CanvasRenderingContext2D_setLineWidth_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setMiterLimit */
   void setMiterLimit(num limit) native "CanvasRenderingContext2D_setMiterLimit_Callback";
 
   void setShadow(/*float*/ width, /*float*/ height, /*float*/ blur, [c_OR_color_OR_grayLevel_OR_r, /*float*/ alpha_OR_g_OR_m, /*float*/ b_OR_y, /*float*/ a_OR_k, /*float*/ a]) {
@@ -8492,22 +5948,40 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName CanvasRenderingContext2D.setShadow_1 */
   void _setShadow_1(width, height, blur) native "CanvasRenderingContext2D_setShadow_1_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setShadow_2 */
   void _setShadow_2(width, height, blur, c_OR_color_OR_grayLevel_OR_r) native "CanvasRenderingContext2D_setShadow_2_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setShadow_3 */
   void _setShadow_3(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m) native "CanvasRenderingContext2D_setShadow_3_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setShadow_4 */
   void _setShadow_4(width, height, blur, c_OR_color_OR_grayLevel_OR_r) native "CanvasRenderingContext2D_setShadow_4_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setShadow_5 */
   void _setShadow_5(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m) native "CanvasRenderingContext2D_setShadow_5_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setShadow_6 */
   void _setShadow_6(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m, b_OR_y, a_OR_k) native "CanvasRenderingContext2D_setShadow_6_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setShadow_7 */
   void _setShadow_7(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m, b_OR_y, a_OR_k, a) native "CanvasRenderingContext2D_setShadow_7_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.setTransform */
   void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) native "CanvasRenderingContext2D_setTransform_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.stroke */
   void stroke() native "CanvasRenderingContext2D_stroke_Callback";
 
   void strokeRect(/*float*/ x, /*float*/ y, /*float*/ width, /*float*/ height, [/*float*/ lineWidth]) {
@@ -8518,8 +5992,12 @@
     _strokeRect_2(x, y, width, height);
   }
 
+
+  /** @domName CanvasRenderingContext2D.strokeRect_1 */
   void _strokeRect_1(x, y, width, height, lineWidth) native "CanvasRenderingContext2D_strokeRect_1_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.strokeRect_2 */
   void _strokeRect_2(x, y, width, height) native "CanvasRenderingContext2D_strokeRect_2_Callback";
 
   void strokeText(/*DOMString*/ text, /*float*/ x, /*float*/ y, [/*float*/ maxWidth]) {
@@ -8530,14 +6008,24 @@
     _strokeText_2(text, x, y);
   }
 
+
+  /** @domName CanvasRenderingContext2D.strokeText_1 */
   void _strokeText_1(text, x, y, maxWidth) native "CanvasRenderingContext2D_strokeText_1_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.strokeText_2 */
   void _strokeText_2(text, x, y) native "CanvasRenderingContext2D_strokeText_2_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.transform */
   void transform(num m11, num m12, num m21, num m22, num dx, num dy) native "CanvasRenderingContext2D_transform_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.translate */
   void translate(num tx, num ty) native "CanvasRenderingContext2D_translate_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.webkitGetImageDataHD */
   ImageData webkitGetImageDataHD(num sx, num sy, num sw, num sh) native "CanvasRenderingContext2D_webkitGetImageDataHD_Callback";
 
   void webkitPutImageDataHD(/*ImageData*/ imagedata, /*float*/ dx, /*float*/ dy, [/*float*/ dirtyX, /*float*/ dirtyY, /*float*/ dirtyWidth, /*float*/ dirtyHeight]) {
@@ -8552,23 +6040,47 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName CanvasRenderingContext2D.webkitPutImageDataHD_1 */
   void _webkitPutImageDataHD_1(imagedata, dx, dy) native "CanvasRenderingContext2D_webkitPutImageDataHD_1_Callback";
 
+
+  /** @domName CanvasRenderingContext2D.webkitPutImageDataHD_2 */
   void _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_webkitPutImageDataHD_2_Callback";
 
 
+  /**
+   * Sets the color used inside shapes.
+   * [r], [g], [b] are 0-255, [a] is 0-1.
+   */
   void setFillColorRgb(int r, int g, int b, [num a = 1]) {
     this.fillStyle = 'rgba($r, $g, $b, $a)';
   }
 
+  /**
+   * Sets the color used inside shapes.
+   * [h] is in degrees, 0-360.
+   * [s], [l] are in percent, 0-100.
+   * [a] is 0-1.
+   */
   void setFillColorHsl(int h, num s, num l, [num a = 1]) {
     this.fillStyle = 'hsla($h, $s%, $l%, $a)';
   }
 
+  /**
+   * Sets the color used for stroking shapes.
+   * [r], [g], [b] are 0-255, [a] is 0-1.
+   */
   void setStrokeColorRgb(int r, int g, int b, [num a = 1]) {
     this.strokeStyle = 'rgba($r, $g, $b, $a)';
   }
 
+  /**
+   * Sets the color used for stroking shapes.
+   * [h] is in degrees, 0-360.
+   * [s], [l] are in percent, 0-100.
+   * [a] is 0-1.
+   */
   void setStrokeColorHsl(int h, num s, num l, [num a = 1]) {
     this.strokeStyle = 'hsla($h, $s%, $l%, $a)';
   }
@@ -8579,27 +6091,9 @@
 
 // WARNING: Do not edit - generated code.
 
-class _CanvasRenderingContextImpl extends NativeFieldWrapperClass1 implements CanvasRenderingContext {
-
-  CanvasElement get canvas native "CanvasRenderingContext_canvas_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName ChannelMergerNode
-abstract class ChannelMergerNode implements AudioNode {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ChannelMergerNodeImpl extends _AudioNodeImpl implements ChannelMergerNode {
+class ChannelMergerNode extends AudioNode {
+  ChannelMergerNode.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8609,15 +6103,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ChannelSplitterNode
-abstract class ChannelSplitterNode implements AudioNode {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ChannelSplitterNodeImpl extends _AudioNodeImpl implements ChannelSplitterNode {
+class ChannelSplitterNode extends AudioNode {
+  ChannelSplitterNode.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8627,56 +6114,43 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CharacterData
-abstract class CharacterData implements Node {
+class CharacterData extends Node {
+  CharacterData.internal(): super.internal();
+
 
   /** @domName CharacterData.data */
-  String data;
-
-  /** @domName CharacterData.length */
-  int get length;
-
-  /** @domName CharacterData.appendData */
-  void appendData(String data);
-
-  /** @domName CharacterData.deleteData */
-  void deleteData(int offset, int length);
-
-  /** @domName CharacterData.insertData */
-  void insertData(int offset, String data);
-
-  /** @domName CharacterData.remove */
-  void remove();
-
-  /** @domName CharacterData.replaceData */
-  void replaceData(int offset, int length, String data);
-
-  /** @domName CharacterData.substringData */
-  String substringData(int offset, int length);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CharacterDataImpl extends _NodeImpl implements CharacterData {
-
   String get data native "CharacterData_data_Getter";
 
+
+  /** @domName CharacterData.data */
   void set data(String value) native "CharacterData_data_Setter";
 
+
+  /** @domName CharacterData.length */
   int get length native "CharacterData_length_Getter";
 
+
+  /** @domName CharacterData.appendData */
   void appendData(String data) native "CharacterData_appendData_Callback";
 
+
+  /** @domName CharacterData.deleteData */
   void deleteData(int offset, int length) native "CharacterData_deleteData_Callback";
 
+
+  /** @domName CharacterData.insertData */
   void insertData(int offset, String data) native "CharacterData_insertData_Callback";
 
+
+  /** @domName CharacterData.remove */
   void remove() native "CharacterData_remove_Callback";
 
+
+  /** @domName CharacterData.replaceData */
   void replaceData(int offset, int length, String data) native "CharacterData_replaceData_Callback";
 
+
+  /** @domName CharacterData.substringData */
   String substringData(int offset, int length) native "CharacterData_substringData_Callback";
 
 }
@@ -8687,44 +6161,31 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ClientRect
-abstract class ClientRect {
+class ClientRect extends NativeFieldWrapperClass1 {
+  ClientRect.internal();
+
 
   /** @domName ClientRect.bottom */
-  num get bottom;
-
-  /** @domName ClientRect.height */
-  num get height;
-
-  /** @domName ClientRect.left */
-  num get left;
-
-  /** @domName ClientRect.right */
-  num get right;
-
-  /** @domName ClientRect.top */
-  num get top;
-
-  /** @domName ClientRect.width */
-  num get width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ClientRectImpl extends NativeFieldWrapperClass1 implements ClientRect {
-
   num get bottom native "ClientRect_bottom_Getter";
 
+
+  /** @domName ClientRect.height */
   num get height native "ClientRect_height_Getter";
 
+
+  /** @domName ClientRect.left */
   num get left native "ClientRect_left_Getter";
 
+
+  /** @domName ClientRect.right */
   num get right native "ClientRect_right_Getter";
 
+
+  /** @domName ClientRect.top */
   num get top native "ClientRect_top_Getter";
 
+
+  /** @domName ClientRect.width */
   num get width native "ClientRect_width_Getter";
 
 }
@@ -8734,160 +6195,52 @@
 
 // WARNING: Do not edit - generated code.
 
-class _ClientRectListImpl extends NativeFieldWrapperClass1 implements List<ClientRect> {
-
-  int get length native "ClientRectList_length_Getter";
-
-  ClientRect operator[](int index) native "ClientRectList_item_Callback";
-
-  void operator[]=(int index, ClientRect value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<ClientRect> mixins.
-  // ClientRect is the element type.
-
-  // From Iterable<ClientRect>:
-
-  Iterator<ClientRect> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<ClientRect>(this);
-  }
-
-  // From Collection<ClientRect>:
-
-  void add(ClientRect value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(ClientRect value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<ClientRect> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(ClientRect element) => _Collections.contains(this, element);
-
-  void forEach(void f(ClientRect element)) => _Collections.forEach(this, f);
-
-  Collection map(f(ClientRect element)) => _Collections.map(this, [], f);
-
-  Collection<ClientRect> filter(bool f(ClientRect element)) =>
-     _Collections.filter(this, <ClientRect>[], f);
-
-  bool every(bool f(ClientRect element)) => _Collections.every(this, f);
-
-  bool some(bool f(ClientRect element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<ClientRect>:
-
-  void sort([Comparator<ClientRect> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(ClientRect element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(ClientRect element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  ClientRect get last => this[length - 1];
-
-  ClientRect removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<ClientRect> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [ClientRect initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<ClientRect> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <ClientRect>[]);
-
-  // -- end List<ClientRect> mixins.
-
-  ClientRect item(int index) native "ClientRectList_item_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName Clipboard
-abstract class Clipboard {
+class Clipboard extends NativeFieldWrapperClass1 {
+  Clipboard.internal();
+
 
   /** @domName Clipboard.dropEffect */
-  String dropEffect;
-
-  /** @domName Clipboard.effectAllowed */
-  String effectAllowed;
-
-  /** @domName Clipboard.files */
-  List<File> get files;
-
-  /** @domName Clipboard.items */
-  DataTransferItemList get items;
-
-  /** @domName Clipboard.types */
-  List get types;
-
-  /** @domName Clipboard.clearData */
-  void clearData([String type]);
-
-  /** @domName Clipboard.getData */
-  String getData(String type);
-
-  /** @domName Clipboard.setData */
-  bool setData(String type, String data);
-
-  /** @domName Clipboard.setDragImage */
-  void setDragImage(ImageElement image, int x, int y);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ClipboardImpl extends NativeFieldWrapperClass1 implements Clipboard {
-
   String get dropEffect native "Clipboard_dropEffect_Getter";
 
+
+  /** @domName Clipboard.dropEffect */
   void set dropEffect(String value) native "Clipboard_dropEffect_Setter";
 
+
+  /** @domName Clipboard.effectAllowed */
   String get effectAllowed native "Clipboard_effectAllowed_Getter";
 
+
+  /** @domName Clipboard.effectAllowed */
   void set effectAllowed(String value) native "Clipboard_effectAllowed_Setter";
 
+
+  /** @domName Clipboard.files */
   List<File> get files native "Clipboard_files_Getter";
 
+
+  /** @domName Clipboard.items */
   DataTransferItemList get items native "Clipboard_items_Getter";
 
+
+  /** @domName Clipboard.types */
   List get types native "Clipboard_types_Getter";
 
+
+  /** @domName Clipboard.clearData */
   void clearData([String type]) native "Clipboard_clearData_Callback";
 
+
+  /** @domName Clipboard.getData */
   String getData(String type) native "Clipboard_getData_Callback";
 
+
+  /** @domName Clipboard.setData */
   bool setData(String type, String data) native "Clipboard_setData_Callback";
 
+
+  /** @domName Clipboard.setDragImage */
   void setDragImage(ImageElement image, int x, int y) native "Clipboard_setDragImage_Callback";
 
 }
@@ -8898,29 +6251,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CloseEvent
-abstract class CloseEvent implements Event {
+class CloseEvent extends Event {
+  CloseEvent.internal(): super.internal();
+
 
   /** @domName CloseEvent.code */
-  int get code;
-
-  /** @domName CloseEvent.reason */
-  String get reason;
-
-  /** @domName CloseEvent.wasClean */
-  bool get wasClean;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CloseEventImpl extends _EventImpl implements CloseEvent {
-
   int get code native "CloseEvent_code_Getter";
 
+
+  /** @domName CloseEvent.reason */
   String get reason native "CloseEvent_reason_Getter";
 
+
+  /** @domName CloseEvent.wasClean */
   bool get wasClean native "CloseEvent_wasClean_Getter";
 
 }
@@ -8931,15 +6274,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Comment
-abstract class Comment implements CharacterData {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CommentImpl extends _CharacterDataImpl implements Comment {
+class Comment extends CharacterData {
+  Comment.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8949,24 +6285,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName CompositionEvent
-abstract class CompositionEvent implements UIEvent {
+class CompositionEvent extends UIEvent {
+  CompositionEvent.internal(): super.internal();
+
 
   /** @domName CompositionEvent.data */
-  String get data;
-
-  /** @domName CompositionEvent.initCompositionEvent */
-  void initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CompositionEventImpl extends _UIEventImpl implements CompositionEvent {
-
   String get data native "CompositionEvent_data_Getter";
 
+
+  /** @domName CompositionEvent.initCompositionEvent */
   void initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg) native "CompositionEvent_initCompositionEvent_Callback";
 
 }
@@ -8977,119 +6304,91 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Console
-abstract class Console {
+class Console extends NativeFieldWrapperClass1 {
+  Console.internal();
+
 
   /** @domName Console.memory */
-  MemoryInfo get memory;
-
-  /** @domName Console.profiles */
-  List<ScriptProfile> get profiles;
-
-  /** @domName Console.assertCondition */
-  void assertCondition(bool condition, Object arg);
-
-  /** @domName Console.count */
-  void count(Object arg);
-
-  /** @domName Console.debug */
-  void debug(Object arg);
-
-  /** @domName Console.dir */
-  void dir(Object arg);
-
-  /** @domName Console.dirxml */
-  void dirxml(Object arg);
-
-  /** @domName Console.error */
-  void error(Object arg);
-
-  /** @domName Console.group */
-  void group(Object arg);
-
-  /** @domName Console.groupCollapsed */
-  void groupCollapsed(Object arg);
-
-  /** @domName Console.groupEnd */
-  void groupEnd();
-
-  /** @domName Console.info */
-  void info(Object arg);
-
-  /** @domName Console.log */
-  void log(Object arg);
-
-  /** @domName Console.markTimeline */
-  void markTimeline(Object arg);
-
-  /** @domName Console.profile */
-  void profile(String title);
-
-  /** @domName Console.profileEnd */
-  void profileEnd(String title);
-
-  /** @domName Console.time */
-  void time(String title);
-
-  /** @domName Console.timeEnd */
-  void timeEnd(String title, Object arg);
-
-  /** @domName Console.timeStamp */
-  void timeStamp(Object arg);
-
-  /** @domName Console.trace */
-  void trace(Object arg);
-
-  /** @domName Console.warn */
-  void warn(Object arg);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ConsoleImpl extends NativeFieldWrapperClass1 implements Console {
-
   MemoryInfo get memory native "Console_memory_Getter";
 
+
+  /** @domName Console.profiles */
   List<ScriptProfile> get profiles native "Console_profiles_Getter";
 
+
+  /** @domName Console.assertCondition */
   void assertCondition(bool condition, Object arg) native "Console_assertCondition_Callback";
 
+
+  /** @domName Console.count */
   void count(Object arg) native "Console_count_Callback";
 
+
+  /** @domName Console.debug */
   void debug(Object arg) native "Console_debug_Callback";
 
+
+  /** @domName Console.dir */
   void dir(Object arg) native "Console_dir_Callback";
 
+
+  /** @domName Console.dirxml */
   void dirxml(Object arg) native "Console_dirxml_Callback";
 
+
+  /** @domName Console.error */
   void error(Object arg) native "Console_error_Callback";
 
+
+  /** @domName Console.group */
   void group(Object arg) native "Console_group_Callback";
 
+
+  /** @domName Console.groupCollapsed */
   void groupCollapsed(Object arg) native "Console_groupCollapsed_Callback";
 
+
+  /** @domName Console.groupEnd */
   void groupEnd() native "Console_groupEnd_Callback";
 
+
+  /** @domName Console.info */
   void info(Object arg) native "Console_info_Callback";
 
+
+  /** @domName Console.log */
   void log(Object arg) native "Console_log_Callback";
 
+
+  /** @domName Console.markTimeline */
   void markTimeline(Object arg) native "Console_markTimeline_Callback";
 
+
+  /** @domName Console.profile */
   void profile(String title) native "Console_profile_Callback";
 
+
+  /** @domName Console.profileEnd */
   void profileEnd(String title) native "Console_profileEnd_Callback";
 
+
+  /** @domName Console.time */
   void time(String title) native "Console_time_Callback";
 
+
+  /** @domName Console.timeEnd */
   void timeEnd(String title, Object arg) native "Console_timeEnd_Callback";
 
+
+  /** @domName Console.timeStamp */
   void timeStamp(Object arg) native "Console_timeStamp_Callback";
 
+
+  /** @domName Console.trace */
   void trace(Object arg) native "Console_trace_Callback";
 
+
+  /** @domName Console.warn */
   void warn(Object arg) native "Console_warn_Callback";
 
 }
@@ -9100,35 +6399,29 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLContentElement
-abstract class ContentElement implements Element {
+class ContentElement extends _Element_Merged {
 
   factory ContentElement() => _Elements.createContentElement();
+  ContentElement.internal(): super.internal();
+
 
   /** @domName HTMLContentElement.resetStyleInheritance */
-  bool resetStyleInheritance;
-
-  /** @domName HTMLContentElement.select */
-  String select;
-
-  /** @domName HTMLContentElement.getDistributedNodes */
-  List<Node> getDistributedNodes();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ContentElementImpl extends _ElementImpl_Merged implements ContentElement {
-
   bool get resetStyleInheritance native "HTMLContentElement_resetStyleInheritance_Getter";
 
+
+  /** @domName HTMLContentElement.resetStyleInheritance */
   void set resetStyleInheritance(bool value) native "HTMLContentElement_resetStyleInheritance_Setter";
 
+
+  /** @domName HTMLContentElement.select */
   String get select native "HTMLContentElement_select_Getter";
 
+
+  /** @domName HTMLContentElement.select */
   void set select(String value) native "HTMLContentElement_select_Setter";
 
+
+  /** @domName HTMLContentElement.getDistributedNodes */
   List<Node> getDistributedNodes() native "HTMLContentElement_getDistributedNodes_Callback";
 
 }
@@ -9139,28 +6432,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ConvolverNode
-abstract class ConvolverNode implements AudioNode {
+class ConvolverNode extends AudioNode {
+  ConvolverNode.internal(): super.internal();
+
 
   /** @domName ConvolverNode.buffer */
-  AudioBuffer buffer;
-
-  /** @domName ConvolverNode.normalize */
-  bool normalize;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ConvolverNodeImpl extends _AudioNodeImpl implements ConvolverNode {
-
   AudioBuffer get buffer native "ConvolverNode_buffer_Getter";
 
+
+  /** @domName ConvolverNode.buffer */
   void set buffer(AudioBuffer value) native "ConvolverNode_buffer_Setter";
 
+
+  /** @domName ConvolverNode.normalize */
   bool get normalize native "ConvolverNode_normalize_Getter";
 
+
+  /** @domName ConvolverNode.normalize */
   void set normalize(bool value) native "ConvolverNode_normalize_Setter";
 
 }
@@ -9171,49 +6459,35 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Coordinates
-abstract class Coordinates {
+class Coordinates extends NativeFieldWrapperClass1 {
+  Coordinates.internal();
+
 
   /** @domName Coordinates.accuracy */
-  num get accuracy;
-
-  /** @domName Coordinates.altitude */
-  num get altitude;
-
-  /** @domName Coordinates.altitudeAccuracy */
-  num get altitudeAccuracy;
-
-  /** @domName Coordinates.heading */
-  num get heading;
-
-  /** @domName Coordinates.latitude */
-  num get latitude;
-
-  /** @domName Coordinates.longitude */
-  num get longitude;
-
-  /** @domName Coordinates.speed */
-  num get speed;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CoordinatesImpl extends NativeFieldWrapperClass1 implements Coordinates {
-
   num get accuracy native "Coordinates_accuracy_Getter";
 
+
+  /** @domName Coordinates.altitude */
   num get altitude native "Coordinates_altitude_Getter";
 
+
+  /** @domName Coordinates.altitudeAccuracy */
   num get altitudeAccuracy native "Coordinates_altitudeAccuracy_Getter";
 
+
+  /** @domName Coordinates.heading */
   num get heading native "Coordinates_heading_Getter";
 
+
+  /** @domName Coordinates.latitude */
   num get latitude native "Coordinates_latitude_Getter";
 
+
+  /** @domName Coordinates.longitude */
   num get longitude native "Coordinates_longitude_Getter";
 
+
+  /** @domName Coordinates.speed */
   num get speed native "Coordinates_speed_Getter";
 
 }
@@ -9224,29 +6498,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Counter
-abstract class Counter {
+class Counter extends NativeFieldWrapperClass1 {
+  Counter.internal();
+
 
   /** @domName Counter.identifier */
-  String get identifier;
-
-  /** @domName Counter.listStyle */
-  String get listStyle;
-
-  /** @domName Counter.separator */
-  String get separator;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CounterImpl extends NativeFieldWrapperClass1 implements Counter {
-
   String get identifier native "Counter_identifier_Getter";
 
+
+  /** @domName Counter.listStyle */
   String get listStyle native "Counter_listStyle_Getter";
 
+
+  /** @domName Counter.separator */
   String get separator native "Counter_separator_Getter";
 
 }
@@ -9257,19 +6521,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Crypto
-abstract class Crypto {
+class Crypto extends NativeFieldWrapperClass1 {
+  Crypto.internal();
+
 
   /** @domName Crypto.getRandomValues */
-  void getRandomValues(ArrayBufferView array);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CryptoImpl extends NativeFieldWrapperClass1 implements Crypto {
-
   void getRandomValues(ArrayBufferView array) native "Crypto_getRandomValues_Callback";
 
 }
@@ -9279,31 +6535,18 @@
 
 // WARNING: Do not edit - generated code.
 
-
-/// @domName CustomEvent
-abstract class CustomEvent implements Event {
-
+class CustomEvent extends Event {
   factory CustomEvent(String type, [bool canBubble = true, bool cancelable = true,
-      Object detail = null]) => _CustomEventFactoryProvider.createCustomEvent(type, canBubble,
-      cancelable, detail);
+      Object detail]) => _CustomEventFactoryProvider.createCustomEvent(
+      type, canBubble, cancelable, detail);
+  CustomEvent.internal(): super.internal();
 
 
   /** @domName CustomEvent.detail */
-  Object get detail;
-
-  /** @domName CustomEvent.initCustomEvent */
-  void $dom_initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _CustomEventImpl extends _EventImpl implements CustomEvent {
-
   Object get detail native "CustomEvent_detail_Getter";
 
+
+  /** @domName CustomEvent.initCustomEvent */
   void $dom_initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) native "CustomEvent_initCustomEvent_Callback";
 
 }
@@ -9314,23 +6557,17 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLDListElement
-abstract class DListElement implements Element {
+class DListElement extends _Element_Merged {
 
   factory DListElement() => _Elements.createDListElement();
+  DListElement.internal(): super.internal();
+
 
   /** @domName HTMLDListElement.compact */
-  bool compact;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DListElementImpl extends _ElementImpl_Merged implements DListElement {
-
   bool get compact native "HTMLDListElement_compact_Getter";
 
+
+  /** @domName HTMLDListElement.compact */
   void set compact(bool value) native "HTMLDListElement_compact_Setter";
 
 }
@@ -9341,12 +6578,14 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DOMApplicationCache
-abstract class DOMApplicationCache implements EventTarget {
+class DOMApplicationCache extends EventTarget {
+  DOMApplicationCache.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  DOMApplicationCacheEvents get on;
+  DOMApplicationCacheEvents get on =>
+    new DOMApplicationCacheEvents(this);
 
   static const int CHECKING = 2;
 
@@ -9360,75 +6599,38 @@
 
   static const int UPDATEREADY = 4;
 
+
   /** @domName DOMApplicationCache.status */
-  int get status;
-
-  /** @domName DOMApplicationCache.abort */
-  void abort();
-
-  /** @domName DOMApplicationCache.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName DOMApplicationCache.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName DOMApplicationCache.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName DOMApplicationCache.swapCache */
-  void swapCache();
-
-  /** @domName DOMApplicationCache.update */
-  void update();
-}
-
-abstract class DOMApplicationCacheEvents implements Events {
-
-  EventListenerList get cached;
-
-  EventListenerList get checking;
-
-  EventListenerList get downloading;
-
-  EventListenerList get error;
-
-  EventListenerList get noUpdate;
-
-  EventListenerList get obsolete;
-
-  EventListenerList get progress;
-
-  EventListenerList get updateReady;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DOMApplicationCacheImpl extends _EventTargetImpl implements DOMApplicationCache {
-
-  _DOMApplicationCacheEventsImpl get on =>
-    new _DOMApplicationCacheEventsImpl(this);
-
   int get status native "DOMApplicationCache_status_Getter";
 
+
+  /** @domName DOMApplicationCache.abort */
   void abort() native "DOMApplicationCache_abort_Callback";
 
+
+  /** @domName DOMApplicationCache.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_addEventListener_Callback";
 
+
+  /** @domName DOMApplicationCache.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "DOMApplicationCache_dispatchEvent_Callback";
 
+
+  /** @domName DOMApplicationCache.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_removeEventListener_Callback";
 
+
+  /** @domName DOMApplicationCache.swapCache */
   void swapCache() native "DOMApplicationCache_swapCache_Callback";
 
+
+  /** @domName DOMApplicationCache.update */
   void update() native "DOMApplicationCache_update_Callback";
 
 }
 
-class _DOMApplicationCacheEventsImpl extends _EventsImpl implements DOMApplicationCacheEvents {
-  _DOMApplicationCacheEventsImpl(_ptr) : super(_ptr);
+class DOMApplicationCacheEvents extends Events {
+  DOMApplicationCacheEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get cached => this['cached'];
 
@@ -9453,19 +6655,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DOMError
-abstract class DOMError {
+class DOMError extends NativeFieldWrapperClass1 {
+  DOMError.internal();
+
 
   /** @domName DOMError.name */
-  String get name;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DOMErrorImpl extends NativeFieldWrapperClass1 implements DOMError {
-
   String get name native "DOMError_name_Getter";
 
 }
@@ -9476,7 +6670,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DOMException
-abstract class DOMException {
+class DOMException extends NativeFieldWrapperClass1 {
+  DOMException.internal();
 
   static const int ABORT_ERR = 20;
 
@@ -9528,32 +6723,20 @@
 
   static const int WRONG_DOCUMENT_ERR = 4;
 
-  /** @domName DOMException.code */
-  int get code;
 
-  /** @domName DOMException.message */
-  String get message;
-
-  /** @domName DOMException.name */
-  String get name;
-
-  /** @domName DOMException.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DOMExceptionImpl extends NativeFieldWrapperClass1 implements DOMException {
-
+  /** @domName DOMCoreException.code */
   int get code native "DOMCoreException_code_Getter";
 
+
+  /** @domName DOMCoreException.message */
   String get message native "DOMCoreException_message_Getter";
 
+
+  /** @domName DOMCoreException.name */
   String get name native "DOMCoreException_name_Getter";
 
+
+  /** @domName DOMCoreException.toString */
   String toString() native "DOMCoreException_toString_Callback";
 
 }
@@ -9564,24 +6747,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DOMFileSystem
-abstract class DOMFileSystem {
+class DOMFileSystem extends NativeFieldWrapperClass1 {
+  DOMFileSystem.internal();
+
 
   /** @domName DOMFileSystem.name */
-  String get name;
-
-  /** @domName DOMFileSystem.root */
-  DirectoryEntry get root;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DOMFileSystemImpl extends NativeFieldWrapperClass1 implements DOMFileSystem {
-
   String get name native "DOMFileSystem_name_Getter";
 
+
+  /** @domName DOMFileSystem.root */
   DirectoryEntry get root native "DOMFileSystem_root_Getter";
 
 }
@@ -9592,24 +6766,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DOMFileSystemSync
-abstract class DOMFileSystemSync {
+class DOMFileSystemSync extends NativeFieldWrapperClass1 {
+  DOMFileSystemSync.internal();
+
 
   /** @domName DOMFileSystemSync.name */
-  String get name;
-
-  /** @domName DOMFileSystemSync.root */
-  DirectoryEntrySync get root;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DOMFileSystemSyncImpl extends NativeFieldWrapperClass1 implements DOMFileSystemSync {
-
   String get name native "DOMFileSystemSync_name_Getter";
 
+
+  /** @domName DOMFileSystemSync.root */
   DirectoryEntrySync get root native "DOMFileSystemSync_root_Getter";
 
 }
@@ -9620,39 +6785,27 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DOMImplementation
-abstract class DOMImplementation {
+class DOMImplementation extends NativeFieldWrapperClass1 {
+  DOMImplementation.internal();
+
 
   /** @domName DOMImplementation.createCSSStyleSheet */
-  CSSStyleSheet createCSSStyleSheet(String title, String media);
-
-  /** @domName DOMImplementation.createDocument */
-  Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype);
-
-  /** @domName DOMImplementation.createDocumentType */
-  DocumentType createDocumentType(String qualifiedName, String publicId, String systemId);
-
-  /** @domName DOMImplementation.createHTMLDocument */
-  Document createHTMLDocument(String title);
-
-  /** @domName DOMImplementation.hasFeature */
-  bool hasFeature(String feature, String version);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DOMImplementationImpl extends NativeFieldWrapperClass1 implements DOMImplementation {
-
   CSSStyleSheet createCSSStyleSheet(String title, String media) native "DOMImplementation_createCSSStyleSheet_Callback";
 
+
+  /** @domName DOMImplementation.createDocument */
   Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype) native "DOMImplementation_createDocument_Callback";
 
+
+  /** @domName DOMImplementation.createDocumentType */
   DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native "DOMImplementation_createDocumentType_Callback";
 
+
+  /** @domName DOMImplementation.createHTMLDocument */
   Document createHTMLDocument(String title) native "DOMImplementation_createHTMLDocument_Callback";
 
+
+  /** @domName DOMImplementation.hasFeature */
   bool hasFeature(String feature, String version) native "DOMImplementation_hasFeature_Callback";
 
 }
@@ -9663,19 +6816,25 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MimeType
-abstract class DOMMimeType {
+class DOMMimeType extends NativeFieldWrapperClass1 {
+  DOMMimeType.internal();
 
-  /** @domName MimeType.description */
-  String get description;
 
-  /** @domName MimeType.enabledPlugin */
-  DOMPlugin get enabledPlugin;
+  /** @domName DOMMimeType.description */
+  String get description native "DOMMimeType_description_Getter";
 
-  /** @domName MimeType.suffixes */
-  String get suffixes;
 
-  /** @domName MimeType.type */
-  String get type;
+  /** @domName DOMMimeType.enabledPlugin */
+  DOMPlugin get enabledPlugin native "DOMMimeType_enabledPlugin_Getter";
+
+
+  /** @domName DOMMimeType.suffixes */
+  String get suffixes native "DOMMimeType_suffixes_Getter";
+
+
+  /** @domName DOMMimeType.type */
+  String get type native "DOMMimeType_type_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -9684,25 +6843,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MimeTypeArray
-abstract class DOMMimeTypeArray implements List<DOMMimeType> {
+class DOMMimeTypeArray extends NativeFieldWrapperClass1 implements List<DOMMimeType> {
+  DOMMimeTypeArray.internal();
 
-  /** @domName MimeTypeArray.length */
-  int get length;
 
-  /** @domName MimeTypeArray.item */
-  DOMMimeType item(int index);
-
-  /** @domName MimeTypeArray.namedItem */
-  DOMMimeType namedItem(String name);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DOMMimeTypeArrayImpl extends NativeFieldWrapperClass1 implements DOMMimeTypeArray {
-
+  /** @domName DOMMimeTypeArray.length */
   int get length native "DOMMimeTypeArray_length_Getter";
 
   DOMMimeType operator[](int index) native "DOMMimeTypeArray_item_Callback";
@@ -9788,8 +6933,12 @@
 
   // -- end List<DOMMimeType> mixins.
 
+
+  /** @domName DOMMimeTypeArray.item */
   DOMMimeType item(int index) native "DOMMimeTypeArray_item_Callback";
 
+
+  /** @domName DOMMimeTypeArray.namedItem */
   DOMMimeType namedItem(String name) native "DOMMimeTypeArray_namedItem_Callback";
 
 }
@@ -9799,39 +6948,14 @@
 
 // WARNING: Do not edit - generated code.
 
-class _DOMMimeTypeImpl extends NativeFieldWrapperClass1 implements DOMMimeType {
-
-  String get description native "DOMMimeType_description_Getter";
-
-  DOMPlugin get enabledPlugin native "DOMMimeType_enabledPlugin_Getter";
-
-  String get suffixes native "DOMMimeType_suffixes_Getter";
-
-  String get type native "DOMMimeType_type_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName DOMParser
-abstract class DOMParser {
+class DOMParser extends NativeFieldWrapperClass1 {
 
   factory DOMParser() => _DOMParserFactoryProvider.createDOMParser();
+  DOMParser.internal();
+
 
   /** @domName DOMParser.parseFromString */
-  Document parseFromString(String str, String contentType);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DOMParserImpl extends NativeFieldWrapperClass1 implements DOMParser {
-
   Document parseFromString(String str, String contentType) native "DOMParser_parseFromString_Callback";
 
 }
@@ -9842,25 +6966,33 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Plugin
-abstract class DOMPlugin {
+class DOMPlugin extends NativeFieldWrapperClass1 {
+  DOMPlugin.internal();
 
-  /** @domName Plugin.description */
-  String get description;
 
-  /** @domName Plugin.filename */
-  String get filename;
+  /** @domName DOMPlugin.description */
+  String get description native "DOMPlugin_description_Getter";
 
-  /** @domName Plugin.length */
-  int get length;
 
-  /** @domName Plugin.name */
-  String get name;
+  /** @domName DOMPlugin.filename */
+  String get filename native "DOMPlugin_filename_Getter";
 
-  /** @domName Plugin.item */
-  DOMMimeType item(int index);
 
-  /** @domName Plugin.namedItem */
-  DOMMimeType namedItem(String name);
+  /** @domName DOMPlugin.length */
+  int get length native "DOMPlugin_length_Getter";
+
+
+  /** @domName DOMPlugin.name */
+  String get name native "DOMPlugin_name_Getter";
+
+
+  /** @domName DOMPlugin.item */
+  DOMMimeType item(int index) native "DOMPlugin_item_Callback";
+
+
+  /** @domName DOMPlugin.namedItem */
+  DOMMimeType namedItem(String name) native "DOMPlugin_namedItem_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -9869,28 +7001,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName PluginArray
-abstract class DOMPluginArray implements List<DOMPlugin> {
+class DOMPluginArray extends NativeFieldWrapperClass1 implements List<DOMPlugin> {
+  DOMPluginArray.internal();
 
-  /** @domName PluginArray.length */
-  int get length;
 
-  /** @domName PluginArray.item */
-  DOMPlugin item(int index);
-
-  /** @domName PluginArray.namedItem */
-  DOMPlugin namedItem(String name);
-
-  /** @domName PluginArray.refresh */
-  void refresh(bool reload);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DOMPluginArrayImpl extends NativeFieldWrapperClass1 implements DOMPluginArray {
-
+  /** @domName DOMPluginArray.length */
   int get length native "DOMPluginArray_length_Getter";
 
   DOMPlugin operator[](int index) native "DOMPluginArray_item_Callback";
@@ -9976,10 +7091,16 @@
 
   // -- end List<DOMPlugin> mixins.
 
+
+  /** @domName DOMPluginArray.item */
   DOMPlugin item(int index) native "DOMPluginArray_item_Callback";
 
+
+  /** @domName DOMPluginArray.namedItem */
   DOMPlugin namedItem(String name) native "DOMPluginArray_namedItem_Callback";
 
+
+  /** @domName DOMPluginArray.refresh */
   void refresh(bool reload) native "DOMPluginArray_refresh_Callback";
 
 }
@@ -9989,166 +7110,112 @@
 
 // WARNING: Do not edit - generated code.
 
-class _DOMPluginImpl extends NativeFieldWrapperClass1 implements DOMPlugin {
-
-  String get description native "DOMPlugin_description_Getter";
-
-  String get filename native "DOMPlugin_filename_Getter";
-
-  int get length native "DOMPlugin_length_Getter";
-
-  String get name native "DOMPlugin_name_Getter";
-
-  DOMMimeType item(int index) native "DOMPlugin_item_Callback";
-
-  DOMMimeType namedItem(String name) native "DOMPlugin_namedItem_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName Selection
-abstract class DOMSelection {
+class DOMSelection extends NativeFieldWrapperClass1 {
+  DOMSelection.internal();
 
-  /** @domName Selection.anchorNode */
-  Node get anchorNode;
 
-  /** @domName Selection.anchorOffset */
-  int get anchorOffset;
-
-  /** @domName Selection.baseNode */
-  Node get baseNode;
-
-  /** @domName Selection.baseOffset */
-  int get baseOffset;
-
-  /** @domName Selection.extentNode */
-  Node get extentNode;
-
-  /** @domName Selection.extentOffset */
-  int get extentOffset;
-
-  /** @domName Selection.focusNode */
-  Node get focusNode;
-
-  /** @domName Selection.focusOffset */
-  int get focusOffset;
-
-  /** @domName Selection.isCollapsed */
-  bool get isCollapsed;
-
-  /** @domName Selection.rangeCount */
-  int get rangeCount;
-
-  /** @domName Selection.type */
-  String get type;
-
-  /** @domName Selection.addRange */
-  void addRange(Range range);
-
-  /** @domName Selection.collapse */
-  void collapse(Node node, int index);
-
-  /** @domName Selection.collapseToEnd */
-  void collapseToEnd();
-
-  /** @domName Selection.collapseToStart */
-  void collapseToStart();
-
-  /** @domName Selection.containsNode */
-  bool containsNode(Node node, bool allowPartial);
-
-  /** @domName Selection.deleteFromDocument */
-  void deleteFromDocument();
-
-  /** @domName Selection.empty */
-  void empty();
-
-  /** @domName Selection.extend */
-  void extend(Node node, int offset);
-
-  /** @domName Selection.getRangeAt */
-  Range getRangeAt(int index);
-
-  /** @domName Selection.modify */
-  void modify(String alter, String direction, String granularity);
-
-  /** @domName Selection.removeAllRanges */
-  void removeAllRanges();
-
-  /** @domName Selection.selectAllChildren */
-  void selectAllChildren(Node node);
-
-  /** @domName Selection.setBaseAndExtent */
-  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset);
-
-  /** @domName Selection.setPosition */
-  void setPosition(Node node, int offset);
-
-  /** @domName Selection.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DOMSelectionImpl extends NativeFieldWrapperClass1 implements DOMSelection {
-
+  /** @domName DOMSelection.anchorNode */
   Node get anchorNode native "DOMSelection_anchorNode_Getter";
 
+
+  /** @domName DOMSelection.anchorOffset */
   int get anchorOffset native "DOMSelection_anchorOffset_Getter";
 
+
+  /** @domName DOMSelection.baseNode */
   Node get baseNode native "DOMSelection_baseNode_Getter";
 
+
+  /** @domName DOMSelection.baseOffset */
   int get baseOffset native "DOMSelection_baseOffset_Getter";
 
+
+  /** @domName DOMSelection.extentNode */
   Node get extentNode native "DOMSelection_extentNode_Getter";
 
+
+  /** @domName DOMSelection.extentOffset */
   int get extentOffset native "DOMSelection_extentOffset_Getter";
 
+
+  /** @domName DOMSelection.focusNode */
   Node get focusNode native "DOMSelection_focusNode_Getter";
 
+
+  /** @domName DOMSelection.focusOffset */
   int get focusOffset native "DOMSelection_focusOffset_Getter";
 
+
+  /** @domName DOMSelection.isCollapsed */
   bool get isCollapsed native "DOMSelection_isCollapsed_Getter";
 
+
+  /** @domName DOMSelection.rangeCount */
   int get rangeCount native "DOMSelection_rangeCount_Getter";
 
+
+  /** @domName DOMSelection.type */
   String get type native "DOMSelection_type_Getter";
 
+
+  /** @domName DOMSelection.addRange */
   void addRange(Range range) native "DOMSelection_addRange_Callback";
 
+
+  /** @domName DOMSelection.collapse */
   void collapse(Node node, int index) native "DOMSelection_collapse_Callback";
 
+
+  /** @domName DOMSelection.collapseToEnd */
   void collapseToEnd() native "DOMSelection_collapseToEnd_Callback";
 
+
+  /** @domName DOMSelection.collapseToStart */
   void collapseToStart() native "DOMSelection_collapseToStart_Callback";
 
+
+  /** @domName DOMSelection.containsNode */
   bool containsNode(Node node, bool allowPartial) native "DOMSelection_containsNode_Callback";
 
+
+  /** @domName DOMSelection.deleteFromDocument */
   void deleteFromDocument() native "DOMSelection_deleteFromDocument_Callback";
 
+
+  /** @domName DOMSelection.empty */
   void empty() native "DOMSelection_empty_Callback";
 
+
+  /** @domName DOMSelection.extend */
   void extend(Node node, int offset) native "DOMSelection_extend_Callback";
 
+
+  /** @domName DOMSelection.getRangeAt */
   Range getRangeAt(int index) native "DOMSelection_getRangeAt_Callback";
 
+
+  /** @domName DOMSelection.modify */
   void modify(String alter, String direction, String granularity) native "DOMSelection_modify_Callback";
 
+
+  /** @domName DOMSelection.removeAllRanges */
   void removeAllRanges() native "DOMSelection_removeAllRanges_Callback";
 
+
+  /** @domName DOMSelection.selectAllChildren */
   void selectAllChildren(Node node) native "DOMSelection_selectAllChildren_Callback";
 
+
+  /** @domName DOMSelection.setBaseAndExtent */
   void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native "DOMSelection_setBaseAndExtent_Callback";
 
+
+  /** @domName DOMSelection.setPosition */
   void setPosition(Node node, int offset) native "DOMSelection_setPosition_Callback";
 
+
+  /** @domName DOMSelection.toString */
   String toString() native "DOMSelection_toString_Callback";
 
 }
@@ -10159,21 +7226,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DOMSettableTokenList
-abstract class DOMSettableTokenList implements DOMTokenList {
+class DOMSettableTokenList extends DOMTokenList {
+  DOMSettableTokenList.internal(): super.internal();
+
 
   /** @domName DOMSettableTokenList.value */
-  String value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DOMSettableTokenListImpl extends _DOMTokenListImpl implements DOMSettableTokenList {
-
   String get value native "DOMSettableTokenList_value_Getter";
 
+
+  /** @domName DOMSettableTokenList.value */
   void set value(String value) native "DOMSettableTokenList_value_Setter";
 
 }
@@ -10183,106 +7244,10 @@
 
 // WARNING: Do not edit - generated code.
 
-class _DOMStringListImpl extends NativeFieldWrapperClass1 implements List<String> {
-
-  int get length native "DOMStringList_length_Getter";
-
-  String operator[](int index) native "DOMStringList_item_Callback";
-
-  void operator[]=(int index, String value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<String> mixins.
-  // String is the element type.
-
-  // From Iterable<String>:
-
-  Iterator<String> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<String>(this);
-  }
-
-  // From Collection<String>:
-
-  void add(String value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(String value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<String> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  // contains() defined by IDL.
-
-  void forEach(void f(String element)) => _Collections.forEach(this, f);
-
-  Collection map(f(String element)) => _Collections.map(this, [], f);
-
-  Collection<String> filter(bool f(String element)) =>
-     _Collections.filter(this, <String>[], f);
-
-  bool every(bool f(String element)) => _Collections.every(this, f);
-
-  bool some(bool f(String element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<String>:
-
-  void sort([Comparator<String> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(String element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(String element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  String get last => this[length - 1];
-
-  String removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [String initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<String> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <String>[]);
-
-  // -- end List<String> mixins.
-
-  bool contains(String string) native "DOMStringList_contains_Callback";
-
-  String item(int index) native "DOMStringList_item_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName DOMStringMap
-abstract class DOMStringMap {
+class DOMStringMap extends NativeFieldWrapperClass1 {
+  DOMStringMap.internal();
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -10291,37 +7256,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DOMTokenList
-abstract class DOMTokenList {
+class DOMTokenList extends NativeFieldWrapperClass1 {
+  DOMTokenList.internal();
+
 
   /** @domName DOMTokenList.length */
-  int get length;
-
-  /** @domName DOMTokenList.contains */
-  bool contains(String token);
-
-  /** @domName DOMTokenList.item */
-  String item(int index);
-
-  /** @domName DOMTokenList.toString */
-  String toString();
-
-  /** @domName DOMTokenList.toggle */
-  bool toggle(String token, [bool force]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DOMTokenListImpl extends NativeFieldWrapperClass1 implements DOMTokenList {
-
   int get length native "DOMTokenList_length_Getter";
 
+
+  /** @domName DOMTokenList.contains */
   bool contains(String token) native "DOMTokenList_contains_Callback";
 
+
+  /** @domName DOMTokenList.item */
   String item(int index) native "DOMTokenList_item_Callback";
 
+
+  /** @domName DOMTokenList.toString */
   String toString() native "DOMTokenList_toString_Callback";
 
   bool toggle(/*DOMString*/ token, [/*boolean*/ force]) {
@@ -10331,8 +7282,12 @@
     return _toggle_2(token);
   }
 
+
+  /** @domName DOMTokenList.toggle_1 */
   bool _toggle_1(token, force) native "DOMTokenList_toggle_1_Callback";
 
+
+  /** @domName DOMTokenList.toggle_2 */
   bool _toggle_2(token) native "DOMTokenList_toggle_2_Callback";
 
 }
@@ -10342,69 +7297,14 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName URL
-abstract class DOMURL {
-
-  factory DOMURL() => _DOMURLFactoryProvider.createDOMURL();
-
-  /** @domName URL.createObjectURL */
-  static final createObjectURL = _DOMURLImpl.createObjectURL;
-
-  /** @domName URL.revokeObjectURL */
-  static final revokeObjectURL = _DOMURLImpl.revokeObjectURL;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DOMURLImpl extends NativeFieldWrapperClass1 implements DOMURL {
-
-  static String createObjectURL(blob_OR_source_OR_stream) {
-    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
-      return _createObjectURL_1(blob_OR_source_OR_stream);
-    }
-    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
-      return _createObjectURL_2(blob_OR_source_OR_stream);
-    }
-    if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
-      return _createObjectURL_3(blob_OR_source_OR_stream);
-    }
-    throw "Incorrect number or type of arguments";
-  }
-
-  static String _createObjectURL_1(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_1_Callback";
-
-  static String _createObjectURL_2(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_2_Callback";
-
-  static String _createObjectURL_3(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_3_Callback";
-
-  static void revokeObjectURL(String url) native "DOMURL_revokeObjectURL_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName HTMLDataListElement
-abstract class DataListElement implements Element {
+class DataListElement extends _Element_Merged {
 
   factory DataListElement() => _Elements.createDataListElement();
+  DataListElement.internal(): super.internal();
+
 
   /** @domName HTMLDataListElement.options */
-  HTMLCollection get options;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DataListElementImpl extends _ElementImpl_Merged implements DataListElement {
-
   HTMLCollection get options native "HTMLDataListElement_options_Getter";
 
 }
@@ -10415,39 +7315,27 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DataTransferItem
-abstract class DataTransferItem {
+class DataTransferItem extends NativeFieldWrapperClass1 {
+  DataTransferItem.internal();
+
 
   /** @domName DataTransferItem.kind */
-  String get kind;
-
-  /** @domName DataTransferItem.type */
-  String get type;
-
-  /** @domName DataTransferItem.getAsFile */
-  Blob getAsFile();
-
-  /** @domName DataTransferItem.getAsString */
-  void getAsString([StringCallback callback]);
-
-  /** @domName DataTransferItem.webkitGetAsEntry */
-  Entry webkitGetAsEntry();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DataTransferItemImpl extends NativeFieldWrapperClass1 implements DataTransferItem {
-
   String get kind native "DataTransferItem_kind_Getter";
 
+
+  /** @domName DataTransferItem.type */
   String get type native "DataTransferItem_type_Getter";
 
+
+  /** @domName DataTransferItem.getAsFile */
   Blob getAsFile() native "DataTransferItem_getAsFile_Callback";
 
+
+  /** @domName DataTransferItem.getAsString */
   void getAsString([StringCallback callback]) native "DataTransferItem_getAsString_Callback";
 
+
+  /** @domName DataTransferItem.webkitGetAsEntry */
   Entry webkitGetAsEntry() native "DataTransferItem_webkitGetAsEntry_Callback";
 
 }
@@ -10458,28 +7346,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DataTransferItemList
-abstract class DataTransferItemList {
+class DataTransferItemList extends NativeFieldWrapperClass1 {
+  DataTransferItemList.internal();
+
 
   /** @domName DataTransferItemList.length */
-  int get length;
-
-  /** @domName DataTransferItemList.add */
-  void add(data_OR_file, [String type]);
-
-  /** @domName DataTransferItemList.clear */
-  void clear();
-
-  /** @domName DataTransferItemList.item */
-  DataTransferItem item(int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DataTransferItemListImpl extends NativeFieldWrapperClass1 implements DataTransferItemList {
-
   int get length native "DataTransferItemList_length_Getter";
 
   void add(data_OR_file, [/*DOMString*/ type]) {
@@ -10494,12 +7365,20 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName DataTransferItemList.add_1 */
   void _add_1(data_OR_file) native "DataTransferItemList_add_1_Callback";
 
+
+  /** @domName DataTransferItemList.add_2 */
   void _add_2(data_OR_file, type) native "DataTransferItemList_add_2_Callback";
 
+
+  /** @domName DataTransferItemList.clear */
   void clear() native "DataTransferItemList_clear_Callback";
 
+
+  /** @domName DataTransferItemList.item */
   DataTransferItem item(int index) native "DataTransferItemList_item_Callback";
 
 }
@@ -10510,7 +7389,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DataView
-abstract class DataView implements ArrayBufferView {
+class DataView extends ArrayBufferView {
 
   factory DataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) {
     if (!?byteOffset) {
@@ -10521,62 +7400,7 @@
     }
     return _DataViewFactoryProvider.createDataView(buffer, byteOffset, byteLength);
   }
-
-  /** @domName DataView.getFloat32 */
-  num getFloat32(int byteOffset, {bool littleEndian});
-
-  /** @domName DataView.getFloat64 */
-  num getFloat64(int byteOffset, {bool littleEndian});
-
-  /** @domName DataView.getInt16 */
-  int getInt16(int byteOffset, {bool littleEndian});
-
-  /** @domName DataView.getInt32 */
-  int getInt32(int byteOffset, {bool littleEndian});
-
-  /** @domName DataView.getInt8 */
-  int getInt8(int byteOffset);
-
-  /** @domName DataView.getUint16 */
-  int getUint16(int byteOffset, {bool littleEndian});
-
-  /** @domName DataView.getUint32 */
-  int getUint32(int byteOffset, {bool littleEndian});
-
-  /** @domName DataView.getUint8 */
-  int getUint8(int byteOffset);
-
-  /** @domName DataView.setFloat32 */
-  void setFloat32(int byteOffset, num value, {bool littleEndian});
-
-  /** @domName DataView.setFloat64 */
-  void setFloat64(int byteOffset, num value, {bool littleEndian});
-
-  /** @domName DataView.setInt16 */
-  void setInt16(int byteOffset, int value, {bool littleEndian});
-
-  /** @domName DataView.setInt32 */
-  void setInt32(int byteOffset, int value, {bool littleEndian});
-
-  /** @domName DataView.setInt8 */
-  void setInt8(int byteOffset, int value);
-
-  /** @domName DataView.setUint16 */
-  void setUint16(int byteOffset, int value, {bool littleEndian});
-
-  /** @domName DataView.setUint32 */
-  void setUint32(int byteOffset, int value, {bool littleEndian});
-
-  /** @domName DataView.setUint8 */
-  void setUint8(int byteOffset, int value);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DataViewImpl extends _ArrayBufferViewImpl implements DataView {
+  DataView.internal(): super.internal();
 
   num getFloat32(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
     if (?littleEndian) {
@@ -10585,8 +7409,12 @@
     return _getFloat32_2(byteOffset);
   }
 
+
+  /** @domName DataView.getFloat32_1 */
   num _getFloat32_1(byteOffset, littleEndian) native "DataView_getFloat32_1_Callback";
 
+
+  /** @domName DataView.getFloat32_2 */
   num _getFloat32_2(byteOffset) native "DataView_getFloat32_2_Callback";
 
   num getFloat64(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
@@ -10596,8 +7424,12 @@
     return _getFloat64_2(byteOffset);
   }
 
+
+  /** @domName DataView.getFloat64_1 */
   num _getFloat64_1(byteOffset, littleEndian) native "DataView_getFloat64_1_Callback";
 
+
+  /** @domName DataView.getFloat64_2 */
   num _getFloat64_2(byteOffset) native "DataView_getFloat64_2_Callback";
 
   int getInt16(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
@@ -10607,8 +7439,12 @@
     return _getInt16_2(byteOffset);
   }
 
+
+  /** @domName DataView.getInt16_1 */
   int _getInt16_1(byteOffset, littleEndian) native "DataView_getInt16_1_Callback";
 
+
+  /** @domName DataView.getInt16_2 */
   int _getInt16_2(byteOffset) native "DataView_getInt16_2_Callback";
 
   int getInt32(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
@@ -10618,10 +7454,16 @@
     return _getInt32_2(byteOffset);
   }
 
+
+  /** @domName DataView.getInt32_1 */
   int _getInt32_1(byteOffset, littleEndian) native "DataView_getInt32_1_Callback";
 
+
+  /** @domName DataView.getInt32_2 */
   int _getInt32_2(byteOffset) native "DataView_getInt32_2_Callback";
 
+
+  /** @domName DataView.getInt8 */
   int getInt8(int byteOffset) native "DataView_getInt8_Callback";
 
   int getUint16(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
@@ -10631,8 +7473,12 @@
     return _getUint16_2(byteOffset);
   }
 
+
+  /** @domName DataView.getUint16_1 */
   int _getUint16_1(byteOffset, littleEndian) native "DataView_getUint16_1_Callback";
 
+
+  /** @domName DataView.getUint16_2 */
   int _getUint16_2(byteOffset) native "DataView_getUint16_2_Callback";
 
   int getUint32(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
@@ -10642,10 +7488,16 @@
     return _getUint32_2(byteOffset);
   }
 
+
+  /** @domName DataView.getUint32_1 */
   int _getUint32_1(byteOffset, littleEndian) native "DataView_getUint32_1_Callback";
 
+
+  /** @domName DataView.getUint32_2 */
   int _getUint32_2(byteOffset) native "DataView_getUint32_2_Callback";
 
+
+  /** @domName DataView.getUint8 */
   int getUint8(int byteOffset) native "DataView_getUint8_Callback";
 
   void setFloat32(/*unsigned long*/ byteOffset, /*float*/ value, {/*boolean*/ littleEndian}) {
@@ -10656,8 +7508,12 @@
     _setFloat32_2(byteOffset, value);
   }
 
+
+  /** @domName DataView.setFloat32_1 */
   void _setFloat32_1(byteOffset, value, littleEndian) native "DataView_setFloat32_1_Callback";
 
+
+  /** @domName DataView.setFloat32_2 */
   void _setFloat32_2(byteOffset, value) native "DataView_setFloat32_2_Callback";
 
   void setFloat64(/*unsigned long*/ byteOffset, /*double*/ value, {/*boolean*/ littleEndian}) {
@@ -10668,8 +7524,12 @@
     _setFloat64_2(byteOffset, value);
   }
 
+
+  /** @domName DataView.setFloat64_1 */
   void _setFloat64_1(byteOffset, value, littleEndian) native "DataView_setFloat64_1_Callback";
 
+
+  /** @domName DataView.setFloat64_2 */
   void _setFloat64_2(byteOffset, value) native "DataView_setFloat64_2_Callback";
 
   void setInt16(/*unsigned long*/ byteOffset, /*short*/ value, {/*boolean*/ littleEndian}) {
@@ -10680,8 +7540,12 @@
     _setInt16_2(byteOffset, value);
   }
 
+
+  /** @domName DataView.setInt16_1 */
   void _setInt16_1(byteOffset, value, littleEndian) native "DataView_setInt16_1_Callback";
 
+
+  /** @domName DataView.setInt16_2 */
   void _setInt16_2(byteOffset, value) native "DataView_setInt16_2_Callback";
 
   void setInt32(/*unsigned long*/ byteOffset, /*long*/ value, {/*boolean*/ littleEndian}) {
@@ -10692,10 +7556,16 @@
     _setInt32_2(byteOffset, value);
   }
 
+
+  /** @domName DataView.setInt32_1 */
   void _setInt32_1(byteOffset, value, littleEndian) native "DataView_setInt32_1_Callback";
 
+
+  /** @domName DataView.setInt32_2 */
   void _setInt32_2(byteOffset, value) native "DataView_setInt32_2_Callback";
 
+
+  /** @domName DataView.setInt8 */
   void setInt8(int byteOffset, int value) native "DataView_setInt8_Callback";
 
   void setUint16(/*unsigned long*/ byteOffset, /*unsigned short*/ value, {/*boolean*/ littleEndian}) {
@@ -10706,8 +7576,12 @@
     _setUint16_2(byteOffset, value);
   }
 
+
+  /** @domName DataView.setUint16_1 */
   void _setUint16_1(byteOffset, value, littleEndian) native "DataView_setUint16_1_Callback";
 
+
+  /** @domName DataView.setUint16_2 */
   void _setUint16_2(byteOffset, value) native "DataView_setUint16_2_Callback";
 
   void setUint32(/*unsigned long*/ byteOffset, /*unsigned long*/ value, {/*boolean*/ littleEndian}) {
@@ -10718,10 +7592,16 @@
     _setUint32_2(byteOffset, value);
   }
 
+
+  /** @domName DataView.setUint32_1 */
   void _setUint32_1(byteOffset, value, littleEndian) native "DataView_setUint32_1_Callback";
 
+
+  /** @domName DataView.setUint32_2 */
   void _setUint32_2(byteOffset, value) native "DataView_setUint32_2_Callback";
 
+
+  /** @domName DataView.setUint8 */
   void setUint8(int byteOffset, int value) native "DataView_setUint8_Callback";
 
 }
@@ -10732,19 +7612,25 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Database
-abstract class Database {
+class Database extends NativeFieldWrapperClass1 {
+  Database.internal();
+
 
   /** @domName Database.version */
-  String get version;
+  String get version native "Database_version_Getter";
+
 
   /** @domName Database.changeVersion */
-  void changeVersion(String oldVersion, String newVersion, [SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]);
+  void changeVersion(String oldVersion, String newVersion, [SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_changeVersion_Callback";
+
 
   /** @domName Database.readTransaction */
-  void readTransaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]);
+  void readTransaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_readTransaction_Callback";
+
 
   /** @domName Database.transaction */
-  void transaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]);
+  void transaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_transaction_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -10760,57 +7646,28 @@
 
 // WARNING: Do not edit - generated code.
 
-class _DatabaseImpl extends NativeFieldWrapperClass1 implements Database {
-
-  String get version native "Database_version_Getter";
-
-  void changeVersion(String oldVersion, String newVersion, [SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_changeVersion_Callback";
-
-  void readTransaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_readTransaction_Callback";
-
-  void transaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_transaction_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName DatabaseSync
-abstract class DatabaseSync {
+class DatabaseSync extends NativeFieldWrapperClass1 {
+  DatabaseSync.internal();
+
 
   /** @domName DatabaseSync.lastErrorMessage */
-  String get lastErrorMessage;
-
-  /** @domName DatabaseSync.version */
-  String get version;
-
-  /** @domName DatabaseSync.changeVersion */
-  void changeVersion(String oldVersion, String newVersion, [SQLTransactionSyncCallback callback]);
-
-  /** @domName DatabaseSync.readTransaction */
-  void readTransaction(SQLTransactionSyncCallback callback);
-
-  /** @domName DatabaseSync.transaction */
-  void transaction(SQLTransactionSyncCallback callback);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DatabaseSyncImpl extends NativeFieldWrapperClass1 implements DatabaseSync {
-
   String get lastErrorMessage native "DatabaseSync_lastErrorMessage_Getter";
 
+
+  /** @domName DatabaseSync.version */
   String get version native "DatabaseSync_version_Getter";
 
+
+  /** @domName DatabaseSync.changeVersion */
   void changeVersion(String oldVersion, String newVersion, [SQLTransactionSyncCallback callback]) native "DatabaseSync_changeVersion_Callback";
 
+
+  /** @domName DatabaseSync.readTransaction */
   void readTransaction(SQLTransactionSyncCallback callback) native "DatabaseSync_readTransaction_Callback";
 
+
+  /** @domName DatabaseSync.transaction */
   void transaction(SQLTransactionSyncCallback callback) native "DatabaseSync_transaction_Callback";
 
 }
@@ -10821,38 +7678,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DedicatedWorkerContext
-abstract class DedicatedWorkerContext implements WorkerContext {
+class DedicatedWorkerContext extends WorkerContext {
+  DedicatedWorkerContext.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  DedicatedWorkerContextEvents get on;
+  DedicatedWorkerContextEvents get on =>
+    new DedicatedWorkerContextEvents(this);
+
 
   /** @domName DedicatedWorkerContext.postMessage */
-  void postMessage(Object message, [List messagePorts]);
-}
-
-abstract class DedicatedWorkerContextEvents implements WorkerContextEvents {
-
-  EventListenerList get message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DedicatedWorkerContextImpl extends _WorkerContextImpl implements DedicatedWorkerContext {
-
-  _DedicatedWorkerContextEventsImpl get on =>
-    new _DedicatedWorkerContextEventsImpl(this);
-
   void postMessage(Object message, [List messagePorts]) native "DedicatedWorkerContext_postMessage_Callback";
 
 }
 
-class _DedicatedWorkerContextEventsImpl extends _WorkerContextEventsImpl implements DedicatedWorkerContextEvents {
-  _DedicatedWorkerContextEventsImpl(_ptr) : super(_ptr);
+class DedicatedWorkerContextEvents extends WorkerContextEvents {
+  DedicatedWorkerContextEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get message => this['message'];
 }
@@ -10863,19 +7705,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DelayNode
-abstract class DelayNode implements AudioNode {
+class DelayNode extends AudioNode {
+  DelayNode.internal(): super.internal();
+
 
   /** @domName DelayNode.delayTime */
-  AudioParam get delayTime;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DelayNodeImpl extends _AudioNodeImpl implements DelayNode {
-
   AudioParam get delayTime native "DelayNode_delayTime_Getter";
 
 }
@@ -10886,23 +7720,17 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLDetailsElement
-abstract class DetailsElement implements Element {
+class DetailsElement extends _Element_Merged {
 
   factory DetailsElement() => _Elements.createDetailsElement();
+  DetailsElement.internal(): super.internal();
+
 
   /** @domName HTMLDetailsElement.open */
-  bool open;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DetailsElementImpl extends _ElementImpl_Merged implements DetailsElement {
-
   bool get open native "HTMLDetailsElement_open_Getter";
 
+
+  /** @domName HTMLDetailsElement.open */
   void set open(bool value) native "HTMLDetailsElement_open_Setter";
 
 }
@@ -10913,19 +7741,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DeviceMotionEvent
-abstract class DeviceMotionEvent implements Event {
+class DeviceMotionEvent extends Event {
+  DeviceMotionEvent.internal(): super.internal();
+
 
   /** @domName DeviceMotionEvent.interval */
-  num get interval;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DeviceMotionEventImpl extends _EventImpl implements DeviceMotionEvent {
-
   num get interval native "DeviceMotionEvent_interval_Getter";
 
 }
@@ -10936,39 +7756,27 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DeviceOrientationEvent
-abstract class DeviceOrientationEvent implements Event {
+class DeviceOrientationEvent extends Event {
+  DeviceOrientationEvent.internal(): super.internal();
+
 
   /** @domName DeviceOrientationEvent.absolute */
-  bool get absolute;
-
-  /** @domName DeviceOrientationEvent.alpha */
-  num get alpha;
-
-  /** @domName DeviceOrientationEvent.beta */
-  num get beta;
-
-  /** @domName DeviceOrientationEvent.gamma */
-  num get gamma;
-
-  /** @domName DeviceOrientationEvent.initDeviceOrientationEvent */
-  void initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DeviceOrientationEventImpl extends _EventImpl implements DeviceOrientationEvent {
-
   bool get absolute native "DeviceOrientationEvent_absolute_Getter";
 
+
+  /** @domName DeviceOrientationEvent.alpha */
   num get alpha native "DeviceOrientationEvent_alpha_Getter";
 
+
+  /** @domName DeviceOrientationEvent.beta */
   num get beta native "DeviceOrientationEvent_beta_Getter";
 
+
+  /** @domName DeviceOrientationEvent.gamma */
   num get gamma native "DeviceOrientationEvent_gamma_Getter";
 
+
+  /** @domName DeviceOrientationEvent.initDeviceOrientationEvent */
   void initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
 
 }
@@ -10979,21 +7787,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLDirectoryElement
-abstract class DirectoryElement implements Element {
+class DirectoryElement extends _Element_Merged {
+  DirectoryElement.internal(): super.internal();
+
 
   /** @domName HTMLDirectoryElement.compact */
-  bool compact;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DirectoryElementImpl extends _ElementImpl_Merged implements DirectoryElement {
-
   bool get compact native "HTMLDirectoryElement_compact_Getter";
 
+
+  /** @domName HTMLDirectoryElement.compact */
   void set compact(bool value) native "HTMLDirectoryElement_compact_Setter";
 
 }
@@ -11004,34 +7806,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DirectoryEntry
-abstract class DirectoryEntry implements Entry {
+class DirectoryEntry extends Entry {
+  DirectoryEntry.internal(): super.internal();
+
 
   /** @domName DirectoryEntry.createReader */
-  DirectoryReader createReader();
-
-  /** @domName DirectoryEntry.getDirectory */
-  void getDirectory(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback});
-
-  /** @domName DirectoryEntry.getFile */
-  void getFile(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback});
-
-  /** @domName DirectoryEntry.removeRecursively */
-  void removeRecursively(VoidCallback successCallback, [ErrorCallback errorCallback]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DirectoryEntryImpl extends _EntryImpl implements DirectoryEntry {
-
   DirectoryReader createReader() native "DirectoryEntry_createReader_Callback";
 
+
+  /** @domName DirectoryEntry.getDirectory */
   void getDirectory(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) native "DirectoryEntry_getDirectory_Callback";
 
+
+  /** @domName DirectoryEntry.getFile */
   void getFile(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) native "DirectoryEntry_getFile_Callback";
 
+
+  /** @domName DirectoryEntry.removeRecursively */
   void removeRecursively(VoidCallback successCallback, [ErrorCallback errorCallback]) native "DirectoryEntry_removeRecursively_Callback";
 
 }
@@ -11042,34 +7833,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DirectoryEntrySync
-abstract class DirectoryEntrySync implements EntrySync {
+class DirectoryEntrySync extends EntrySync {
+  DirectoryEntrySync.internal(): super.internal();
+
 
   /** @domName DirectoryEntrySync.createReader */
-  DirectoryReaderSync createReader();
-
-  /** @domName DirectoryEntrySync.getDirectory */
-  DirectoryEntrySync getDirectory(String path, Map flags);
-
-  /** @domName DirectoryEntrySync.getFile */
-  FileEntrySync getFile(String path, Map flags);
-
-  /** @domName DirectoryEntrySync.removeRecursively */
-  void removeRecursively();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DirectoryEntrySyncImpl extends _EntrySyncImpl implements DirectoryEntrySync {
-
   DirectoryReaderSync createReader() native "DirectoryEntrySync_createReader_Callback";
 
+
+  /** @domName DirectoryEntrySync.getDirectory */
   DirectoryEntrySync getDirectory(String path, Map flags) native "DirectoryEntrySync_getDirectory_Callback";
 
+
+  /** @domName DirectoryEntrySync.getFile */
   FileEntrySync getFile(String path, Map flags) native "DirectoryEntrySync_getFile_Callback";
 
+
+  /** @domName DirectoryEntrySync.removeRecursively */
   void removeRecursively() native "DirectoryEntrySync_removeRecursively_Callback";
 
 }
@@ -11080,19 +7860,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DirectoryReader
-abstract class DirectoryReader {
+class DirectoryReader extends NativeFieldWrapperClass1 {
+  DirectoryReader.internal();
+
 
   /** @domName DirectoryReader.readEntries */
-  void readEntries(EntriesCallback successCallback, [ErrorCallback errorCallback]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DirectoryReaderImpl extends NativeFieldWrapperClass1 implements DirectoryReader {
-
   void readEntries(EntriesCallback successCallback, [ErrorCallback errorCallback]) native "DirectoryReader_readEntries_Callback";
 
 }
@@ -11103,19 +7875,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DirectoryReaderSync
-abstract class DirectoryReaderSync {
+class DirectoryReaderSync extends NativeFieldWrapperClass1 {
+  DirectoryReaderSync.internal();
+
 
   /** @domName DirectoryReaderSync.readEntries */
-  List<EntrySync> readEntries();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DirectoryReaderSyncImpl extends NativeFieldWrapperClass1 implements DirectoryReaderSync {
-
   List<EntrySync> readEntries() native "DirectoryReaderSync_readEntries_Callback";
 
 }
@@ -11126,23 +7890,17 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLDivElement
-abstract class DivElement implements Element {
+class DivElement extends _Element_Merged {
 
   factory DivElement() => _Elements.createDivElement();
+  DivElement.internal(): super.internal();
+
 
   /** @domName HTMLDivElement.align */
-  String align;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DivElementImpl extends _ElementImpl_Merged implements DivElement {
-
   String get align native "HTMLDivElement_align_Getter";
 
+
+  /** @domName HTMLDivElement.align */
   void set align(String value) native "HTMLDivElement_align_Setter";
 
 }
@@ -11150,305 +7908,375 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+class Document extends Node
+{
 
-/// @domName Document
-abstract class Document extends HtmlElement {
-
+  Document.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  DocumentEvents get on;
+  DocumentEvents get on =>
+    new DocumentEvents(this);
+
+
+  /** @domName Document.body */
+  Element get body native "Document_body_Getter";
+
+
+  /** @domName Document.body */
+  void set body(Element value) native "Document_body_Setter";
+
+
+  /** @domName Document.charset */
+  String get charset native "Document_charset_Getter";
+
+
+  /** @domName Document.charset */
+  void set charset(String value) native "Document_charset_Setter";
+
+
+  /** @domName Document.cookie */
+  String get cookie native "Document_cookie_Getter";
+
+
+  /** @domName Document.cookie */
+  void set cookie(String value) native "Document_cookie_Setter";
+
+
+  /** @domName Document.defaultView */
+  Window get window native "Document_defaultView_Getter";
+
+
+  /** @domName Document.documentElement */
+  Element get documentElement native "Document_documentElement_Getter";
+
+
+  /** @domName Document.domain */
+  String get domain native "Document_domain_Getter";
+
+
+  /** @domName Document.head */
+  HeadElement get head native "Document_head_Getter";
+
+
+  /** @domName Document.implementation */
+  DOMImplementation get implementation native "Document_implementation_Getter";
+
+
+  /** @domName Document.lastModified */
+  String get lastModified native "Document_lastModified_Getter";
+
+
+  /** @domName Document.preferredStylesheetSet */
+  String get preferredStylesheetSet native "Document_preferredStylesheetSet_Getter";
+
+
+  /** @domName Document.readyState */
+  String get readyState native "Document_readyState_Getter";
+
+
+  /** @domName Document.referrer */
+  String get referrer native "Document_referrer_Getter";
+
+
+  /** @domName Document.selectedStylesheetSet */
+  String get selectedStylesheetSet native "Document_selectedStylesheetSet_Getter";
+
+
+  /** @domName Document.selectedStylesheetSet */
+  void set selectedStylesheetSet(String value) native "Document_selectedStylesheetSet_Setter";
+
+
+  /** @domName Document.styleSheets */
+  List<StyleSheet> get styleSheets native "Document_styleSheets_Getter";
+
+
+  /** @domName Document.title */
+  String get title native "Document_title_Getter";
+
+
+  /** @domName Document.title */
+  void set title(String value) native "Document_title_Setter";
+
+
+  /** @domName Document.webkitCurrentFullScreenElement */
+  Element get webkitCurrentFullScreenElement native "Document_webkitCurrentFullScreenElement_Getter";
+
+
+  /** @domName Document.webkitFullScreenKeyboardInputAllowed */
+  bool get webkitFullScreenKeyboardInputAllowed native "Document_webkitFullScreenKeyboardInputAllowed_Getter";
+
+
+  /** @domName Document.webkitFullscreenElement */
+  Element get webkitFullscreenElement native "Document_webkitFullscreenElement_Getter";
+
+
+  /** @domName Document.webkitFullscreenEnabled */
+  bool get webkitFullscreenEnabled native "Document_webkitFullscreenEnabled_Getter";
+
+
+  /** @domName Document.webkitHidden */
+  bool get webkitHidden native "Document_webkitHidden_Getter";
+
+
+  /** @domName Document.webkitIsFullScreen */
+  bool get webkitIsFullScreen native "Document_webkitIsFullScreen_Getter";
+
+
+  /** @domName Document.webkitPointerLockElement */
+  Element get webkitPointerLockElement native "Document_webkitPointerLockElement_Getter";
+
+
+  /** @domName Document.webkitVisibilityState */
+  String get webkitVisibilityState native "Document_webkitVisibilityState_Getter";
+
+
+  /** @domName Document.caretRangeFromPoint */
+  Range caretRangeFromPoint(int x, int y) native "Document_caretRangeFromPoint_Callback";
+
+
+  /** @domName Document.createCDATASection */
+  CDATASection createCDATASection(String data) native "Document_createCDATASection_Callback";
+
+
+  /** @domName Document.createDocumentFragment */
+  DocumentFragment createDocumentFragment() native "Document_createDocumentFragment_Callback";
+
+
+  /** @domName Document.createElement */
+  Element $dom_createElement(String tagName) native "Document_createElement_Callback";
+
+
+  /** @domName Document.createElementNS */
+  Element $dom_createElementNS(String namespaceURI, String qualifiedName) native "Document_createElementNS_Callback";
+
+
+  /** @domName Document.createEvent */
+  Event $dom_createEvent(String eventType) native "Document_createEvent_Callback";
+
+
+  /** @domName Document.createRange */
+  Range createRange() native "Document_createRange_Callback";
+
+
+  /** @domName Document.createTextNode */
+  Text $dom_createTextNode(String data) native "Document_createTextNode_Callback";
+
+
+  /** @domName Document.createTouch */
+  Touch createTouch(LocalWindow window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) native "Document_createTouch_Callback";
+
+
+  /** @domName Document.createTouchList */
+  TouchList $dom_createTouchList() native "Document_createTouchList_Callback";
+
+
+  /** @domName Document.elementFromPoint */
+  Element elementFromPoint(int x, int y) native "Document_elementFromPoint_Callback";
+
+
+  /** @domName Document.execCommand */
+  bool execCommand(String command, bool userInterface, String value) native "Document_execCommand_Callback";
+
+
+  /** @domName Document.getCSSCanvasContext */
+  CanvasRenderingContext getCSSCanvasContext(String contextId, String name, int width, int height) native "Document_getCSSCanvasContext_Callback";
+
+
+  /** @domName Document.getElementById */
+  Element $dom_getElementById(String elementId) native "Document_getElementById_Callback";
+
+
+  /** @domName Document.getElementsByClassName */
+  List<Node> $dom_getElementsByClassName(String tagname) native "Document_getElementsByClassName_Callback";
+
+
+  /** @domName Document.getElementsByName */
+  List<Node> $dom_getElementsByName(String elementName) native "Document_getElementsByName_Callback";
+
+
+  /** @domName Document.getElementsByTagName */
+  List<Node> $dom_getElementsByTagName(String tagname) native "Document_getElementsByTagName_Callback";
+
+
+  /** @domName Document.queryCommandEnabled */
+  bool queryCommandEnabled(String command) native "Document_queryCommandEnabled_Callback";
+
+
+  /** @domName Document.queryCommandIndeterm */
+  bool queryCommandIndeterm(String command) native "Document_queryCommandIndeterm_Callback";
+
+
+  /** @domName Document.queryCommandState */
+  bool queryCommandState(String command) native "Document_queryCommandState_Callback";
+
+
+  /** @domName Document.queryCommandSupported */
+  bool queryCommandSupported(String command) native "Document_queryCommandSupported_Callback";
+
+
+  /** @domName Document.queryCommandValue */
+  String queryCommandValue(String command) native "Document_queryCommandValue_Callback";
+
+
+  /** @domName Document.querySelector */
+  Element $dom_querySelector(String selectors) native "Document_querySelector_Callback";
+
+
+  /** @domName Document.querySelectorAll */
+  List<Node> $dom_querySelectorAll(String selectors) native "Document_querySelectorAll_Callback";
+
+
+  /** @domName Document.webkitCancelFullScreen */
+  void webkitCancelFullScreen() native "Document_webkitCancelFullScreen_Callback";
+
+
+  /** @domName Document.webkitExitFullscreen */
+  void webkitExitFullscreen() native "Document_webkitExitFullscreen_Callback";
+
+
+  /** @domName Document.webkitExitPointerLock */
+  void webkitExitPointerLock() native "Document_webkitExitPointerLock_Callback";
 
   /** @domName HTMLDocument.activeElement */
   Element get activeElement;
 
-  /** @domName Document.body */
-  Element body;
+  // TODO(jacobr): implement all Element methods not on Document.
 
-  /** @domName Document.charset */
-  String charset;
+  Element query(String selectors) {
+    // It is fine for our RegExp to detect element id query selectors to have
+    // false negatives but not false positives.
+    if (const RegExp("^#[_a-zA-Z]\\w*\$").hasMatch(selectors)) {
+      return $dom_getElementById(selectors.substring(1));
+    }
+    return $dom_querySelector(selectors);
+  }
 
-  /** @domName Document.cookie */
-  String cookie;
-
-  /** @domName Document.defaultView */
-  Window get window;
-
-  /** @domName Document.documentElement */
-  Element get documentElement;
-
-  /** @domName Document.domain */
-  String get domain;
-
-  /** @domName Document.head */
-  HeadElement get head;
-
-  /** @domName Document.implementation */
-  DOMImplementation get implementation;
-
-  /** @domName Document.lastModified */
-  String get lastModified;
-
-  /** @domName Document.preferredStylesheetSet */
-  String get preferredStylesheetSet;
-
-  /** @domName Document.readyState */
-  String get readyState;
-
-  /** @domName Document.referrer */
-  String get referrer;
-
-  /** @domName Document.selectedStylesheetSet */
-  String selectedStylesheetSet;
-
-  /** @domName Document.styleSheets */
-  List<StyleSheet> get styleSheets;
-
-  /** @domName Document.title */
-  String title;
-
-  /** @domName Document.webkitCurrentFullScreenElement */
-  Element get webkitCurrentFullScreenElement;
-
-  /** @domName Document.webkitFullScreenKeyboardInputAllowed */
-  bool get webkitFullScreenKeyboardInputAllowed;
-
-  /** @domName Document.webkitFullscreenElement */
-  Element get webkitFullscreenElement;
-
-  /** @domName Document.webkitFullscreenEnabled */
-  bool get webkitFullscreenEnabled;
-
-  /** @domName Document.webkitHidden */
-  bool get webkitHidden;
-
-  /** @domName Document.webkitIsFullScreen */
-  bool get webkitIsFullScreen;
-
-  /** @domName Document.webkitPointerLockElement */
-  Element get webkitPointerLockElement;
-
-  /** @domName Document.webkitVisibilityState */
-  String get webkitVisibilityState;
-
-  /** @domName Document.caretRangeFromPoint */
-  Range caretRangeFromPoint(int x, int y);
-
-  /** @domName Document.createCDATASection */
-  CDATASection createCDATASection(String data);
-
-  /** @domName Document.createDocumentFragment */
-  DocumentFragment createDocumentFragment();
-
-  /** @domName Document.createElement */
-  Element $dom_createElement(String tagName);
-
-  /** @domName Document.createElementNS */
-  Element $dom_createElementNS(String namespaceURI, String qualifiedName);
-
-  /** @domName Document.createEvent */
-  Event $dom_createEvent(String eventType);
-
-  /** @domName Document.createRange */
-  Range createRange();
-
-  /** @domName Document.createTextNode */
-  Text $dom_createTextNode(String data);
-
-  /** @domName Document.createTouch */
-  Touch createTouch(LocalWindow window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce);
-
-  /** @domName Document.createTouchList */
-  TouchList $dom_createTouchList();
-
-  /** @domName Document.elementFromPoint */
-  Element elementFromPoint(int x, int y);
-
-  /** @domName Document.execCommand */
-  bool execCommand(String command, bool userInterface, String value);
-
-  /** @domName Document.getCSSCanvasContext */
-  CanvasRenderingContext getCSSCanvasContext(String contextId, String name, int width, int height);
-
-  /** @domName Document.getElementById */
-  Element $dom_getElementById(String elementId);
-
-  /** @domName Document.getElementsByClassName */
-  List<Node> $dom_getElementsByClassName(String tagname);
-
-  /** @domName Document.getElementsByName */
-  List<Node> $dom_getElementsByName(String elementName);
-
-  /** @domName Document.getElementsByTagName */
-  List<Node> $dom_getElementsByTagName(String tagname);
-
-  /** @domName Document.queryCommandEnabled */
-  bool queryCommandEnabled(String command);
-
-  /** @domName Document.queryCommandIndeterm */
-  bool queryCommandIndeterm(String command);
-
-  /** @domName Document.queryCommandState */
-  bool queryCommandState(String command);
-
-  /** @domName Document.queryCommandSupported */
-  bool queryCommandSupported(String command);
-
-  /** @domName Document.queryCommandValue */
-  String queryCommandValue(String command);
-
-  /** @domName Document.querySelector */
-  Element $dom_querySelector(String selectors);
-
-  /** @domName Document.querySelectorAll */
-  List<Node> $dom_querySelectorAll(String selectors);
-
-  /** @domName Document.webkitCancelFullScreen */
-  void webkitCancelFullScreen();
-
-  /** @domName Document.webkitExitFullscreen */
-  void webkitExitFullscreen();
-
-  /** @domName Document.webkitExitPointerLock */
-  void webkitExitPointerLock();
-
+  List<Element> queryAll(String selectors) {
+    if (const RegExp("""^\\[name=["'][^'"]+['"]\\]\$""").hasMatch(selectors)) {
+      final mutableMatches = $dom_getElementsByName(
+          selectors.substring(7,selectors.length - 2));
+      int len = mutableMatches.length;
+      final copyOfMatches = new List<Element>(len);
+      for (int i = 0; i < len; ++i) {
+        copyOfMatches[i] = mutableMatches[i];
+      }
+      return new _FrozenElementList._wrap(copyOfMatches);
+    } else if (const RegExp("^[*a-zA-Z0-9]+\$").hasMatch(selectors)) {
+      final mutableMatches = $dom_getElementsByTagName(selectors);
+      int len = mutableMatches.length;
+      final copyOfMatches = new List<Element>(len);
+      for (int i = 0; i < len; ++i) {
+        copyOfMatches[i] = mutableMatches[i];
+      }
+      return new _FrozenElementList._wrap(copyOfMatches);
+    } else {
+      return new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
+    }
+  }
 }
 
-abstract class DocumentEvents implements ElementEvents {
+class DocumentEvents extends ElementEvents {
+  DocumentEvents(EventTarget _ptr) : super(_ptr);
 
-  EventListenerList get abort;
+  EventListenerList get abort => this['abort'];
 
-  EventListenerList get beforeCopy;
+  EventListenerList get beforeCopy => this['beforecopy'];
 
-  EventListenerList get beforeCut;
+  EventListenerList get beforeCut => this['beforecut'];
 
-  EventListenerList get beforePaste;
+  EventListenerList get beforePaste => this['beforepaste'];
 
-  EventListenerList get blur;
+  EventListenerList get blur => this['blur'];
 
-  EventListenerList get change;
+  EventListenerList get change => this['change'];
 
-  EventListenerList get click;
+  EventListenerList get click => this['click'];
 
-  EventListenerList get contextMenu;
+  EventListenerList get contextMenu => this['contextmenu'];
 
-  EventListenerList get copy;
+  EventListenerList get copy => this['copy'];
 
-  EventListenerList get cut;
+  EventListenerList get cut => this['cut'];
 
-  EventListenerList get doubleClick;
+  EventListenerList get doubleClick => this['dblclick'];
 
-  EventListenerList get drag;
+  EventListenerList get drag => this['drag'];
 
-  EventListenerList get dragEnd;
+  EventListenerList get dragEnd => this['dragend'];
 
-  EventListenerList get dragEnter;
+  EventListenerList get dragEnter => this['dragenter'];
 
-  EventListenerList get dragLeave;
+  EventListenerList get dragLeave => this['dragleave'];
 
-  EventListenerList get dragOver;
+  EventListenerList get dragOver => this['dragover'];
 
-  EventListenerList get dragStart;
+  EventListenerList get dragStart => this['dragstart'];
 
-  EventListenerList get drop;
+  EventListenerList get drop => this['drop'];
 
-  EventListenerList get error;
+  EventListenerList get error => this['error'];
 
-  EventListenerList get focus;
+  EventListenerList get focus => this['focus'];
 
-  EventListenerList get input;
+  EventListenerList get input => this['input'];
 
-  EventListenerList get invalid;
+  EventListenerList get invalid => this['invalid'];
 
-  EventListenerList get keyDown;
+  EventListenerList get keyDown => this['keydown'];
 
-  EventListenerList get keyPress;
+  EventListenerList get keyPress => this['keypress'];
 
-  EventListenerList get keyUp;
+  EventListenerList get keyUp => this['keyup'];
 
-  EventListenerList get load;
+  EventListenerList get load => this['load'];
 
-  EventListenerList get mouseDown;
+  EventListenerList get mouseDown => this['mousedown'];
 
-  EventListenerList get mouseMove;
+  EventListenerList get mouseMove => this['mousemove'];
 
-  EventListenerList get mouseOut;
+  EventListenerList get mouseOut => this['mouseout'];
 
-  EventListenerList get mouseOver;
+  EventListenerList get mouseOver => this['mouseover'];
 
-  EventListenerList get mouseUp;
+  EventListenerList get mouseUp => this['mouseup'];
 
-  EventListenerList get mouseWheel;
+  EventListenerList get mouseWheel => this['mousewheel'];
 
-  EventListenerList get paste;
+  EventListenerList get paste => this['paste'];
 
-  EventListenerList get readyStateChange;
+  EventListenerList get readyStateChange => this['readystatechange'];
 
-  EventListenerList get reset;
+  EventListenerList get reset => this['reset'];
 
-  EventListenerList get scroll;
+  EventListenerList get scroll => this['scroll'];
 
-  EventListenerList get search;
+  EventListenerList get search => this['search'];
 
-  EventListenerList get select;
+  EventListenerList get select => this['select'];
 
-  EventListenerList get selectionChange;
+  EventListenerList get selectionChange => this['selectionchange'];
 
-  EventListenerList get selectStart;
+  EventListenerList get selectStart => this['selectstart'];
 
-  EventListenerList get submit;
+  EventListenerList get submit => this['submit'];
 
-  EventListenerList get touchCancel;
+  EventListenerList get touchCancel => this['touchcancel'];
 
-  EventListenerList get touchEnd;
+  EventListenerList get touchEnd => this['touchend'];
 
-  EventListenerList get touchMove;
+  EventListenerList get touchMove => this['touchmove'];
 
-  EventListenerList get touchStart;
+  EventListenerList get touchStart => this['touchstart'];
 
-  EventListenerList get fullscreenChange;
+  EventListenerList get fullscreenChange => this['webkitfullscreenchange'];
 
-  EventListenerList get fullscreenError;
+  EventListenerList get fullscreenError => this['webkitfullscreenerror'];
 
-  EventListenerList get pointerLockChange;
+  EventListenerList get pointerLockChange => this['webkitpointerlockchange'];
 
-  EventListenerList get pointerLockError;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName DocumentFragment
-abstract class DocumentFragment extends Element {
-
-  factory DocumentFragment() => _DocumentFragmentFactoryProvider.createDocumentFragment();
-
-  factory DocumentFragment.html(String html) =>
-      _DocumentFragmentFactoryProvider.createDocumentFragment_html(html);
-
-  // TODO(nweiz): enable this when XML is ported
-  // /** WARNING: Currently this doesn't work on Dartium (issue 649). */
-  // DocumentFragment.xml(String xml);
-
-  factory DocumentFragment.svg(String svg) =>
-      new _DocumentFragmentFactoryProvider.DocumentFragment.svg(svg);
-
-  DocumentFragment clone(bool deep);
-
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  ElementEvents get on;
-
-  /** @domName DocumentFragment.querySelector */
-  Element $dom_querySelector(String selectors);
-
-  /** @domName DocumentFragment.querySelectorAll */
-  List<Node> $dom_querySelectorAll(String selectors);
-
+  EventListenerList get pointerLockError => this['webkitpointerlockerror'];
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -11507,7 +8335,7 @@
   }
 
   void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
-    throw const NotImplementedException();
+    throw new UnimplementedError();
   }
 
   void removeRange(int start, int rangeLength) {
@@ -11515,7 +8343,7 @@
   }
 
   void insertRange(int start, int rangeLength, [initialValue = null]) {
-    throw const NotImplementedException();
+    throw new UnimplementedError();
   }
 
   void clear() {
@@ -11568,8 +8396,8 @@
   const EmptyElementRect();
 }
 
-class _FrozenCSSClassSet extends _CssClassSet {
-  _FrozenCSSClassSet() : super(null);
+class _FrozenCssClassSet extends _CssClassSet {
+  _FrozenCssClassSet() : super(null);
 
   void _write(Set s) {
     throw new UnsupportedError(
@@ -11580,7 +8408,15 @@
   bool get frozen => true;
 }
 
-class _DocumentFragmentImpl extends _NodeImpl implements DocumentFragment {
+class DocumentFragment extends Node {
+  factory DocumentFragment() => _DocumentFragmentFactoryProvider.createDocumentFragment();
+
+  factory DocumentFragment.html(String html) =>
+      _DocumentFragmentFactoryProvider.createDocumentFragment_html(html);
+
+  factory DocumentFragment.svg(String svg) =>
+      new _DocumentFragmentFactoryProvider.createDocumentFragment_svg(svg);
+
   List<Element> _elements;
 
   List<Element> get elements {
@@ -11599,7 +8435,7 @@
     elements.addAll(copy);
   }
 
-  _ElementImpl query(String selectors) => $dom_querySelector(selectors);
+  Element query(String selectors) => $dom_querySelector(selectors);
 
   List<Element> queryAll(String selectors) =>
     new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
@@ -11692,7 +8528,7 @@
   Element get offsetParent => null;
   Element get parent => null;
   Map<String, String> get attributes => const {};
-  CSSClassSet get classes => new _FrozenCSSClassSet();
+  CssClassSet get classes => new _FrozenCssClassSet();
   Map<String, String> get dataAttributes => const {};
   CSSStyleDeclaration get style => new Element.tag('div').style;
   Future<CSSStyleDeclaration> get computedStyle =>
@@ -11809,12 +8645,20 @@
       "WebKit region overflow can't be set for document fragments.");
   }
 
+  DocumentFragment.internal(): super.internal();
 
-  _ElementEventsImpl get on =>
-    new _ElementEventsImpl(this);
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  ElementEvents get on =>
+    new ElementEvents(this);
 
+
+  /** @domName DocumentFragment.querySelector */
   Element $dom_querySelector(String selectors) native "DocumentFragment_querySelector_Callback";
 
+
+  /** @domName DocumentFragment.querySelectorAll */
   List<Node> $dom_querySelectorAll(String selectors) native "DocumentFragment_querySelectorAll_Callback";
 
 }
@@ -11822,320 +8666,38 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-class _DocumentImpl extends _NodeImpl implements Document
-{
-
-
-  _DocumentEventsImpl get on =>
-    new _DocumentEventsImpl(this);
-
-  Element get body native "Document_body_Getter";
-
-  void set body(Element value) native "Document_body_Setter";
-
-  String get charset native "Document_charset_Getter";
-
-  void set charset(String value) native "Document_charset_Setter";
-
-  String get cookie native "Document_cookie_Getter";
-
-  void set cookie(String value) native "Document_cookie_Setter";
-
-  Window get window native "Document_defaultView_Getter";
-
-  Element get documentElement native "Document_documentElement_Getter";
-
-  String get domain native "Document_domain_Getter";
-
-  HeadElement get head native "Document_head_Getter";
-
-  DOMImplementation get implementation native "Document_implementation_Getter";
-
-  String get lastModified native "Document_lastModified_Getter";
-
-  String get preferredStylesheetSet native "Document_preferredStylesheetSet_Getter";
-
-  String get readyState native "Document_readyState_Getter";
-
-  String get referrer native "Document_referrer_Getter";
-
-  String get selectedStylesheetSet native "Document_selectedStylesheetSet_Getter";
-
-  void set selectedStylesheetSet(String value) native "Document_selectedStylesheetSet_Setter";
-
-  List<StyleSheet> get styleSheets native "Document_styleSheets_Getter";
-
-  String get title native "Document_title_Getter";
-
-  void set title(String value) native "Document_title_Setter";
-
-  Element get webkitCurrentFullScreenElement native "Document_webkitCurrentFullScreenElement_Getter";
-
-  bool get webkitFullScreenKeyboardInputAllowed native "Document_webkitFullScreenKeyboardInputAllowed_Getter";
-
-  Element get webkitFullscreenElement native "Document_webkitFullscreenElement_Getter";
-
-  bool get webkitFullscreenEnabled native "Document_webkitFullscreenEnabled_Getter";
-
-  bool get webkitHidden native "Document_webkitHidden_Getter";
-
-  bool get webkitIsFullScreen native "Document_webkitIsFullScreen_Getter";
-
-  Element get webkitPointerLockElement native "Document_webkitPointerLockElement_Getter";
-
-  String get webkitVisibilityState native "Document_webkitVisibilityState_Getter";
-
-  Range caretRangeFromPoint(int x, int y) native "Document_caretRangeFromPoint_Callback";
-
-  CDATASection createCDATASection(String data) native "Document_createCDATASection_Callback";
-
-  DocumentFragment createDocumentFragment() native "Document_createDocumentFragment_Callback";
-
-  Element $dom_createElement(String tagName) native "Document_createElement_Callback";
-
-  Element $dom_createElementNS(String namespaceURI, String qualifiedName) native "Document_createElementNS_Callback";
-
-  Event $dom_createEvent(String eventType) native "Document_createEvent_Callback";
-
-  Range createRange() native "Document_createRange_Callback";
-
-  Text $dom_createTextNode(String data) native "Document_createTextNode_Callback";
-
-  Touch createTouch(LocalWindow window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) native "Document_createTouch_Callback";
-
-  TouchList $dom_createTouchList() native "Document_createTouchList_Callback";
-
-  Element elementFromPoint(int x, int y) native "Document_elementFromPoint_Callback";
-
-  bool execCommand(String command, bool userInterface, String value) native "Document_execCommand_Callback";
-
-  CanvasRenderingContext getCSSCanvasContext(String contextId, String name, int width, int height) native "Document_getCSSCanvasContext_Callback";
-
-  Element $dom_getElementById(String elementId) native "Document_getElementById_Callback";
-
-  List<Node> $dom_getElementsByClassName(String tagname) native "Document_getElementsByClassName_Callback";
-
-  List<Node> $dom_getElementsByName(String elementName) native "Document_getElementsByName_Callback";
-
-  List<Node> $dom_getElementsByTagName(String tagname) native "Document_getElementsByTagName_Callback";
-
-  bool queryCommandEnabled(String command) native "Document_queryCommandEnabled_Callback";
-
-  bool queryCommandIndeterm(String command) native "Document_queryCommandIndeterm_Callback";
-
-  bool queryCommandState(String command) native "Document_queryCommandState_Callback";
-
-  bool queryCommandSupported(String command) native "Document_queryCommandSupported_Callback";
-
-  String queryCommandValue(String command) native "Document_queryCommandValue_Callback";
-
-  Element $dom_querySelector(String selectors) native "Document_querySelector_Callback";
-
-  List<Node> $dom_querySelectorAll(String selectors) native "Document_querySelectorAll_Callback";
-
-  void webkitCancelFullScreen() native "Document_webkitCancelFullScreen_Callback";
-
-  void webkitExitFullscreen() native "Document_webkitExitFullscreen_Callback";
-
-  void webkitExitPointerLock() native "Document_webkitExitPointerLock_Callback";
-
-  // TODO(jacobr): implement all Element methods not on Document.
-
-  _ElementImpl query(String selectors) {
-    // It is fine for our RegExp to detect element id query selectors to have
-    // false negatives but not false positives.
-    if (const RegExp("^#[_a-zA-Z]\\w*\$").hasMatch(selectors)) {
-      return $dom_getElementById(selectors.substring(1));
-    }
-    return $dom_querySelector(selectors);
-  }
-
-  List<Element> queryAll(String selectors) {
-    if (const RegExp("""^\\[name=["'][^'"]+['"]\\]\$""").hasMatch(selectors)) {
-      final mutableMatches = $dom_getElementsByName(
-          selectors.substring(7,selectors.length - 2));
-      int len = mutableMatches.length;
-      final copyOfMatches = new List<Element>(len);
-      for (int i = 0; i < len; ++i) {
-        copyOfMatches[i] = mutableMatches[i];
-      }
-      return new _FrozenElementList._wrap(copyOfMatches);
-    } else if (const RegExp("^[*a-zA-Z0-9]+\$").hasMatch(selectors)) {
-      final mutableMatches = $dom_getElementsByTagName(selectors);
-      int len = mutableMatches.length;
-      final copyOfMatches = new List<Element>(len);
-      for (int i = 0; i < len; ++i) {
-        copyOfMatches[i] = mutableMatches[i];
-      }
-      return new _FrozenElementList._wrap(copyOfMatches);
-    } else {
-      return new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
-    }
-  }
-}
-
-class _DocumentEventsImpl extends _ElementEventsImpl implements DocumentEvents {
-  _DocumentEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get beforeCopy => this['beforecopy'];
-
-  EventListenerList get beforeCut => this['beforecut'];
-
-  EventListenerList get beforePaste => this['beforepaste'];
-
-  EventListenerList get blur => this['blur'];
-
-  EventListenerList get change => this['change'];
-
-  EventListenerList get click => this['click'];
-
-  EventListenerList get contextMenu => this['contextmenu'];
-
-  EventListenerList get copy => this['copy'];
-
-  EventListenerList get cut => this['cut'];
-
-  EventListenerList get doubleClick => this['dblclick'];
-
-  EventListenerList get drag => this['drag'];
-
-  EventListenerList get dragEnd => this['dragend'];
-
-  EventListenerList get dragEnter => this['dragenter'];
-
-  EventListenerList get dragLeave => this['dragleave'];
-
-  EventListenerList get dragOver => this['dragover'];
-
-  EventListenerList get dragStart => this['dragstart'];
-
-  EventListenerList get drop => this['drop'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get focus => this['focus'];
-
-  EventListenerList get input => this['input'];
-
-  EventListenerList get invalid => this['invalid'];
-
-  EventListenerList get keyDown => this['keydown'];
-
-  EventListenerList get keyPress => this['keypress'];
-
-  EventListenerList get keyUp => this['keyup'];
-
-  EventListenerList get load => this['load'];
-
-  EventListenerList get mouseDown => this['mousedown'];
-
-  EventListenerList get mouseMove => this['mousemove'];
-
-  EventListenerList get mouseOut => this['mouseout'];
-
-  EventListenerList get mouseOver => this['mouseover'];
-
-  EventListenerList get mouseUp => this['mouseup'];
-
-  EventListenerList get mouseWheel => this['mousewheel'];
-
-  EventListenerList get paste => this['paste'];
-
-  EventListenerList get readyStateChange => this['readystatechange'];
-
-  EventListenerList get reset => this['reset'];
-
-  EventListenerList get scroll => this['scroll'];
-
-  EventListenerList get search => this['search'];
-
-  EventListenerList get select => this['select'];
-
-  EventListenerList get selectionChange => this['selectionchange'];
-
-  EventListenerList get selectStart => this['selectstart'];
-
-  EventListenerList get submit => this['submit'];
-
-  EventListenerList get touchCancel => this['touchcancel'];
-
-  EventListenerList get touchEnd => this['touchend'];
-
-  EventListenerList get touchMove => this['touchmove'];
-
-  EventListenerList get touchStart => this['touchstart'];
-
-  EventListenerList get fullscreenChange => this['webkitfullscreenchange'];
-
-  EventListenerList get fullscreenError => this['webkitfullscreenerror'];
-
-  EventListenerList get pointerLockChange => this['webkitpointerlockchange'];
-
-  EventListenerList get pointerLockError => this['webkitpointerlockerror'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DocumentImpl_Merged extends _DocumentImpl implements Document {
-
-  Element get activeElement native "HTMLDocument_activeElement_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
 // WARNING: Do not edit - generated code.
 
 /// @domName DocumentType
-abstract class DocumentType implements Node {
+class DocumentType extends Node {
+  DocumentType.internal(): super.internal();
+
 
   /** @domName DocumentType.entities */
-  NamedNodeMap get entities;
-
-  /** @domName DocumentType.internalSubset */
-  String get internalSubset;
-
-  /** @domName DocumentType.name */
-  String get name;
-
-  /** @domName DocumentType.notations */
-  NamedNodeMap get notations;
-
-  /** @domName DocumentType.publicId */
-  String get publicId;
-
-  /** @domName DocumentType.systemId */
-  String get systemId;
-
-  /** @domName DocumentType.remove */
-  void remove();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DocumentTypeImpl extends _NodeImpl implements DocumentType {
-
   NamedNodeMap get entities native "DocumentType_entities_Getter";
 
+
+  /** @domName DocumentType.internalSubset */
   String get internalSubset native "DocumentType_internalSubset_Getter";
 
+
+  /** @domName DocumentType.name */
   String get name native "DocumentType_name_Getter";
 
+
+  /** @domName DocumentType.notations */
   NamedNodeMap get notations native "DocumentType_notations_Getter";
 
+
+  /** @domName DocumentType.publicId */
   String get publicId native "DocumentType_publicId_Getter";
 
+
+  /** @domName DocumentType.systemId */
   String get systemId native "DocumentType_systemId_Getter";
 
+
+  /** @domName DocumentType.remove */
   void remove() native "DocumentType_remove_Callback";
 
 }
@@ -12146,44 +8708,31 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName DynamicsCompressorNode
-abstract class DynamicsCompressorNode implements AudioNode {
+class DynamicsCompressorNode extends AudioNode {
+  DynamicsCompressorNode.internal(): super.internal();
+
 
   /** @domName DynamicsCompressorNode.attack */
-  AudioParam get attack;
-
-  /** @domName DynamicsCompressorNode.knee */
-  AudioParam get knee;
-
-  /** @domName DynamicsCompressorNode.ratio */
-  AudioParam get ratio;
-
-  /** @domName DynamicsCompressorNode.reduction */
-  AudioParam get reduction;
-
-  /** @domName DynamicsCompressorNode.release */
-  AudioParam get release;
-
-  /** @domName DynamicsCompressorNode.threshold */
-  AudioParam get threshold;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _DynamicsCompressorNodeImpl extends _AudioNodeImpl implements DynamicsCompressorNode {
-
   AudioParam get attack native "DynamicsCompressorNode_attack_Getter";
 
+
+  /** @domName DynamicsCompressorNode.knee */
   AudioParam get knee native "DynamicsCompressorNode_knee_Getter";
 
+
+  /** @domName DynamicsCompressorNode.ratio */
   AudioParam get ratio native "DynamicsCompressorNode_ratio_Getter";
 
+
+  /** @domName DynamicsCompressorNode.reduction */
   AudioParam get reduction native "DynamicsCompressorNode_reduction_Getter";
 
+
+  /** @domName DynamicsCompressorNode.release */
   AudioParam get release native "DynamicsCompressorNode_release_Getter";
 
+
+  /** @domName DynamicsCompressorNode.threshold */
   AudioParam get threshold native "DynamicsCompressorNode_threshold_Getter";
 
 }
@@ -12194,426 +8743,13 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName EXTTextureFilterAnisotropic
-abstract class EXTTextureFilterAnisotropic {
+class EXTTextureFilterAnisotropic extends NativeFieldWrapperClass1 {
+  EXTTextureFilterAnisotropic.internal();
 
   static const int MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;
 
   static const int TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _EXTTextureFilterAnisotropicImpl extends NativeFieldWrapperClass1 implements EXTTextureFilterAnisotropic {
-
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/**
- * All your attribute manipulation needs in one place.
- * Extends the regular Map interface by automatically coercing non-string
- * values to strings.
- */
-abstract class AttributeMap implements Map<String, String> {
-  void operator []=(String key, value);
-}
-
-/**
- * All your element measurement needs in one place
- */
-abstract class ElementRect {
-  // Relative to offsetParent
-  ClientRect get client;
-  ClientRect get offset;
-  ClientRect get scroll;
-  // In global coords
-  ClientRect get bounding;
-  // In global coords
-  List<ClientRect> get clientRects;
-}
-
-abstract class NodeSelector {
-  Element query(String selectors);
-  List<Element> queryAll(String selectors);
-}
-
-abstract class CSSClassSet implements Set<String> {
-  /**
-   * Adds the class [token] to the element if it is not on it, removes it if it
-   * is.
-   */
-  bool toggle(String token);
-
-  /**
-   * Returns [:true:] classes cannot be added or removed from this
-   * [:CSSClassSet:].
-   */
-  bool get frozen;
-}
-
-/// @domName Element
-abstract class Element implements Node, NodeSelector {
-  factory Element.html(String html) =>
-      _ElementFactoryProvider.createElement_html(html);
-  factory Element.tag(String tag) =>
-      _ElementFactoryProvider.createElement_tag(tag);
-
-  AttributeMap get attributes;
-  void set attributes(Map<String, String> value);
-
-  /**
-   * @domName childElementCount, firstElementChild, lastElementChild,
-   *   children, Node.nodes.add
-   */
-  List<Element> get elements;
-
-  void set elements(Collection<Element> value);
-
-  /** @domName className, classList */
-  CSSClassSet get classes;
-
-  void set classes(Collection<String> value);
-
-  AttributeMap get dataAttributes;
-  void set dataAttributes(Map<String, String> value);
-
-  /**
-   * Adds the specified text as a text node after the last child of this.
-   */
-  void addText(String text);
-
-  /**
-   * Parses the specified text as HTML and adds the resulting node after the
-   * last child of this.
-   */
-  void addHTML(String html);
-
-  /**
-   * @domName getClientRects, getBoundingClientRect, clientHeight, clientWidth,
-   * clientTop, clientLeft, offsetHeight, offsetWidth, offsetTop, offsetLeft,
-   * scrollHeight, scrollWidth, scrollTop, scrollLeft
-   */
-  Future<ElementRect> get rect;
-
-  /** @domName Window.getComputedStyle */
-  Future<CSSStyleDeclaration> get computedStyle;
-
-  /** @domName Window.getComputedStyle */
-  Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement);
-
-  Element clone(bool deep);
-
-  Element get parent;
-
-  /**
-   * Experimental support for [web components][wc]. This field stores a
-   * reference to the component implementation. It was inspired by Mozilla's
-   * [x-tags][] project. Please note: in the future it may be possible to
-   * `extend Element` from your class, in which case this field will be
-   * deprecated and will simply return this [Element] object.
-   *
-   * [wc]: http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html
-   * [x-tags]: http://x-tags.org/
-   */
-  var xtag;
-
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  ElementEvents get on;
-
-  /** @domName HTMLElement.children */
-  HTMLCollection get $dom_children;
-
-  /** @domName HTMLElement.contentEditable */
-  String contentEditable;
-
-  /** @domName HTMLElement.dir */
-  String dir;
-
-  /** @domName HTMLElement.draggable */
-  bool draggable;
-
-  /** @domName HTMLElement.hidden */
-  bool hidden;
-
-  /** @domName HTMLElement.id */
-  String id;
-
-  /** @domName HTMLElement.innerHTML */
-  String innerHTML;
-
-  /** @domName HTMLElement.isContentEditable */
-  bool get isContentEditable;
-
-  /** @domName HTMLElement.lang */
-  String lang;
-
-  /** @domName HTMLElement.outerHTML */
-  String get outerHTML;
-
-  /** @domName HTMLElement.spellcheck */
-  bool spellcheck;
-
-  /** @domName HTMLElement.tabIndex */
-  int tabIndex;
-
-  /** @domName HTMLElement.title */
-  String title;
-
-  /** @domName HTMLElement.translate */
-  bool translate;
-
-  /** @domName HTMLElement.webkitdropzone */
-  String webkitdropzone;
-
-  /** @domName HTMLElement.click */
-  void click();
-
-  /** @domName HTMLElement.insertAdjacentElement */
-  Element insertAdjacentElement(String where, Element element);
-
-  /** @domName HTMLElement.insertAdjacentHTML */
-  void insertAdjacentHTML(String where, String html);
-
-  /** @domName HTMLElement.insertAdjacentText */
-  void insertAdjacentText(String where, String text);
-
-  static const int ALLOW_KEYBOARD_INPUT = 1;
-
-  /** @domName Element.childElementCount */
-  int get $dom_childElementCount;
-
-  /** @domName Element.className */
-  String $dom_className;
-
-  /** @domName Element.clientHeight */
-  int get clientHeight;
-
-  /** @domName Element.clientLeft */
-  int get clientLeft;
-
-  /** @domName Element.clientTop */
-  int get clientTop;
-
-  /** @domName Element.clientWidth */
-  int get clientWidth;
-
-  /** @domName Element.dataset */
-  Map<String, String> get dataset;
-
-  /** @domName Element.firstElementChild */
-  Element get $dom_firstElementChild;
-
-  /** @domName Element.lastElementChild */
-  Element get $dom_lastElementChild;
-
-  /** @domName Element.nextElementSibling */
-  Element get nextElementSibling;
-
-  /** @domName Element.offsetHeight */
-  int get offsetHeight;
-
-  /** @domName Element.offsetLeft */
-  int get offsetLeft;
-
-  /** @domName Element.offsetParent */
-  Element get offsetParent;
-
-  /** @domName Element.offsetTop */
-  int get offsetTop;
-
-  /** @domName Element.offsetWidth */
-  int get offsetWidth;
-
-  /** @domName Element.previousElementSibling */
-  Element get previousElementSibling;
-
-  /** @domName Element.scrollHeight */
-  int get scrollHeight;
-
-  /** @domName Element.scrollLeft */
-  int scrollLeft;
-
-  /** @domName Element.scrollTop */
-  int scrollTop;
-
-  /** @domName Element.scrollWidth */
-  int get scrollWidth;
-
-  /** @domName Element.style */
-  CSSStyleDeclaration get style;
-
-  /** @domName Element.tagName */
-  String get tagName;
-
-  /** @domName Element.blur */
-  void blur();
-
-  /** @domName Element.focus */
-  void focus();
-
-  /** @domName Element.getAttribute */
-  String $dom_getAttribute(String name);
-
-  /** @domName Element.getBoundingClientRect */
-  ClientRect getBoundingClientRect();
-
-  /** @domName Element.getClientRects */
-  List<ClientRect> getClientRects();
-
-  /** @domName Element.getElementsByClassName */
-  List<Node> $dom_getElementsByClassName(String name);
-
-  /** @domName Element.getElementsByTagName */
-  List<Node> $dom_getElementsByTagName(String name);
-
-  /** @domName Element.hasAttribute */
-  bool $dom_hasAttribute(String name);
-
-  /** @domName Element.querySelector */
-  Element $dom_querySelector(String selectors);
-
-  /** @domName Element.querySelectorAll */
-  List<Node> $dom_querySelectorAll(String selectors);
-
-  /** @domName Element.remove */
-  void remove();
-
-  /** @domName Element.removeAttribute */
-  void $dom_removeAttribute(String name);
-
-  /** @domName Element.scrollByLines */
-  void scrollByLines(int lines);
-
-  /** @domName Element.scrollByPages */
-  void scrollByPages(int pages);
-
-  /** @domName Element.scrollIntoViewIfNeeded */
-  void scrollIntoView([bool centerIfNeeded]);
-
-  /** @domName Element.setAttribute */
-  void $dom_setAttribute(String name, String value);
-
-  /** @domName Element.webkitMatchesSelector */
-  bool matchesSelector(String selectors);
-
-  /** @domName Element.webkitRequestFullScreen */
-  void webkitRequestFullScreen(int flags);
-
-  /** @domName Element.webkitRequestFullscreen */
-  void webkitRequestFullscreen();
-
-  /** @domName Element.webkitRequestPointerLock */
-  void webkitRequestPointerLock();
-
-}
-
-abstract class ElementEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get beforeCopy;
-
-  EventListenerList get beforeCut;
-
-  EventListenerList get beforePaste;
-
-  EventListenerList get blur;
-
-  EventListenerList get change;
-
-  EventListenerList get click;
-
-  EventListenerList get contextMenu;
-
-  EventListenerList get copy;
-
-  EventListenerList get cut;
-
-  EventListenerList get doubleClick;
-
-  EventListenerList get drag;
-
-  EventListenerList get dragEnd;
-
-  EventListenerList get dragEnter;
-
-  EventListenerList get dragLeave;
-
-  EventListenerList get dragOver;
-
-  EventListenerList get dragStart;
-
-  EventListenerList get drop;
-
-  EventListenerList get error;
-
-  EventListenerList get focus;
-
-  EventListenerList get input;
-
-  EventListenerList get invalid;
-
-  EventListenerList get keyDown;
-
-  EventListenerList get keyPress;
-
-  EventListenerList get keyUp;
-
-  EventListenerList get load;
-
-  EventListenerList get mouseDown;
-
-  EventListenerList get mouseMove;
-
-  EventListenerList get mouseOut;
-
-  EventListenerList get mouseOver;
-
-  EventListenerList get mouseUp;
-
-  EventListenerList get mouseWheel;
-
-  EventListenerList get paste;
-
-  EventListenerList get reset;
-
-  EventListenerList get scroll;
-
-  EventListenerList get search;
-
-  EventListenerList get select;
-
-  EventListenerList get selectStart;
-
-  EventListenerList get submit;
-
-  EventListenerList get touchCancel;
-
-  EventListenerList get touchEnd;
-
-  EventListenerList get touchEnter;
-
-  EventListenerList get touchLeave;
-
-  EventListenerList get touchMove;
-
-  EventListenerList get touchStart;
-
-  EventListenerList get transitionEnd;
-
-  EventListenerList get fullscreenChange;
 
-  EventListenerList get fullscreenError;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -12623,10 +8759,10 @@
 // functionality.
 class _ChildrenElementList implements List {
   // Raw Element.
-  final _ElementImpl _element;
-  final _HTMLCollectionImpl _childElements;
+  final Element _element;
+  final HTMLCollection _childElements;
 
-  _ChildrenElementList._wrap(_ElementImpl element)
+  _ChildrenElementList._wrap(Element element)
     : _childElements = element.$dom_children,
       _element = element;
 
@@ -12641,7 +8777,7 @@
   bool contains(Element element) => _childElements.contains(element);
 
   void forEach(void f(Element element)) {
-    for (_ElementImpl element in _childElements) {
+    for (Element element in _childElements) {
       f(element);
     }
   }
@@ -12690,11 +8826,11 @@
     return _childElements.length;
   }
 
-  _ElementImpl operator [](int index) {
+  Element operator [](int index) {
     return _childElements[index];
   }
 
-  void operator []=(int index, _ElementImpl value) {
+  void operator []=(int index, Element value) {
     _element.$dom_replaceChild(value, _childElements[index]);
   }
 
@@ -12703,17 +8839,17 @@
      throw new UnsupportedError('');
    }
 
-  Element add(_ElementImpl value) {
+  Element add(Element value) {
     _element.$dom_appendChild(value);
     return value;
   }
 
-  Element addLast(_ElementImpl value) => add(value);
+  Element addLast(Element value) => add(value);
 
   Iterator<Element> iterator() => _toList().iterator();
 
   void addAll(Collection<Element> collection) {
-    for (_ElementImpl element in collection) {
+    for (Element element in collection) {
       _element.$dom_appendChild(element);
     }
   }
@@ -12723,15 +8859,15 @@
   }
 
   void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
-    throw const NotImplementedException();
+    throw new UnimplementedError();
   }
 
   void removeRange(int start, int rangeLength) {
-    throw const NotImplementedException();
+    throw new UnimplementedError();
   }
 
   void insertRange(int start, int rangeLength, [initialValue = null]) {
-    throw const NotImplementedException();
+    throw new UnimplementedError();
   }
 
   List getRange(int start, int rangeLength) =>
@@ -12913,9 +9049,18 @@
   bool get hasNext => _index < _list.length;
 }
 
-class _ElementAttributeMap implements AttributeMap {
+/**
+ * All your attribute manipulation needs in one place.
+ * Extends the regular Map interface by automatically coercing non-string
+ * values to strings.
+ */
+abstract class AttributeMap implements Map<String, String> {
+  void operator []=(String key, value);
+}
 
-  final _ElementImpl _element;
+class _ElementAttributeMap extends AttributeMap {
+
+  final Element _element;
 
   _ElementAttributeMap(this._element);
 
@@ -13008,7 +9153,7 @@
  * Provides a Map abstraction on top of data-* attributes, similar to the
  * dataSet in the old DOM.
  */
-class _DataAttributeMap implements AttributeMap {
+class _DataAttributeMap extends AttributeMap {
 
   final Map<String, String> $dom_attributes;
 
@@ -13078,9 +9223,23 @@
   String _strip(String key) => key.substring(5);
 }
 
-class _CssClassSet implements CSSClassSet {
+abstract class CssClassSet implements Set<String> {
+  /**
+   * Adds the class [token] to the element if it is not on it, removes it if it
+   * is.
+   */
+  bool toggle(String token);
 
-  final _ElementImpl _element;
+  /**
+   * Returns [:true:] if classes cannot be added or removed from this
+   * [:CssClassSet:].
+   */
+  bool get frozen;
+}
+
+class _CssClassSet extends CssClassSet {
+
+  final Element _element;
 
   _CssClassSet(this._element);
 
@@ -13105,6 +9264,10 @@
 
   bool get isEmpty => _read().isEmpty;
 
+  /**
+   * Returns [:true:] if classes cannot be added or removed from this
+   * [:CssClassSet:].
+   */
   bool get frozen => false;
 
   int get length =>_read().length;
@@ -13127,6 +9290,10 @@
     return result;
   }
 
+  /**
+   * Adds the class [token] to the element if it is not on it, removes it if it
+   * is.
+   */
   bool toggle(String value) {
     Set<String> s = _read();
     bool result = false;
@@ -13237,20 +9404,21 @@
 // rects as we must perform all measurement queries at a safe point to avoid
 // triggering unneeded layouts.
 /**
- * All your element measurement needs in one place
+ * All your element measurement needs in one place.
  * @domName none
  */
-class _ElementRectImpl implements ElementRect {
+class ElementRect {
+  // Relative to offsetParent.
   final ClientRect client;
   final ClientRect offset;
   final ClientRect scroll;
 
   // TODO(jacobr): should we move these outside of ElementRect to avoid the
   // overhead of computing them every time even though they are rarely used.
-  final _ClientRectImpl _boundingClientRect;
-  final _ClientRectListImpl _clientRects;
+  final ClientRect _boundingClientRect;
+  final _ClientRectList _clientRects;
 
-  _ElementRectImpl(_ElementImpl element) :
+  ElementRect(Element element) :
     client = new _SimpleClientRect(element.clientLeft,
                                   element.clientTop,
                                   element.clientWidth,
@@ -13266,9 +9434,10 @@
     _boundingClientRect = element.getBoundingClientRect(),
     _clientRects = element.getClientRects();
 
-  _ClientRectImpl get bounding => _boundingClientRect;
+  // In global coords.
+  ClientRect get bounding => _boundingClientRect;
 
-  // TODO(jacobr): cleanup.
+  // In global coords.
   List<ClientRect> get clientRects {
     final out = new List(_clientRects.length);
     for (num i = 0; i < _clientRects.length; i++) {
@@ -13278,7 +9447,12 @@
   }
 }
 
-class _ElementImpl extends _NodeImpl implements Element {
+class Element extends Node implements ElementTraversal {
+
+  factory Element.html(String html) =>
+      _ElementFactoryProvider.createElement_html(html);
+  factory Element.tag(String tag) =>
+      _ElementFactoryProvider.createElement_tag(tag);
 
   /**
    * @domName Element.hasAttribute, Element.getAttribute, Element.setAttribute,
@@ -13300,17 +9474,22 @@
     elements.addAll(value);
   }
 
+  /**
+   * @domName childElementCount, firstElementChild, lastElementChild,
+   *   children, Node.nodes.add
+   */
   List<Element> get elements => new _ChildrenElementList._wrap(this);
 
-  _ElementImpl query(String selectors) => $dom_querySelector(selectors);
+  Element query(String selectors) => $dom_querySelector(selectors);
 
   List<Element> queryAll(String selectors) =>
     new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
 
-  _CssClassSet get classes => new _CssClassSet(this);
+  /** @domName className, classList */
+  CssClassSet get classes => new _CssClassSet(this);
 
   void set classes(Collection<String> value) {
-    _CssClassSet classSet = classes;
+    CssClassSet classSet = classes;
     classSet.clear();
     classSet.addAll(value);
   }
@@ -13326,32 +9505,56 @@
     }
   }
 
+  /**
+   * @domName getClientRects, getBoundingClientRect, clientHeight, clientWidth,
+   * clientTop, clientLeft, offsetHeight, offsetWidth, offsetTop, offsetLeft,
+   * scrollHeight, scrollWidth, scrollTop, scrollLeft
+   */
   Future<ElementRect> get rect {
     return _createMeasurementFuture(
-        () => new _ElementRectImpl(this),
+        () => new ElementRect(this),
         new Completer<ElementRect>());
   }
 
+  /** @domName Window.getComputedStyle */
   Future<CSSStyleDeclaration> get computedStyle {
      // TODO(jacobr): last param should be null, see b/5045788
      return getComputedStyle('');
   }
 
+  /** @domName Window.getComputedStyle */
   Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement) {
     return _createMeasurementFuture(
-        () => _window.$dom_getComputedStyle(this, pseudoElement),
+        () => window.$dom_getComputedStyle(this, pseudoElement),
         new Completer<CSSStyleDeclaration>());
   }
 
+  /**
+   * Adds the specified text as a text node after the last child of this.
+   */
   void addText(String text) {
     this.insertAdjacentText('beforeend', text);
   }
 
+  /**
+   * Parses the specified text as HTML and adds the resulting node after the
+   * last child of this.
+   */
   void addHTML(String text) {
     this.insertAdjacentHTML('beforeend', text);
   }
 
   // Hooks to support custom WebComponents.
+  /**
+   * Experimental support for [web components][wc]. This field stores a
+   * reference to the component implementation. It was inspired by Mozilla's
+   * [x-tags][] project. Please note: in the future it may be possible to
+   * `extend Element` from your class, in which case this field will be
+   * deprecated and will simply return this [Element] object.
+   *
+   * [wc]: http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html
+   * [x-tags]: http://x-tags.org/
+   */
   var xtag;
 
   noSuchMethod(InvocationMirror invocation) {
@@ -13370,86 +9573,170 @@
   }
 
 
+  Element.internal(): super.internal();
 
-  _ElementEventsImpl get on =>
-    new _ElementEventsImpl(this);
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  ElementEvents get on =>
+    new ElementEvents(this);
 
+  static const int ALLOW_KEYBOARD_INPUT = 1;
+
+
+  /** @domName Element.childElementCount */
   int get $dom_childElementCount native "Element_childElementCount_Getter";
 
+
+  /** @domName Element.className */
   String get $dom_className native "Element_className_Getter";
 
+
+  /** @domName Element.className */
   void set $dom_className(String value) native "Element_className_Setter";
 
+
+  /** @domName Element.clientHeight */
   int get clientHeight native "Element_clientHeight_Getter";
 
+
+  /** @domName Element.clientLeft */
   int get clientLeft native "Element_clientLeft_Getter";
 
+
+  /** @domName Element.clientTop */
   int get clientTop native "Element_clientTop_Getter";
 
+
+  /** @domName Element.clientWidth */
   int get clientWidth native "Element_clientWidth_Getter";
 
+
+  /** @domName Element.dataset */
   Map<String, String> get dataset native "Element_dataset_Getter";
 
+
+  /** @domName Element.firstElementChild */
   Element get $dom_firstElementChild native "Element_firstElementChild_Getter";
 
+
+  /** @domName Element.lastElementChild */
   Element get $dom_lastElementChild native "Element_lastElementChild_Getter";
 
+
+  /** @domName Element.nextElementSibling */
   Element get nextElementSibling native "Element_nextElementSibling_Getter";
 
+
+  /** @domName Element.offsetHeight */
   int get offsetHeight native "Element_offsetHeight_Getter";
 
+
+  /** @domName Element.offsetLeft */
   int get offsetLeft native "Element_offsetLeft_Getter";
 
+
+  /** @domName Element.offsetParent */
   Element get offsetParent native "Element_offsetParent_Getter";
 
+
+  /** @domName Element.offsetTop */
   int get offsetTop native "Element_offsetTop_Getter";
 
+
+  /** @domName Element.offsetWidth */
   int get offsetWidth native "Element_offsetWidth_Getter";
 
+
+  /** @domName Element.previousElementSibling */
   Element get previousElementSibling native "Element_previousElementSibling_Getter";
 
+
+  /** @domName Element.scrollHeight */
   int get scrollHeight native "Element_scrollHeight_Getter";
 
+
+  /** @domName Element.scrollLeft */
   int get scrollLeft native "Element_scrollLeft_Getter";
 
+
+  /** @domName Element.scrollLeft */
   void set scrollLeft(int value) native "Element_scrollLeft_Setter";
 
+
+  /** @domName Element.scrollTop */
   int get scrollTop native "Element_scrollTop_Getter";
 
+
+  /** @domName Element.scrollTop */
   void set scrollTop(int value) native "Element_scrollTop_Setter";
 
+
+  /** @domName Element.scrollWidth */
   int get scrollWidth native "Element_scrollWidth_Getter";
 
+
+  /** @domName Element.style */
   CSSStyleDeclaration get style native "Element_style_Getter";
 
+
+  /** @domName Element.tagName */
   String get tagName native "Element_tagName_Getter";
 
+
+  /** @domName Element.blur */
   void blur() native "Element_blur_Callback";
 
+
+  /** @domName Element.focus */
   void focus() native "Element_focus_Callback";
 
+
+  /** @domName Element.getAttribute */
   String $dom_getAttribute(String name) native "Element_getAttribute_Callback";
 
+
+  /** @domName Element.getBoundingClientRect */
   ClientRect getBoundingClientRect() native "Element_getBoundingClientRect_Callback";
 
+
+  /** @domName Element.getClientRects */
   List<ClientRect> getClientRects() native "Element_getClientRects_Callback";
 
+
+  /** @domName Element.getElementsByClassName */
   List<Node> $dom_getElementsByClassName(String name) native "Element_getElementsByClassName_Callback";
 
+
+  /** @domName Element.getElementsByTagName */
   List<Node> $dom_getElementsByTagName(String name) native "Element_getElementsByTagName_Callback";
 
+
+  /** @domName Element.hasAttribute */
   bool $dom_hasAttribute(String name) native "Element_hasAttribute_Callback";
 
+
+  /** @domName Element.querySelector */
   Element $dom_querySelector(String selectors) native "Element_querySelector_Callback";
 
+
+  /** @domName Element.querySelectorAll */
   List<Node> $dom_querySelectorAll(String selectors) native "Element_querySelectorAll_Callback";
 
+
+  /** @domName Element.remove */
   void remove() native "Element_remove_Callback";
 
+
+  /** @domName Element.removeAttribute */
   void $dom_removeAttribute(String name) native "Element_removeAttribute_Callback";
 
+
+  /** @domName Element.scrollByLines */
   void scrollByLines(int lines) native "Element_scrollByLines_Callback";
 
+
+  /** @domName Element.scrollByPages */
   void scrollByPages(int pages) native "Element_scrollByPages_Callback";
 
   void scrollIntoView([/*boolean*/ centerIfNeeded]) {
@@ -13460,20 +9747,91 @@
     _scrollIntoViewIfNeeded_2();
   }
 
+
+  /** @domName Element.scrollIntoViewIfNeeded_1 */
   void _scrollIntoViewIfNeeded_1(centerIfNeeded) native "Element_scrollIntoViewIfNeeded_1_Callback";
 
+
+  /** @domName Element.scrollIntoViewIfNeeded_2 */
   void _scrollIntoViewIfNeeded_2() native "Element_scrollIntoViewIfNeeded_2_Callback";
 
+
+  /** @domName Element.setAttribute */
   void $dom_setAttribute(String name, String value) native "Element_setAttribute_Callback";
 
+
+  /** @domName Element.webkitMatchesSelector */
   bool matchesSelector(String selectors) native "Element_webkitMatchesSelector_Callback";
 
+
+  /** @domName Element.webkitRequestFullScreen */
   void webkitRequestFullScreen(int flags) native "Element_webkitRequestFullScreen_Callback";
 
+
+  /** @domName Element.webkitRequestFullscreen */
   void webkitRequestFullscreen() native "Element_webkitRequestFullscreen_Callback";
 
+
+  /** @domName Element.webkitRequestPointerLock */
   void webkitRequestPointerLock() native "Element_webkitRequestPointerLock_Callback";
 
+  /** @domName HTMLElement.children */
+  HTMLCollection get $dom_children;
+
+  /** @domName HTMLElement.contentEditable */
+  String contentEditable;
+
+  /** @domName HTMLElement.dir */
+  String dir;
+
+  /** @domName HTMLElement.draggable */
+  bool draggable;
+
+  /** @domName HTMLElement.hidden */
+  bool hidden;
+
+  /** @domName HTMLElement.id */
+  String id;
+
+  /** @domName HTMLElement.innerHTML */
+  String innerHTML;
+
+  /** @domName HTMLElement.isContentEditable */
+  bool get isContentEditable;
+
+  /** @domName HTMLElement.lang */
+  String lang;
+
+  /** @domName HTMLElement.outerHTML */
+  String get outerHTML;
+
+  /** @domName HTMLElement.spellcheck */
+  bool spellcheck;
+
+  /** @domName HTMLElement.tabIndex */
+  int tabIndex;
+
+  /** @domName HTMLElement.title */
+  String title;
+
+  /** @domName HTMLElement.translate */
+  bool translate;
+
+  /** @domName HTMLElement.webkitdropzone */
+  String webkitdropzone;
+
+  /** @domName HTMLElement.click */
+  void click();
+
+  /** @domName HTMLElement.insertAdjacentElement */
+  Element insertAdjacentElement(String where, Element element);
+
+  /** @domName HTMLElement.insertAdjacentHTML */
+  void insertAdjacentHTML(String where, String html);
+
+  /** @domName HTMLElement.insertAdjacentText */
+  void insertAdjacentText(String where, String text);
+
 }
 
 // Temporary dispatch hook to support WebComponents.
@@ -13512,7 +9870,7 @@
         parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
       }
     }
-    final _ElementImpl temp = new Element.tag(parentTag);
+    final Element temp = new Element.tag(parentTag);
     temp.innerHTML = html;
 
     Element element;
@@ -13533,11 +9891,11 @@
 
   /** @domName Document.createElement */
   static Element createElement_tag(String tag) =>
-      _document.$dom_createElement(tag);
+      document.$dom_createElement(tag);
 }
 
-class _ElementEventsImpl extends _EventsImpl implements ElementEvents {
-  _ElementEventsImpl(_ptr) : super(_ptr);
+class ElementEvents extends Events {
+  ElementEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get abort => this['abort'];
 
@@ -13641,91 +9999,26 @@
 
 // WARNING: Do not edit - generated code.
 
-class _ElementImpl_Merged extends _ElementImpl implements Element {
-
-  HTMLCollection get $dom_children native "HTMLElement_children_Getter";
-
-  String get contentEditable native "HTMLElement_contentEditable_Getter";
-
-  void set contentEditable(String value) native "HTMLElement_contentEditable_Setter";
-
-  String get dir native "HTMLElement_dir_Getter";
-
-  void set dir(String value) native "HTMLElement_dir_Setter";
-
-  bool get draggable native "HTMLElement_draggable_Getter";
-
-  void set draggable(bool value) native "HTMLElement_draggable_Setter";
-
-  bool get hidden native "HTMLElement_hidden_Getter";
-
-  void set hidden(bool value) native "HTMLElement_hidden_Setter";
-
-  String get id native "HTMLElement_id_Getter";
-
-  void set id(String value) native "HTMLElement_id_Setter";
-
-  String get innerHTML native "HTMLElement_innerHTML_Getter";
-
-  void set innerHTML(String value) native "HTMLElement_innerHTML_Setter";
-
-  bool get isContentEditable native "HTMLElement_isContentEditable_Getter";
-
-  String get lang native "HTMLElement_lang_Getter";
-
-  void set lang(String value) native "HTMLElement_lang_Setter";
-
-  String get outerHTML native "HTMLElement_outerHTML_Getter";
-
-  bool get spellcheck native "HTMLElement_spellcheck_Getter";
-
-  void set spellcheck(bool value) native "HTMLElement_spellcheck_Setter";
-
-  int get tabIndex native "HTMLElement_tabIndex_Getter";
-
-  void set tabIndex(int value) native "HTMLElement_tabIndex_Setter";
-
-  String get title native "HTMLElement_title_Getter";
-
-  void set title(String value) native "HTMLElement_title_Setter";
-
-  bool get translate native "HTMLElement_translate_Getter";
-
-  void set translate(bool value) native "HTMLElement_translate_Setter";
-
-  String get webkitdropzone native "HTMLElement_webkitdropzone_Getter";
-
-  void set webkitdropzone(String value) native "HTMLElement_webkitdropzone_Setter";
-
-  void click() native "HTMLElement_click_Callback";
-
-  Element insertAdjacentElement(String where, Element element) native "HTMLElement_insertAdjacentElement_Callback";
-
-  void insertAdjacentHTML(String where, String html) native "HTMLElement_insertAdjacentHTML_Callback";
-
-  void insertAdjacentText(String where, String text) native "HTMLElement_insertAdjacentText_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName ElementTimeControl
-abstract class ElementTimeControl {
+class ElementTimeControl extends NativeFieldWrapperClass1 {
+  ElementTimeControl.internal();
+
 
   /** @domName ElementTimeControl.beginElement */
-  void beginElement();
+  void beginElement() native "ElementTimeControl_beginElement_Callback";
+
 
   /** @domName ElementTimeControl.beginElementAt */
-  void beginElementAt(num offset);
+  void beginElementAt(num offset) native "ElementTimeControl_beginElementAt_Callback";
+
 
   /** @domName ElementTimeControl.endElement */
-  void endElement();
+  void endElement() native "ElementTimeControl_endElement_Callback";
+
 
   /** @domName ElementTimeControl.endElementAt */
-  void endElementAt(num offset);
+  void endElementAt(num offset) native "ElementTimeControl_endElementAt_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -13734,22 +10027,29 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ElementTraversal
-abstract class ElementTraversal {
+class ElementTraversal extends NativeFieldWrapperClass1 {
+  ElementTraversal.internal();
+
 
   /** @domName ElementTraversal.childElementCount */
-  int get childElementCount;
+  int get childElementCount native "ElementTraversal_childElementCount_Getter";
+
 
   /** @domName ElementTraversal.firstElementChild */
-  Element get firstElementChild;
+  Element get firstElementChild native "ElementTraversal_firstElementChild_Getter";
+
 
   /** @domName ElementTraversal.lastElementChild */
-  Element get lastElementChild;
+  Element get lastElementChild native "ElementTraversal_lastElementChild_Getter";
+
 
   /** @domName ElementTraversal.nextElementSibling */
-  Element get nextElementSibling;
+  Element get nextElementSibling native "ElementTraversal_nextElementSibling_Getter";
+
 
   /** @domName ElementTraversal.previousElementSibling */
-  Element get previousElementSibling;
+  Element get previousElementSibling native "ElementTraversal_previousElementSibling_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -13758,58 +10058,57 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLEmbedElement
-abstract class EmbedElement implements Element {
+class EmbedElement extends _Element_Merged {
 
   factory EmbedElement() => _Elements.createEmbedElement();
+  EmbedElement.internal(): super.internal();
+
 
   /** @domName HTMLEmbedElement.align */
-  String align;
-
-  /** @domName HTMLEmbedElement.height */
-  String height;
-
-  /** @domName HTMLEmbedElement.name */
-  String name;
-
-  /** @domName HTMLEmbedElement.src */
-  String src;
-
-  /** @domName HTMLEmbedElement.type */
-  String type;
-
-  /** @domName HTMLEmbedElement.width */
-  String width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _EmbedElementImpl extends _ElementImpl_Merged implements EmbedElement {
-
   String get align native "HTMLEmbedElement_align_Getter";
 
+
+  /** @domName HTMLEmbedElement.align */
   void set align(String value) native "HTMLEmbedElement_align_Setter";
 
+
+  /** @domName HTMLEmbedElement.height */
   String get height native "HTMLEmbedElement_height_Getter";
 
+
+  /** @domName HTMLEmbedElement.height */
   void set height(String value) native "HTMLEmbedElement_height_Setter";
 
+
+  /** @domName HTMLEmbedElement.name */
   String get name native "HTMLEmbedElement_name_Getter";
 
+
+  /** @domName HTMLEmbedElement.name */
   void set name(String value) native "HTMLEmbedElement_name_Setter";
 
+
+  /** @domName HTMLEmbedElement.src */
   String get src native "HTMLEmbedElement_src_Getter";
 
+
+  /** @domName HTMLEmbedElement.src */
   void set src(String value) native "HTMLEmbedElement_src_Setter";
 
+
+  /** @domName HTMLEmbedElement.type */
   String get type native "HTMLEmbedElement_type_Getter";
 
+
+  /** @domName HTMLEmbedElement.type */
   void set type(String value) native "HTMLEmbedElement_type_Setter";
 
+
+  /** @domName HTMLEmbedElement.width */
   String get width native "HTMLEmbedElement_width_Getter";
 
+
+  /** @domName HTMLEmbedElement.width */
   void set width(String value) native "HTMLEmbedElement_width_Setter";
 
 }
@@ -13820,15 +10119,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName EntityReference
-abstract class EntityReference implements Node {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _EntityReferenceImpl extends _NodeImpl implements EntityReference {
+class EntityReference extends Node {
+  EntityReference.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13846,231 +10138,76 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Entry
-abstract class Entry {
+class Entry extends NativeFieldWrapperClass1 {
+  Entry.internal();
+
 
   /** @domName Entry.filesystem */
-  DOMFileSystem get filesystem;
+  DOMFileSystem get filesystem native "Entry_filesystem_Getter";
+
 
   /** @domName Entry.fullPath */
-  String get fullPath;
+  String get fullPath native "Entry_fullPath_Getter";
+
 
   /** @domName Entry.isDirectory */
-  bool get isDirectory;
+  bool get isDirectory native "Entry_isDirectory_Getter";
+
 
   /** @domName Entry.isFile */
-  bool get isFile;
+  bool get isFile native "Entry_isFile_Getter";
+
 
   /** @domName Entry.name */
-  String get name;
+  String get name native "Entry_name_Getter";
 
-  /** @domName Entry.copyTo */
-  void copyTo(DirectoryEntry parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]);
+  void copyTo(/*DirectoryEntry*/ parent, [/*DOMString*/ name, /*EntryCallback*/ successCallback, /*ErrorCallback*/ errorCallback]) {
+    if (?name) {
+      _copyTo_1(parent, name, successCallback, errorCallback);
+      return;
+    }
+    _copyTo_2(parent);
+  }
+
+
+  /** @domName Entry.copyTo_1 */
+  void _copyTo_1(parent, name, successCallback, errorCallback) native "Entry_copyTo_1_Callback";
+
+
+  /** @domName Entry.copyTo_2 */
+  void _copyTo_2(parent) native "Entry_copyTo_2_Callback";
+
 
   /** @domName Entry.getMetadata */
-  void getMetadata(MetadataCallback successCallback, [ErrorCallback errorCallback]);
+  void getMetadata(MetadataCallback successCallback, [ErrorCallback errorCallback]) native "Entry_getMetadata_Callback";
+
 
   /** @domName Entry.getParent */
-  void getParent([EntryCallback successCallback, ErrorCallback errorCallback]);
+  void getParent([EntryCallback successCallback, ErrorCallback errorCallback]) native "Entry_getParent_Callback";
 
-  /** @domName Entry.moveTo */
-  void moveTo(DirectoryEntry parent, [String name, EntryCallback successCallback, ErrorCallback errorCallback]);
+  void moveTo(/*DirectoryEntry*/ parent, [/*DOMString*/ name, /*EntryCallback*/ successCallback, /*ErrorCallback*/ errorCallback]) {
+    if (?name) {
+      _moveTo_1(parent, name, successCallback, errorCallback);
+      return;
+    }
+    _moveTo_2(parent);
+  }
+
+
+  /** @domName Entry.moveTo_1 */
+  void _moveTo_1(parent, name, successCallback, errorCallback) native "Entry_moveTo_1_Callback";
+
+
+  /** @domName Entry.moveTo_2 */
+  void _moveTo_2(parent) native "Entry_moveTo_2_Callback";
+
 
   /** @domName Entry.remove */
-  void remove(VoidCallback successCallback, [ErrorCallback errorCallback]);
+  void remove(VoidCallback successCallback, [ErrorCallback errorCallback]) native "Entry_remove_Callback";
+
 
   /** @domName Entry.toURL */
-  String toURL();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _EntryArrayImpl extends NativeFieldWrapperClass1 implements List<Entry> {
-
-  int get length native "EntryArray_length_Getter";
-
-  Entry operator[](int index) native "EntryArray_item_Callback";
-
-  void operator[]=(int index, Entry value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<Entry> mixins.
-  // Entry is the element type.
-
-  // From Iterable<Entry>:
-
-  Iterator<Entry> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<Entry>(this);
-  }
-
-  // From Collection<Entry>:
-
-  void add(Entry value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(Entry value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<Entry> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(Entry element) => _Collections.contains(this, element);
-
-  void forEach(void f(Entry element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Entry element)) => _Collections.map(this, [], f);
-
-  Collection<Entry> filter(bool f(Entry element)) =>
-     _Collections.filter(this, <Entry>[], f);
-
-  bool every(bool f(Entry element)) => _Collections.every(this, f);
-
-  bool some(bool f(Entry element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Entry>:
-
-  void sort([Comparator<Entry> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Entry element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Entry element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  Entry get last => this[length - 1];
-
-  Entry removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<Entry> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [Entry initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<Entry> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <Entry>[]);
-
-  // -- end List<Entry> mixins.
-
-  Entry item(int index) native "EntryArray_item_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _EntryArraySyncImpl extends NativeFieldWrapperClass1 implements List<EntrySync> {
-
-  int get length native "EntryArraySync_length_Getter";
-
-  EntrySync operator[](int index) native "EntryArraySync_item_Callback";
-
-  void operator[]=(int index, EntrySync value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<EntrySync> mixins.
-  // EntrySync is the element type.
-
-  // From Iterable<EntrySync>:
-
-  Iterator<EntrySync> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<EntrySync>(this);
-  }
-
-  // From Collection<EntrySync>:
-
-  void add(EntrySync value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(EntrySync value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<EntrySync> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(EntrySync element) => _Collections.contains(this, element);
-
-  void forEach(void f(EntrySync element)) => _Collections.forEach(this, f);
-
-  Collection map(f(EntrySync element)) => _Collections.map(this, [], f);
-
-  Collection<EntrySync> filter(bool f(EntrySync element)) =>
-     _Collections.filter(this, <EntrySync>[], f);
-
-  bool every(bool f(EntrySync element)) => _Collections.every(this, f);
-
-  bool some(bool f(EntrySync element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<EntrySync>:
-
-  void sort([Comparator<EntrySync> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(EntrySync element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(EntrySync element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  EntrySync get last => this[length - 1];
-
-  EntrySync removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<EntrySync> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [EntrySync initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<EntrySync> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <EntrySync>[]);
-
-  // -- end List<EntrySync> mixins.
-
-  EntrySync item(int index) native "EntryArraySync_item_Callback";
+  String toURL() native "Entry_toURL_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14087,121 +10224,52 @@
 
 // WARNING: Do not edit - generated code.
 
-class _EntryImpl extends NativeFieldWrapperClass1 implements Entry {
-
-  DOMFileSystem get filesystem native "Entry_filesystem_Getter";
-
-  String get fullPath native "Entry_fullPath_Getter";
-
-  bool get isDirectory native "Entry_isDirectory_Getter";
-
-  bool get isFile native "Entry_isFile_Getter";
-
-  String get name native "Entry_name_Getter";
-
-  void copyTo(/*DirectoryEntry*/ parent, [/*DOMString*/ name, /*EntryCallback*/ successCallback, /*ErrorCallback*/ errorCallback]) {
-    if (?name) {
-      _copyTo_1(parent, name, successCallback, errorCallback);
-      return;
-    }
-    _copyTo_2(parent);
-  }
-
-  void _copyTo_1(parent, name, successCallback, errorCallback) native "Entry_copyTo_1_Callback";
-
-  void _copyTo_2(parent) native "Entry_copyTo_2_Callback";
-
-  void getMetadata(MetadataCallback successCallback, [ErrorCallback errorCallback]) native "Entry_getMetadata_Callback";
-
-  void getParent([EntryCallback successCallback, ErrorCallback errorCallback]) native "Entry_getParent_Callback";
-
-  void moveTo(/*DirectoryEntry*/ parent, [/*DOMString*/ name, /*EntryCallback*/ successCallback, /*ErrorCallback*/ errorCallback]) {
-    if (?name) {
-      _moveTo_1(parent, name, successCallback, errorCallback);
-      return;
-    }
-    _moveTo_2(parent);
-  }
-
-  void _moveTo_1(parent, name, successCallback, errorCallback) native "Entry_moveTo_1_Callback";
-
-  void _moveTo_2(parent) native "Entry_moveTo_2_Callback";
-
-  void remove(VoidCallback successCallback, [ErrorCallback errorCallback]) native "Entry_remove_Callback";
-
-  String toURL() native "Entry_toURL_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName EntrySync
-abstract class EntrySync {
+class EntrySync extends NativeFieldWrapperClass1 {
+  EntrySync.internal();
+
 
   /** @domName EntrySync.filesystem */
-  DOMFileSystemSync get filesystem;
-
-  /** @domName EntrySync.fullPath */
-  String get fullPath;
-
-  /** @domName EntrySync.isDirectory */
-  bool get isDirectory;
-
-  /** @domName EntrySync.isFile */
-  bool get isFile;
-
-  /** @domName EntrySync.name */
-  String get name;
-
-  /** @domName EntrySync.copyTo */
-  EntrySync copyTo(DirectoryEntrySync parent, String name);
-
-  /** @domName EntrySync.getMetadata */
-  Metadata getMetadata();
-
-  /** @domName EntrySync.getParent */
-  EntrySync getParent();
-
-  /** @domName EntrySync.moveTo */
-  EntrySync moveTo(DirectoryEntrySync parent, String name);
-
-  /** @domName EntrySync.remove */
-  void remove();
-
-  /** @domName EntrySync.toURL */
-  String toURL();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _EntrySyncImpl extends NativeFieldWrapperClass1 implements EntrySync {
-
   DOMFileSystemSync get filesystem native "EntrySync_filesystem_Getter";
 
+
+  /** @domName EntrySync.fullPath */
   String get fullPath native "EntrySync_fullPath_Getter";
 
+
+  /** @domName EntrySync.isDirectory */
   bool get isDirectory native "EntrySync_isDirectory_Getter";
 
+
+  /** @domName EntrySync.isFile */
   bool get isFile native "EntrySync_isFile_Getter";
 
+
+  /** @domName EntrySync.name */
   String get name native "EntrySync_name_Getter";
 
+
+  /** @domName EntrySync.copyTo */
   EntrySync copyTo(DirectoryEntrySync parent, String name) native "EntrySync_copyTo_Callback";
 
+
+  /** @domName EntrySync.getMetadata */
   Metadata getMetadata() native "EntrySync_getMetadata_Callback";
 
+
+  /** @domName EntrySync.getParent */
   EntrySync getParent() native "EntrySync_getParent_Callback";
 
+
+  /** @domName EntrySync.moveTo */
   EntrySync moveTo(DirectoryEntrySync parent, String name) native "EntrySync_moveTo_Callback";
 
+
+  /** @domName EntrySync.remove */
   void remove() native "EntrySync_remove_Callback";
 
+
+  /** @domName EntrySync.toURL */
   String toURL() native "EntrySync_toURL_Callback";
 
 }
@@ -14220,29 +10288,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ErrorEvent
-abstract class ErrorEvent implements Event {
+class ErrorEvent extends Event {
+  ErrorEvent.internal(): super.internal();
+
 
   /** @domName ErrorEvent.filename */
-  String get filename;
-
-  /** @domName ErrorEvent.lineno */
-  int get lineno;
-
-  /** @domName ErrorEvent.message */
-  String get message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ErrorEventImpl extends _EventImpl implements ErrorEvent {
-
   String get filename native "ErrorEvent_filename_Getter";
 
+
+  /** @domName ErrorEvent.lineno */
   int get lineno native "ErrorEvent_lineno_Getter";
 
+
+  /** @domName ErrorEvent.message */
   String get message native "ErrorEvent_message_Getter";
 
 }
@@ -14252,10 +10310,7 @@
 
 // WARNING: Do not edit - generated code.
 
-
-/// @domName Event
-abstract class Event {
-
+class Event extends NativeFieldWrapperClass1 {
   // In JS, canBubble and cancelable are technically required parameters to
   // init*Event. In practice, though, if they aren't provided they simply
   // default to false (since that's Boolean(undefined)).
@@ -14264,6 +10319,7 @@
   // what people want most of the time anyway.
   factory Event(String type, [bool canBubble = true, bool cancelable = true]) =>
       _EventFactoryProvider.createEvent(type, canBubble, cancelable);
+  Event.internal();
 
   static const int AT_TARGET = 2;
 
@@ -14305,138 +10361,76 @@
 
   static const int SELECT = 16384;
 
+
   /** @domName Event.bubbles */
-  bool get bubbles;
-
-  /** @domName Event.cancelBubble */
-  bool cancelBubble;
-
-  /** @domName Event.cancelable */
-  bool get cancelable;
-
-  /** @domName Event.clipboardData */
-  Clipboard get clipboardData;
-
-  /** @domName Event.currentTarget */
-  EventTarget get currentTarget;
-
-  /** @domName Event.defaultPrevented */
-  bool get defaultPrevented;
-
-  /** @domName Event.eventPhase */
-  int get eventPhase;
-
-  /** @domName Event.returnValue */
-  bool returnValue;
-
-  /** @domName Event.srcElement */
-  EventTarget get srcElement;
-
-  /** @domName Event.target */
-  EventTarget get target;
-
-  /** @domName Event.timeStamp */
-  int get timeStamp;
-
-  /** @domName Event.type */
-  String get type;
-
-  /** @domName Event.initEvent */
-  void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg);
-
-  /** @domName Event.preventDefault */
-  void preventDefault();
-
-  /** @domName Event.stopImmediatePropagation */
-  void stopImmediatePropagation();
-
-  /** @domName Event.stopPropagation */
-  void stopPropagation();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName EventException
-abstract class EventException {
-
-  static const int DISPATCH_REQUEST_ERR = 1;
-
-  static const int UNSPECIFIED_EVENT_TYPE_ERR = 0;
-
-  /** @domName EventException.code */
-  int get code;
-
-  /** @domName EventException.message */
-  String get message;
-
-  /** @domName EventException.name */
-  String get name;
-
-  /** @domName EventException.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _EventExceptionImpl extends NativeFieldWrapperClass1 implements EventException {
-
-  int get code native "EventException_code_Getter";
-
-  String get message native "EventException_message_Getter";
-
-  String get name native "EventException_name_Getter";
-
-  String toString() native "EventException_toString_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _EventImpl extends NativeFieldWrapperClass1 implements Event {
-
   bool get bubbles native "Event_bubbles_Getter";
 
+
+  /** @domName Event.cancelBubble */
   bool get cancelBubble native "Event_cancelBubble_Getter";
 
+
+  /** @domName Event.cancelBubble */
   void set cancelBubble(bool value) native "Event_cancelBubble_Setter";
 
+
+  /** @domName Event.cancelable */
   bool get cancelable native "Event_cancelable_Getter";
 
+
+  /** @domName Event.clipboardData */
   Clipboard get clipboardData native "Event_clipboardData_Getter";
 
+
+  /** @domName Event.currentTarget */
   EventTarget get currentTarget native "Event_currentTarget_Getter";
 
+
+  /** @domName Event.defaultPrevented */
   bool get defaultPrevented native "Event_defaultPrevented_Getter";
 
+
+  /** @domName Event.eventPhase */
   int get eventPhase native "Event_eventPhase_Getter";
 
+
+  /** @domName Event.returnValue */
   bool get returnValue native "Event_returnValue_Getter";
 
+
+  /** @domName Event.returnValue */
   void set returnValue(bool value) native "Event_returnValue_Setter";
 
+
+  /** @domName Event.srcElement */
   EventTarget get srcElement native "Event_srcElement_Getter";
 
+
+  /** @domName Event.target */
   EventTarget get target native "Event_target_Getter";
 
+
+  /** @domName Event.timeStamp */
   int get timeStamp native "Event_timeStamp_Getter";
 
+
+  /** @domName Event.type */
   String get type native "Event_type_Getter";
 
+
+  /** @domName Event.initEvent */
   void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native "Event_initEvent_Callback";
 
+
+  /** @domName Event.preventDefault */
   void preventDefault() native "Event_preventDefault_Callback";
 
+
+  /** @domName Event.stopImmediatePropagation */
   void stopImmediatePropagation() native "Event_stopImmediatePropagation_Callback";
 
+
+  /** @domName Event.stopPropagation */
   void stopPropagation() native "Event_stopPropagation_Callback";
 
 }
@@ -14446,51 +10440,30 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName EventSource
-abstract class EventSource implements EventTarget {
+/// @domName EventException
+class EventException extends NativeFieldWrapperClass1 {
+  EventException.internal();
 
-  factory EventSource(String scriptUrl) => _EventSourceFactoryProvider.createEventSource(scriptUrl);
+  static const int DISPATCH_REQUEST_ERR = 1;
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  EventSourceEvents get on;
+  static const int UNSPECIFIED_EVENT_TYPE_ERR = 0;
 
-  static const int CLOSED = 2;
 
-  static const int CONNECTING = 0;
+  /** @domName EventException.code */
+  int get code native "EventException_code_Getter";
 
-  static const int OPEN = 1;
 
-  /** @domName EventSource.URL */
-  String get URL;
+  /** @domName EventException.message */
+  String get message native "EventException_message_Getter";
 
-  /** @domName EventSource.readyState */
-  int get readyState;
 
-  /** @domName EventSource.url */
-  String get url;
+  /** @domName EventException.name */
+  String get name native "EventException_name_Getter";
 
-  /** @domName EventSource.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
 
-  /** @domName EventSource.close */
-  void close();
+  /** @domName EventException.toString */
+  String toString() native "EventException_toString_Callback";
 
-  /** @domName EventSource.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName EventSource.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class EventSourceEvents implements Events {
-
-  EventListenerList get error;
-
-  EventListenerList get message;
-
-  EventListenerList get open;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -14498,29 +10471,56 @@
 
 // WARNING: Do not edit - generated code.
 
-class _EventSourceImpl extends _EventTargetImpl implements EventSource {
+/// @domName EventSource
+class EventSource extends EventTarget {
 
-  _EventSourceEventsImpl get on =>
-    new _EventSourceEventsImpl(this);
+  factory EventSource(String scriptUrl) => _EventSourceFactoryProvider.createEventSource(scriptUrl);
+  EventSource.internal(): super.internal();
 
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  EventSourceEvents get on =>
+    new EventSourceEvents(this);
+
+  static const int CLOSED = 2;
+
+  static const int CONNECTING = 0;
+
+  static const int OPEN = 1;
+
+
+  /** @domName EventSource.URL */
   String get URL native "EventSource_URL_Getter";
 
+
+  /** @domName EventSource.readyState */
   int get readyState native "EventSource_readyState_Getter";
 
+
+  /** @domName EventSource.url */
   String get url native "EventSource_url_Getter";
 
+
+  /** @domName EventSource.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_addEventListener_Callback";
 
+
+  /** @domName EventSource.close */
   void close() native "EventSource_close_Callback";
 
+
+  /** @domName EventSource.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "EventSource_dispatchEvent_Callback";
 
+
+  /** @domName EventSource.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_removeEventListener_Callback";
 
 }
 
-class _EventSourceEventsImpl extends _EventsImpl implements EventSourceEvents {
-  _EventSourceEventsImpl(_ptr) : super(_ptr);
+class EventSourceEvents extends Events {
+  EventSourceEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get error => this['error'];
 
@@ -14532,71 +10532,33 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-
-abstract class EventListenerList {
-  EventListenerList add(EventListener handler, [bool useCapture]);
-
-  EventListenerList remove(EventListener handler, [bool useCapture]);
-
-  bool dispatch(Event evt);
-}
-
-abstract class Events {
-  EventListenerList operator [](String type);
-}
-
-/// @domName EventTarget
-abstract class EventTarget {
-
-  /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
-  abstract Events get on;
-
-  /** @domName EventTarget.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName EventTarget.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName EventTarget.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _EventsImpl implements Events {
+class Events {
   /* Raw event target. */
-  // TODO(jacobr): it would be nice if we could specify this as
-  // _EventTargetImpl or EventTarget
-  final _ptr;
+  final EventTarget _ptr;
 
-  _EventsImpl(this._ptr);
+  Events(this._ptr);
 
-  _EventListenerListImpl operator [](String type) {
-    return new _EventListenerListImpl(_ptr, type);
+  EventListenerList operator [](String type) {
+    return new EventListenerList(_ptr, type);
   }
 }
 
-class _EventListenerListImpl implements EventListenerList {
+class EventListenerList {
 
-  // TODO(jacobr): make this _EventTargetImpl
-  final _ptr;
+  final EventTarget _ptr;
   final String _type;
 
-  _EventListenerListImpl(this._ptr, this._type);
+  EventListenerList(this._ptr, this._type);
 
   // TODO(jacobr): implement equals.
 
-  _EventListenerListImpl add(EventListener listener,
+  EventListenerList add(EventListener listener,
       [bool useCapture = false]) {
     _add(listener, useCapture);
     return this;
   }
 
-  _EventListenerListImpl remove(EventListener listener,
+  EventListenerList remove(EventListener listener,
       [bool useCapture = false]) {
     _remove(listener, useCapture);
     return this;
@@ -14616,14 +10578,22 @@
 }
 
 
-class _EventTargetImpl extends NativeFieldWrapperClass1 implements EventTarget {
+class EventTarget extends NativeFieldWrapperClass1 {
 
-  Events get on => new _EventsImpl(this);
+  /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
+  Events get on => new Events(this);
+  EventTarget.internal();
 
+
+  /** @domName EventTarget.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "EventTarget_addEventListener_Callback";
 
+
+  /** @domName EventTarget.dispatchEvent */
   bool $dom_dispatchEvent(Event event) native "EventTarget_dispatchEvent_Callback";
 
+
+  /** @domName EventTarget.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventTarget_removeEventListener_Callback";
 
 }
@@ -14634,70 +10604,57 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLFieldSetElement
-abstract class FieldSetElement implements Element {
+class FieldSetElement extends _Element_Merged {
 
   factory FieldSetElement() => _Elements.createFieldSetElement();
+  FieldSetElement.internal(): super.internal();
+
 
   /** @domName HTMLFieldSetElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLFieldSetElement.elements */
-  HTMLCollection get elements;
-
-  /** @domName HTMLFieldSetElement.form */
-  FormElement get form;
-
-  /** @domName HTMLFieldSetElement.name */
-  String name;
-
-  /** @domName HTMLFieldSetElement.type */
-  String get type;
-
-  /** @domName HTMLFieldSetElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLFieldSetElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLFieldSetElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLFieldSetElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLFieldSetElement.setCustomValidity */
-  void setCustomValidity(String error);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _FieldSetElementImpl extends _ElementImpl_Merged implements FieldSetElement {
-
   bool get disabled native "HTMLFieldSetElement_disabled_Getter";
 
+
+  /** @domName HTMLFieldSetElement.disabled */
   void set disabled(bool value) native "HTMLFieldSetElement_disabled_Setter";
 
+
+  /** @domName HTMLFieldSetElement.elements */
   HTMLCollection get elements native "HTMLFieldSetElement_elements_Getter";
 
+
+  /** @domName HTMLFieldSetElement.form */
   FormElement get form native "HTMLFieldSetElement_form_Getter";
 
+
+  /** @domName HTMLFieldSetElement.name */
   String get name native "HTMLFieldSetElement_name_Getter";
 
+
+  /** @domName HTMLFieldSetElement.name */
   void set name(String value) native "HTMLFieldSetElement_name_Setter";
 
+
+  /** @domName HTMLFieldSetElement.type */
   String get type native "HTMLFieldSetElement_type_Getter";
 
+
+  /** @domName HTMLFieldSetElement.validationMessage */
   String get validationMessage native "HTMLFieldSetElement_validationMessage_Getter";
 
+
+  /** @domName HTMLFieldSetElement.validity */
   ValidityState get validity native "HTMLFieldSetElement_validity_Getter";
 
+
+  /** @domName HTMLFieldSetElement.willValidate */
   bool get willValidate native "HTMLFieldSetElement_willValidate_Getter";
 
+
+  /** @domName HTMLFieldSetElement.checkValidity */
   bool checkValidity() native "HTMLFieldSetElement_checkValidity_Callback";
 
+
+  /** @domName HTMLFieldSetElement.setCustomValidity */
   void setCustomValidity(String error) native "HTMLFieldSetElement_setCustomValidity_Callback";
 
 }
@@ -14708,16 +10665,21 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName File
-abstract class File implements Blob {
+class File extends Blob {
+  File.internal(): super.internal();
+
 
   /** @domName File.lastModifiedDate */
-  Date get lastModifiedDate;
+  Date get lastModifiedDate native "File_lastModifiedDate_Getter";
+
 
   /** @domName File.name */
-  String get name;
+  String get name native "File_name_Getter";
+
 
   /** @domName File.webkitRelativePath */
-  String get webkitRelativePath;
+  String get webkitRelativePath native "File_webkitRelativePath_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -14734,24 +10696,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName FileEntry
-abstract class FileEntry implements Entry {
+class FileEntry extends Entry {
+  FileEntry.internal(): super.internal();
+
 
   /** @domName FileEntry.createWriter */
-  void createWriter(FileWriterCallback successCallback, [ErrorCallback errorCallback]);
-
-  /** @domName FileEntry.file */
-  void file(FileCallback successCallback, [ErrorCallback errorCallback]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _FileEntryImpl extends _EntryImpl implements FileEntry {
-
   void createWriter(FileWriterCallback successCallback, [ErrorCallback errorCallback]) native "FileEntry_createWriter_Callback";
 
+
+  /** @domName FileEntry.file */
   void file(FileCallback successCallback, [ErrorCallback errorCallback]) native "FileEntry_file_Callback";
 
 }
@@ -14762,24 +10715,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName FileEntrySync
-abstract class FileEntrySync implements EntrySync {
+class FileEntrySync extends EntrySync {
+  FileEntrySync.internal(): super.internal();
+
 
   /** @domName FileEntrySync.createWriter */
-  FileWriterSync createWriter();
-
-  /** @domName FileEntrySync.file */
-  File file();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _FileEntrySyncImpl extends _EntrySyncImpl implements FileEntrySync {
-
   FileWriterSync createWriter() native "FileEntrySync_createWriter_Callback";
 
+
+  /** @domName FileEntrySync.file */
   File file() native "FileEntrySync_file_Callback";
 
 }
@@ -14790,7 +10734,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName FileError
-abstract class FileError {
+class FileError extends NativeFieldWrapperClass1 {
+  FileError.internal();
 
   static const int ABORT_ERR = 3;
 
@@ -14816,17 +10761,8 @@
 
   static const int TYPE_MISMATCH_ERR = 11;
 
+
   /** @domName FileError.code */
-  int get code;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _FileErrorImpl extends NativeFieldWrapperClass1 implements FileError {
-
   int get code native "FileError_code_Getter";
 
 }
@@ -14837,7 +10773,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName FileException
-abstract class FileException {
+class FileException extends NativeFieldWrapperClass1 {
+  FileException.internal();
 
   static const int ABORT_ERR = 3;
 
@@ -14863,32 +10800,20 @@
 
   static const int TYPE_MISMATCH_ERR = 11;
 
+
   /** @domName FileException.code */
-  int get code;
-
-  /** @domName FileException.message */
-  String get message;
-
-  /** @domName FileException.name */
-  String get name;
-
-  /** @domName FileException.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _FileExceptionImpl extends NativeFieldWrapperClass1 implements FileException {
-
   int get code native "FileException_code_Getter";
 
+
+  /** @domName FileException.message */
   String get message native "FileException_message_Getter";
 
+
+  /** @domName FileException.name */
   String get name native "FileException_name_Getter";
 
+
+  /** @domName FileException.toString */
   String toString() native "FileException_toString_Callback";
 
 }
@@ -14898,126 +10823,17 @@
 
 // WARNING: Do not edit - generated code.
 
-class _FileImpl extends _BlobImpl implements File {
-
-  Date get lastModifiedDate native "File_lastModifiedDate_Getter";
-
-  String get name native "File_name_Getter";
-
-  String get webkitRelativePath native "File_webkitRelativePath_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _FileListImpl extends NativeFieldWrapperClass1 implements List<File> {
-
-  int get length native "FileList_length_Getter";
-
-  File operator[](int index) native "FileList_item_Callback";
-
-  void operator[]=(int index, File value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<File> mixins.
-  // File is the element type.
-
-  // From Iterable<File>:
-
-  Iterator<File> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<File>(this);
-  }
-
-  // From Collection<File>:
-
-  void add(File value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(File value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<File> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(File element) => _Collections.contains(this, element);
-
-  void forEach(void f(File element)) => _Collections.forEach(this, f);
-
-  Collection map(f(File element)) => _Collections.map(this, [], f);
-
-  Collection<File> filter(bool f(File element)) =>
-     _Collections.filter(this, <File>[], f);
-
-  bool every(bool f(File element)) => _Collections.every(this, f);
-
-  bool some(bool f(File element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<File>:
-
-  void sort([Comparator<File> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(File element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(File element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  File get last => this[length - 1];
-
-  File removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<File> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [File initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<File> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <File>[]);
-
-  // -- end List<File> mixins.
-
-  File item(int index) native "FileList_item_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName FileReader
-abstract class FileReader implements EventTarget {
+class FileReader extends EventTarget {
 
   factory FileReader() => _FileReaderFactoryProvider.createFileReader();
+  FileReader.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  FileReaderEvents get on;
+  FileReaderEvents get on =>
+    new FileReaderEvents(this);
 
   static const int DONE = 2;
 
@@ -15025,81 +10841,40 @@
 
   static const int LOADING = 1;
 
+
   /** @domName FileReader.error */
-  FileError get error;
-
-  /** @domName FileReader.readyState */
-  int get readyState;
-
-  /** @domName FileReader.result */
-  Object get result;
-
-  /** @domName FileReader.abort */
-  void abort();
-
-  /** @domName FileReader.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName FileReader.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName FileReader.readAsArrayBuffer */
-  void readAsArrayBuffer(Blob blob);
-
-  /** @domName FileReader.readAsBinaryString */
-  void readAsBinaryString(Blob blob);
-
-  /** @domName FileReader.readAsDataURL */
-  void readAsDataURL(Blob blob);
-
-  /** @domName FileReader.readAsText */
-  void readAsText(Blob blob, [String encoding]);
-
-  /** @domName FileReader.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class FileReaderEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get error;
-
-  EventListenerList get load;
-
-  EventListenerList get loadEnd;
-
-  EventListenerList get loadStart;
-
-  EventListenerList get progress;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _FileReaderImpl extends _EventTargetImpl implements FileReader {
-
-  _FileReaderEventsImpl get on =>
-    new _FileReaderEventsImpl(this);
-
   FileError get error native "FileReader_error_Getter";
 
+
+  /** @domName FileReader.readyState */
   int get readyState native "FileReader_readyState_Getter";
 
+
+  /** @domName FileReader.result */
   Object get result native "FileReader_result_Getter";
 
+
+  /** @domName FileReader.abort */
   void abort() native "FileReader_abort_Callback";
 
+
+  /** @domName FileReader.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_addEventListener_Callback";
 
+
+  /** @domName FileReader.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "FileReader_dispatchEvent_Callback";
 
+
+  /** @domName FileReader.readAsArrayBuffer */
   void readAsArrayBuffer(Blob blob) native "FileReader_readAsArrayBuffer_Callback";
 
+
+  /** @domName FileReader.readAsBinaryString */
   void readAsBinaryString(Blob blob) native "FileReader_readAsBinaryString_Callback";
 
+
+  /** @domName FileReader.readAsDataURL */
   void readAsDataURL(Blob blob) native "FileReader_readAsDataURL_Callback";
 
   void readAsText(/*Blob*/ blob, [/*DOMString*/ encoding]) {
@@ -15110,16 +10885,22 @@
     _readAsText_2(blob);
   }
 
+
+  /** @domName FileReader.readAsText_1 */
   void _readAsText_1(blob, encoding) native "FileReader_readAsText_1_Callback";
 
+
+  /** @domName FileReader.readAsText_2 */
   void _readAsText_2(blob) native "FileReader_readAsText_2_Callback";
 
+
+  /** @domName FileReader.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_removeEventListener_Callback";
 
 }
 
-class _FileReaderEventsImpl extends _EventsImpl implements FileReaderEvents {
-  _FileReaderEventsImpl(_ptr) : super(_ptr);
+class FileReaderEvents extends Events {
+  FileReaderEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get abort => this['abort'];
 
@@ -15140,34 +10921,21 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName FileReaderSync
-abstract class FileReaderSync {
+class FileReaderSync extends NativeFieldWrapperClass1 {
 
   factory FileReaderSync() => _FileReaderSyncFactoryProvider.createFileReaderSync();
+  FileReaderSync.internal();
+
 
   /** @domName FileReaderSync.readAsArrayBuffer */
-  ArrayBuffer readAsArrayBuffer(Blob blob);
-
-  /** @domName FileReaderSync.readAsBinaryString */
-  String readAsBinaryString(Blob blob);
-
-  /** @domName FileReaderSync.readAsDataURL */
-  String readAsDataURL(Blob blob);
-
-  /** @domName FileReaderSync.readAsText */
-  String readAsText(Blob blob, [String encoding]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _FileReaderSyncImpl extends NativeFieldWrapperClass1 implements FileReaderSync {
-
   ArrayBuffer readAsArrayBuffer(Blob blob) native "FileReaderSync_readAsArrayBuffer_Callback";
 
+
+  /** @domName FileReaderSync.readAsBinaryString */
   String readAsBinaryString(Blob blob) native "FileReaderSync_readAsBinaryString_Callback";
 
+
+  /** @domName FileReaderSync.readAsDataURL */
   String readAsDataURL(Blob blob) native "FileReaderSync_readAsDataURL_Callback";
 
   String readAsText(/*Blob*/ blob, [/*DOMString*/ encoding]) {
@@ -15177,8 +10945,12 @@
     return _readAsText_2(blob);
   }
 
+
+  /** @domName FileReaderSync.readAsText_1 */
   String _readAsText_1(blob, encoding) native "FileReaderSync_readAsText_1_Callback";
 
+
+  /** @domName FileReaderSync.readAsText_2 */
   String _readAsText_2(blob) native "FileReaderSync_readAsText_2_Callback";
 
 }
@@ -15197,12 +10969,14 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName FileWriter
-abstract class FileWriter implements EventTarget {
+class FileWriter extends EventTarget {
+  FileWriter.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  FileWriterEvents get on;
+  FileWriterEvents get on =>
+    new FileWriterEvents(this);
 
   static const int DONE = 2;
 
@@ -15210,99 +10984,54 @@
 
   static const int WRITING = 1;
 
+
   /** @domName FileWriter.error */
-  FileError get error;
-
-  /** @domName FileWriter.length */
-  int get length;
-
-  /** @domName FileWriter.position */
-  int get position;
-
-  /** @domName FileWriter.readyState */
-  int get readyState;
-
-  /** @domName FileWriter.abort */
-  void abort();
-
-  /** @domName FileWriter.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName FileWriter.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName FileWriter.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName FileWriter.seek */
-  void seek(int position);
-
-  /** @domName FileWriter.truncate */
-  void truncate(int size);
-
-  /** @domName FileWriter.write */
-  void write(Blob data);
-}
-
-abstract class FileWriterEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get error;
-
-  EventListenerList get progress;
-
-  EventListenerList get write;
-
-  EventListenerList get writeEnd;
-
-  EventListenerList get writeStart;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-typedef void FileWriterCallback(FileWriter fileWriter);
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _FileWriterImpl extends _EventTargetImpl implements FileWriter {
-
-  _FileWriterEventsImpl get on =>
-    new _FileWriterEventsImpl(this);
-
   FileError get error native "FileWriter_error_Getter";
 
+
+  /** @domName FileWriter.length */
   int get length native "FileWriter_length_Getter";
 
+
+  /** @domName FileWriter.position */
   int get position native "FileWriter_position_Getter";
 
+
+  /** @domName FileWriter.readyState */
   int get readyState native "FileWriter_readyState_Getter";
 
+
+  /** @domName FileWriter.abort */
   void abort() native "FileWriter_abort_Callback";
 
+
+  /** @domName FileWriter.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_addEventListener_Callback";
 
+
+  /** @domName FileWriter.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "FileWriter_dispatchEvent_Callback";
 
+
+  /** @domName FileWriter.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_removeEventListener_Callback";
 
+
+  /** @domName FileWriter.seek */
   void seek(int position) native "FileWriter_seek_Callback";
 
+
+  /** @domName FileWriter.truncate */
   void truncate(int size) native "FileWriter_truncate_Callback";
 
+
+  /** @domName FileWriter.write */
   void write(Blob data) native "FileWriter_write_Callback";
 
 }
 
-class _FileWriterEventsImpl extends _EventsImpl implements FileWriterEvents {
-  _FileWriterEventsImpl(_ptr) : super(_ptr);
+class FileWriterEvents extends Events {
+  FileWriterEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get abort => this['abort'];
 
@@ -15322,40 +11051,36 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName FileWriterSync
-abstract class FileWriterSync {
 
-  /** @domName FileWriterSync.length */
-  int get length;
-
-  /** @domName FileWriterSync.position */
-  int get position;
-
-  /** @domName FileWriterSync.seek */
-  void seek(int position);
-
-  /** @domName FileWriterSync.truncate */
-  void truncate(int size);
-
-  /** @domName FileWriterSync.write */
-  void write(Blob data);
-}
+typedef void FileWriterCallback(FileWriter fileWriter);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 // WARNING: Do not edit - generated code.
 
-class _FileWriterSyncImpl extends NativeFieldWrapperClass1 implements FileWriterSync {
+/// @domName FileWriterSync
+class FileWriterSync extends NativeFieldWrapperClass1 {
+  FileWriterSync.internal();
 
+
+  /** @domName FileWriterSync.length */
   int get length native "FileWriterSync_length_Getter";
 
+
+  /** @domName FileWriterSync.position */
   int get position native "FileWriterSync_position_Getter";
 
+
+  /** @domName FileWriterSync.seek */
   void seek(int position) native "FileWriterSync_seek_Callback";
 
+
+  /** @domName FileWriterSync.truncate */
   void truncate(int size) native "FileWriterSync_truncate_Callback";
 
+
+  /** @domName FileWriterSync.write */
   void write(Blob data) native "FileWriterSync_write_Callback";
 
 }
@@ -15366,7 +11091,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Float32Array
-abstract class Float32Array implements ArrayBufferView, List<num> {
+class Float32Array extends ArrayBufferView implements List<num> {
 
   factory Float32Array(int length) =>
     _TypedArrayFactoryProvider.createFloat32Array(length);
@@ -15376,30 +11101,20 @@
 
   factory Float32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createFloat32Array_fromBuffer(buffer, byteOffset, length);
+  Float32Array.internal(): super.internal();
 
   static const int BYTES_PER_ELEMENT = 4;
 
+
   /** @domName Float32Array.length */
-  int get length;
-
-  /** @domName Float32Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Float32Array.subarray */
-  Float32Array subarray(int start, [int end]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _Float32ArrayImpl extends _ArrayBufferViewImpl implements Float32Array {
-
   int get length native "Float32Array_length_Getter";
 
+
+  /** @domName Float32Array.numericIndexGetter */
   num operator[](int index) native "Float32Array_numericIndexGetter_Callback";
 
+
+  /** @domName Float32Array.numericIndexSetter */
   void operator[]=(int index, num value) native "Float32Array_numericIndexSetter_Callback";
   // -- start List<num> mixins.
   // num is the element type.
@@ -15479,6 +11194,8 @@
 
   // -- end List<num> mixins.
 
+
+  /** @domName Float32Array.setElements */
   void setElements(Object array, [int offset]) native "Float32Array_setElements_Callback";
 
   Float32Array subarray(/*long*/ start, [/*long*/ end]) {
@@ -15488,8 +11205,12 @@
     return _subarray_2(start);
   }
 
+
+  /** @domName Float32Array.subarray_1 */
   Float32Array _subarray_1(start, end) native "Float32Array_subarray_1_Callback";
 
+
+  /** @domName Float32Array.subarray_2 */
   Float32Array _subarray_2(start) native "Float32Array_subarray_2_Callback";
 
 }
@@ -15500,7 +11221,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Float64Array
-abstract class Float64Array implements ArrayBufferView, List<num> {
+class Float64Array extends ArrayBufferView implements List<num> {
 
   factory Float64Array(int length) =>
     _TypedArrayFactoryProvider.createFloat64Array(length);
@@ -15510,30 +11231,20 @@
 
   factory Float64Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createFloat64Array_fromBuffer(buffer, byteOffset, length);
+  Float64Array.internal(): super.internal();
 
   static const int BYTES_PER_ELEMENT = 8;
 
+
   /** @domName Float64Array.length */
-  int get length;
-
-  /** @domName Float64Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Float64Array.subarray */
-  Float64Array subarray(int start, [int end]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _Float64ArrayImpl extends _ArrayBufferViewImpl implements Float64Array {
-
   int get length native "Float64Array_length_Getter";
 
+
+  /** @domName Float64Array.numericIndexGetter */
   num operator[](int index) native "Float64Array_numericIndexGetter_Callback";
 
+
+  /** @domName Float64Array.numericIndexSetter */
   void operator[]=(int index, num value) native "Float64Array_numericIndexSetter_Callback";
   // -- start List<num> mixins.
   // num is the element type.
@@ -15613,6 +11324,8 @@
 
   // -- end List<num> mixins.
 
+
+  /** @domName Float64Array.setElements */
   void setElements(Object array, [int offset]) native "Float64Array_setElements_Callback";
 
   Float64Array subarray(/*long*/ start, [/*long*/ end]) {
@@ -15622,8 +11335,12 @@
     return _subarray_2(start);
   }
 
+
+  /** @domName Float64Array.subarray_1 */
   Float64Array _subarray_1(start, end) native "Float64Array_subarray_1_Callback";
 
+
+  /** @domName Float64Array.subarray_2 */
   Float64Array _subarray_2(start) native "Float64Array_subarray_2_Callback";
 
 }
@@ -15634,35 +11351,31 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLFontElement
-abstract class FontElement implements Element {
+class FontElement extends _Element_Merged {
+  FontElement.internal(): super.internal();
+
 
   /** @domName HTMLFontElement.color */
-  String color;
-
-  /** @domName HTMLFontElement.face */
-  String face;
-
-  /** @domName HTMLFontElement.size */
-  String size;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _FontElementImpl extends _ElementImpl_Merged implements FontElement {
-
   String get color native "HTMLFontElement_color_Getter";
 
+
+  /** @domName HTMLFontElement.color */
   void set color(String value) native "HTMLFontElement_color_Setter";
 
+
+  /** @domName HTMLFontElement.face */
   String get face native "HTMLFontElement_face_Getter";
 
+
+  /** @domName HTMLFontElement.face */
   void set face(String value) native "HTMLFontElement_face_Setter";
 
+
+  /** @domName HTMLFontElement.size */
   String get size native "HTMLFontElement_size_Getter";
 
+
+  /** @domName HTMLFontElement.size */
   void set size(String value) native "HTMLFontElement_size_Setter";
 
 }
@@ -15673,7 +11386,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName FormData
-abstract class FormData {
+class FormData extends NativeFieldWrapperClass1 {
 
   factory FormData([FormElement form]) {
     if (!?form) {
@@ -15681,18 +11394,10 @@
     }
     return _FormDataFactoryProvider.createFormData(form);
   }
+  FormData.internal();
 
-  /** @domName FormData.append */
-  void append(String name, String value, String filename);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-class _FormDataImpl extends NativeFieldWrapperClass1 implements FormData {
-
+  /** @domName DOMFormData.append */
   void append(String name, String value, String filename) native "DOMFormData_append_Callback";
 
 }
@@ -15703,99 +11408,97 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLFormElement
-abstract class FormElement implements Element {
+class FormElement extends _Element_Merged {
 
   factory FormElement() => _Elements.createFormElement();
+  FormElement.internal(): super.internal();
+
 
   /** @domName HTMLFormElement.acceptCharset */
-  String acceptCharset;
-
-  /** @domName HTMLFormElement.action */
-  String action;
-
-  /** @domName HTMLFormElement.autocomplete */
-  String autocomplete;
-
-  /** @domName HTMLFormElement.encoding */
-  String encoding;
-
-  /** @domName HTMLFormElement.enctype */
-  String enctype;
-
-  /** @domName HTMLFormElement.length */
-  int get length;
-
-  /** @domName HTMLFormElement.method */
-  String method;
-
-  /** @domName HTMLFormElement.name */
-  String name;
-
-  /** @domName HTMLFormElement.noValidate */
-  bool noValidate;
-
-  /** @domName HTMLFormElement.target */
-  String target;
-
-  /** @domName HTMLFormElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLFormElement.reset */
-  void reset();
-
-  /** @domName HTMLFormElement.submit */
-  void submit();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _FormElementImpl extends _ElementImpl_Merged implements FormElement {
-
   String get acceptCharset native "HTMLFormElement_acceptCharset_Getter";
 
+
+  /** @domName HTMLFormElement.acceptCharset */
   void set acceptCharset(String value) native "HTMLFormElement_acceptCharset_Setter";
 
+
+  /** @domName HTMLFormElement.action */
   String get action native "HTMLFormElement_action_Getter";
 
+
+  /** @domName HTMLFormElement.action */
   void set action(String value) native "HTMLFormElement_action_Setter";
 
+
+  /** @domName HTMLFormElement.autocomplete */
   String get autocomplete native "HTMLFormElement_autocomplete_Getter";
 
+
+  /** @domName HTMLFormElement.autocomplete */
   void set autocomplete(String value) native "HTMLFormElement_autocomplete_Setter";
 
+
+  /** @domName HTMLFormElement.encoding */
   String get encoding native "HTMLFormElement_encoding_Getter";
 
+
+  /** @domName HTMLFormElement.encoding */
   void set encoding(String value) native "HTMLFormElement_encoding_Setter";
 
+
+  /** @domName HTMLFormElement.enctype */
   String get enctype native "HTMLFormElement_enctype_Getter";
 
+
+  /** @domName HTMLFormElement.enctype */
   void set enctype(String value) native "HTMLFormElement_enctype_Setter";
 
+
+  /** @domName HTMLFormElement.length */
   int get length native "HTMLFormElement_length_Getter";
 
+
+  /** @domName HTMLFormElement.method */
   String get method native "HTMLFormElement_method_Getter";
 
+
+  /** @domName HTMLFormElement.method */
   void set method(String value) native "HTMLFormElement_method_Setter";
 
+
+  /** @domName HTMLFormElement.name */
   String get name native "HTMLFormElement_name_Getter";
 
+
+  /** @domName HTMLFormElement.name */
   void set name(String value) native "HTMLFormElement_name_Setter";
 
+
+  /** @domName HTMLFormElement.noValidate */
   bool get noValidate native "HTMLFormElement_noValidate_Getter";
 
+
+  /** @domName HTMLFormElement.noValidate */
   void set noValidate(bool value) native "HTMLFormElement_noValidate_Setter";
 
+
+  /** @domName HTMLFormElement.target */
   String get target native "HTMLFormElement_target_Getter";
 
+
+  /** @domName HTMLFormElement.target */
   void set target(String value) native "HTMLFormElement_target_Setter";
 
+
+  /** @domName HTMLFormElement.checkValidity */
   bool checkValidity() native "HTMLFormElement_checkValidity_Callback";
 
+
+  /** @domName HTMLFormElement.reset */
   void reset() native "HTMLFormElement_reset_Callback";
 
+
+  /** @domName HTMLFormElement.submit */
   void submit() native "HTMLFormElement_submit_Callback";
 
 }
@@ -15806,92 +11509,91 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLFrameElement
-abstract class FrameElement implements Element {
+class FrameElement extends _Element_Merged {
+  FrameElement.internal(): super.internal();
+
 
   /** @domName HTMLFrameElement.contentWindow */
-  Window get contentWindow;
-
-  /** @domName HTMLFrameElement.frameBorder */
-  String frameBorder;
-
-  /** @domName HTMLFrameElement.height */
-  int get height;
-
-  /** @domName HTMLFrameElement.location */
-  String location;
-
-  /** @domName HTMLFrameElement.longDesc */
-  String longDesc;
-
-  /** @domName HTMLFrameElement.marginHeight */
-  String marginHeight;
-
-  /** @domName HTMLFrameElement.marginWidth */
-  String marginWidth;
-
-  /** @domName HTMLFrameElement.name */
-  String name;
-
-  /** @domName HTMLFrameElement.noResize */
-  bool noResize;
-
-  /** @domName HTMLFrameElement.scrolling */
-  String scrolling;
-
-  /** @domName HTMLFrameElement.src */
-  String src;
-
-  /** @domName HTMLFrameElement.width */
-  int get width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _FrameElementImpl extends _ElementImpl_Merged implements FrameElement {
-
   Window get contentWindow native "HTMLFrameElement_contentWindow_Getter";
 
+
+  /** @domName HTMLFrameElement.frameBorder */
   String get frameBorder native "HTMLFrameElement_frameBorder_Getter";
 
+
+  /** @domName HTMLFrameElement.frameBorder */
   void set frameBorder(String value) native "HTMLFrameElement_frameBorder_Setter";
 
+
+  /** @domName HTMLFrameElement.height */
   int get height native "HTMLFrameElement_height_Getter";
 
+
+  /** @domName HTMLFrameElement.location */
   String get location native "HTMLFrameElement_location_Getter";
 
+
+  /** @domName HTMLFrameElement.location */
   void set location(String value) native "HTMLFrameElement_location_Setter";
 
+
+  /** @domName HTMLFrameElement.longDesc */
   String get longDesc native "HTMLFrameElement_longDesc_Getter";
 
+
+  /** @domName HTMLFrameElement.longDesc */
   void set longDesc(String value) native "HTMLFrameElement_longDesc_Setter";
 
+
+  /** @domName HTMLFrameElement.marginHeight */
   String get marginHeight native "HTMLFrameElement_marginHeight_Getter";
 
+
+  /** @domName HTMLFrameElement.marginHeight */
   void set marginHeight(String value) native "HTMLFrameElement_marginHeight_Setter";
 
+
+  /** @domName HTMLFrameElement.marginWidth */
   String get marginWidth native "HTMLFrameElement_marginWidth_Getter";
 
+
+  /** @domName HTMLFrameElement.marginWidth */
   void set marginWidth(String value) native "HTMLFrameElement_marginWidth_Setter";
 
+
+  /** @domName HTMLFrameElement.name */
   String get name native "HTMLFrameElement_name_Getter";
 
+
+  /** @domName HTMLFrameElement.name */
   void set name(String value) native "HTMLFrameElement_name_Setter";
 
+
+  /** @domName HTMLFrameElement.noResize */
   bool get noResize native "HTMLFrameElement_noResize_Getter";
 
+
+  /** @domName HTMLFrameElement.noResize */
   void set noResize(bool value) native "HTMLFrameElement_noResize_Setter";
 
+
+  /** @domName HTMLFrameElement.scrolling */
   String get scrolling native "HTMLFrameElement_scrolling_Getter";
 
+
+  /** @domName HTMLFrameElement.scrolling */
   void set scrolling(String value) native "HTMLFrameElement_scrolling_Setter";
 
+
+  /** @domName HTMLFrameElement.src */
   String get src native "HTMLFrameElement_src_Getter";
 
+
+  /** @domName HTMLFrameElement.src */
   void set src(String value) native "HTMLFrameElement_src_Setter";
 
+
+  /** @domName HTMLFrameElement.width */
   int get width native "HTMLFrameElement_width_Getter";
 
 }
@@ -15902,71 +11604,35 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLFrameSetElement
-abstract class FrameSetElement implements Element {
+class FrameSetElement extends _Element_Merged {
+  FrameSetElement.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  FrameSetElementEvents get on;
+  FrameSetElementEvents get on =>
+    new FrameSetElementEvents(this);
+
 
   /** @domName HTMLFrameSetElement.cols */
-  String cols;
-
-  /** @domName HTMLFrameSetElement.rows */
-  String rows;
-}
-
-abstract class FrameSetElementEvents implements ElementEvents {
-
-  EventListenerList get beforeUnload;
-
-  EventListenerList get blur;
-
-  EventListenerList get error;
-
-  EventListenerList get focus;
-
-  EventListenerList get hashChange;
-
-  EventListenerList get load;
-
-  EventListenerList get message;
-
-  EventListenerList get offline;
-
-  EventListenerList get online;
-
-  EventListenerList get popState;
-
-  EventListenerList get resize;
-
-  EventListenerList get storage;
-
-  EventListenerList get unload;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _FrameSetElementImpl extends _ElementImpl_Merged implements FrameSetElement {
-
-  _FrameSetElementEventsImpl get on =>
-    new _FrameSetElementEventsImpl(this);
-
   String get cols native "HTMLFrameSetElement_cols_Getter";
 
+
+  /** @domName HTMLFrameSetElement.cols */
   void set cols(String value) native "HTMLFrameSetElement_cols_Setter";
 
+
+  /** @domName HTMLFrameSetElement.rows */
   String get rows native "HTMLFrameSetElement_rows_Getter";
 
+
+  /** @domName HTMLFrameSetElement.rows */
   void set rows(String value) native "HTMLFrameSetElement_rows_Setter";
 
 }
 
-class _FrameSetElementEventsImpl extends _ElementEventsImpl implements FrameSetElementEvents {
-  _FrameSetElementEventsImpl(_ptr) : super(_ptr);
+class FrameSetElementEvents extends ElementEvents {
+  FrameSetElementEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get beforeUnload => this['beforeunload'];
 
@@ -16001,19 +11667,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName GainNode
-abstract class GainNode implements AudioNode {
+class GainNode extends AudioNode {
+  GainNode.internal(): super.internal();
+
 
   /** @domName GainNode.gain */
-  AudioGain get gain;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _GainNodeImpl extends _AudioNodeImpl implements GainNode {
-
   AudioGain get gain native "GainNode_gain_Getter";
 
 }
@@ -16024,39 +11682,27 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Gamepad
-abstract class Gamepad {
+class Gamepad extends NativeFieldWrapperClass1 {
+  Gamepad.internal();
+
 
   /** @domName Gamepad.axes */
-  List<num> get axes;
-
-  /** @domName Gamepad.buttons */
-  List<num> get buttons;
-
-  /** @domName Gamepad.id */
-  String get id;
-
-  /** @domName Gamepad.index */
-  int get index;
-
-  /** @domName Gamepad.timestamp */
-  int get timestamp;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _GamepadImpl extends NativeFieldWrapperClass1 implements Gamepad {
-
   List<num> get axes native "Gamepad_axes_Getter";
 
+
+  /** @domName Gamepad.buttons */
   List<num> get buttons native "Gamepad_buttons_Getter";
 
+
+  /** @domName Gamepad.id */
   String get id native "Gamepad_id_Getter";
 
+
+  /** @domName Gamepad.index */
   int get index native "Gamepad_index_Getter";
 
+
+  /** @domName Gamepad.timestamp */
   int get timestamp native "Gamepad_timestamp_Getter";
 
 }
@@ -16066,126 +11712,20 @@
 
 // WARNING: Do not edit - generated code.
 
-class _GamepadListImpl extends NativeFieldWrapperClass1 implements List<Gamepad> {
-
-  int get length native "GamepadList_length_Getter";
-
-  Gamepad operator[](int index) native "GamepadList_item_Callback";
-
-  void operator[]=(int index, Gamepad value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<Gamepad> mixins.
-  // Gamepad is the element type.
-
-  // From Iterable<Gamepad>:
-
-  Iterator<Gamepad> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<Gamepad>(this);
-  }
-
-  // From Collection<Gamepad>:
-
-  void add(Gamepad value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(Gamepad value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<Gamepad> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(Gamepad element) => _Collections.contains(this, element);
-
-  void forEach(void f(Gamepad element)) => _Collections.forEach(this, f);
-
-  Collection map(f(Gamepad element)) => _Collections.map(this, [], f);
-
-  Collection<Gamepad> filter(bool f(Gamepad element)) =>
-     _Collections.filter(this, <Gamepad>[], f);
-
-  bool every(bool f(Gamepad element)) => _Collections.every(this, f);
-
-  bool some(bool f(Gamepad element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<Gamepad>:
-
-  void sort([Comparator<Gamepad> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(Gamepad element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(Gamepad element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  Gamepad get last => this[length - 1];
-
-  Gamepad removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<Gamepad> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [Gamepad initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<Gamepad> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <Gamepad>[]);
-
-  // -- end List<Gamepad> mixins.
-
-  Gamepad item(int index) native "GamepadList_item_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName Geolocation
-abstract class Geolocation {
+class Geolocation extends NativeFieldWrapperClass1 {
+  Geolocation.internal();
+
 
   /** @domName Geolocation.clearWatch */
-  void clearWatch(int watchId);
-
-  /** @domName Geolocation.getCurrentPosition */
-  void getCurrentPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]);
-
-  /** @domName Geolocation.watchPosition */
-  int watchPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _GeolocationImpl extends NativeFieldWrapperClass1 implements Geolocation {
-
   void clearWatch(int watchId) native "Geolocation_clearWatch_Callback";
 
+
+  /** @domName Geolocation.getCurrentPosition */
   void getCurrentPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native "Geolocation_getCurrentPosition_Callback";
 
+
+  /** @domName Geolocation.watchPosition */
   int watchPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native "Geolocation_watchPosition_Callback";
 
 }
@@ -16196,24 +11736,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Geoposition
-abstract class Geoposition {
+class Geoposition extends NativeFieldWrapperClass1 {
+  Geoposition.internal();
+
 
   /** @domName Geoposition.coords */
-  Coordinates get coords;
-
-  /** @domName Geoposition.timestamp */
-  int get timestamp;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _GeopositionImpl extends NativeFieldWrapperClass1 implements Geoposition {
-
   Coordinates get coords native "Geoposition_coords_Getter";
 
+
+  /** @domName Geoposition.timestamp */
   int get timestamp native "Geoposition_timestamp_Getter";
 
 }
@@ -16224,44 +11755,41 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLHRElement
-abstract class HRElement implements Element {
+class HRElement extends _Element_Merged {
 
   factory HRElement() => _Elements.createHRElement();
+  HRElement.internal(): super.internal();
+
 
   /** @domName HTMLHRElement.align */
-  String align;
-
-  /** @domName HTMLHRElement.noShade */
-  bool noShade;
-
-  /** @domName HTMLHRElement.size */
-  String size;
-
-  /** @domName HTMLHRElement.width */
-  String width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _HRElementImpl extends _ElementImpl_Merged implements HRElement {
-
   String get align native "HTMLHRElement_align_Getter";
 
+
+  /** @domName HTMLHRElement.align */
   void set align(String value) native "HTMLHRElement_align_Setter";
 
+
+  /** @domName HTMLHRElement.noShade */
   bool get noShade native "HTMLHRElement_noShade_Getter";
 
+
+  /** @domName HTMLHRElement.noShade */
   void set noShade(bool value) native "HTMLHRElement_noShade_Setter";
 
+
+  /** @domName HTMLHRElement.size */
   String get size native "HTMLHRElement_size_Getter";
 
+
+  /** @domName HTMLHRElement.size */
   void set size(String value) native "HTMLHRElement_size_Setter";
 
+
+  /** @domName HTMLHRElement.width */
   String get width native "HTMLHRElement_width_Getter";
 
+
+  /** @domName HTMLHRElement.width */
   void set width(String value) native "HTMLHRElement_width_Setter";
 
 }
@@ -16272,28 +11800,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLAllCollection
-abstract class HTMLAllCollection implements List<Node> {
+class HTMLAllCollection extends NativeFieldWrapperClass1 implements List<Node> {
+  HTMLAllCollection.internal();
+
 
   /** @domName HTMLAllCollection.length */
-  int get length;
-
-  /** @domName HTMLAllCollection.item */
-  Node item(int index);
-
-  /** @domName HTMLAllCollection.namedItem */
-  Node namedItem(String name);
-
-  /** @domName HTMLAllCollection.tags */
-  List<Node> tags(String name);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _HTMLAllCollectionImpl extends NativeFieldWrapperClass1 implements HTMLAllCollection {
-
   int get length native "HTMLAllCollection_length_Getter";
 
   Node operator[](int index) native "HTMLAllCollection_item_Callback";
@@ -16379,10 +11890,16 @@
 
   // -- end List<Node> mixins.
 
+
+  /** @domName HTMLAllCollection.item */
   Node item(int index) native "HTMLAllCollection_item_Callback";
 
+
+  /** @domName HTMLAllCollection.namedItem */
   Node namedItem(String name) native "HTMLAllCollection_namedItem_Callback";
 
+
+  /** @domName HTMLAllCollection.tags */
   List<Node> tags(String name) native "HTMLAllCollection_tags_Callback";
 
 }
@@ -16393,25 +11910,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLCollection
-abstract class HTMLCollection implements List<Node> {
+class HTMLCollection extends NativeFieldWrapperClass1 implements List<Node> {
+  HTMLCollection.internal();
+
 
   /** @domName HTMLCollection.length */
-  int get length;
-
-  /** @domName HTMLCollection.item */
-  Node item(int index);
-
-  /** @domName HTMLCollection.namedItem */
-  Node namedItem(String name);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _HTMLCollectionImpl extends NativeFieldWrapperClass1 implements HTMLCollection {
-
   int get length native "HTMLCollection_length_Getter";
 
   Node operator[](int index) native "HTMLCollection_item_Callback";
@@ -16497,8 +12000,12 @@
 
   // -- end List<Node> mixins.
 
+
+  /** @domName HTMLCollection.item */
   Node item(int index) native "HTMLCollection_item_Callback";
 
+
+  /** @domName HTMLCollection.namedItem */
   Node namedItem(String name) native "HTMLCollection_namedItem_Callback";
 
 }
@@ -16509,35 +12016,31 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLOptionsCollection
-abstract class HTMLOptionsCollection implements HTMLCollection {
+class HTMLOptionsCollection extends HTMLCollection {
+  HTMLOptionsCollection.internal(): super.internal();
+
 
   /** @domName HTMLOptionsCollection.length */
-  int length;
-
-  /** @domName HTMLOptionsCollection.selectedIndex */
-  int selectedIndex;
-
-  /** @domName HTMLOptionsCollection.remove */
-  void remove(int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _HTMLOptionsCollectionImpl extends _HTMLCollectionImpl implements HTMLOptionsCollection {
-
   int get length native "HTMLOptionsCollection_length_Getter";
 
+
+  /** @domName HTMLOptionsCollection.length */
   void set length(int value) native "HTMLOptionsCollection_length_Setter";
 
+
+  /** @domName HTMLOptionsCollection.selectedIndex */
   int get selectedIndex native "HTMLOptionsCollection_selectedIndex_Getter";
 
+
+  /** @domName HTMLOptionsCollection.selectedIndex */
   void set selectedIndex(int value) native "HTMLOptionsCollection_selectedIndex_Setter";
 
+
+  /** @domName HTMLOptionsCollection.numericIndexSetter */
   void operator[]=(int index, Node value) native "HTMLOptionsCollection_numericIndexSetter_Callback";
 
+
+  /** @domName HTMLOptionsCollection.remove */
   void remove(int index) native "HTMLOptionsCollection_remove_Callback";
 
 }
@@ -16548,29 +12051,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HashChangeEvent
-abstract class HashChangeEvent implements Event {
+class HashChangeEvent extends Event {
+  HashChangeEvent.internal(): super.internal();
+
 
   /** @domName HashChangeEvent.newURL */
-  String get newURL;
-
-  /** @domName HashChangeEvent.oldURL */
-  String get oldURL;
-
-  /** @domName HashChangeEvent.initHashChangeEvent */
-  void initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _HashChangeEventImpl extends _EventImpl implements HashChangeEvent {
-
   String get newURL native "HashChangeEvent_newURL_Getter";
 
+
+  /** @domName HashChangeEvent.oldURL */
   String get oldURL native "HashChangeEvent_oldURL_Getter";
 
+
+  /** @domName HashChangeEvent.initHashChangeEvent */
   void initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) native "HashChangeEvent_initHashChangeEvent_Callback";
 
 }
@@ -16581,23 +12074,17 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLHeadElement
-abstract class HeadElement implements Element {
+class HeadElement extends _Element_Merged {
 
   factory HeadElement() => _Elements.createHeadElement();
+  HeadElement.internal(): super.internal();
+
 
   /** @domName HTMLHeadElement.profile */
-  String profile;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _HeadElementImpl extends _ElementImpl_Merged implements HeadElement {
-
   String get profile native "HTMLHeadElement_profile_Getter";
 
+
+  /** @domName HTMLHeadElement.profile */
   void set profile(String value) native "HTMLHeadElement_profile_Setter";
 
 }
@@ -16608,7 +12095,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLHeadingElement
-abstract class HeadingElement implements Element {
+class HeadingElement extends _Element_Merged {
 
   factory HeadingElement.h1() => _Elements.createHeadingElement_h1();
 
@@ -16621,20 +12108,14 @@
   factory HeadingElement.h5() => _Elements.createHeadingElement_h5();
 
   factory HeadingElement.h6() => _Elements.createHeadingElement_h6();
+  HeadingElement.internal(): super.internal();
+
 
   /** @domName HTMLHeadingElement.align */
-  String align;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _HeadingElementImpl extends _ElementImpl_Merged implements HeadingElement {
-
   String get align native "HTMLHeadingElement_align_Getter";
 
+
+  /** @domName HTMLHeadingElement.align */
   void set align(String value) native "HTMLHeadingElement_align_Setter";
 
 }
@@ -16645,40 +12126,32 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLHtmlElement
-abstract class HtmlElement implements Element {
+class HtmlElement extends _Element_Merged {
 
   factory HtmlElement() => _Elements.createHtmlElement();
+  HtmlElement.internal(): super.internal();
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-class _HtmlElementImpl extends _ElementImpl_Merged implements HtmlElement {
-
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName XMLHttpRequest
-abstract class HttpRequest implements EventTarget {
+class HttpRequest extends EventTarget {
   factory HttpRequest.get(String url, onSuccess(HttpRequest request)) =>
       _HttpRequestFactoryProvider.createHttpRequest_get(url, onSuccess);
 
   factory HttpRequest.getWithCredentials(String url, onSuccess(HttpRequest request)) =>
-      _HttpRequestFactoryProvider.createHttpRequest_getWithCredentials(url, onSuccess);
+      _HttpRequestFactoryProvider.createHttpRequestgetWithCredentials(url, onSuccess);
+
 
   factory HttpRequest() => _HttpRequestFactoryProvider.createHttpRequest();
+  HttpRequest.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  HttpRequestEvents get on;
+  HttpRequestEvents get on =>
+    new HttpRequestEvents(this);
 
   static const int DONE = 4;
 
@@ -16690,179 +12163,94 @@
 
   static const int UNSENT = 0;
 
+
   /** @domName XMLHttpRequest.readyState */
-  int get readyState;
-
-  /** @domName XMLHttpRequest.response */
-  Object get response;
-
-  /** @domName XMLHttpRequest.responseText */
-  String get responseText;
-
-  /** @domName XMLHttpRequest.responseType */
-  String responseType;
-
-  /** @domName XMLHttpRequest.responseXML */
-  Document get responseXML;
-
-  /** @domName XMLHttpRequest.status */
-  int get status;
-
-  /** @domName XMLHttpRequest.statusText */
-  String get statusText;
-
-  /** @domName XMLHttpRequest.upload */
-  HttpRequestUpload get upload;
-
-  /** @domName XMLHttpRequest.withCredentials */
-  bool withCredentials;
-
-  /** @domName XMLHttpRequest.abort */
-  void abort();
-
-  /** @domName XMLHttpRequest.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName XMLHttpRequest.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName XMLHttpRequest.getAllResponseHeaders */
-  String getAllResponseHeaders();
-
-  /** @domName XMLHttpRequest.getResponseHeader */
-  String getResponseHeader(String header);
-
-  /** @domName XMLHttpRequest.open */
-  void open(String method, String url, [bool async, String user, String password]);
-
-  /** @domName XMLHttpRequest.overrideMimeType */
-  void overrideMimeType(String override);
-
-  /** @domName XMLHttpRequest.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName XMLHttpRequest.send */
-  void send([data]);
-
-  /** @domName XMLHttpRequest.setRequestHeader */
-  void setRequestHeader(String header, String value);
-}
-
-abstract class HttpRequestEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get error;
-
-  EventListenerList get load;
-
-  EventListenerList get loadEnd;
-
-  EventListenerList get loadStart;
-
-  EventListenerList get progress;
-
-  EventListenerList get readyStateChange;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XMLHttpRequestException
-abstract class HttpRequestException {
-
-  static const int ABORT_ERR = 102;
-
-  static const int NETWORK_ERR = 101;
-
-  /** @domName XMLHttpRequestException.code */
-  int get code;
-
-  /** @domName XMLHttpRequestException.message */
-  String get message;
-
-  /** @domName XMLHttpRequestException.name */
-  String get name;
-
-  /** @domName XMLHttpRequestException.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _HttpRequestExceptionImpl extends NativeFieldWrapperClass1 implements HttpRequestException {
-
-  int get code native "XMLHttpRequestException_code_Getter";
-
-  String get message native "XMLHttpRequestException_message_Getter";
-
-  String get name native "XMLHttpRequestException_name_Getter";
-
-  String toString() native "XMLHttpRequestException_toString_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _HttpRequestImpl extends _EventTargetImpl implements HttpRequest {
-
-  _HttpRequestEventsImpl get on =>
-    new _HttpRequestEventsImpl(this);
-
   int get readyState native "XMLHttpRequest_readyState_Getter";
 
+
+  /** @domName XMLHttpRequest.response */
   Object get response native "XMLHttpRequest_response_Getter";
 
+
+  /** @domName XMLHttpRequest.responseText */
   String get responseText native "XMLHttpRequest_responseText_Getter";
 
+
+  /** @domName XMLHttpRequest.responseType */
   String get responseType native "XMLHttpRequest_responseType_Getter";
 
+
+  /** @domName XMLHttpRequest.responseType */
   void set responseType(String value) native "XMLHttpRequest_responseType_Setter";
 
+
+  /** @domName XMLHttpRequest.responseXML */
   Document get responseXML native "XMLHttpRequest_responseXML_Getter";
 
+
+  /** @domName XMLHttpRequest.status */
   int get status native "XMLHttpRequest_status_Getter";
 
+
+  /** @domName XMLHttpRequest.statusText */
   String get statusText native "XMLHttpRequest_statusText_Getter";
 
+
+  /** @domName XMLHttpRequest.upload */
   HttpRequestUpload get upload native "XMLHttpRequest_upload_Getter";
 
+
+  /** @domName XMLHttpRequest.withCredentials */
   bool get withCredentials native "XMLHttpRequest_withCredentials_Getter";
 
+
+  /** @domName XMLHttpRequest.withCredentials */
   void set withCredentials(bool value) native "XMLHttpRequest_withCredentials_Setter";
 
+
+  /** @domName XMLHttpRequest.abort */
   void abort() native "XMLHttpRequest_abort_Callback";
 
+
+  /** @domName XMLHttpRequest.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_addEventListener_Callback";
 
+
+  /** @domName XMLHttpRequest.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "XMLHttpRequest_dispatchEvent_Callback";
 
+
+  /** @domName XMLHttpRequest.getAllResponseHeaders */
   String getAllResponseHeaders() native "XMLHttpRequest_getAllResponseHeaders_Callback";
 
+
+  /** @domName XMLHttpRequest.getResponseHeader */
   String getResponseHeader(String header) native "XMLHttpRequest_getResponseHeader_Callback";
 
+
+  /** @domName XMLHttpRequest.open */
   void open(String method, String url, [bool async, String user, String password]) native "XMLHttpRequest_open_Callback";
 
+
+  /** @domName XMLHttpRequest.overrideMimeType */
   void overrideMimeType(String override) native "XMLHttpRequest_overrideMimeType_Callback";
 
+
+  /** @domName XMLHttpRequest.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_removeEventListener_Callback";
 
+
+  /** @domName XMLHttpRequest.send */
   void send([data]) native "XMLHttpRequest_send_Callback";
 
+
+  /** @domName XMLHttpRequest.setRequestHeader */
   void setRequestHeader(String header, String value) native "XMLHttpRequest_setRequestHeader_Callback";
 
 }
 
-class _HttpRequestEventsImpl extends _EventsImpl implements HttpRequestEvents {
-  _HttpRequestEventsImpl(_ptr) : super(_ptr);
+class HttpRequestEvents extends Events {
+  HttpRequestEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get abort => this['abort'];
 
@@ -16884,14 +12272,30 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName XMLHttpRequestProgressEvent
-abstract class HttpRequestProgressEvent implements ProgressEvent {
+/// @domName XMLHttpRequestException
+class HttpRequestException extends NativeFieldWrapperClass1 {
+  HttpRequestException.internal();
 
-  /** @domName XMLHttpRequestProgressEvent.position */
-  int get position;
+  static const int ABORT_ERR = 102;
 
-  /** @domName XMLHttpRequestProgressEvent.totalSize */
-  int get totalSize;
+  static const int NETWORK_ERR = 101;
+
+
+  /** @domName XMLHttpRequestException.code */
+  int get code native "XMLHttpRequestException_code_Getter";
+
+
+  /** @domName XMLHttpRequestException.message */
+  String get message native "XMLHttpRequestException_message_Getter";
+
+
+  /** @domName XMLHttpRequestException.name */
+  String get name native "XMLHttpRequestException_name_Getter";
+
+
+  /** @domName XMLHttpRequestException.toString */
+  String toString() native "XMLHttpRequestException_toString_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -16899,10 +12303,16 @@
 
 // WARNING: Do not edit - generated code.
 
-class _HttpRequestProgressEventImpl extends _ProgressEventImpl implements HttpRequestProgressEvent {
+/// @domName XMLHttpRequestProgressEvent
+class HttpRequestProgressEvent extends ProgressEvent {
+  HttpRequestProgressEvent.internal(): super.internal();
 
+
+  /** @domName XMLHttpRequestProgressEvent.position */
   int get position native "XMLHttpRequestProgressEvent_position_Getter";
 
+
+  /** @domName XMLHttpRequestProgressEvent.totalSize */
   int get totalSize native "XMLHttpRequestProgressEvent_totalSize_Getter";
 
 }
@@ -16913,58 +12323,31 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName XMLHttpRequestUpload
-abstract class HttpRequestUpload implements EventTarget {
+class HttpRequestUpload extends EventTarget {
+  HttpRequestUpload.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  HttpRequestUploadEvents get on;
+  HttpRequestUploadEvents get on =>
+    new HttpRequestUploadEvents(this);
+
 
   /** @domName XMLHttpRequestUpload.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName XMLHttpRequestUpload.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName XMLHttpRequestUpload.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class HttpRequestUploadEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get error;
-
-  EventListenerList get load;
-
-  EventListenerList get loadEnd;
-
-  EventListenerList get loadStart;
-
-  EventListenerList get progress;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _HttpRequestUploadImpl extends _EventTargetImpl implements HttpRequestUpload {
-
-  _HttpRequestUploadEventsImpl get on =>
-    new _HttpRequestUploadEventsImpl(this);
-
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestUpload_addEventListener_Callback";
 
+
+  /** @domName XMLHttpRequestUpload.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "XMLHttpRequestUpload_dispatchEvent_Callback";
 
+
+  /** @domName XMLHttpRequestUpload.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestUpload_removeEventListener_Callback";
 
 }
 
-class _HttpRequestUploadEventsImpl extends _EventsImpl implements HttpRequestUploadEvents {
-  _HttpRequestUploadEventsImpl(_ptr) : super(_ptr);
+class HttpRequestUploadEvents extends Events {
+  HttpRequestUploadEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get abort => this['abort'];
 
@@ -16985,15 +12368,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBAny
-abstract class IDBAny {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBAnyImpl extends NativeFieldWrapperClass1 implements IDBAny {
+class IDBAny extends NativeFieldWrapperClass1 {
+  IDBAny.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17003,7 +12379,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBCursor
-abstract class IDBCursor {
+class IDBCursor extends NativeFieldWrapperClass1 {
+  IDBCursor.internal();
 
   static const int NEXT = 0;
 
@@ -17013,46 +12390,24 @@
 
   static const int PREV_NO_DUPLICATE = 3;
 
+
   /** @domName IDBCursor.direction */
-  String get direction;
-
-  /** @domName IDBCursor.key */
-  Object get key;
-
-  /** @domName IDBCursor.primaryKey */
-  Object get primaryKey;
-
-  /** @domName IDBCursor.source */
-  dynamic get source;
-
-  /** @domName IDBCursor.advance */
-  void advance(int count);
-
-  /** @domName IDBCursor.continueFunction */
-  void continueFunction([/*IDBKey*/ key]);
-
-  /** @domName IDBCursor.delete */
-  IDBRequest delete();
-
-  /** @domName IDBCursor.update */
-  IDBRequest update(Object value);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBCursorImpl extends NativeFieldWrapperClass1 implements IDBCursor {
-
   String get direction native "IDBCursor_direction_Getter";
 
+
+  /** @domName IDBCursor.key */
   Object get key native "IDBCursor_key_Getter";
 
+
+  /** @domName IDBCursor.primaryKey */
   Object get primaryKey native "IDBCursor_primaryKey_Getter";
 
+
+  /** @domName IDBCursor.source */
   dynamic get source native "IDBCursor_source_Getter";
 
+
+  /** @domName IDBCursor.advance */
   void advance(int count) native "IDBCursor_advance_Callback";
 
   void continueFunction([/*IDBKey*/ key]) {
@@ -17063,12 +12418,20 @@
     _continue_2();
   }
 
+
+  /** @domName IDBCursor.continue_1 */
   void _continue_1(key) native "IDBCursor_continue_1_Callback";
 
+
+  /** @domName IDBCursor.continue_2 */
   void _continue_2() native "IDBCursor_continue_2_Callback";
 
+
+  /** @domName IDBCursor.delete */
   IDBRequest delete() native "IDBCursor_delete_Callback";
 
+
+  /** @domName IDBCursor.update */
   IDBRequest update(Object value) native "IDBCursor_update_Callback";
 
 }
@@ -17079,19 +12442,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBCursorWithValue
-abstract class IDBCursorWithValue implements IDBCursor {
+class IDBCursorWithValue extends IDBCursor {
+  IDBCursorWithValue.internal(): super.internal();
+
 
   /** @domName IDBCursorWithValue.value */
-  Object get value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBCursorWithValueImpl extends _IDBCursorImpl implements IDBCursorWithValue {
-
   Object get value native "IDBCursorWithValue_value_Getter";
 
 }
@@ -17102,54 +12457,90 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBDatabase
-abstract class IDBDatabase implements EventTarget {
+class IDBDatabase extends EventTarget {
+  IDBDatabase.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  IDBDatabaseEvents get on;
+  IDBDatabaseEvents get on =>
+    new IDBDatabaseEvents(this);
+
 
   /** @domName IDBDatabase.name */
-  String get name;
+  String get name native "IDBDatabase_name_Getter";
+
 
   /** @domName IDBDatabase.objectStoreNames */
-  List<String> get objectStoreNames;
+  List<String> get objectStoreNames native "IDBDatabase_objectStoreNames_Getter";
+
 
   /** @domName IDBDatabase.version */
-  dynamic get version;
+  dynamic get version native "IDBDatabase_version_Getter";
+
 
   /** @domName IDBDatabase.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_addEventListener_Callback";
+
 
   /** @domName IDBDatabase.close */
-  void close();
+  void close() native "IDBDatabase_close_Callback";
+
 
   /** @domName IDBDatabase.createObjectStore */
-  IDBObjectStore createObjectStore(String name, [Map options]);
+  IDBObjectStore createObjectStore(String name, [Map options]) native "IDBDatabase_createObjectStore_Callback";
+
 
   /** @domName IDBDatabase.deleteObjectStore */
-  void deleteObjectStore(String name);
+  void deleteObjectStore(String name) native "IDBDatabase_deleteObjectStore_Callback";
+
 
   /** @domName IDBDatabase.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
+  bool $dom_dispatchEvent(Event evt) native "IDBDatabase_dispatchEvent_Callback";
+
 
   /** @domName IDBDatabase.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_removeEventListener_Callback";
+
 
   /** @domName IDBDatabase.setVersion */
-  IDBVersionChangeRequest setVersion(String version);
+  IDBVersionChangeRequest setVersion(String version) native "IDBDatabase_setVersion_Callback";
 
-  /** @domName IDBDatabase.transaction */
-  IDBTransaction transaction(storeName_OR_storeNames, String mode);
+  IDBTransaction transaction(storeName_OR_storeNames, /*DOMString*/ mode) {
+    if ((storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null) && (mode is String || mode == null)) {
+      return _transaction_1(storeName_OR_storeNames, mode);
+    }
+    if ((storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null) && (mode is String || mode == null)) {
+      return _transaction_2(storeName_OR_storeNames, mode);
+    }
+    if ((storeName_OR_storeNames is String || storeName_OR_storeNames == null) && (mode is String || mode == null)) {
+      return _transaction_3(storeName_OR_storeNames, mode);
+    }
+    throw "Incorrect number or type of arguments";
+  }
+
+
+  /** @domName IDBDatabase.transaction_1 */
+  IDBTransaction _transaction_1(storeName_OR_storeNames, mode) native "IDBDatabase_transaction_1_Callback";
+
+
+  /** @domName IDBDatabase.transaction_2 */
+  IDBTransaction _transaction_2(storeName_OR_storeNames, mode) native "IDBDatabase_transaction_2_Callback";
+
+
+  /** @domName IDBDatabase.transaction_3 */
+  IDBTransaction _transaction_3(storeName_OR_storeNames, mode) native "IDBDatabase_transaction_3_Callback";
+
 }
 
-abstract class IDBDatabaseEvents implements Events {
+class IDBDatabaseEvents extends Events {
+  IDBDatabaseEvents(EventTarget _ptr) : super(_ptr);
 
-  EventListenerList get abort;
+  EventListenerList get abort => this['abort'];
 
-  EventListenerList get error;
+  EventListenerList get error => this['error'];
 
-  EventListenerList get versionChange;
+  EventListenerList get versionChange => this['versionchange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -17158,7 +12549,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBDatabaseException
-abstract class IDBDatabaseException {
+class IDBDatabaseException extends NativeFieldWrapperClass1 {
+  IDBDatabaseException.internal();
 
   static const int ABORT_ERR = 20;
 
@@ -17186,32 +12578,20 @@
 
   static const int VER_ERR = 12;
 
+
   /** @domName IDBDatabaseException.code */
-  int get code;
-
-  /** @domName IDBDatabaseException.message */
-  String get message;
-
-  /** @domName IDBDatabaseException.name */
-  String get name;
-
-  /** @domName IDBDatabaseException.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBDatabaseExceptionImpl extends NativeFieldWrapperClass1 implements IDBDatabaseException {
-
   int get code native "IDBDatabaseException_code_Getter";
 
+
+  /** @domName IDBDatabaseException.message */
   String get message native "IDBDatabaseException_message_Getter";
 
+
+  /** @domName IDBDatabaseException.name */
   String get name native "IDBDatabaseException_name_Getter";
 
+
+  /** @domName IDBDatabaseException.toString */
   String toString() native "IDBDatabaseException_toString_Callback";
 
 }
@@ -17221,92 +12601,16 @@
 
 // WARNING: Do not edit - generated code.
 
-class _IDBDatabaseImpl extends _EventTargetImpl implements IDBDatabase {
-
-  _IDBDatabaseEventsImpl get on =>
-    new _IDBDatabaseEventsImpl(this);
-
-  String get name native "IDBDatabase_name_Getter";
-
-  List<String> get objectStoreNames native "IDBDatabase_objectStoreNames_Getter";
-
-  dynamic get version native "IDBDatabase_version_Getter";
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_addEventListener_Callback";
-
-  void close() native "IDBDatabase_close_Callback";
-
-  IDBObjectStore createObjectStore(String name, [Map options]) native "IDBDatabase_createObjectStore_Callback";
-
-  void deleteObjectStore(String name) native "IDBDatabase_deleteObjectStore_Callback";
-
-  bool $dom_dispatchEvent(Event evt) native "IDBDatabase_dispatchEvent_Callback";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_removeEventListener_Callback";
-
-  IDBVersionChangeRequest setVersion(String version) native "IDBDatabase_setVersion_Callback";
-
-  IDBTransaction transaction(storeName_OR_storeNames, /*DOMString*/ mode) {
-    if ((storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null) && (mode is String || mode == null)) {
-      return _transaction_1(storeName_OR_storeNames, mode);
-    }
-    if ((storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null) && (mode is String || mode == null)) {
-      return _transaction_2(storeName_OR_storeNames, mode);
-    }
-    if ((storeName_OR_storeNames is String || storeName_OR_storeNames == null) && (mode is String || mode == null)) {
-      return _transaction_3(storeName_OR_storeNames, mode);
-    }
-    throw "Incorrect number or type of arguments";
-  }
-
-  IDBTransaction _transaction_1(storeName_OR_storeNames, mode) native "IDBDatabase_transaction_1_Callback";
-
-  IDBTransaction _transaction_2(storeName_OR_storeNames, mode) native "IDBDatabase_transaction_2_Callback";
-
-  IDBTransaction _transaction_3(storeName_OR_storeNames, mode) native "IDBDatabase_transaction_3_Callback";
-
-}
-
-class _IDBDatabaseEventsImpl extends _EventsImpl implements IDBDatabaseEvents {
-  _IDBDatabaseEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get abort => this['abort'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get versionChange => this['versionchange'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName IDBFactory
-abstract class IDBFactory {
+class IDBFactory extends NativeFieldWrapperClass1 {
+  IDBFactory.internal();
+
 
   /** @domName IDBFactory.cmp */
-  int cmp(/*IDBKey*/ first, /*IDBKey*/ second);
-
-  /** @domName IDBFactory.deleteDatabase */
-  IDBVersionChangeRequest deleteDatabase(String name);
-
-  /** @domName IDBFactory.open */
-  IDBOpenDBRequest open(String name, [int version]);
-
-  /** @domName IDBFactory.webkitGetDatabaseNames */
-  IDBRequest webkitGetDatabaseNames();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBFactoryImpl extends NativeFieldWrapperClass1 implements IDBFactory {
-
   int cmp(/*IDBKey*/ first, /*IDBKey*/ second) native "IDBFactory_cmp_Callback";
 
+
+  /** @domName IDBFactory.deleteDatabase */
   IDBVersionChangeRequest deleteDatabase(String name) native "IDBFactory_deleteDatabase_Callback";
 
   IDBOpenDBRequest open(/*DOMString*/ name, [/*long long*/ version]) {
@@ -17316,10 +12620,16 @@
     return _open_2(name);
   }
 
+
+  /** @domName IDBFactory.open_1 */
   IDBOpenDBRequest _open_1(name, version) native "IDBFactory_open_1_Callback";
 
+
+  /** @domName IDBFactory.open_2 */
   IDBOpenDBRequest _open_2(name) native "IDBFactory_open_2_Callback";
 
+
+  /** @domName IDBFactory.webkitGetDatabaseNames */
   IDBRequest webkitGetDatabaseNames() native "IDBFactory_webkitGetDatabaseNames_Callback";
 
 }
@@ -17330,54 +12640,27 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBIndex
-abstract class IDBIndex {
+class IDBIndex extends NativeFieldWrapperClass1 {
+  IDBIndex.internal();
+
 
   /** @domName IDBIndex.keyPath */
-  dynamic get keyPath;
-
-  /** @domName IDBIndex.multiEntry */
-  bool get multiEntry;
-
-  /** @domName IDBIndex.name */
-  String get name;
-
-  /** @domName IDBIndex.objectStore */
-  IDBObjectStore get objectStore;
-
-  /** @domName IDBIndex.unique */
-  bool get unique;
-
-  /** @domName IDBIndex.count */
-  IDBRequest count([key_OR_range]);
-
-  /** @domName IDBIndex.get */
-  IDBRequest get(key);
-
-  /** @domName IDBIndex.getKey */
-  IDBRequest getKey(key);
-
-  /** @domName IDBIndex.openCursor */
-  IDBRequest openCursor([key_OR_range, String direction]);
-
-  /** @domName IDBIndex.openKeyCursor */
-  IDBRequest openKeyCursor([key_OR_range, String direction]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBIndexImpl extends NativeFieldWrapperClass1 implements IDBIndex {
-
   dynamic get keyPath native "IDBIndex_keyPath_Getter";
 
+
+  /** @domName IDBIndex.multiEntry */
   bool get multiEntry native "IDBIndex_multiEntry_Getter";
 
+
+  /** @domName IDBIndex.name */
   String get name native "IDBIndex_name_Getter";
 
+
+  /** @domName IDBIndex.objectStore */
   IDBObjectStore get objectStore native "IDBIndex_objectStore_Getter";
 
+
+  /** @domName IDBIndex.unique */
   bool get unique native "IDBIndex_unique_Getter";
 
   IDBRequest count([key_OR_range]) {
@@ -17391,10 +12674,16 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName IDBIndex.count_1 */
   IDBRequest _count_1() native "IDBIndex_count_1_Callback";
 
+
+  /** @domName IDBIndex.count_2 */
   IDBRequest _count_2(key_OR_range) native "IDBIndex_count_2_Callback";
 
+
+  /** @domName IDBIndex.count_3 */
   IDBRequest _count_3(key_OR_range) native "IDBIndex_count_3_Callback";
 
   IDBRequest get(key) {
@@ -17405,8 +12694,12 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName IDBIndex.get_1 */
   IDBRequest _get_1(key) native "IDBIndex_get_1_Callback";
 
+
+  /** @domName IDBIndex.get_2 */
   IDBRequest _get_2(key) native "IDBIndex_get_2_Callback";
 
   IDBRequest getKey(key) {
@@ -17417,8 +12710,12 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName IDBIndex.getKey_1 */
   IDBRequest _getKey_1(key) native "IDBIndex_getKey_1_Callback";
 
+
+  /** @domName IDBIndex.getKey_2 */
   IDBRequest _getKey_2(key) native "IDBIndex_getKey_2_Callback";
 
   IDBRequest openCursor([key_OR_range, /*DOMString*/ direction]) {
@@ -17440,14 +12737,24 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName IDBIndex.openCursor_1 */
   IDBRequest _openCursor_1() native "IDBIndex_openCursor_1_Callback";
 
+
+  /** @domName IDBIndex.openCursor_2 */
   IDBRequest _openCursor_2(key_OR_range) native "IDBIndex_openCursor_2_Callback";
 
+
+  /** @domName IDBIndex.openCursor_3 */
   IDBRequest _openCursor_3(key_OR_range, direction) native "IDBIndex_openCursor_3_Callback";
 
+
+  /** @domName IDBIndex.openCursor_4 */
   IDBRequest _openCursor_4(key_OR_range) native "IDBIndex_openCursor_4_Callback";
 
+
+  /** @domName IDBIndex.openCursor_5 */
   IDBRequest _openCursor_5(key_OR_range, direction) native "IDBIndex_openCursor_5_Callback";
 
   IDBRequest openKeyCursor([key_OR_range, /*DOMString*/ direction]) {
@@ -17469,14 +12776,24 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName IDBIndex.openKeyCursor_1 */
   IDBRequest _openKeyCursor_1() native "IDBIndex_openKeyCursor_1_Callback";
 
+
+  /** @domName IDBIndex.openKeyCursor_2 */
   IDBRequest _openKeyCursor_2(key_OR_range) native "IDBIndex_openKeyCursor_2_Callback";
 
+
+  /** @domName IDBIndex.openKeyCursor_3 */
   IDBRequest _openKeyCursor_3(key_OR_range, direction) native "IDBIndex_openKeyCursor_3_Callback";
 
+
+  /** @domName IDBIndex.openKeyCursor_4 */
   IDBRequest _openKeyCursor_4(key_OR_range) native "IDBIndex_openKeyCursor_4_Callback";
 
+
+  /** @domName IDBIndex.openKeyCursor_5 */
   IDBRequest _openKeyCursor_5(key_OR_range, direction) native "IDBIndex_openKeyCursor_5_Callback";
 
 }
@@ -17487,27 +12804,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBKey
-abstract class IDBKey {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBKeyImpl extends NativeFieldWrapperClass1 implements IDBKey {
+class IDBKey extends NativeFieldWrapperClass1 {
+  IDBKey.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-
-/// @domName IDBKeyRange
-abstract class IDBKeyRange {
-
+class IDBKeyRange extends NativeFieldWrapperClass1 {
   /**
    * @domName IDBKeyRange.only
    */
@@ -17534,45 +12839,22 @@
       _IDBKeyRangeFactoryProvider.createIDBKeyRange_bound(
           lower, upper, lowerOpen, upperOpen);
 
+  IDBKeyRange.internal();
+
 
   /** @domName IDBKeyRange.lower */
-  dynamic get lower;
-
-  /** @domName IDBKeyRange.lowerOpen */
-  bool get lowerOpen;
-
-  /** @domName IDBKeyRange.upper */
-  dynamic get upper;
-
-  /** @domName IDBKeyRange.upperOpen */
-  bool get upperOpen;
-
-  /** @domName IDBKeyRange.bound_ */
-  static final bound_ = _IDBKeyRangeImpl.bound_;
-
-  /** @domName IDBKeyRange.lowerBound_ */
-  static final lowerBound_ = _IDBKeyRangeImpl.lowerBound_;
-
-  /** @domName IDBKeyRange.only_ */
-  static final only_ = _IDBKeyRangeImpl.only_;
-
-  /** @domName IDBKeyRange.upperBound_ */
-  static final upperBound_ = _IDBKeyRangeImpl.upperBound_;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBKeyRangeImpl extends NativeFieldWrapperClass1 implements IDBKeyRange {
-
   dynamic get lower native "IDBKeyRange_lower_Getter";
 
+
+  /** @domName IDBKeyRange.lowerOpen */
   bool get lowerOpen native "IDBKeyRange_lowerOpen_Getter";
 
+
+  /** @domName IDBKeyRange.upper */
   dynamic get upper native "IDBKeyRange_upper_Getter";
 
+
+  /** @domName IDBKeyRange.upperOpen */
   bool get upperOpen native "IDBKeyRange_upperOpen_Getter";
 
   static IDBKeyRange bound_(/*IDBKey*/ lower, /*IDBKey*/ upper, [/*boolean*/ lowerOpen, /*boolean*/ upperOpen]) {
@@ -17585,10 +12867,16 @@
     return _bound_3(lower, upper);
   }
 
+
+  /** @domName IDBKeyRange.bound_1 */
   static IDBKeyRange _bound_1(lower, upper, lowerOpen, upperOpen) native "IDBKeyRange_bound_1_Callback";
 
+
+  /** @domName IDBKeyRange.bound_2 */
   static IDBKeyRange _bound_2(lower, upper, lowerOpen) native "IDBKeyRange_bound_2_Callback";
 
+
+  /** @domName IDBKeyRange.bound_3 */
   static IDBKeyRange _bound_3(lower, upper) native "IDBKeyRange_bound_3_Callback";
 
   static IDBKeyRange lowerBound_(/*IDBKey*/ bound, [/*boolean*/ open]) {
@@ -17598,10 +12886,16 @@
     return _lowerBound_2(bound);
   }
 
+
+  /** @domName IDBKeyRange.lowerBound_1 */
   static IDBKeyRange _lowerBound_1(bound, open) native "IDBKeyRange_lowerBound_1_Callback";
 
+
+  /** @domName IDBKeyRange.lowerBound_2 */
   static IDBKeyRange _lowerBound_2(bound) native "IDBKeyRange_lowerBound_2_Callback";
 
+
+  /** @domName IDBKeyRange.only_ */
   static IDBKeyRange only_(/*IDBKey*/ value) native "IDBKeyRange_only__Callback";
 
   static IDBKeyRange upperBound_(/*IDBKey*/ bound, [/*boolean*/ open]) {
@@ -17611,8 +12905,12 @@
     return _upperBound_2(bound);
   }
 
+
+  /** @domName IDBKeyRange.upperBound_1 */
   static IDBKeyRange _upperBound_1(bound, open) native "IDBKeyRange_upperBound_1_Callback";
 
+
+  /** @domName IDBKeyRange.upperBound_2 */
   static IDBKeyRange _upperBound_2(bound) native "IDBKeyRange_upperBound_2_Callback";
 
 }
@@ -17623,69 +12921,27 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBObjectStore
-abstract class IDBObjectStore {
+class IDBObjectStore extends NativeFieldWrapperClass1 {
+  IDBObjectStore.internal();
+
 
   /** @domName IDBObjectStore.autoIncrement */
-  bool get autoIncrement;
-
-  /** @domName IDBObjectStore.indexNames */
-  List<String> get indexNames;
-
-  /** @domName IDBObjectStore.keyPath */
-  dynamic get keyPath;
-
-  /** @domName IDBObjectStore.name */
-  String get name;
-
-  /** @domName IDBObjectStore.transaction */
-  IDBTransaction get transaction;
-
-  /** @domName IDBObjectStore.add */
-  IDBRequest add(Object value, [/*IDBKey*/ key]);
-
-  /** @domName IDBObjectStore.clear */
-  IDBRequest clear();
-
-  /** @domName IDBObjectStore.count */
-  IDBRequest count([key_OR_range]);
-
-  /** @domName IDBObjectStore.createIndex */
-  IDBIndex createIndex(String name, keyPath, [Map options]);
-
-  /** @domName IDBObjectStore.delete */
-  IDBRequest delete(key_OR_keyRange);
-
-  /** @domName IDBObjectStore.deleteIndex */
-  void deleteIndex(String name);
-
-  /** @domName IDBObjectStore.getObject */
-  IDBRequest getObject(key);
-
-  /** @domName IDBObjectStore.index */
-  IDBIndex index(String name);
-
-  /** @domName IDBObjectStore.openCursor */
-  IDBRequest openCursor([key_OR_range, String direction]);
-
-  /** @domName IDBObjectStore.put */
-  IDBRequest put(Object value, [/*IDBKey*/ key]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBObjectStoreImpl extends NativeFieldWrapperClass1 implements IDBObjectStore {
-
   bool get autoIncrement native "IDBObjectStore_autoIncrement_Getter";
 
+
+  /** @domName IDBObjectStore.indexNames */
   List<String> get indexNames native "IDBObjectStore_indexNames_Getter";
 
+
+  /** @domName IDBObjectStore.keyPath */
   dynamic get keyPath native "IDBObjectStore_keyPath_Getter";
 
+
+  /** @domName IDBObjectStore.name */
   String get name native "IDBObjectStore_name_Getter";
 
+
+  /** @domName IDBObjectStore.transaction */
   IDBTransaction get transaction native "IDBObjectStore_transaction_Getter";
 
   IDBRequest add(/*any*/ value, [/*IDBKey*/ key]) {
@@ -17695,10 +12951,16 @@
     return _add_2(value);
   }
 
+
+  /** @domName IDBObjectStore.add_1 */
   IDBRequest _add_1(value, key) native "IDBObjectStore_add_1_Callback";
 
+
+  /** @domName IDBObjectStore.add_2 */
   IDBRequest _add_2(value) native "IDBObjectStore_add_2_Callback";
 
+
+  /** @domName IDBObjectStore.clear */
   IDBRequest clear() native "IDBObjectStore_clear_Callback";
 
   IDBRequest count([key_OR_range]) {
@@ -17712,10 +12974,16 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName IDBObjectStore.count_1 */
   IDBRequest _count_1() native "IDBObjectStore_count_1_Callback";
 
+
+  /** @domName IDBObjectStore.count_2 */
   IDBRequest _count_2(key_OR_range) native "IDBObjectStore_count_2_Callback";
 
+
+  /** @domName IDBObjectStore.count_3 */
   IDBRequest _count_3(key_OR_range) native "IDBObjectStore_count_3_Callback";
 
   IDBIndex createIndex(/*DOMString*/ name, keyPath, [/*Dictionary*/ options]) {
@@ -17728,8 +12996,12 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName IDBObjectStore.createIndex_1 */
   IDBIndex _createIndex_1(name, keyPath, options) native "IDBObjectStore_createIndex_1_Callback";
 
+
+  /** @domName IDBObjectStore.createIndex_2 */
   IDBIndex _createIndex_2(name, keyPath, options) native "IDBObjectStore_createIndex_2_Callback";
 
   IDBRequest delete(key_OR_keyRange) {
@@ -17740,10 +13012,16 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName IDBObjectStore.delete_1 */
   IDBRequest _delete_1(key_OR_keyRange) native "IDBObjectStore_delete_1_Callback";
 
+
+  /** @domName IDBObjectStore.delete_2 */
   IDBRequest _delete_2(key_OR_keyRange) native "IDBObjectStore_delete_2_Callback";
 
+
+  /** @domName IDBObjectStore.deleteIndex */
   void deleteIndex(String name) native "IDBObjectStore_deleteIndex_Callback";
 
   IDBRequest getObject(key) {
@@ -17754,10 +13032,16 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName IDBObjectStore.get_1 */
   IDBRequest _get_1(key) native "IDBObjectStore_get_1_Callback";
 
+
+  /** @domName IDBObjectStore.get_2 */
   IDBRequest _get_2(key) native "IDBObjectStore_get_2_Callback";
 
+
+  /** @domName IDBObjectStore.index */
   IDBIndex index(String name) native "IDBObjectStore_index_Callback";
 
   IDBRequest openCursor([key_OR_range, /*DOMString*/ direction]) {
@@ -17779,14 +13063,24 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName IDBObjectStore.openCursor_1 */
   IDBRequest _openCursor_1() native "IDBObjectStore_openCursor_1_Callback";
 
+
+  /** @domName IDBObjectStore.openCursor_2 */
   IDBRequest _openCursor_2(key_OR_range) native "IDBObjectStore_openCursor_2_Callback";
 
+
+  /** @domName IDBObjectStore.openCursor_3 */
   IDBRequest _openCursor_3(key_OR_range, direction) native "IDBObjectStore_openCursor_3_Callback";
 
+
+  /** @domName IDBObjectStore.openCursor_4 */
   IDBRequest _openCursor_4(key_OR_range) native "IDBObjectStore_openCursor_4_Callback";
 
+
+  /** @domName IDBObjectStore.openCursor_5 */
   IDBRequest _openCursor_5(key_OR_range, direction) native "IDBObjectStore_openCursor_5_Callback";
 
   IDBRequest put(/*any*/ value, [/*IDBKey*/ key]) {
@@ -17796,8 +13090,12 @@
     return _put_2(value);
   }
 
+
+  /** @domName IDBObjectStore.put_1 */
   IDBRequest _put_1(value, key) native "IDBObjectStore_put_1_Callback";
 
+
+  /** @domName IDBObjectStore.put_2 */
   IDBRequest _put_2(value) native "IDBObjectStore_put_2_Callback";
 
 }
@@ -17808,35 +13106,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBOpenDBRequest
-abstract class IDBOpenDBRequest implements IDBRequest, EventTarget {
+class IDBOpenDBRequest extends IDBRequest implements EventTarget {
+  IDBOpenDBRequest.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  IDBOpenDBRequestEvents get on;
-}
-
-abstract class IDBOpenDBRequestEvents implements IDBRequestEvents {
-
-  EventListenerList get blocked;
-
-  EventListenerList get upgradeNeeded;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBOpenDBRequestImpl extends _IDBRequestImpl implements IDBOpenDBRequest {
-
-  _IDBOpenDBRequestEventsImpl get on =>
-    new _IDBOpenDBRequestEventsImpl(this);
+  IDBOpenDBRequestEvents get on =>
+    new IDBOpenDBRequestEvents(this);
 
 }
 
-class _IDBOpenDBRequestEventsImpl extends _IDBRequestEventsImpl implements IDBOpenDBRequestEvents {
-  _IDBOpenDBRequestEventsImpl(_ptr) : super(_ptr);
+class IDBOpenDBRequestEvents extends IDBRequestEvents {
+  IDBOpenDBRequestEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get blocked => this['blocked'];
 
@@ -17849,85 +13131,59 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBRequest
-abstract class IDBRequest implements EventTarget {
+class IDBRequest extends EventTarget {
+  IDBRequest.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  IDBRequestEvents get on;
+  IDBRequestEvents get on =>
+    new IDBRequestEvents(this);
+
 
   /** @domName IDBRequest.error */
-  DOMError get error;
-
-  /** @domName IDBRequest.errorCode */
-  int get errorCode;
-
-  /** @domName IDBRequest.readyState */
-  String get readyState;
-
-  /** @domName IDBRequest.result */
-  dynamic get result;
-
-  /** @domName IDBRequest.source */
-  dynamic get source;
-
-  /** @domName IDBRequest.transaction */
-  IDBTransaction get transaction;
-
-  /** @domName IDBRequest.webkitErrorMessage */
-  String get webkitErrorMessage;
-
-  /** @domName IDBRequest.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName IDBRequest.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName IDBRequest.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class IDBRequestEvents implements Events {
-
-  EventListenerList get error;
-
-  EventListenerList get success;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBRequestImpl extends _EventTargetImpl implements IDBRequest {
-
-  _IDBRequestEventsImpl get on =>
-    new _IDBRequestEventsImpl(this);
-
   DOMError get error native "IDBRequest_error_Getter";
 
+
+  /** @domName IDBRequest.errorCode */
   int get errorCode native "IDBRequest_errorCode_Getter";
 
+
+  /** @domName IDBRequest.readyState */
   String get readyState native "IDBRequest_readyState_Getter";
 
+
+  /** @domName IDBRequest.result */
   dynamic get result native "IDBRequest_result_Getter";
 
+
+  /** @domName IDBRequest.source */
   dynamic get source native "IDBRequest_source_Getter";
 
+
+  /** @domName IDBRequest.transaction */
   IDBTransaction get transaction native "IDBRequest_transaction_Getter";
 
+
+  /** @domName IDBRequest.webkitErrorMessage */
   String get webkitErrorMessage native "IDBRequest_webkitErrorMessage_Getter";
 
+
+  /** @domName IDBRequest.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBRequest_addEventListener_Callback";
 
+
+  /** @domName IDBRequest.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "IDBRequest_dispatchEvent_Callback";
 
+
+  /** @domName IDBRequest.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBRequest_removeEventListener_Callback";
 
 }
 
-class _IDBRequestEventsImpl extends _EventsImpl implements IDBRequestEvents {
-  _IDBRequestEventsImpl(_ptr) : super(_ptr);
+class IDBRequestEvents extends Events {
+  IDBRequestEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get error => this['error'];
 
@@ -17940,12 +13196,14 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBTransaction
-abstract class IDBTransaction implements EventTarget {
+class IDBTransaction extends EventTarget {
+  IDBTransaction.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  IDBTransactionEvents get on;
+  IDBTransactionEvents get on =>
+    new IDBTransactionEvents(this);
 
   static const int READ_ONLY = 0;
 
@@ -17953,70 +13211,42 @@
 
   static const int VERSION_CHANGE = 2;
 
+
   /** @domName IDBTransaction.db */
-  IDBDatabase get db;
-
-  /** @domName IDBTransaction.error */
-  DOMError get error;
-
-  /** @domName IDBTransaction.mode */
-  String get mode;
-
-  /** @domName IDBTransaction.abort */
-  void abort();
-
-  /** @domName IDBTransaction.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName IDBTransaction.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName IDBTransaction.objectStore */
-  IDBObjectStore objectStore(String name);
-
-  /** @domName IDBTransaction.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class IDBTransactionEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get complete;
-
-  EventListenerList get error;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBTransactionImpl extends _EventTargetImpl implements IDBTransaction {
-
-  _IDBTransactionEventsImpl get on =>
-    new _IDBTransactionEventsImpl(this);
-
   IDBDatabase get db native "IDBTransaction_db_Getter";
 
+
+  /** @domName IDBTransaction.error */
   DOMError get error native "IDBTransaction_error_Getter";
 
+
+  /** @domName IDBTransaction.mode */
   String get mode native "IDBTransaction_mode_Getter";
 
+
+  /** @domName IDBTransaction.abort */
   void abort() native "IDBTransaction_abort_Callback";
 
+
+  /** @domName IDBTransaction.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBTransaction_addEventListener_Callback";
 
+
+  /** @domName IDBTransaction.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "IDBTransaction_dispatchEvent_Callback";
 
+
+  /** @domName IDBTransaction.objectStore */
   IDBObjectStore objectStore(String name) native "IDBTransaction_objectStore_Callback";
 
+
+  /** @domName IDBTransaction.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBTransaction_removeEventListener_Callback";
 
 }
 
-class _IDBTransactionEventsImpl extends _EventsImpl implements IDBTransactionEvents {
-  _IDBTransactionEventsImpl(_ptr) : super(_ptr);
+class IDBTransactionEvents extends Events {
+  IDBTransactionEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get abort => this['abort'];
 
@@ -18031,24 +13261,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBVersionChangeEvent
-abstract class IDBUpgradeNeededEvent implements Event {
+class IDBUpgradeNeededEvent extends Event {
+  IDBUpgradeNeededEvent.internal(): super.internal();
 
-  /** @domName IDBVersionChangeEvent.newVersion */
-  int get newVersion;
 
-  /** @domName IDBVersionChangeEvent.oldVersion */
-  int get oldVersion;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBUpgradeNeededEventImpl extends _EventImpl implements IDBUpgradeNeededEvent {
-
+  /** @domName IDBUpgradeNeededEvent.newVersion */
   int get newVersion native "IDBUpgradeNeededEvent_newVersion_Getter";
 
+
+  /** @domName IDBUpgradeNeededEvent.oldVersion */
   int get oldVersion native "IDBUpgradeNeededEvent_oldVersion_Getter";
 
 }
@@ -18059,19 +13280,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBVersionChangeEvent
-abstract class IDBVersionChangeEvent implements Event {
+class IDBVersionChangeEvent extends Event {
+  IDBVersionChangeEvent.internal(): super.internal();
+
 
   /** @domName IDBVersionChangeEvent.version */
-  String get version;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBVersionChangeEventImpl extends _EventImpl implements IDBVersionChangeEvent {
-
   String get version native "IDBVersionChangeEvent_version_Getter";
 
 }
@@ -18082,33 +13295,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IDBVersionChangeRequest
-abstract class IDBVersionChangeRequest implements IDBRequest, EventTarget {
+class IDBVersionChangeRequest extends IDBRequest implements EventTarget {
+  IDBVersionChangeRequest.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  IDBVersionChangeRequestEvents get on;
-}
-
-abstract class IDBVersionChangeRequestEvents implements IDBRequestEvents {
-
-  EventListenerList get blocked;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IDBVersionChangeRequestImpl extends _IDBRequestImpl implements IDBVersionChangeRequest {
-
-  _IDBVersionChangeRequestEventsImpl get on =>
-    new _IDBVersionChangeRequestEventsImpl(this);
+  IDBVersionChangeRequestEvents get on =>
+    new IDBVersionChangeRequestEvents(this);
 
 }
 
-class _IDBVersionChangeRequestEventsImpl extends _IDBRequestEventsImpl implements IDBVersionChangeRequestEvents {
-  _IDBVersionChangeRequestEventsImpl(_ptr) : super(_ptr);
+class IDBVersionChangeRequestEvents extends IDBRequestEvents {
+  IDBVersionChangeRequestEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get blocked => this['blocked'];
 }
@@ -18119,105 +13318,109 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLIFrameElement
-abstract class IFrameElement implements Element {
+class IFrameElement extends _Element_Merged {
 
   factory IFrameElement() => _Elements.createIFrameElement();
+  IFrameElement.internal(): super.internal();
+
 
   /** @domName HTMLIFrameElement.align */
-  String align;
-
-  /** @domName HTMLIFrameElement.contentWindow */
-  Window get contentWindow;
-
-  /** @domName HTMLIFrameElement.frameBorder */
-  String frameBorder;
-
-  /** @domName HTMLIFrameElement.height */
-  String height;
-
-  /** @domName HTMLIFrameElement.longDesc */
-  String longDesc;
-
-  /** @domName HTMLIFrameElement.marginHeight */
-  String marginHeight;
-
-  /** @domName HTMLIFrameElement.marginWidth */
-  String marginWidth;
-
-  /** @domName HTMLIFrameElement.name */
-  String name;
-
-  /** @domName HTMLIFrameElement.sandbox */
-  String sandbox;
-
-  /** @domName HTMLIFrameElement.scrolling */
-  String scrolling;
-
-  /** @domName HTMLIFrameElement.src */
-  String src;
-
-  /** @domName HTMLIFrameElement.srcdoc */
-  String srcdoc;
-
-  /** @domName HTMLIFrameElement.width */
-  String width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IFrameElementImpl extends _ElementImpl_Merged implements IFrameElement {
-
   String get align native "HTMLIFrameElement_align_Getter";
 
+
+  /** @domName HTMLIFrameElement.align */
   void set align(String value) native "HTMLIFrameElement_align_Setter";
 
+
+  /** @domName HTMLIFrameElement.contentWindow */
   Window get contentWindow native "HTMLIFrameElement_contentWindow_Getter";
 
+
+  /** @domName HTMLIFrameElement.frameBorder */
   String get frameBorder native "HTMLIFrameElement_frameBorder_Getter";
 
+
+  /** @domName HTMLIFrameElement.frameBorder */
   void set frameBorder(String value) native "HTMLIFrameElement_frameBorder_Setter";
 
+
+  /** @domName HTMLIFrameElement.height */
   String get height native "HTMLIFrameElement_height_Getter";
 
+
+  /** @domName HTMLIFrameElement.height */
   void set height(String value) native "HTMLIFrameElement_height_Setter";
 
+
+  /** @domName HTMLIFrameElement.longDesc */
   String get longDesc native "HTMLIFrameElement_longDesc_Getter";
 
+
+  /** @domName HTMLIFrameElement.longDesc */
   void set longDesc(String value) native "HTMLIFrameElement_longDesc_Setter";
 
+
+  /** @domName HTMLIFrameElement.marginHeight */
   String get marginHeight native "HTMLIFrameElement_marginHeight_Getter";
 
+
+  /** @domName HTMLIFrameElement.marginHeight */
   void set marginHeight(String value) native "HTMLIFrameElement_marginHeight_Setter";
 
+
+  /** @domName HTMLIFrameElement.marginWidth */
   String get marginWidth native "HTMLIFrameElement_marginWidth_Getter";
 
+
+  /** @domName HTMLIFrameElement.marginWidth */
   void set marginWidth(String value) native "HTMLIFrameElement_marginWidth_Setter";
 
+
+  /** @domName HTMLIFrameElement.name */
   String get name native "HTMLIFrameElement_name_Getter";
 
+
+  /** @domName HTMLIFrameElement.name */
   void set name(String value) native "HTMLIFrameElement_name_Setter";
 
+
+  /** @domName HTMLIFrameElement.sandbox */
   String get sandbox native "HTMLIFrameElement_sandbox_Getter";
 
+
+  /** @domName HTMLIFrameElement.sandbox */
   void set sandbox(String value) native "HTMLIFrameElement_sandbox_Setter";
 
+
+  /** @domName HTMLIFrameElement.scrolling */
   String get scrolling native "HTMLIFrameElement_scrolling_Getter";
 
+
+  /** @domName HTMLIFrameElement.scrolling */
   void set scrolling(String value) native "HTMLIFrameElement_scrolling_Setter";
 
+
+  /** @domName HTMLIFrameElement.src */
   String get src native "HTMLIFrameElement_src_Getter";
 
+
+  /** @domName HTMLIFrameElement.src */
   void set src(String value) native "HTMLIFrameElement_src_Setter";
 
+
+  /** @domName HTMLIFrameElement.srcdoc */
   String get srcdoc native "HTMLIFrameElement_srcdoc_Getter";
 
+
+  /** @domName HTMLIFrameElement.srcdoc */
   void set srcdoc(String value) native "HTMLIFrameElement_srcdoc_Setter";
 
+
+  /** @domName HTMLIFrameElement.width */
   String get width native "HTMLIFrameElement_width_Getter";
 
+
+  /** @domName HTMLIFrameElement.width */
   void set width(String value) native "HTMLIFrameElement_width_Setter";
 
 }
@@ -18236,26 +13439,17 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName IceCandidate
-abstract class IceCandidate {
+class IceCandidate extends NativeFieldWrapperClass1 {
 
   factory IceCandidate(String label, String candidateLine) => _IceCandidateFactoryProvider.createIceCandidate(label, candidateLine);
+  IceCandidate.internal();
+
 
   /** @domName IceCandidate.label */
-  String get label;
-
-  /** @domName IceCandidate.toSdp */
-  String toSdp();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _IceCandidateImpl extends NativeFieldWrapperClass1 implements IceCandidate {
-
   String get label native "IceCandidate_label_Getter";
 
+
+  /** @domName IceCandidate.toSdp */
   String toSdp() native "IceCandidate_toSdp_Callback";
 
 }
@@ -18266,29 +13460,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ImageData
-abstract class ImageData {
+class ImageData extends NativeFieldWrapperClass1 {
+  ImageData.internal();
+
 
   /** @domName ImageData.data */
-  Uint8ClampedArray get data;
-
-  /** @domName ImageData.height */
-  int get height;
-
-  /** @domName ImageData.width */
-  int get width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ImageDataImpl extends NativeFieldWrapperClass1 implements ImageData {
-
   Uint8ClampedArray get data native "ImageData_data_Getter";
 
+
+  /** @domName ImageData.height */
   int get height native "ImageData_height_Getter";
 
+
+  /** @domName ImageData.width */
   int get width native "ImageData_width_Getter";
 
 }
@@ -18299,7 +13483,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLImageElement
-abstract class ImageElement implements Element {
+class ImageElement extends _Element_Merged {
 
   factory ImageElement({String src, int width, int height}) {
     if (!?src) {
@@ -18313,136 +13497,138 @@
     }
     return _Elements.createImageElement(src, width, height);
   }
+  ImageElement.internal(): super.internal();
+
 
   /** @domName HTMLImageElement.align */
-  String align;
-
-  /** @domName HTMLImageElement.alt */
-  String alt;
-
-  /** @domName HTMLImageElement.border */
-  String border;
-
-  /** @domName HTMLImageElement.complete */
-  bool get complete;
-
-  /** @domName HTMLImageElement.crossOrigin */
-  String crossOrigin;
-
-  /** @domName HTMLImageElement.height */
-  int height;
-
-  /** @domName HTMLImageElement.hspace */
-  int hspace;
-
-  /** @domName HTMLImageElement.isMap */
-  bool isMap;
-
-  /** @domName HTMLImageElement.longDesc */
-  String longDesc;
-
-  /** @domName HTMLImageElement.lowsrc */
-  String lowsrc;
-
-  /** @domName HTMLImageElement.name */
-  String name;
-
-  /** @domName HTMLImageElement.naturalHeight */
-  int get naturalHeight;
-
-  /** @domName HTMLImageElement.naturalWidth */
-  int get naturalWidth;
-
-  /** @domName HTMLImageElement.src */
-  String src;
-
-  /** @domName HTMLImageElement.useMap */
-  String useMap;
-
-  /** @domName HTMLImageElement.vspace */
-  int vspace;
-
-  /** @domName HTMLImageElement.width */
-  int width;
-
-  /** @domName HTMLImageElement.x */
-  int get x;
-
-  /** @domName HTMLImageElement.y */
-  int get y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ImageElementImpl extends _ElementImpl_Merged implements ImageElement {
-
   String get align native "HTMLImageElement_align_Getter";
 
+
+  /** @domName HTMLImageElement.align */
   void set align(String value) native "HTMLImageElement_align_Setter";
 
+
+  /** @domName HTMLImageElement.alt */
   String get alt native "HTMLImageElement_alt_Getter";
 
+
+  /** @domName HTMLImageElement.alt */
   void set alt(String value) native "HTMLImageElement_alt_Setter";
 
+
+  /** @domName HTMLImageElement.border */
   String get border native "HTMLImageElement_border_Getter";
 
+
+  /** @domName HTMLImageElement.border */
   void set border(String value) native "HTMLImageElement_border_Setter";
 
+
+  /** @domName HTMLImageElement.complete */
   bool get complete native "HTMLImageElement_complete_Getter";
 
+
+  /** @domName HTMLImageElement.crossOrigin */
   String get crossOrigin native "HTMLImageElement_crossOrigin_Getter";
 
+
+  /** @domName HTMLImageElement.crossOrigin */
   void set crossOrigin(String value) native "HTMLImageElement_crossOrigin_Setter";
 
+
+  /** @domName HTMLImageElement.height */
   int get height native "HTMLImageElement_height_Getter";
 
+
+  /** @domName HTMLImageElement.height */
   void set height(int value) native "HTMLImageElement_height_Setter";
 
+
+  /** @domName HTMLImageElement.hspace */
   int get hspace native "HTMLImageElement_hspace_Getter";
 
+
+  /** @domName HTMLImageElement.hspace */
   void set hspace(int value) native "HTMLImageElement_hspace_Setter";
 
+
+  /** @domName HTMLImageElement.isMap */
   bool get isMap native "HTMLImageElement_isMap_Getter";
 
+
+  /** @domName HTMLImageElement.isMap */
   void set isMap(bool value) native "HTMLImageElement_isMap_Setter";
 
+
+  /** @domName HTMLImageElement.longDesc */
   String get longDesc native "HTMLImageElement_longDesc_Getter";
 
+
+  /** @domName HTMLImageElement.longDesc */
   void set longDesc(String value) native "HTMLImageElement_longDesc_Setter";
 
+
+  /** @domName HTMLImageElement.lowsrc */
   String get lowsrc native "HTMLImageElement_lowsrc_Getter";
 
+
+  /** @domName HTMLImageElement.lowsrc */
   void set lowsrc(String value) native "HTMLImageElement_lowsrc_Setter";
 
+
+  /** @domName HTMLImageElement.name */
   String get name native "HTMLImageElement_name_Getter";
 
+
+  /** @domName HTMLImageElement.name */
   void set name(String value) native "HTMLImageElement_name_Setter";
 
+
+  /** @domName HTMLImageElement.naturalHeight */
   int get naturalHeight native "HTMLImageElement_naturalHeight_Getter";
 
+
+  /** @domName HTMLImageElement.naturalWidth */
   int get naturalWidth native "HTMLImageElement_naturalWidth_Getter";
 
+
+  /** @domName HTMLImageElement.src */
   String get src native "HTMLImageElement_src_Getter";
 
+
+  /** @domName HTMLImageElement.src */
   void set src(String value) native "HTMLImageElement_src_Setter";
 
+
+  /** @domName HTMLImageElement.useMap */
   String get useMap native "HTMLImageElement_useMap_Getter";
 
+
+  /** @domName HTMLImageElement.useMap */
   void set useMap(String value) native "HTMLImageElement_useMap_Setter";
 
+
+  /** @domName HTMLImageElement.vspace */
   int get vspace native "HTMLImageElement_vspace_Getter";
 
+
+  /** @domName HTMLImageElement.vspace */
   void set vspace(int value) native "HTMLImageElement_vspace_Setter";
 
+
+  /** @domName HTMLImageElement.width */
   int get width native "HTMLImageElement_width_Getter";
 
+
+  /** @domName HTMLImageElement.width */
   void set width(int value) native "HTMLImageElement_width_Setter";
 
+
+  /** @domName HTMLImageElement.x */
   int get x native "HTMLImageElement_x_Getter";
 
+
+  /** @domName HTMLImageElement.y */
   int get y native "HTMLImageElement_y_Getter";
 
 }
@@ -18453,7 +13639,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLInputElement
-abstract class InputElement implements Element {
+class InputElement extends _Element_Merged {
 
   factory InputElement({String type}) {
     if (!?type) {
@@ -18461,389 +13647,396 @@
     }
     return _Elements.createInputElement(type);
   }
+  InputElement.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  InputElementEvents get on;
+  InputElementEvents get on =>
+    new InputElementEvents(this);
+
 
   /** @domName HTMLInputElement.accept */
-  String accept;
-
-  /** @domName HTMLInputElement.align */
-  String align;
-
-  /** @domName HTMLInputElement.alt */
-  String alt;
-
-  /** @domName HTMLInputElement.autocomplete */
-  String autocomplete;
-
-  /** @domName HTMLInputElement.autofocus */
-  bool autofocus;
-
-  /** @domName HTMLInputElement.checked */
-  bool checked;
-
-  /** @domName HTMLInputElement.defaultChecked */
-  bool defaultChecked;
-
-  /** @domName HTMLInputElement.defaultValue */
-  String defaultValue;
-
-  /** @domName HTMLInputElement.dirName */
-  String dirName;
-
-  /** @domName HTMLInputElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLInputElement.files */
-  List<File> files;
-
-  /** @domName HTMLInputElement.form */
-  FormElement get form;
-
-  /** @domName HTMLInputElement.formAction */
-  String formAction;
-
-  /** @domName HTMLInputElement.formEnctype */
-  String formEnctype;
-
-  /** @domName HTMLInputElement.formMethod */
-  String formMethod;
-
-  /** @domName HTMLInputElement.formNoValidate */
-  bool formNoValidate;
-
-  /** @domName HTMLInputElement.formTarget */
-  String formTarget;
-
-  /** @domName HTMLInputElement.height */
-  int height;
-
-  /** @domName HTMLInputElement.incremental */
-  bool incremental;
-
-  /** @domName HTMLInputElement.indeterminate */
-  bool indeterminate;
-
-  /** @domName HTMLInputElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLInputElement.list */
-  Element get list;
-
-  /** @domName HTMLInputElement.max */
-  String max;
-
-  /** @domName HTMLInputElement.maxLength */
-  int maxLength;
-
-  /** @domName HTMLInputElement.min */
-  String min;
-
-  /** @domName HTMLInputElement.multiple */
-  bool multiple;
-
-  /** @domName HTMLInputElement.name */
-  String name;
-
-  /** @domName HTMLInputElement.pattern */
-  String pattern;
-
-  /** @domName HTMLInputElement.placeholder */
-  String placeholder;
-
-  /** @domName HTMLInputElement.readOnly */
-  bool readOnly;
-
-  /** @domName HTMLInputElement.required */
-  bool required;
-
-  /** @domName HTMLInputElement.selectionDirection */
-  String selectionDirection;
-
-  /** @domName HTMLInputElement.selectionEnd */
-  int selectionEnd;
-
-  /** @domName HTMLInputElement.selectionStart */
-  int selectionStart;
-
-  /** @domName HTMLInputElement.size */
-  int size;
-
-  /** @domName HTMLInputElement.src */
-  String src;
-
-  /** @domName HTMLInputElement.step */
-  String step;
-
-  /** @domName HTMLInputElement.type */
-  String type;
-
-  /** @domName HTMLInputElement.useMap */
-  String useMap;
-
-  /** @domName HTMLInputElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLInputElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLInputElement.value */
-  String value;
-
-  /** @domName HTMLInputElement.valueAsDate */
-  Date valueAsDate;
-
-  /** @domName HTMLInputElement.valueAsNumber */
-  num valueAsNumber;
-
-  /** @domName HTMLInputElement.webkitEntries */
-  List<Entry> get webkitEntries;
-
-  /** @domName HTMLInputElement.webkitGrammar */
-  bool webkitGrammar;
-
-  /** @domName HTMLInputElement.webkitSpeech */
-  bool webkitSpeech;
-
-  /** @domName HTMLInputElement.webkitdirectory */
-  bool webkitdirectory;
-
-  /** @domName HTMLInputElement.width */
-  int width;
-
-  /** @domName HTMLInputElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLInputElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLInputElement.select */
-  void select();
-
-  /** @domName HTMLInputElement.setCustomValidity */
-  void setCustomValidity(String error);
-
-  /** @domName HTMLInputElement.setRangeText */
-  void setRangeText(String replacement, [int start, int end, String selectionMode]);
-
-  /** @domName HTMLInputElement.setSelectionRange */
-  void setSelectionRange(int start, int end, [String direction]);
-
-  /** @domName HTMLInputElement.stepDown */
-  void stepDown([int n]);
-
-  /** @domName HTMLInputElement.stepUp */
-  void stepUp([int n]);
-}
-
-abstract class InputElementEvents implements ElementEvents {
-
-  EventListenerList get speechChange;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _InputElementImpl extends _ElementImpl_Merged implements InputElement {
-
-  _InputElementEventsImpl get on =>
-    new _InputElementEventsImpl(this);
-
   String get accept native "HTMLInputElement_accept_Getter";
 
+
+  /** @domName HTMLInputElement.accept */
   void set accept(String value) native "HTMLInputElement_accept_Setter";
 
+
+  /** @domName HTMLInputElement.align */
   String get align native "HTMLInputElement_align_Getter";
 
+
+  /** @domName HTMLInputElement.align */
   void set align(String value) native "HTMLInputElement_align_Setter";
 
+
+  /** @domName HTMLInputElement.alt */
   String get alt native "HTMLInputElement_alt_Getter";
 
+
+  /** @domName HTMLInputElement.alt */
   void set alt(String value) native "HTMLInputElement_alt_Setter";
 
+
+  /** @domName HTMLInputElement.autocomplete */
   String get autocomplete native "HTMLInputElement_autocomplete_Getter";
 
+
+  /** @domName HTMLInputElement.autocomplete */
   void set autocomplete(String value) native "HTMLInputElement_autocomplete_Setter";
 
+
+  /** @domName HTMLInputElement.autofocus */
   bool get autofocus native "HTMLInputElement_autofocus_Getter";
 
+
+  /** @domName HTMLInputElement.autofocus */
   void set autofocus(bool value) native "HTMLInputElement_autofocus_Setter";
 
+
+  /** @domName HTMLInputElement.checked */
   bool get checked native "HTMLInputElement_checked_Getter";
 
+
+  /** @domName HTMLInputElement.checked */
   void set checked(bool value) native "HTMLInputElement_checked_Setter";
 
+
+  /** @domName HTMLInputElement.defaultChecked */
   bool get defaultChecked native "HTMLInputElement_defaultChecked_Getter";
 
+
+  /** @domName HTMLInputElement.defaultChecked */
   void set defaultChecked(bool value) native "HTMLInputElement_defaultChecked_Setter";
 
+
+  /** @domName HTMLInputElement.defaultValue */
   String get defaultValue native "HTMLInputElement_defaultValue_Getter";
 
+
+  /** @domName HTMLInputElement.defaultValue */
   void set defaultValue(String value) native "HTMLInputElement_defaultValue_Setter";
 
+
+  /** @domName HTMLInputElement.dirName */
   String get dirName native "HTMLInputElement_dirName_Getter";
 
+
+  /** @domName HTMLInputElement.dirName */
   void set dirName(String value) native "HTMLInputElement_dirName_Setter";
 
+
+  /** @domName HTMLInputElement.disabled */
   bool get disabled native "HTMLInputElement_disabled_Getter";
 
+
+  /** @domName HTMLInputElement.disabled */
   void set disabled(bool value) native "HTMLInputElement_disabled_Setter";
 
+
+  /** @domName HTMLInputElement.files */
   List<File> get files native "HTMLInputElement_files_Getter";
 
+
+  /** @domName HTMLInputElement.files */
   void set files(List<File> value) native "HTMLInputElement_files_Setter";
 
+
+  /** @domName HTMLInputElement.form */
   FormElement get form native "HTMLInputElement_form_Getter";
 
+
+  /** @domName HTMLInputElement.formAction */
   String get formAction native "HTMLInputElement_formAction_Getter";
 
+
+  /** @domName HTMLInputElement.formAction */
   void set formAction(String value) native "HTMLInputElement_formAction_Setter";
 
+
+  /** @domName HTMLInputElement.formEnctype */
   String get formEnctype native "HTMLInputElement_formEnctype_Getter";
 
+
+  /** @domName HTMLInputElement.formEnctype */
   void set formEnctype(String value) native "HTMLInputElement_formEnctype_Setter";
 
+
+  /** @domName HTMLInputElement.formMethod */
   String get formMethod native "HTMLInputElement_formMethod_Getter";
 
+
+  /** @domName HTMLInputElement.formMethod */
   void set formMethod(String value) native "HTMLInputElement_formMethod_Setter";
 
+
+  /** @domName HTMLInputElement.formNoValidate */
   bool get formNoValidate native "HTMLInputElement_formNoValidate_Getter";
 
+
+  /** @domName HTMLInputElement.formNoValidate */
   void set formNoValidate(bool value) native "HTMLInputElement_formNoValidate_Setter";
 
+
+  /** @domName HTMLInputElement.formTarget */
   String get formTarget native "HTMLInputElement_formTarget_Getter";
 
+
+  /** @domName HTMLInputElement.formTarget */
   void set formTarget(String value) native "HTMLInputElement_formTarget_Setter";
 
+
+  /** @domName HTMLInputElement.height */
   int get height native "HTMLInputElement_height_Getter";
 
+
+  /** @domName HTMLInputElement.height */
   void set height(int value) native "HTMLInputElement_height_Setter";
 
+
+  /** @domName HTMLInputElement.incremental */
   bool get incremental native "HTMLInputElement_incremental_Getter";
 
+
+  /** @domName HTMLInputElement.incremental */
   void set incremental(bool value) native "HTMLInputElement_incremental_Setter";
 
+
+  /** @domName HTMLInputElement.indeterminate */
   bool get indeterminate native "HTMLInputElement_indeterminate_Getter";
 
+
+  /** @domName HTMLInputElement.indeterminate */
   void set indeterminate(bool value) native "HTMLInputElement_indeterminate_Setter";
 
+
+  /** @domName HTMLInputElement.labels */
   List<Node> get labels native "HTMLInputElement_labels_Getter";
 
+
+  /** @domName HTMLInputElement.list */
   Element get list native "HTMLInputElement_list_Getter";
 
+
+  /** @domName HTMLInputElement.max */
   String get max native "HTMLInputElement_max_Getter";
 
+
+  /** @domName HTMLInputElement.max */
   void set max(String value) native "HTMLInputElement_max_Setter";
 
+
+  /** @domName HTMLInputElement.maxLength */
   int get maxLength native "HTMLInputElement_maxLength_Getter";
 
+
+  /** @domName HTMLInputElement.maxLength */
   void set maxLength(int value) native "HTMLInputElement_maxLength_Setter";
 
+
+  /** @domName HTMLInputElement.min */
   String get min native "HTMLInputElement_min_Getter";
 
+
+  /** @domName HTMLInputElement.min */
   void set min(String value) native "HTMLInputElement_min_Setter";
 
+
+  /** @domName HTMLInputElement.multiple */
   bool get multiple native "HTMLInputElement_multiple_Getter";
 
+
+  /** @domName HTMLInputElement.multiple */
   void set multiple(bool value) native "HTMLInputElement_multiple_Setter";
 
+
+  /** @domName HTMLInputElement.name */
   String get name native "HTMLInputElement_name_Getter";
 
+
+  /** @domName HTMLInputElement.name */
   void set name(String value) native "HTMLInputElement_name_Setter";
 
+
+  /** @domName HTMLInputElement.pattern */
   String get pattern native "HTMLInputElement_pattern_Getter";
 
+
+  /** @domName HTMLInputElement.pattern */
   void set pattern(String value) native "HTMLInputElement_pattern_Setter";
 
+
+  /** @domName HTMLInputElement.placeholder */
   String get placeholder native "HTMLInputElement_placeholder_Getter";
 
+
+  /** @domName HTMLInputElement.placeholder */
   void set placeholder(String value) native "HTMLInputElement_placeholder_Setter";
 
+
+  /** @domName HTMLInputElement.readOnly */
   bool get readOnly native "HTMLInputElement_readOnly_Getter";
 
+
+  /** @domName HTMLInputElement.readOnly */
   void set readOnly(bool value) native "HTMLInputElement_readOnly_Setter";
 
+
+  /** @domName HTMLInputElement.required */
   bool get required native "HTMLInputElement_required_Getter";
 
+
+  /** @domName HTMLInputElement.required */
   void set required(bool value) native "HTMLInputElement_required_Setter";
 
+
+  /** @domName HTMLInputElement.selectionDirection */
   String get selectionDirection native "HTMLInputElement_selectionDirection_Getter";
 
+
+  /** @domName HTMLInputElement.selectionDirection */
   void set selectionDirection(String value) native "HTMLInputElement_selectionDirection_Setter";
 
+
+  /** @domName HTMLInputElement.selectionEnd */
   int get selectionEnd native "HTMLInputElement_selectionEnd_Getter";
 
+
+  /** @domName HTMLInputElement.selectionEnd */
   void set selectionEnd(int value) native "HTMLInputElement_selectionEnd_Setter";
 
+
+  /** @domName HTMLInputElement.selectionStart */
   int get selectionStart native "HTMLInputElement_selectionStart_Getter";
 
+
+  /** @domName HTMLInputElement.selectionStart */
   void set selectionStart(int value) native "HTMLInputElement_selectionStart_Setter";
 
+
+  /** @domName HTMLInputElement.size */
   int get size native "HTMLInputElement_size_Getter";
 
+
+  /** @domName HTMLInputElement.size */
   void set size(int value) native "HTMLInputElement_size_Setter";
 
+
+  /** @domName HTMLInputElement.src */
   String get src native "HTMLInputElement_src_Getter";
 
+
+  /** @domName HTMLInputElement.src */
   void set src(String value) native "HTMLInputElement_src_Setter";
 
+
+  /** @domName HTMLInputElement.step */
   String get step native "HTMLInputElement_step_Getter";
 
+
+  /** @domName HTMLInputElement.step */
   void set step(String value) native "HTMLInputElement_step_Setter";
 
+
+  /** @domName HTMLInputElement.type */
   String get type native "HTMLInputElement_type_Getter";
 
+
+  /** @domName HTMLInputElement.type */
   void set type(String value) native "HTMLInputElement_type_Setter";
 
+
+  /** @domName HTMLInputElement.useMap */
   String get useMap native "HTMLInputElement_useMap_Getter";
 
+
+  /** @domName HTMLInputElement.useMap */
   void set useMap(String value) native "HTMLInputElement_useMap_Setter";
 
+
+  /** @domName HTMLInputElement.validationMessage */
   String get validationMessage native "HTMLInputElement_validationMessage_Getter";
 
+
+  /** @domName HTMLInputElement.validity */
   ValidityState get validity native "HTMLInputElement_validity_Getter";
 
+
+  /** @domName HTMLInputElement.value */
   String get value native "HTMLInputElement_value_Getter";
 
+
+  /** @domName HTMLInputElement.value */
   void set value(String value) native "HTMLInputElement_value_Setter";
 
+
+  /** @domName HTMLInputElement.valueAsDate */
   Date get valueAsDate native "HTMLInputElement_valueAsDate_Getter";
 
+
+  /** @domName HTMLInputElement.valueAsDate */
   void set valueAsDate(Date value) native "HTMLInputElement_valueAsDate_Setter";
 
+
+  /** @domName HTMLInputElement.valueAsNumber */
   num get valueAsNumber native "HTMLInputElement_valueAsNumber_Getter";
 
+
+  /** @domName HTMLInputElement.valueAsNumber */
   void set valueAsNumber(num value) native "HTMLInputElement_valueAsNumber_Setter";
 
+
+  /** @domName HTMLInputElement.webkitEntries */
   List<Entry> get webkitEntries native "HTMLInputElement_webkitEntries_Getter";
 
+
+  /** @domName HTMLInputElement.webkitGrammar */
   bool get webkitGrammar native "HTMLInputElement_webkitGrammar_Getter";
 
+
+  /** @domName HTMLInputElement.webkitGrammar */
   void set webkitGrammar(bool value) native "HTMLInputElement_webkitGrammar_Setter";
 
+
+  /** @domName HTMLInputElement.webkitSpeech */
   bool get webkitSpeech native "HTMLInputElement_webkitSpeech_Getter";
 
+
+  /** @domName HTMLInputElement.webkitSpeech */
   void set webkitSpeech(bool value) native "HTMLInputElement_webkitSpeech_Setter";
 
+
+  /** @domName HTMLInputElement.webkitdirectory */
   bool get webkitdirectory native "HTMLInputElement_webkitdirectory_Getter";
 
+
+  /** @domName HTMLInputElement.webkitdirectory */
   void set webkitdirectory(bool value) native "HTMLInputElement_webkitdirectory_Setter";
 
+
+  /** @domName HTMLInputElement.width */
   int get width native "HTMLInputElement_width_Getter";
 
+
+  /** @domName HTMLInputElement.width */
   void set width(int value) native "HTMLInputElement_width_Setter";
 
+
+  /** @domName HTMLInputElement.willValidate */
   bool get willValidate native "HTMLInputElement_willValidate_Getter";
 
+
+  /** @domName HTMLInputElement.checkValidity */
   bool checkValidity() native "HTMLInputElement_checkValidity_Callback";
 
+
+  /** @domName HTMLInputElement.select */
   void select() native "HTMLInputElement_select_Callback";
 
+
+  /** @domName HTMLInputElement.setCustomValidity */
   void setCustomValidity(String error) native "HTMLInputElement_setCustomValidity_Callback";
 
   void setRangeText(/*DOMString*/ replacement, [/*unsigned long*/ start, /*unsigned long*/ end, /*DOMString*/ selectionMode]) {
@@ -18858,10 +14051,16 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName HTMLInputElement.setRangeText_1 */
   void _setRangeText_1(replacement) native "HTMLInputElement_setRangeText_1_Callback";
 
+
+  /** @domName HTMLInputElement.setRangeText_2 */
   void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLInputElement_setRangeText_2_Callback";
 
+
+  /** @domName HTMLInputElement.setSelectionRange */
   void setSelectionRange(int start, int end, [String direction]) native "HTMLInputElement_setSelectionRange_Callback";
 
   void stepDown([/*long*/ n]) {
@@ -18872,8 +14071,12 @@
     _stepDown_2();
   }
 
+
+  /** @domName HTMLInputElement.stepDown_1 */
   void _stepDown_1(n) native "HTMLInputElement_stepDown_1_Callback";
 
+
+  /** @domName HTMLInputElement.stepDown_2 */
   void _stepDown_2() native "HTMLInputElement_stepDown_2_Callback";
 
   void stepUp([/*long*/ n]) {
@@ -18884,14 +14087,18 @@
     _stepUp_2();
   }
 
+
+  /** @domName HTMLInputElement.stepUp_1 */
   void _stepUp_1(n) native "HTMLInputElement_stepUp_1_Callback";
 
+
+  /** @domName HTMLInputElement.stepUp_2 */
   void _stepUp_2() native "HTMLInputElement_stepUp_2_Callback";
 
 }
 
-class _InputElementEventsImpl extends _ElementEventsImpl implements InputElementEvents {
-  _InputElementEventsImpl(_ptr) : super(_ptr);
+class InputElementEvents extends ElementEvents {
+  InputElementEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get speechChange => this['webkitSpeechChange'];
 }
@@ -18902,7 +14109,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Int16Array
-abstract class Int16Array implements ArrayBufferView, List<int> {
+class Int16Array extends ArrayBufferView implements List<int> {
 
   factory Int16Array(int length) =>
     _TypedArrayFactoryProvider.createInt16Array(length);
@@ -18912,30 +14119,20 @@
 
   factory Int16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createInt16Array_fromBuffer(buffer, byteOffset, length);
+  Int16Array.internal(): super.internal();
 
   static const int BYTES_PER_ELEMENT = 2;
 
+
   /** @domName Int16Array.length */
-  int get length;
-
-  /** @domName Int16Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Int16Array.subarray */
-  Int16Array subarray(int start, [int end]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _Int16ArrayImpl extends _ArrayBufferViewImpl implements Int16Array {
-
   int get length native "Int16Array_length_Getter";
 
+
+  /** @domName Int16Array.numericIndexGetter */
   int operator[](int index) native "Int16Array_numericIndexGetter_Callback";
 
+
+  /** @domName Int16Array.numericIndexSetter */
   void operator[]=(int index, int value) native "Int16Array_numericIndexSetter_Callback";
   // -- start List<int> mixins.
   // int is the element type.
@@ -19015,6 +14212,8 @@
 
   // -- end List<int> mixins.
 
+
+  /** @domName Int16Array.setElements */
   void setElements(Object array, [int offset]) native "Int16Array_setElements_Callback";
 
   Int16Array subarray(/*long*/ start, [/*long*/ end]) {
@@ -19024,8 +14223,12 @@
     return _subarray_2(start);
   }
 
+
+  /** @domName Int16Array.subarray_1 */
   Int16Array _subarray_1(start, end) native "Int16Array_subarray_1_Callback";
 
+
+  /** @domName Int16Array.subarray_2 */
   Int16Array _subarray_2(start) native "Int16Array_subarray_2_Callback";
 
 }
@@ -19036,7 +14239,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Int32Array
-abstract class Int32Array implements ArrayBufferView, List<int> {
+class Int32Array extends ArrayBufferView implements List<int> {
 
   factory Int32Array(int length) =>
     _TypedArrayFactoryProvider.createInt32Array(length);
@@ -19046,30 +14249,20 @@
 
   factory Int32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createInt32Array_fromBuffer(buffer, byteOffset, length);
+  Int32Array.internal(): super.internal();
 
   static const int BYTES_PER_ELEMENT = 4;
 
+
   /** @domName Int32Array.length */
-  int get length;
-
-  /** @domName Int32Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Int32Array.subarray */
-  Int32Array subarray(int start, [int end]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _Int32ArrayImpl extends _ArrayBufferViewImpl implements Int32Array {
-
   int get length native "Int32Array_length_Getter";
 
+
+  /** @domName Int32Array.numericIndexGetter */
   int operator[](int index) native "Int32Array_numericIndexGetter_Callback";
 
+
+  /** @domName Int32Array.numericIndexSetter */
   void operator[]=(int index, int value) native "Int32Array_numericIndexSetter_Callback";
   // -- start List<int> mixins.
   // int is the element type.
@@ -19149,6 +14342,8 @@
 
   // -- end List<int> mixins.
 
+
+  /** @domName Int32Array.setElements */
   void setElements(Object array, [int offset]) native "Int32Array_setElements_Callback";
 
   Int32Array subarray(/*long*/ start, [/*long*/ end]) {
@@ -19158,8 +14353,12 @@
     return _subarray_2(start);
   }
 
+
+  /** @domName Int32Array.subarray_1 */
   Int32Array _subarray_1(start, end) native "Int32Array_subarray_1_Callback";
 
+
+  /** @domName Int32Array.subarray_2 */
   Int32Array _subarray_2(start) native "Int32Array_subarray_2_Callback";
 
 }
@@ -19170,7 +14369,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Int8Array
-abstract class Int8Array implements ArrayBufferView, List<int> {
+class Int8Array extends ArrayBufferView implements List<int> {
 
   factory Int8Array(int length) =>
     _TypedArrayFactoryProvider.createInt8Array(length);
@@ -19180,30 +14379,20 @@
 
   factory Int8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createInt8Array_fromBuffer(buffer, byteOffset, length);
+  Int8Array.internal(): super.internal();
 
   static const int BYTES_PER_ELEMENT = 1;
 
+
   /** @domName Int8Array.length */
-  int get length;
-
-  /** @domName Int8Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Int8Array.subarray */
-  Int8Array subarray(int start, [int end]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _Int8ArrayImpl extends _ArrayBufferViewImpl implements Int8Array {
-
   int get length native "Int8Array_length_Getter";
 
+
+  /** @domName Int8Array.numericIndexGetter */
   int operator[](int index) native "Int8Array_numericIndexGetter_Callback";
 
+
+  /** @domName Int8Array.numericIndexSetter */
   void operator[]=(int index, int value) native "Int8Array_numericIndexSetter_Callback";
   // -- start List<int> mixins.
   // int is the element type.
@@ -19283,6 +14472,8 @@
 
   // -- end List<int> mixins.
 
+
+  /** @domName Int8Array.setElements */
   void setElements(Object array, [int offset]) native "Int8Array_setElements_Callback";
 
   Int8Array subarray(/*long*/ start, [/*long*/ end]) {
@@ -19292,8 +14483,12 @@
     return _subarray_2(start);
   }
 
+
+  /** @domName Int8Array.subarray_1 */
   Int8Array _subarray_1(start, end) native "Int8Array_subarray_1_Callback";
 
+
+  /** @domName Int8Array.subarray_2 */
   Int8Array _subarray_2(start) native "Int8Array_subarray_2_Callback";
 
 }
@@ -19304,7 +14499,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName JavaScriptCallFrame
-abstract class JavaScriptCallFrame {
+class JavaScriptCallFrame extends NativeFieldWrapperClass1 {
+  JavaScriptCallFrame.internal();
 
   static const int CATCH_SCOPE = 4;
 
@@ -19316,67 +14512,48 @@
 
   static const int WITH_SCOPE = 2;
 
+
   /** @domName JavaScriptCallFrame.caller */
-  JavaScriptCallFrame get caller;
-
-  /** @domName JavaScriptCallFrame.column */
-  int get column;
-
-  /** @domName JavaScriptCallFrame.functionName */
-  String get functionName;
-
-  /** @domName JavaScriptCallFrame.line */
-  int get line;
-
-  /** @domName JavaScriptCallFrame.scopeChain */
-  List get scopeChain;
-
-  /** @domName JavaScriptCallFrame.sourceID */
-  int get sourceID;
-
-  /** @domName JavaScriptCallFrame.thisObject */
-  Object get thisObject;
-
-  /** @domName JavaScriptCallFrame.type */
-  String get type;
-
-  /** @domName JavaScriptCallFrame.evaluate */
-  void evaluate(String script);
-
-  /** @domName JavaScriptCallFrame.restart */
-  Object restart();
-
-  /** @domName JavaScriptCallFrame.scopeType */
-  int scopeType(int scopeIndex);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _JavaScriptCallFrameImpl extends NativeFieldWrapperClass1 implements JavaScriptCallFrame {
-
   JavaScriptCallFrame get caller native "JavaScriptCallFrame_caller_Getter";
 
+
+  /** @domName JavaScriptCallFrame.column */
   int get column native "JavaScriptCallFrame_column_Getter";
 
+
+  /** @domName JavaScriptCallFrame.functionName */
   String get functionName native "JavaScriptCallFrame_functionName_Getter";
 
+
+  /** @domName JavaScriptCallFrame.line */
   int get line native "JavaScriptCallFrame_line_Getter";
 
+
+  /** @domName JavaScriptCallFrame.scopeChain */
   List get scopeChain native "JavaScriptCallFrame_scopeChain_Getter";
 
+
+  /** @domName JavaScriptCallFrame.sourceID */
   int get sourceID native "JavaScriptCallFrame_sourceID_Getter";
 
+
+  /** @domName JavaScriptCallFrame.thisObject */
   Object get thisObject native "JavaScriptCallFrame_thisObject_Getter";
 
+
+  /** @domName JavaScriptCallFrame.type */
   String get type native "JavaScriptCallFrame_type_Getter";
 
+
+  /** @domName JavaScriptCallFrame.evaluate */
   void evaluate(String script) native "JavaScriptCallFrame_evaluate_Callback";
 
+
+  /** @domName JavaScriptCallFrame.restart */
   Object restart() native "JavaScriptCallFrame_restart_Callback";
 
+
+  /** @domName JavaScriptCallFrame.scopeType */
   int scopeType(int scopeIndex) native "JavaScriptCallFrame_scopeType_Callback";
 
 }
@@ -19387,54 +14564,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName KeyboardEvent
-abstract class KeyboardEvent implements UIEvent {
+class KeyboardEvent extends UIEvent {
+  KeyboardEvent.internal(): super.internal();
+
 
   /** @domName KeyboardEvent.altGraphKey */
-  bool get altGraphKey;
-
-  /** @domName KeyboardEvent.altKey */
-  bool get altKey;
-
-  /** @domName KeyboardEvent.ctrlKey */
-  bool get ctrlKey;
-
-  /** @domName KeyboardEvent.keyIdentifier */
-  String get keyIdentifier;
-
-  /** @domName KeyboardEvent.keyLocation */
-  int get keyLocation;
-
-  /** @domName KeyboardEvent.metaKey */
-  bool get metaKey;
-
-  /** @domName KeyboardEvent.shiftKey */
-  bool get shiftKey;
-
-  /** @domName KeyboardEvent.initKeyboardEvent */
-  void initKeyboardEvent(String type, bool canBubble, bool cancelable, LocalWindow view, String keyIdentifier, int keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _KeyboardEventImpl extends _UIEventImpl implements KeyboardEvent {
-
   bool get altGraphKey native "KeyboardEvent_altGraphKey_Getter";
 
+
+  /** @domName KeyboardEvent.altKey */
   bool get altKey native "KeyboardEvent_altKey_Getter";
 
+
+  /** @domName KeyboardEvent.ctrlKey */
   bool get ctrlKey native "KeyboardEvent_ctrlKey_Getter";
 
+
+  /** @domName KeyboardEvent.keyIdentifier */
   String get keyIdentifier native "KeyboardEvent_keyIdentifier_Getter";
 
+
+  /** @domName KeyboardEvent.keyLocation */
   int get keyLocation native "KeyboardEvent_keyLocation_Getter";
 
+
+  /** @domName KeyboardEvent.metaKey */
   bool get metaKey native "KeyboardEvent_metaKey_Getter";
 
+
+  /** @domName KeyboardEvent.shiftKey */
   bool get shiftKey native "KeyboardEvent_shiftKey_Getter";
 
+
+  /** @domName KeyboardEvent.initKeyboardEvent */
   void initKeyboardEvent(String type, bool canBubble, bool cancelable, LocalWindow view, String keyIdentifier, int keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback";
 
 }
@@ -19445,91 +14607,81 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLKeygenElement
-abstract class KeygenElement implements Element {
+class KeygenElement extends _Element_Merged {
 
   factory KeygenElement() => _Elements.createKeygenElement();
+  KeygenElement.internal(): super.internal();
+
 
   /** @domName HTMLKeygenElement.autofocus */
-  bool autofocus;
-
-  /** @domName HTMLKeygenElement.challenge */
-  String challenge;
-
-  /** @domName HTMLKeygenElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLKeygenElement.form */
-  FormElement get form;
-
-  /** @domName HTMLKeygenElement.keytype */
-  String keytype;
-
-  /** @domName HTMLKeygenElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLKeygenElement.name */
-  String name;
-
-  /** @domName HTMLKeygenElement.type */
-  String get type;
-
-  /** @domName HTMLKeygenElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLKeygenElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLKeygenElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLKeygenElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLKeygenElement.setCustomValidity */
-  void setCustomValidity(String error);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _KeygenElementImpl extends _ElementImpl_Merged implements KeygenElement {
-
   bool get autofocus native "HTMLKeygenElement_autofocus_Getter";
 
+
+  /** @domName HTMLKeygenElement.autofocus */
   void set autofocus(bool value) native "HTMLKeygenElement_autofocus_Setter";
 
+
+  /** @domName HTMLKeygenElement.challenge */
   String get challenge native "HTMLKeygenElement_challenge_Getter";
 
+
+  /** @domName HTMLKeygenElement.challenge */
   void set challenge(String value) native "HTMLKeygenElement_challenge_Setter";
 
+
+  /** @domName HTMLKeygenElement.disabled */
   bool get disabled native "HTMLKeygenElement_disabled_Getter";
 
+
+  /** @domName HTMLKeygenElement.disabled */
   void set disabled(bool value) native "HTMLKeygenElement_disabled_Setter";
 
+
+  /** @domName HTMLKeygenElement.form */
   FormElement get form native "HTMLKeygenElement_form_Getter";
 
+
+  /** @domName HTMLKeygenElement.keytype */
   String get keytype native "HTMLKeygenElement_keytype_Getter";
 
+
+  /** @domName HTMLKeygenElement.keytype */
   void set keytype(String value) native "HTMLKeygenElement_keytype_Setter";
 
+
+  /** @domName HTMLKeygenElement.labels */
   List<Node> get labels native "HTMLKeygenElement_labels_Getter";
 
+
+  /** @domName HTMLKeygenElement.name */
   String get name native "HTMLKeygenElement_name_Getter";
 
+
+  /** @domName HTMLKeygenElement.name */
   void set name(String value) native "HTMLKeygenElement_name_Setter";
 
+
+  /** @domName HTMLKeygenElement.type */
   String get type native "HTMLKeygenElement_type_Getter";
 
+
+  /** @domName HTMLKeygenElement.validationMessage */
   String get validationMessage native "HTMLKeygenElement_validationMessage_Getter";
 
+
+  /** @domName HTMLKeygenElement.validity */
   ValidityState get validity native "HTMLKeygenElement_validity_Getter";
 
+
+  /** @domName HTMLKeygenElement.willValidate */
   bool get willValidate native "HTMLKeygenElement_willValidate_Getter";
 
+
+  /** @domName HTMLKeygenElement.checkValidity */
   bool checkValidity() native "HTMLKeygenElement_checkValidity_Callback";
 
+
+  /** @domName HTMLKeygenElement.setCustomValidity */
   void setCustomValidity(String error) native "HTMLKeygenElement_setCustomValidity_Callback";
 
 }
@@ -19540,30 +14692,25 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLLIElement
-abstract class LIElement implements Element {
+class LIElement extends _Element_Merged {
 
   factory LIElement() => _Elements.createLIElement();
+  LIElement.internal(): super.internal();
+
 
   /** @domName HTMLLIElement.type */
-  String type;
-
-  /** @domName HTMLLIElement.value */
-  int value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _LIElementImpl extends _ElementImpl_Merged implements LIElement {
-
   String get type native "HTMLLIElement_type_Getter";
 
+
+  /** @domName HTMLLIElement.type */
   void set type(String value) native "HTMLLIElement_type_Setter";
 
+
+  /** @domName HTMLLIElement.value */
   int get value native "HTMLLIElement_value_Getter";
 
+
+  /** @domName HTMLLIElement.value */
   void set value(int value) native "HTMLLIElement_value_Setter";
 
 }
@@ -19574,33 +14721,25 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLLabelElement
-abstract class LabelElement implements Element {
+class LabelElement extends _Element_Merged {
 
   factory LabelElement() => _Elements.createLabelElement();
+  LabelElement.internal(): super.internal();
+
 
   /** @domName HTMLLabelElement.control */
-  Element get control;
-
-  /** @domName HTMLLabelElement.form */
-  FormElement get form;
-
-  /** @domName HTMLLabelElement.htmlFor */
-  String htmlFor;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _LabelElementImpl extends _ElementImpl_Merged implements LabelElement {
-
   Element get control native "HTMLLabelElement_control_Getter";
 
+
+  /** @domName HTMLLabelElement.form */
   FormElement get form native "HTMLLabelElement_form_Getter";
 
+
+  /** @domName HTMLLabelElement.htmlFor */
   String get htmlFor native "HTMLLabelElement_htmlFor_Getter";
 
+
+  /** @domName HTMLLabelElement.htmlFor */
   void set htmlFor(String value) native "HTMLLabelElement_htmlFor_Setter";
 
 }
@@ -19611,28 +14750,21 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLLegendElement
-abstract class LegendElement implements Element {
+class LegendElement extends _Element_Merged {
 
   factory LegendElement() => _Elements.createLegendElement();
+  LegendElement.internal(): super.internal();
+
 
   /** @domName HTMLLegendElement.align */
-  String align;
-
-  /** @domName HTMLLegendElement.form */
-  FormElement get form;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _LegendElementImpl extends _ElementImpl_Merged implements LegendElement {
-
   String get align native "HTMLLegendElement_align_Getter";
 
+
+  /** @domName HTMLLegendElement.align */
   void set align(String value) native "HTMLLegendElement_align_Setter";
 
+
+  /** @domName HTMLLegendElement.form */
   FormElement get form native "HTMLLegendElement_form_Getter";
 
 }
@@ -19643,91 +14775,93 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLLinkElement
-abstract class LinkElement implements Element {
+class LinkElement extends _Element_Merged {
 
   factory LinkElement() => _Elements.createLinkElement();
+  LinkElement.internal(): super.internal();
+
 
   /** @domName HTMLLinkElement.charset */
-  String charset;
-
-  /** @domName HTMLLinkElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLLinkElement.href */
-  String href;
-
-  /** @domName HTMLLinkElement.hreflang */
-  String hreflang;
-
-  /** @domName HTMLLinkElement.media */
-  String media;
-
-  /** @domName HTMLLinkElement.rel */
-  String rel;
-
-  /** @domName HTMLLinkElement.rev */
-  String rev;
-
-  /** @domName HTMLLinkElement.sheet */
-  StyleSheet get sheet;
-
-  /** @domName HTMLLinkElement.sizes */
-  DOMSettableTokenList sizes;
-
-  /** @domName HTMLLinkElement.target */
-  String target;
-
-  /** @domName HTMLLinkElement.type */
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _LinkElementImpl extends _ElementImpl_Merged implements LinkElement {
-
   String get charset native "HTMLLinkElement_charset_Getter";
 
+
+  /** @domName HTMLLinkElement.charset */
   void set charset(String value) native "HTMLLinkElement_charset_Setter";
 
+
+  /** @domName HTMLLinkElement.disabled */
   bool get disabled native "HTMLLinkElement_disabled_Getter";
 
+
+  /** @domName HTMLLinkElement.disabled */
   void set disabled(bool value) native "HTMLLinkElement_disabled_Setter";
 
+
+  /** @domName HTMLLinkElement.href */
   String get href native "HTMLLinkElement_href_Getter";
 
+
+  /** @domName HTMLLinkElement.href */
   void set href(String value) native "HTMLLinkElement_href_Setter";
 
+
+  /** @domName HTMLLinkElement.hreflang */
   String get hreflang native "HTMLLinkElement_hreflang_Getter";
 
+
+  /** @domName HTMLLinkElement.hreflang */
   void set hreflang(String value) native "HTMLLinkElement_hreflang_Setter";
 
+
+  /** @domName HTMLLinkElement.media */
   String get media native "HTMLLinkElement_media_Getter";
 
+
+  /** @domName HTMLLinkElement.media */
   void set media(String value) native "HTMLLinkElement_media_Setter";
 
+
+  /** @domName HTMLLinkElement.rel */
   String get rel native "HTMLLinkElement_rel_Getter";
 
+
+  /** @domName HTMLLinkElement.rel */
   void set rel(String value) native "HTMLLinkElement_rel_Setter";
 
+
+  /** @domName HTMLLinkElement.rev */
   String get rev native "HTMLLinkElement_rev_Getter";
 
+
+  /** @domName HTMLLinkElement.rev */
   void set rev(String value) native "HTMLLinkElement_rev_Setter";
 
+
+  /** @domName HTMLLinkElement.sheet */
   StyleSheet get sheet native "HTMLLinkElement_sheet_Getter";
 
+
+  /** @domName HTMLLinkElement.sizes */
   DOMSettableTokenList get sizes native "HTMLLinkElement_sizes_Getter";
 
+
+  /** @domName HTMLLinkElement.sizes */
   void set sizes(DOMSettableTokenList value) native "HTMLLinkElement_sizes_Setter";
 
+
+  /** @domName HTMLLinkElement.target */
   String get target native "HTMLLinkElement_target_Getter";
 
+
+  /** @domName HTMLLinkElement.target */
   void set target(String value) native "HTMLLinkElement_target_Setter";
 
+
+  /** @domName HTMLLinkElement.type */
   String get type native "HTMLLinkElement_type_Getter";
 
+
+  /** @domName HTMLLinkElement.type */
   void set type(String value) native "HTMLLinkElement_type_Setter";
 
 }
@@ -19738,49 +14872,35 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName History
-abstract class LocalHistory implements History {
+class LocalHistory extends NativeFieldWrapperClass1 implements History {
+  LocalHistory.internal();
+
 
   /** @domName History.length */
-  int get length;
-
-  /** @domName History.state */
-  dynamic get state;
-
-  /** @domName History.back */
-  void back();
-
-  /** @domName History.forward */
-  void forward();
-
-  /** @domName History.go */
-  void go(int distance);
-
-  /** @domName History.pushState */
-  void pushState(Object data, String title, [String url]);
-
-  /** @domName History.replaceState */
-  void replaceState(Object data, String title, [String url]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _LocalHistoryImpl extends NativeFieldWrapperClass1 implements LocalHistory {
-
   int get length native "History_length_Getter";
 
+
+  /** @domName History.state */
   dynamic get state native "History_state_Getter";
 
+
+  /** @domName History.back */
   void back() native "History_back_Callback";
 
+
+  /** @domName History.forward */
   void forward() native "History_forward_Callback";
 
+
+  /** @domName History.go */
   void go(int distance) native "History_go_Callback";
 
+
+  /** @domName History.pushState */
   void pushState(Object data, String title, [String url]) native "History_pushState_Callback";
 
+
+  /** @domName History.replaceState */
   void replaceState(Object data, String title, [String url]) native "History_replaceState_Callback";
 
 }
@@ -19791,100 +14911,95 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Location
-abstract class LocalLocation implements Location {
+class LocalLocation extends NativeFieldWrapperClass1 implements Location {
+  LocalLocation.internal();
+
 
   /** @domName Location.ancestorOrigins */
-  List<String> get ancestorOrigins;
-
-  /** @domName Location.hash */
-  String hash;
-
-  /** @domName Location.host */
-  String host;
-
-  /** @domName Location.hostname */
-  String hostname;
-
-  /** @domName Location.href */
-  String href;
-
-  /** @domName Location.origin */
-  String get origin;
-
-  /** @domName Location.pathname */
-  String pathname;
-
-  /** @domName Location.port */
-  String port;
-
-  /** @domName Location.protocol */
-  String protocol;
-
-  /** @domName Location.search */
-  String search;
-
-  /** @domName Location.assign */
-  void assign(String url);
-
-  /** @domName Location.reload */
-  void reload();
-
-  /** @domName Location.replace */
-  void replace(String url);
-
-  /** @domName Location.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _LocalLocationImpl extends NativeFieldWrapperClass1 implements LocalLocation {
-
   List<String> get ancestorOrigins native "Location_ancestorOrigins_Getter";
 
+
+  /** @domName Location.hash */
   String get hash native "Location_hash_Getter";
 
+
+  /** @domName Location.hash */
   void set hash(String value) native "Location_hash_Setter";
 
+
+  /** @domName Location.host */
   String get host native "Location_host_Getter";
 
+
+  /** @domName Location.host */
   void set host(String value) native "Location_host_Setter";
 
+
+  /** @domName Location.hostname */
   String get hostname native "Location_hostname_Getter";
 
+
+  /** @domName Location.hostname */
   void set hostname(String value) native "Location_hostname_Setter";
 
+
+  /** @domName Location.href */
   String get href native "Location_href_Getter";
 
+
+  /** @domName Location.href */
   void set href(String value) native "Location_href_Setter";
 
+
+  /** @domName Location.origin */
   String get origin native "Location_origin_Getter";
 
+
+  /** @domName Location.pathname */
   String get pathname native "Location_pathname_Getter";
 
+
+  /** @domName Location.pathname */
   void set pathname(String value) native "Location_pathname_Setter";
 
+
+  /** @domName Location.port */
   String get port native "Location_port_Getter";
 
+
+  /** @domName Location.port */
   void set port(String value) native "Location_port_Setter";
 
+
+  /** @domName Location.protocol */
   String get protocol native "Location_protocol_Getter";
 
+
+  /** @domName Location.protocol */
   void set protocol(String value) native "Location_protocol_Setter";
 
+
+  /** @domName Location.search */
   String get search native "Location_search_Getter";
 
+
+  /** @domName Location.search */
   void set search(String value) native "Location_search_Setter";
 
+
+  /** @domName Location.assign */
   void assign(String url) native "Location_assign_Callback";
 
+
+  /** @domName Location.reload */
   void reload() native "Location_reload_Callback";
 
+
+  /** @domName Location.replace */
   void replace(String url) native "Location_replace_Callback";
 
+
+  /** @domName Location.toString */
   String toString() native "Location_toString_Callback";
 
 }
@@ -19895,726 +15010,452 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName LocalMediaStream
-abstract class LocalMediaStream implements MediaStream, EventTarget {
+class LocalMediaStream extends MediaStream implements EventTarget {
+  LocalMediaStream.internal(): super.internal();
+
 
   /** @domName LocalMediaStream.stop */
-  void stop();
+  void stop() native "LocalMediaStream_stop_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-class _LocalMediaStreamImpl extends _MediaStreamImpl implements LocalMediaStream {
-
-  void stop() native "LocalMediaStream_stop_Callback";
-
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName Window
-abstract class LocalWindow implements EventTarget, Window {
-
-  /**
-   * Register a [port] on this window under the given [name].  This
-   * port may be retrieved by any isolate (or JavaScript script)
-   * running in this window.
-   */
-  void registerPort(String name, SendPortSync port);
-
-  /**
-   * Lookup a port by its [name].  Return null if no port is
-   * registered under [name].
-   */
-  SendPortSync lookupPort(String name);
+class LocalWindow extends EventTarget implements Window {
 
   /**
    * Executes a [callback] after the next batch of browser layout measurements
    * has completed or would have completed if any browser layout measurements
    * had been scheduled.
    */
-  void requestLayoutFrame(TimeoutHandler callback);
-
-  /**
-   * Creates a new object URL for the specified object. The URL will be
-   * available until revokeObjectUrl is called.
-   * [object] can be a Blob, MediaStream or MediaSource.
-   */
-  String createObjectUrl(object);
-
-  /** @domName DOMURL.revokeObjectURL */
-  void revokeObjectUrl(String objectUrl);
-
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  LocalWindowEvents get on;
-
-  static const int PERSISTENT = 1;
-
-  static const int TEMPORARY = 0;
-
-  /** @domName Window.applicationCache */
-  DOMApplicationCache get applicationCache;
-
-  /** @domName Window.clientInformation */
-  Navigator get clientInformation;
-
-  /** @domName Window.closed */
-  bool get closed;
-
-  /** @domName Window.console */
-  Console get console;
-
-  /** @domName Window.crypto */
-  Crypto get crypto;
-
-  /** @domName Window.defaultStatus */
-  String defaultStatus;
-
-  /** @domName Window.defaultstatus */
-  String defaultstatus;
-
-  /** @domName Window.devicePixelRatio */
-  num get devicePixelRatio;
-
-  /** @domName Window.document */
-  Document get document;
-
-  /** @domName Window.event */
-  Event get event;
-
-  /** @domName Window.history */
-  LocalHistory get history;
-
-  /** @domName DOMWindow.indexedDB */
-  IDBFactory get indexedDB;
-
-  /** @domName Window.innerHeight */
-  int get innerHeight;
-
-  /** @domName Window.innerWidth */
-  int get innerWidth;
-
-  /** @domName Window.localStorage */
-  Storage get localStorage;
-
-  /** @domName Window.location */
-  LocalLocation location;
-
-  /** @domName Window.locationbar */
-  BarInfo get locationbar;
-
-  /** @domName Window.menubar */
-  BarInfo get menubar;
-
-  /** @domName Window.name */
-  String name;
-
-  /** @domName Window.navigator */
-  Navigator get navigator;
-
-  /** @domName Window.offscreenBuffering */
-  bool get offscreenBuffering;
-
-  /** @domName Window.opener */
-  Window get opener;
-
-  /** @domName Window.outerHeight */
-  int get outerHeight;
-
-  /** @domName Window.outerWidth */
-  int get outerWidth;
-
-  /** @domName DOMWindow.pagePopupController */
-  PagePopupController get pagePopupController;
-
-  /** @domName Window.pageXOffset */
-  int get pageXOffset;
-
-  /** @domName Window.pageYOffset */
-  int get pageYOffset;
-
-  /** @domName Window.parent */
-  Window get parent;
-
-  /** @domName Window.performance */
-  Performance get performance;
-
-  /** @domName Window.personalbar */
-  BarInfo get personalbar;
-
-  /** @domName Window.screen */
-  Screen get screen;
-
-  /** @domName Window.screenLeft */
-  int get screenLeft;
-
-  /** @domName Window.screenTop */
-  int get screenTop;
-
-  /** @domName Window.screenX */
-  int get screenX;
-
-  /** @domName Window.screenY */
-  int get screenY;
-
-  /** @domName Window.scrollX */
-  int get scrollX;
-
-  /** @domName Window.scrollY */
-  int get scrollY;
-
-  /** @domName Window.scrollbars */
-  BarInfo get scrollbars;
-
-  /** @domName Window.self */
-  Window get self;
-
-  /** @domName Window.sessionStorage */
-  Storage get sessionStorage;
-
-  /** @domName Window.status */
-  String status;
-
-  /** @domName Window.statusbar */
-  BarInfo get statusbar;
-
-  /** @domName Window.styleMedia */
-  StyleMedia get styleMedia;
-
-  /** @domName Window.toolbar */
-  BarInfo get toolbar;
-
-  /** @domName Window.top */
-  Window get top;
-
-  /** @domName DOMWindow.webkitIndexedDB */
-  IDBFactory get webkitIndexedDB;
-
-  /** @domName DOMWindow.webkitNotifications */
-  NotificationCenter get webkitNotifications;
-
-  /** @domName DOMWindow.webkitStorageInfo */
-  StorageInfo get webkitStorageInfo;
-
-  /** @domName Window.window */
-  Window get window;
-
-  /** @domName Window.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Window.alert */
-  void alert(String message);
-
-  /** @domName Window.atob */
-  String atob(String string);
-
-  /** @domName Window.blur */
-  void blur();
-
-  /** @domName Window.btoa */
-  String btoa(String string);
-
-  /** @domName Window.cancelAnimationFrame */
-  void cancelAnimationFrame(int id);
-
-  /** @domName Window.captureEvents */
-  void captureEvents();
-
-  /** @domName Window.clearInterval */
-  void clearInterval(int handle);
-
-  /** @domName Window.clearTimeout */
-  void clearTimeout(int handle);
-
-  /** @domName Window.close */
-  void close();
-
-  /** @domName Window.confirm */
-  bool confirm(String message);
-
-  /** @domName Window.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName Window.find */
-  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog);
-
-  /** @domName Window.focus */
-  void focus();
-
-  /** @domName Window.getComputedStyle */
-  CSSStyleDeclaration $dom_getComputedStyle(Element element, String pseudoElement);
-
-  /** @domName Window.getMatchedCSSRules */
-  List<CSSRule> getMatchedCSSRules(Element element, String pseudoElement);
-
-  /** @domName Window.getSelection */
-  DOMSelection getSelection();
-
-  /** @domName Window.matchMedia */
-  MediaQueryList matchMedia(String query);
-
-  /** @domName Window.moveBy */
-  void moveBy(num x, num y);
-
-  /** @domName Window.moveTo */
-  void moveTo(num x, num y);
-
-  /** @domName Window.open */
-  Window open(String url, String name, [String options]);
-
-  /** @domName DOMWindow.openDatabase */
-  Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]);
-
-  /** @domName Window.postMessage */
-  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]);
-
-  /** @domName Window.print */
-  void print();
-
-  /** @domName Window.prompt */
-  String prompt(String message, String defaultValue);
-
-  /** @domName Window.releaseEvents */
-  void releaseEvents();
-
-  /** @domName Window.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Window.requestAnimationFrame */
-  int requestAnimationFrame(RequestAnimationFrameCallback callback);
-
-  /** @domName Window.resizeBy */
-  void resizeBy(num x, num y);
-
-  /** @domName Window.resizeTo */
-  void resizeTo(num width, num height);
-
-  /** @domName Window.scroll */
-  void scroll(int x, int y);
-
-  /** @domName Window.scrollBy */
-  void scrollBy(int x, int y);
-
-  /** @domName Window.scrollTo */
-  void scrollTo(int x, int y);
-
-  /** @domName Window.setInterval */
-  int setInterval(TimeoutHandler handler, int timeout);
-
-  /** @domName Window.setTimeout */
-  int setTimeout(TimeoutHandler handler, int timeout);
-
-  /** @domName Window.showModalDialog */
-  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]);
-
-  /** @domName Window.stop */
-  void stop();
-
-  /** @domName Window.webkitCancelAnimationFrame */
-  void webkitCancelAnimationFrame(int id);
-
-  /** @domName Window.webkitConvertPointFromNodeToPage */
-  Point webkitConvertPointFromNodeToPage(Node node, Point p);
-
-  /** @domName Window.webkitConvertPointFromPageToNode */
-  Point webkitConvertPointFromPageToNode(Node node, Point p);
-
-  /** @domName Window.webkitRequestAnimationFrame */
-  int webkitRequestAnimationFrame(RequestAnimationFrameCallback callback);
-
-  /** @domName DOMWindow.webkitRequestFileSystem */
-  void webkitRequestFileSystem(int type, int size, FileSystemCallback successCallback, [ErrorCallback errorCallback]);
-
-  /** @domName DOMWindow.webkitResolveLocalFileSystemURL */
-  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]);
-
-}
-
-abstract class LocalWindowEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get beforeUnload;
-
-  EventListenerList get blur;
-
-  EventListenerList get canPlay;
-
-  EventListenerList get canPlayThrough;
-
-  EventListenerList get change;
-
-  EventListenerList get click;
-
-  EventListenerList get contextMenu;
-
-  EventListenerList get doubleClick;
-
-  EventListenerList get deviceMotion;
-
-  EventListenerList get deviceOrientation;
-
-  EventListenerList get drag;
-
-  EventListenerList get dragEnd;
-
-  EventListenerList get dragEnter;
-
-  EventListenerList get dragLeave;
-
-  EventListenerList get dragOver;
-
-  EventListenerList get dragStart;
-
-  EventListenerList get drop;
-
-  EventListenerList get durationChange;
-
-  EventListenerList get emptied;
-
-  EventListenerList get ended;
-
-  EventListenerList get error;
-
-  EventListenerList get focus;
-
-  EventListenerList get hashChange;
-
-  EventListenerList get input;
-
-  EventListenerList get invalid;
-
-  EventListenerList get keyDown;
-
-  EventListenerList get keyPress;
-
-  EventListenerList get keyUp;
-
-  EventListenerList get load;
-
-  EventListenerList get loadedData;
-
-  EventListenerList get loadedMetadata;
-
-  EventListenerList get loadStart;
-
-  EventListenerList get message;
-
-  EventListenerList get mouseDown;
-
-  EventListenerList get mouseMove;
-
-  EventListenerList get mouseOut;
-
-  EventListenerList get mouseOver;
-
-  EventListenerList get mouseUp;
-
-  EventListenerList get mouseWheel;
-
-  EventListenerList get offline;
-
-  EventListenerList get online;
-
-  EventListenerList get pageHide;
-
-  EventListenerList get pageShow;
-
-  EventListenerList get pause;
-
-  EventListenerList get play;
-
-  EventListenerList get playing;
-
-  EventListenerList get popState;
-
-  EventListenerList get progress;
-
-  EventListenerList get rateChange;
-
-  EventListenerList get reset;
-
-  EventListenerList get resize;
-
-  EventListenerList get scroll;
-
-  EventListenerList get search;
-
-  EventListenerList get seeked;
-
-  EventListenerList get seeking;
-
-  EventListenerList get select;
-
-  EventListenerList get stalled;
-
-  EventListenerList get storage;
-
-  EventListenerList get submit;
-
-  EventListenerList get suspend;
-
-  EventListenerList get timeUpdate;
-
-  EventListenerList get touchCancel;
-
-  EventListenerList get touchEnd;
-
-  EventListenerList get touchMove;
-
-  EventListenerList get touchStart;
-
-  EventListenerList get unload;
-
-  EventListenerList get volumeChange;
-
-  EventListenerList get waiting;
-
-  EventListenerList get animationEnd;
-
-  EventListenerList get animationIteration;
-
-  EventListenerList get animationStart;
-
-  EventListenerList get transitionEnd;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _LocalWindowImpl extends _EventTargetImpl implements LocalWindow {
-
   void requestLayoutFrame(TimeoutHandler callback) {
     _addMeasurementFrameCallback(callback);
   }
 
-  // TODO(kasperl): Document these.
+  /**
+   * Lookup a port by its [name].  Return null if no port is
+   * registered under [name].
+   */
   lookupPort(String name) {
     var port = JSON.parse(localStorage['dart-port:$name']);
     return _deserialize(port);
   }
 
+  /**
+   * Register a [port] on this window under the given [name].  This
+   * port may be retrieved by any isolate (or JavaScript script)
+   * running in this window.
+   */
   registerPort(String name, var port) {
     var serialized = _serialize(port);
     localStorage['dart-port:$name'] = JSON.stringify(serialized);
   }
 
-  String createObjectUrl(object) => DOMURL.createObjectURL(object);
-  void revokeObjectUrl(String url) {
-    DOMURL.revokeObjectURL(url);
-  }
+  LocalWindow.internal(): super.internal();
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  LocalWindowEvents get on =>
+    new LocalWindowEvents(this);
+
+  static const int PERSISTENT = 1;
+
+  static const int TEMPORARY = 0;
 
 
-  _LocalWindowEventsImpl get on =>
-    new _LocalWindowEventsImpl(this);
-
+  /** @domName DOMWindow.applicationCache */
   DOMApplicationCache get applicationCache native "DOMWindow_applicationCache_Getter";
 
+
+  /** @domName DOMWindow.clientInformation */
   Navigator get clientInformation native "DOMWindow_clientInformation_Getter";
 
+
+  /** @domName DOMWindow.closed */
   bool get closed native "DOMWindow_closed_Getter";
 
+
+  /** @domName DOMWindow.console */
   Console get console native "DOMWindow_console_Getter";
 
+
+  /** @domName DOMWindow.crypto */
   Crypto get crypto native "DOMWindow_crypto_Getter";
 
+
+  /** @domName DOMWindow.defaultStatus */
   String get defaultStatus native "DOMWindow_defaultStatus_Getter";
 
+
+  /** @domName DOMWindow.defaultStatus */
   void set defaultStatus(String value) native "DOMWindow_defaultStatus_Setter";
 
+
+  /** @domName DOMWindow.defaultstatus */
   String get defaultstatus native "DOMWindow_defaultstatus_Getter";
 
+
+  /** @domName DOMWindow.defaultstatus */
   void set defaultstatus(String value) native "DOMWindow_defaultstatus_Setter";
 
+
+  /** @domName DOMWindow.devicePixelRatio */
   num get devicePixelRatio native "DOMWindow_devicePixelRatio_Getter";
 
+
+  /** @domName DOMWindow.document */
   Document get document native "DOMWindow_document_Getter";
 
+
+  /** @domName DOMWindow.event */
   Event get event native "DOMWindow_event_Getter";
 
+
+  /** @domName DOMWindow.history */
   LocalHistory get history native "DOMWindow_history_Getter";
 
+
+  /** @domName DOMWindow.indexedDB */
   IDBFactory get indexedDB native "DOMWindow_indexedDB_Getter";
 
+
+  /** @domName DOMWindow.innerHeight */
   int get innerHeight native "DOMWindow_innerHeight_Getter";
 
+
+  /** @domName DOMWindow.innerWidth */
   int get innerWidth native "DOMWindow_innerWidth_Getter";
 
+
+  /** @domName DOMWindow.localStorage */
   Storage get localStorage native "DOMWindow_localStorage_Getter";
 
+
+  /** @domName DOMWindow.location */
   LocalLocation get location native "DOMWindow_location_Getter";
 
+
+  /** @domName DOMWindow.location */
   void set location(LocalLocation value) native "DOMWindow_location_Setter";
 
+
+  /** @domName DOMWindow.locationbar */
   BarInfo get locationbar native "DOMWindow_locationbar_Getter";
 
+
+  /** @domName DOMWindow.menubar */
   BarInfo get menubar native "DOMWindow_menubar_Getter";
 
+
+  /** @domName DOMWindow.name */
   String get name native "DOMWindow_name_Getter";
 
+
+  /** @domName DOMWindow.name */
   void set name(String value) native "DOMWindow_name_Setter";
 
+
+  /** @domName DOMWindow.navigator */
   Navigator get navigator native "DOMWindow_navigator_Getter";
 
+
+  /** @domName DOMWindow.offscreenBuffering */
   bool get offscreenBuffering native "DOMWindow_offscreenBuffering_Getter";
 
+
+  /** @domName DOMWindow.opener */
   Window get opener native "DOMWindow_opener_Getter";
 
+
+  /** @domName DOMWindow.outerHeight */
   int get outerHeight native "DOMWindow_outerHeight_Getter";
 
+
+  /** @domName DOMWindow.outerWidth */
   int get outerWidth native "DOMWindow_outerWidth_Getter";
 
+
+  /** @domName DOMWindow.pagePopupController */
   PagePopupController get pagePopupController native "DOMWindow_pagePopupController_Getter";
 
+
+  /** @domName DOMWindow.pageXOffset */
   int get pageXOffset native "DOMWindow_pageXOffset_Getter";
 
+
+  /** @domName DOMWindow.pageYOffset */
   int get pageYOffset native "DOMWindow_pageYOffset_Getter";
 
+
+  /** @domName DOMWindow.parent */
   Window get parent native "DOMWindow_parent_Getter";
 
+
+  /** @domName DOMWindow.performance */
   Performance get performance native "DOMWindow_performance_Getter";
 
+
+  /** @domName DOMWindow.personalbar */
   BarInfo get personalbar native "DOMWindow_personalbar_Getter";
 
+
+  /** @domName DOMWindow.screen */
   Screen get screen native "DOMWindow_screen_Getter";
 
+
+  /** @domName DOMWindow.screenLeft */
   int get screenLeft native "DOMWindow_screenLeft_Getter";
 
+
+  /** @domName DOMWindow.screenTop */
   int get screenTop native "DOMWindow_screenTop_Getter";
 
+
+  /** @domName DOMWindow.screenX */
   int get screenX native "DOMWindow_screenX_Getter";
 
+
+  /** @domName DOMWindow.screenY */
   int get screenY native "DOMWindow_screenY_Getter";
 
+
+  /** @domName DOMWindow.scrollX */
   int get scrollX native "DOMWindow_scrollX_Getter";
 
+
+  /** @domName DOMWindow.scrollY */
   int get scrollY native "DOMWindow_scrollY_Getter";
 
+
+  /** @domName DOMWindow.scrollbars */
   BarInfo get scrollbars native "DOMWindow_scrollbars_Getter";
 
+
+  /** @domName DOMWindow.self */
   Window get self native "DOMWindow_self_Getter";
 
+
+  /** @domName DOMWindow.sessionStorage */
   Storage get sessionStorage native "DOMWindow_sessionStorage_Getter";
 
+
+  /** @domName DOMWindow.status */
   String get status native "DOMWindow_status_Getter";
 
+
+  /** @domName DOMWindow.status */
   void set status(String value) native "DOMWindow_status_Setter";
 
+
+  /** @domName DOMWindow.statusbar */
   BarInfo get statusbar native "DOMWindow_statusbar_Getter";
 
+
+  /** @domName DOMWindow.styleMedia */
   StyleMedia get styleMedia native "DOMWindow_styleMedia_Getter";
 
+
+  /** @domName DOMWindow.toolbar */
   BarInfo get toolbar native "DOMWindow_toolbar_Getter";
 
+
+  /** @domName DOMWindow.top */
   Window get top native "DOMWindow_top_Getter";
 
+
+  /** @domName DOMWindow.webkitIndexedDB */
   IDBFactory get webkitIndexedDB native "DOMWindow_webkitIndexedDB_Getter";
 
+
+  /** @domName DOMWindow.webkitNotifications */
   NotificationCenter get webkitNotifications native "DOMWindow_webkitNotifications_Getter";
 
+
+  /** @domName DOMWindow.webkitStorageInfo */
   StorageInfo get webkitStorageInfo native "DOMWindow_webkitStorageInfo_Getter";
 
+
+  /** @domName DOMWindow.window */
   Window get window native "DOMWindow_window_Getter";
 
+
+  /** @domName DOMWindow.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMWindow_addEventListener_Callback";
 
+
+  /** @domName DOMWindow.alert */
   void alert(String message) native "DOMWindow_alert_Callback";
 
+
+  /** @domName DOMWindow.atob */
   String atob(String string) native "DOMWindow_atob_Callback";
 
+
+  /** @domName DOMWindow.blur */
   void blur() native "DOMWindow_blur_Callback";
 
+
+  /** @domName DOMWindow.btoa */
   String btoa(String string) native "DOMWindow_btoa_Callback";
 
+
+  /** @domName DOMWindow.cancelAnimationFrame */
   void cancelAnimationFrame(int id) native "DOMWindow_cancelAnimationFrame_Callback";
 
+
+  /** @domName DOMWindow.captureEvents */
   void captureEvents() native "DOMWindow_captureEvents_Callback";
 
+
+  /** @domName DOMWindow.clearInterval */
   void clearInterval(int handle) native "DOMWindow_clearInterval_Callback";
 
+
+  /** @domName DOMWindow.clearTimeout */
   void clearTimeout(int handle) native "DOMWindow_clearTimeout_Callback";
 
+
+  /** @domName DOMWindow.close */
   void close() native "DOMWindow_close_Callback";
 
+
+  /** @domName DOMWindow.confirm */
   bool confirm(String message) native "DOMWindow_confirm_Callback";
 
+
+  /** @domName DOMWindow.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "DOMWindow_dispatchEvent_Callback";
 
+
+  /** @domName DOMWindow.find */
   bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native "DOMWindow_find_Callback";
 
+
+  /** @domName DOMWindow.focus */
   void focus() native "DOMWindow_focus_Callback";
 
+
+  /** @domName DOMWindow.getComputedStyle */
   CSSStyleDeclaration $dom_getComputedStyle(Element element, String pseudoElement) native "DOMWindow_getComputedStyle_Callback";
 
+
+  /** @domName DOMWindow.getMatchedCSSRules */
   List<CSSRule> getMatchedCSSRules(Element element, String pseudoElement) native "DOMWindow_getMatchedCSSRules_Callback";
 
+
+  /** @domName DOMWindow.getSelection */
   DOMSelection getSelection() native "DOMWindow_getSelection_Callback";
 
+
+  /** @domName DOMWindow.matchMedia */
   MediaQueryList matchMedia(String query) native "DOMWindow_matchMedia_Callback";
 
+
+  /** @domName DOMWindow.moveBy */
   void moveBy(num x, num y) native "DOMWindow_moveBy_Callback";
 
+
+  /** @domName DOMWindow.moveTo */
   void moveTo(num x, num y) native "DOMWindow_moveTo_Callback";
 
+
+  /** @domName DOMWindow.open */
   Window open(String url, String name, [String options]) native "DOMWindow_open_Callback";
 
+
+  /** @domName DOMWindow.openDatabase */
   Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "DOMWindow_openDatabase_Callback";
 
+
+  /** @domName DOMWindow.postMessage */
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) native "DOMWindow_postMessage_Callback";
 
+
+  /** @domName DOMWindow.print */
   void print() native "DOMWindow_print_Callback";
 
+
+  /** @domName DOMWindow.prompt */
   String prompt(String message, String defaultValue) native "DOMWindow_prompt_Callback";
 
+
+  /** @domName DOMWindow.releaseEvents */
   void releaseEvents() native "DOMWindow_releaseEvents_Callback";
 
+
+  /** @domName DOMWindow.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMWindow_removeEventListener_Callback";
 
+
+  /** @domName DOMWindow.requestAnimationFrame */
   int requestAnimationFrame(RequestAnimationFrameCallback callback) native "DOMWindow_requestAnimationFrame_Callback";
 
+
+  /** @domName DOMWindow.resizeBy */
   void resizeBy(num x, num y) native "DOMWindow_resizeBy_Callback";
 
+
+  /** @domName DOMWindow.resizeTo */
   void resizeTo(num width, num height) native "DOMWindow_resizeTo_Callback";
 
+
+  /** @domName DOMWindow.scroll */
   void scroll(int x, int y) native "DOMWindow_scroll_Callback";
 
+
+  /** @domName DOMWindow.scrollBy */
   void scrollBy(int x, int y) native "DOMWindow_scrollBy_Callback";
 
+
+  /** @domName DOMWindow.scrollTo */
   void scrollTo(int x, int y) native "DOMWindow_scrollTo_Callback";
 
+
+  /** @domName DOMWindow.setInterval */
   int setInterval(TimeoutHandler handler, int timeout) native "DOMWindow_setInterval_Callback";
 
+
+  /** @domName DOMWindow.setTimeout */
   int setTimeout(TimeoutHandler handler, int timeout) native "DOMWindow_setTimeout_Callback";
 
+
+  /** @domName DOMWindow.showModalDialog */
   Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native "DOMWindow_showModalDialog_Callback";
 
+
+  /** @domName DOMWindow.stop */
   void stop() native "DOMWindow_stop_Callback";
 
+
+  /** @domName DOMWindow.webkitCancelAnimationFrame */
   void webkitCancelAnimationFrame(int id) native "DOMWindow_webkitCancelAnimationFrame_Callback";
 
+
+  /** @domName DOMWindow.webkitConvertPointFromNodeToPage */
   Point webkitConvertPointFromNodeToPage(Node node, Point p) native "DOMWindow_webkitConvertPointFromNodeToPage_Callback";
 
+
+  /** @domName DOMWindow.webkitConvertPointFromPageToNode */
   Point webkitConvertPointFromPageToNode(Node node, Point p) native "DOMWindow_webkitConvertPointFromPageToNode_Callback";
 
+
+  /** @domName DOMWindow.webkitRequestAnimationFrame */
   int webkitRequestAnimationFrame(RequestAnimationFrameCallback callback) native "DOMWindow_webkitRequestAnimationFrame_Callback";
 
+
+  /** @domName DOMWindow.webkitRequestFileSystem */
   void webkitRequestFileSystem(int type, int size, FileSystemCallback successCallback, [ErrorCallback errorCallback]) native "DOMWindow_webkitRequestFileSystem_Callback";
 
+
+  /** @domName DOMWindow.webkitResolveLocalFileSystemURL */
   void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native "DOMWindow_webkitResolveLocalFileSystemURL_Callback";
 
 }
 
-class _LocalWindowEventsImpl extends _EventsImpl implements LocalWindowEvents {
-  _LocalWindowEventsImpl(_ptr) : super(_ptr);
+class LocalWindowEvents extends Events {
+  LocalWindowEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get abort => this['abort'];
 
@@ -20769,28 +15610,21 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLMapElement
-abstract class MapElement implements Element {
+class MapElement extends _Element_Merged {
 
   factory MapElement() => _Elements.createMapElement();
+  MapElement.internal(): super.internal();
+
 
   /** @domName HTMLMapElement.areas */
-  HTMLCollection get areas;
-
-  /** @domName HTMLMapElement.name */
-  String name;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MapElementImpl extends _ElementImpl_Merged implements MapElement {
-
   HTMLCollection get areas native "HTMLMapElement_areas_Getter";
 
+
+  /** @domName HTMLMapElement.name */
   String get name native "HTMLMapElement_name_Getter";
 
+
+  /** @domName HTMLMapElement.name */
   void set name(String value) native "HTMLMapElement_name_Setter";
 
 }
@@ -20801,101 +15635,103 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLMarqueeElement
-abstract class MarqueeElement implements Element {
+class MarqueeElement extends _Element_Merged {
+  MarqueeElement.internal(): super.internal();
+
 
   /** @domName HTMLMarqueeElement.behavior */
-  String behavior;
-
-  /** @domName HTMLMarqueeElement.bgColor */
-  String bgColor;
-
-  /** @domName HTMLMarqueeElement.direction */
-  String direction;
-
-  /** @domName HTMLMarqueeElement.height */
-  String height;
-
-  /** @domName HTMLMarqueeElement.hspace */
-  int hspace;
-
-  /** @domName HTMLMarqueeElement.loop */
-  int loop;
-
-  /** @domName HTMLMarqueeElement.scrollAmount */
-  int scrollAmount;
-
-  /** @domName HTMLMarqueeElement.scrollDelay */
-  int scrollDelay;
-
-  /** @domName HTMLMarqueeElement.trueSpeed */
-  bool trueSpeed;
-
-  /** @domName HTMLMarqueeElement.vspace */
-  int vspace;
-
-  /** @domName HTMLMarqueeElement.width */
-  String width;
-
-  /** @domName HTMLMarqueeElement.start */
-  void start();
-
-  /** @domName HTMLMarqueeElement.stop */
-  void stop();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MarqueeElementImpl extends _ElementImpl_Merged implements MarqueeElement {
-
   String get behavior native "HTMLMarqueeElement_behavior_Getter";
 
+
+  /** @domName HTMLMarqueeElement.behavior */
   void set behavior(String value) native "HTMLMarqueeElement_behavior_Setter";
 
+
+  /** @domName HTMLMarqueeElement.bgColor */
   String get bgColor native "HTMLMarqueeElement_bgColor_Getter";
 
+
+  /** @domName HTMLMarqueeElement.bgColor */
   void set bgColor(String value) native "HTMLMarqueeElement_bgColor_Setter";
 
+
+  /** @domName HTMLMarqueeElement.direction */
   String get direction native "HTMLMarqueeElement_direction_Getter";
 
+
+  /** @domName HTMLMarqueeElement.direction */
   void set direction(String value) native "HTMLMarqueeElement_direction_Setter";
 
+
+  /** @domName HTMLMarqueeElement.height */
   String get height native "HTMLMarqueeElement_height_Getter";
 
+
+  /** @domName HTMLMarqueeElement.height */
   void set height(String value) native "HTMLMarqueeElement_height_Setter";
 
+
+  /** @domName HTMLMarqueeElement.hspace */
   int get hspace native "HTMLMarqueeElement_hspace_Getter";
 
+
+  /** @domName HTMLMarqueeElement.hspace */
   void set hspace(int value) native "HTMLMarqueeElement_hspace_Setter";
 
+
+  /** @domName HTMLMarqueeElement.loop */
   int get loop native "HTMLMarqueeElement_loop_Getter";
 
+
+  /** @domName HTMLMarqueeElement.loop */
   void set loop(int value) native "HTMLMarqueeElement_loop_Setter";
 
+
+  /** @domName HTMLMarqueeElement.scrollAmount */
   int get scrollAmount native "HTMLMarqueeElement_scrollAmount_Getter";
 
+
+  /** @domName HTMLMarqueeElement.scrollAmount */
   void set scrollAmount(int value) native "HTMLMarqueeElement_scrollAmount_Setter";
 
+
+  /** @domName HTMLMarqueeElement.scrollDelay */
   int get scrollDelay native "HTMLMarqueeElement_scrollDelay_Getter";
 
+
+  /** @domName HTMLMarqueeElement.scrollDelay */
   void set scrollDelay(int value) native "HTMLMarqueeElement_scrollDelay_Setter";
 
+
+  /** @domName HTMLMarqueeElement.trueSpeed */
   bool get trueSpeed native "HTMLMarqueeElement_trueSpeed_Getter";
 
+
+  /** @domName HTMLMarqueeElement.trueSpeed */
   void set trueSpeed(bool value) native "HTMLMarqueeElement_trueSpeed_Setter";
 
+
+  /** @domName HTMLMarqueeElement.vspace */
   int get vspace native "HTMLMarqueeElement_vspace_Getter";
 
+
+  /** @domName HTMLMarqueeElement.vspace */
   void set vspace(int value) native "HTMLMarqueeElement_vspace_Setter";
 
+
+  /** @domName HTMLMarqueeElement.width */
   String get width native "HTMLMarqueeElement_width_Getter";
 
+
+  /** @domName HTMLMarqueeElement.width */
   void set width(String value) native "HTMLMarqueeElement_width_Setter";
 
+
+  /** @domName HTMLMarqueeElement.start */
   void start() native "HTMLMarqueeElement_start_Callback";
 
+
+  /** @domName HTMLMarqueeElement.stop */
   void stop() native "HTMLMarqueeElement_stop_Callback";
 
 }
@@ -20906,101 +15742,89 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MediaController
-abstract class MediaController implements EventTarget {
+class MediaController extends EventTarget {
 
   factory MediaController() => _MediaControllerFactoryProvider.createMediaController();
+  MediaController.internal(): super.internal();
+
 
   /** @domName MediaController.buffered */
-  TimeRanges get buffered;
-
-  /** @domName MediaController.currentTime */
-  num currentTime;
-
-  /** @domName MediaController.defaultPlaybackRate */
-  num defaultPlaybackRate;
-
-  /** @domName MediaController.duration */
-  num get duration;
-
-  /** @domName MediaController.muted */
-  bool muted;
-
-  /** @domName MediaController.paused */
-  bool get paused;
-
-  /** @domName MediaController.playbackRate */
-  num playbackRate;
-
-  /** @domName MediaController.played */
-  TimeRanges get played;
-
-  /** @domName MediaController.seekable */
-  TimeRanges get seekable;
-
-  /** @domName MediaController.volume */
-  num volume;
-
-  /** @domName MediaController.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MediaController.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName MediaController.pause */
-  void pause();
-
-  /** @domName MediaController.play */
-  void play();
-
-  /** @domName MediaController.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaControllerImpl extends _EventTargetImpl implements MediaController {
-
   TimeRanges get buffered native "MediaController_buffered_Getter";
 
+
+  /** @domName MediaController.currentTime */
   num get currentTime native "MediaController_currentTime_Getter";
 
+
+  /** @domName MediaController.currentTime */
   void set currentTime(num value) native "MediaController_currentTime_Setter";
 
+
+  /** @domName MediaController.defaultPlaybackRate */
   num get defaultPlaybackRate native "MediaController_defaultPlaybackRate_Getter";
 
+
+  /** @domName MediaController.defaultPlaybackRate */
   void set defaultPlaybackRate(num value) native "MediaController_defaultPlaybackRate_Setter";
 
+
+  /** @domName MediaController.duration */
   num get duration native "MediaController_duration_Getter";
 
+
+  /** @domName MediaController.muted */
   bool get muted native "MediaController_muted_Getter";
 
+
+  /** @domName MediaController.muted */
   void set muted(bool value) native "MediaController_muted_Setter";
 
+
+  /** @domName MediaController.paused */
   bool get paused native "MediaController_paused_Getter";
 
+
+  /** @domName MediaController.playbackRate */
   num get playbackRate native "MediaController_playbackRate_Getter";
 
+
+  /** @domName MediaController.playbackRate */
   void set playbackRate(num value) native "MediaController_playbackRate_Setter";
 
+
+  /** @domName MediaController.played */
   TimeRanges get played native "MediaController_played_Getter";
 
+
+  /** @domName MediaController.seekable */
   TimeRanges get seekable native "MediaController_seekable_Getter";
 
+
+  /** @domName MediaController.volume */
   num get volume native "MediaController_volume_Getter";
 
+
+  /** @domName MediaController.volume */
   void set volume(num value) native "MediaController_volume_Setter";
 
+
+  /** @domName MediaController.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_addEventListener_Callback";
 
+
+  /** @domName MediaController.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "MediaController_dispatchEvent_Callback";
 
+
+  /** @domName MediaController.pause */
   void pause() native "MediaController_pause_Callback";
 
+
+  /** @domName MediaController.play */
   void play() native "MediaController_play_Callback";
 
+
+  /** @domName MediaController.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_removeEventListener_Callback";
 
 }
@@ -21011,12 +15835,14 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLMediaElement
-abstract class MediaElement implements Element {
+class MediaElement extends _Element_Merged {
+  MediaElement.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  MediaElementEvents get on;
+  MediaElementEvents get on =>
+    new MediaElementEvents(this);
 
   static const int HAVE_CURRENT_DATA = 2;
 
@@ -21036,305 +15862,192 @@
 
   static const int NETWORK_NO_SOURCE = 3;
 
+
   /** @domName HTMLMediaElement.autoplay */
-  bool autoplay;
-
-  /** @domName HTMLMediaElement.buffered */
-  TimeRanges get buffered;
-
-  /** @domName HTMLMediaElement.controller */
-  MediaController controller;
-
-  /** @domName HTMLMediaElement.controls */
-  bool controls;
-
-  /** @domName HTMLMediaElement.currentSrc */
-  String get currentSrc;
-
-  /** @domName HTMLMediaElement.currentTime */
-  num currentTime;
-
-  /** @domName HTMLMediaElement.defaultMuted */
-  bool defaultMuted;
-
-  /** @domName HTMLMediaElement.defaultPlaybackRate */
-  num defaultPlaybackRate;
-
-  /** @domName HTMLMediaElement.duration */
-  num get duration;
-
-  /** @domName HTMLMediaElement.ended */
-  bool get ended;
-
-  /** @domName HTMLMediaElement.error */
-  MediaError get error;
-
-  /** @domName HTMLMediaElement.initialTime */
-  num get initialTime;
-
-  /** @domName HTMLMediaElement.loop */
-  bool loop;
-
-  /** @domName HTMLMediaElement.mediaGroup */
-  String mediaGroup;
-
-  /** @domName HTMLMediaElement.muted */
-  bool muted;
-
-  /** @domName HTMLMediaElement.networkState */
-  int get networkState;
-
-  /** @domName HTMLMediaElement.paused */
-  bool get paused;
-
-  /** @domName HTMLMediaElement.playbackRate */
-  num playbackRate;
-
-  /** @domName HTMLMediaElement.played */
-  TimeRanges get played;
-
-  /** @domName HTMLMediaElement.preload */
-  String preload;
-
-  /** @domName HTMLMediaElement.readyState */
-  int get readyState;
-
-  /** @domName HTMLMediaElement.seekable */
-  TimeRanges get seekable;
-
-  /** @domName HTMLMediaElement.seeking */
-  bool get seeking;
-
-  /** @domName HTMLMediaElement.src */
-  String src;
-
-  /** @domName HTMLMediaElement.startTime */
-  num get startTime;
-
-  /** @domName HTMLMediaElement.textTracks */
-  TextTrackList get textTracks;
-
-  /** @domName HTMLMediaElement.volume */
-  num volume;
-
-  /** @domName HTMLMediaElement.webkitAudioDecodedByteCount */
-  int get webkitAudioDecodedByteCount;
-
-  /** @domName HTMLMediaElement.webkitClosedCaptionsVisible */
-  bool webkitClosedCaptionsVisible;
-
-  /** @domName HTMLMediaElement.webkitHasClosedCaptions */
-  bool get webkitHasClosedCaptions;
-
-  /** @domName HTMLMediaElement.webkitPreservesPitch */
-  bool webkitPreservesPitch;
-
-  /** @domName HTMLMediaElement.webkitVideoDecodedByteCount */
-  int get webkitVideoDecodedByteCount;
-
-  /** @domName HTMLMediaElement.addTextTrack */
-  TextTrack addTextTrack(String kind, [String label, String language]);
-
-  /** @domName HTMLMediaElement.canPlayType */
-  String canPlayType(String type, String keySystem);
-
-  /** @domName HTMLMediaElement.load */
-  void load();
-
-  /** @domName HTMLMediaElement.pause */
-  void pause();
-
-  /** @domName HTMLMediaElement.play */
-  void play();
-
-  /** @domName HTMLMediaElement.webkitAddKey */
-  void webkitAddKey(String keySystem, Uint8Array key, [Uint8Array initData, String sessionId]);
-
-  /** @domName HTMLMediaElement.webkitCancelKeyRequest */
-  void webkitCancelKeyRequest(String keySystem, String sessionId);
-
-  /** @domName HTMLMediaElement.webkitGenerateKeyRequest */
-  void webkitGenerateKeyRequest(String keySystem, [Uint8Array initData]);
-}
-
-abstract class MediaElementEvents implements ElementEvents {
-
-  EventListenerList get canPlay;
-
-  EventListenerList get canPlayThrough;
-
-  EventListenerList get durationChange;
-
-  EventListenerList get emptied;
-
-  EventListenerList get ended;
-
-  EventListenerList get loadedData;
-
-  EventListenerList get loadedMetadata;
-
-  EventListenerList get loadStart;
-
-  EventListenerList get pause;
-
-  EventListenerList get play;
-
-  EventListenerList get playing;
-
-  EventListenerList get progress;
-
-  EventListenerList get rateChange;
-
-  EventListenerList get seeked;
-
-  EventListenerList get seeking;
-
-  EventListenerList get show;
-
-  EventListenerList get stalled;
-
-  EventListenerList get suspend;
-
-  EventListenerList get timeUpdate;
-
-  EventListenerList get volumeChange;
-
-  EventListenerList get waiting;
-
-  EventListenerList get keyAdded;
-
-  EventListenerList get keyError;
-
-  EventListenerList get keyMessage;
-
-  EventListenerList get needKey;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaElementAudioSourceNode
-abstract class MediaElementAudioSourceNode implements AudioSourceNode {
-
-  /** @domName MediaElementAudioSourceNode.mediaElement */
-  MediaElement get mediaElement;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaElementAudioSourceNodeImpl extends _AudioSourceNodeImpl implements MediaElementAudioSourceNode {
-
-  MediaElement get mediaElement native "MediaElementAudioSourceNode_mediaElement_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaElementImpl extends _ElementImpl_Merged implements MediaElement {
-
-  _MediaElementEventsImpl get on =>
-    new _MediaElementEventsImpl(this);
-
   bool get autoplay native "HTMLMediaElement_autoplay_Getter";
 
+
+  /** @domName HTMLMediaElement.autoplay */
   void set autoplay(bool value) native "HTMLMediaElement_autoplay_Setter";
 
+
+  /** @domName HTMLMediaElement.buffered */
   TimeRanges get buffered native "HTMLMediaElement_buffered_Getter";
 
+
+  /** @domName HTMLMediaElement.controller */
   MediaController get controller native "HTMLMediaElement_controller_Getter";
 
+
+  /** @domName HTMLMediaElement.controller */
   void set controller(MediaController value) native "HTMLMediaElement_controller_Setter";
 
+
+  /** @domName HTMLMediaElement.controls */
   bool get controls native "HTMLMediaElement_controls_Getter";
 
+
+  /** @domName HTMLMediaElement.controls */
   void set controls(bool value) native "HTMLMediaElement_controls_Setter";
 
+
+  /** @domName HTMLMediaElement.currentSrc */
   String get currentSrc native "HTMLMediaElement_currentSrc_Getter";
 
+
+  /** @domName HTMLMediaElement.currentTime */
   num get currentTime native "HTMLMediaElement_currentTime_Getter";
 
+
+  /** @domName HTMLMediaElement.currentTime */
   void set currentTime(num value) native "HTMLMediaElement_currentTime_Setter";
 
+
+  /** @domName HTMLMediaElement.defaultMuted */
   bool get defaultMuted native "HTMLMediaElement_defaultMuted_Getter";
 
+
+  /** @domName HTMLMediaElement.defaultMuted */
   void set defaultMuted(bool value) native "HTMLMediaElement_defaultMuted_Setter";
 
+
+  /** @domName HTMLMediaElement.defaultPlaybackRate */
   num get defaultPlaybackRate native "HTMLMediaElement_defaultPlaybackRate_Getter";
 
+
+  /** @domName HTMLMediaElement.defaultPlaybackRate */
   void set defaultPlaybackRate(num value) native "HTMLMediaElement_defaultPlaybackRate_Setter";
 
+
+  /** @domName HTMLMediaElement.duration */
   num get duration native "HTMLMediaElement_duration_Getter";
 
+
+  /** @domName HTMLMediaElement.ended */
   bool get ended native "HTMLMediaElement_ended_Getter";
 
+
+  /** @domName HTMLMediaElement.error */
   MediaError get error native "HTMLMediaElement_error_Getter";
 
+
+  /** @domName HTMLMediaElement.initialTime */
   num get initialTime native "HTMLMediaElement_initialTime_Getter";
 
+
+  /** @domName HTMLMediaElement.loop */
   bool get loop native "HTMLMediaElement_loop_Getter";
 
+
+  /** @domName HTMLMediaElement.loop */
   void set loop(bool value) native "HTMLMediaElement_loop_Setter";
 
+
+  /** @domName HTMLMediaElement.mediaGroup */
   String get mediaGroup native "HTMLMediaElement_mediaGroup_Getter";
 
+
+  /** @domName HTMLMediaElement.mediaGroup */
   void set mediaGroup(String value) native "HTMLMediaElement_mediaGroup_Setter";
 
+
+  /** @domName HTMLMediaElement.muted */
   bool get muted native "HTMLMediaElement_muted_Getter";
 
+
+  /** @domName HTMLMediaElement.muted */
   void set muted(bool value) native "HTMLMediaElement_muted_Setter";
 
+
+  /** @domName HTMLMediaElement.networkState */
   int get networkState native "HTMLMediaElement_networkState_Getter";
 
+
+  /** @domName HTMLMediaElement.paused */
   bool get paused native "HTMLMediaElement_paused_Getter";
 
+
+  /** @domName HTMLMediaElement.playbackRate */
   num get playbackRate native "HTMLMediaElement_playbackRate_Getter";
 
+
+  /** @domName HTMLMediaElement.playbackRate */
   void set playbackRate(num value) native "HTMLMediaElement_playbackRate_Setter";
 
+
+  /** @domName HTMLMediaElement.played */
   TimeRanges get played native "HTMLMediaElement_played_Getter";
 
+
+  /** @domName HTMLMediaElement.preload */
   String get preload native "HTMLMediaElement_preload_Getter";
 
+
+  /** @domName HTMLMediaElement.preload */
   void set preload(String value) native "HTMLMediaElement_preload_Setter";
 
+
+  /** @domName HTMLMediaElement.readyState */
   int get readyState native "HTMLMediaElement_readyState_Getter";
 
+
+  /** @domName HTMLMediaElement.seekable */
   TimeRanges get seekable native "HTMLMediaElement_seekable_Getter";
 
+
+  /** @domName HTMLMediaElement.seeking */
   bool get seeking native "HTMLMediaElement_seeking_Getter";
 
+
+  /** @domName HTMLMediaElement.src */
   String get src native "HTMLMediaElement_src_Getter";
 
+
+  /** @domName HTMLMediaElement.src */
   void set src(String value) native "HTMLMediaElement_src_Setter";
 
+
+  /** @domName HTMLMediaElement.startTime */
   num get startTime native "HTMLMediaElement_startTime_Getter";
 
+
+  /** @domName HTMLMediaElement.textTracks */
   TextTrackList get textTracks native "HTMLMediaElement_textTracks_Getter";
 
+
+  /** @domName HTMLMediaElement.volume */
   num get volume native "HTMLMediaElement_volume_Getter";
 
+
+  /** @domName HTMLMediaElement.volume */
   void set volume(num value) native "HTMLMediaElement_volume_Setter";
 
+
+  /** @domName HTMLMediaElement.webkitAudioDecodedByteCount */
   int get webkitAudioDecodedByteCount native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";
 
+
+  /** @domName HTMLMediaElement.webkitClosedCaptionsVisible */
   bool get webkitClosedCaptionsVisible native "HTMLMediaElement_webkitClosedCaptionsVisible_Getter";
 
+
+  /** @domName HTMLMediaElement.webkitClosedCaptionsVisible */
   void set webkitClosedCaptionsVisible(bool value) native "HTMLMediaElement_webkitClosedCaptionsVisible_Setter";
 
+
+  /** @domName HTMLMediaElement.webkitHasClosedCaptions */
   bool get webkitHasClosedCaptions native "HTMLMediaElement_webkitHasClosedCaptions_Getter";
 
+
+  /** @domName HTMLMediaElement.webkitPreservesPitch */
   bool get webkitPreservesPitch native "HTMLMediaElement_webkitPreservesPitch_Getter";
 
+
+  /** @domName HTMLMediaElement.webkitPreservesPitch */
   void set webkitPreservesPitch(bool value) native "HTMLMediaElement_webkitPreservesPitch_Setter";
 
+
+  /** @domName HTMLMediaElement.webkitVideoDecodedByteCount */
   int get webkitVideoDecodedByteCount native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
 
   TextTrack addTextTrack(/*DOMString*/ kind, [/*DOMString*/ label, /*DOMString*/ language]) {
@@ -21347,18 +16060,32 @@
     return _addTextTrack_3(kind);
   }
 
+
+  /** @domName HTMLMediaElement.addTextTrack_1 */
   TextTrack _addTextTrack_1(kind, label, language) native "HTMLMediaElement_addTextTrack_1_Callback";
 
+
+  /** @domName HTMLMediaElement.addTextTrack_2 */
   TextTrack _addTextTrack_2(kind, label) native "HTMLMediaElement_addTextTrack_2_Callback";
 
+
+  /** @domName HTMLMediaElement.addTextTrack_3 */
   TextTrack _addTextTrack_3(kind) native "HTMLMediaElement_addTextTrack_3_Callback";
 
+
+  /** @domName HTMLMediaElement.canPlayType */
   String canPlayType(String type, String keySystem) native "HTMLMediaElement_canPlayType_Callback";
 
+
+  /** @domName HTMLMediaElement.load */
   void load() native "HTMLMediaElement_load_Callback";
 
+
+  /** @domName HTMLMediaElement.pause */
   void pause() native "HTMLMediaElement_pause_Callback";
 
+
+  /** @domName HTMLMediaElement.play */
   void play() native "HTMLMediaElement_play_Callback";
 
   void webkitAddKey(/*DOMString*/ keySystem, /*Uint8Array*/ key, [/*Uint8Array*/ initData, /*DOMString*/ sessionId]) {
@@ -21369,10 +16096,16 @@
     _webkitAddKey_2(keySystem, key);
   }
 
+
+  /** @domName HTMLMediaElement.webkitAddKey_1 */
   void _webkitAddKey_1(keySystem, key, initData, sessionId) native "HTMLMediaElement_webkitAddKey_1_Callback";
 
+
+  /** @domName HTMLMediaElement.webkitAddKey_2 */
   void _webkitAddKey_2(keySystem, key) native "HTMLMediaElement_webkitAddKey_2_Callback";
 
+
+  /** @domName HTMLMediaElement.webkitCancelKeyRequest */
   void webkitCancelKeyRequest(String keySystem, String sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
 
   void webkitGenerateKeyRequest(/*DOMString*/ keySystem, [/*Uint8Array*/ initData]) {
@@ -21383,14 +16116,18 @@
     _webkitGenerateKeyRequest_2(keySystem);
   }
 
+
+  /** @domName HTMLMediaElement.webkitGenerateKeyRequest_1 */
   void _webkitGenerateKeyRequest_1(keySystem, initData) native "HTMLMediaElement_webkitGenerateKeyRequest_1_Callback";
 
+
+  /** @domName HTMLMediaElement.webkitGenerateKeyRequest_2 */
   void _webkitGenerateKeyRequest_2(keySystem) native "HTMLMediaElement_webkitGenerateKeyRequest_2_Callback";
 
 }
 
-class _MediaElementEventsImpl extends _ElementEventsImpl implements MediaElementEvents {
-  _MediaElementEventsImpl(_ptr) : super(_ptr);
+class MediaElementEvents extends ElementEvents {
+  MediaElementEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get canPlay => this['canplay'];
 
@@ -21448,8 +16185,24 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName MediaElementAudioSourceNode
+class MediaElementAudioSourceNode extends AudioSourceNode {
+  MediaElementAudioSourceNode.internal(): super.internal();
+
+
+  /** @domName MediaElementAudioSourceNode.mediaElement */
+  MediaElement get mediaElement native "MediaElementAudioSourceNode_mediaElement_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName MediaError
-abstract class MediaError {
+class MediaError extends NativeFieldWrapperClass1 {
+  MediaError.internal();
 
   static const int MEDIA_ERR_ABORTED = 1;
 
@@ -21461,17 +16214,8 @@
 
   static const int MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
 
+
   /** @domName MediaError.code */
-  int get code;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaErrorImpl extends NativeFieldWrapperClass1 implements MediaError {
-
   int get code native "MediaError_code_Getter";
 
 }
@@ -21482,7 +16226,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MediaKeyError
-abstract class MediaKeyError {
+class MediaKeyError extends NativeFieldWrapperClass1 {
+  MediaKeyError.internal();
 
   static const int MEDIA_KEYERR_CLIENT = 2;
 
@@ -21496,17 +16241,8 @@
 
   static const int MEDIA_KEYERR_UNKNOWN = 1;
 
+
   /** @domName MediaKeyError.code */
-  int get code;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaKeyErrorImpl extends NativeFieldWrapperClass1 implements MediaKeyError {
-
   int get code native "MediaKeyError_code_Getter";
 
 }
@@ -21517,49 +16253,35 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MediaKeyEvent
-abstract class MediaKeyEvent implements Event {
+class MediaKeyEvent extends Event {
+  MediaKeyEvent.internal(): super.internal();
+
 
   /** @domName MediaKeyEvent.defaultURL */
-  String get defaultURL;
-
-  /** @domName MediaKeyEvent.errorCode */
-  MediaKeyError get errorCode;
-
-  /** @domName MediaKeyEvent.initData */
-  Uint8Array get initData;
-
-  /** @domName MediaKeyEvent.keySystem */
-  String get keySystem;
-
-  /** @domName MediaKeyEvent.message */
-  Uint8Array get message;
-
-  /** @domName MediaKeyEvent.sessionId */
-  String get sessionId;
-
-  /** @domName MediaKeyEvent.systemCode */
-  int get systemCode;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaKeyEventImpl extends _EventImpl implements MediaKeyEvent {
-
   String get defaultURL native "MediaKeyEvent_defaultURL_Getter";
 
+
+  /** @domName MediaKeyEvent.errorCode */
   MediaKeyError get errorCode native "MediaKeyEvent_errorCode_Getter";
 
+
+  /** @domName MediaKeyEvent.initData */
   Uint8Array get initData native "MediaKeyEvent_initData_Getter";
 
+
+  /** @domName MediaKeyEvent.keySystem */
   String get keySystem native "MediaKeyEvent_keySystem_Getter";
 
+
+  /** @domName MediaKeyEvent.message */
   Uint8Array get message native "MediaKeyEvent_message_Getter";
 
+
+  /** @domName MediaKeyEvent.sessionId */
   String get sessionId native "MediaKeyEvent_sessionId_Getter";
 
+
+  /** @domName MediaKeyEvent.systemCode */
   int get systemCode native "MediaKeyEvent_systemCode_Getter";
 
 }
@@ -21570,41 +16292,31 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MediaList
-abstract class MediaList {
+class MediaList extends NativeFieldWrapperClass1 {
+  MediaList.internal();
+
 
   /** @domName MediaList.length */
-  int get length;
-
-  /** @domName MediaList.mediaText */
-  String mediaText;
-
-  /** @domName MediaList.appendMedium */
-  void appendMedium(String newMedium);
-
-  /** @domName MediaList.deleteMedium */
-  void deleteMedium(String oldMedium);
-
-  /** @domName MediaList.item */
-  String item(int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaListImpl extends NativeFieldWrapperClass1 implements MediaList {
-
   int get length native "MediaList_length_Getter";
 
+
+  /** @domName MediaList.mediaText */
   String get mediaText native "MediaList_mediaText_Getter";
 
+
+  /** @domName MediaList.mediaText */
   void set mediaText(String value) native "MediaList_mediaText_Setter";
 
+
+  /** @domName MediaList.appendMedium */
   void appendMedium(String newMedium) native "MediaList_appendMedium_Callback";
 
+
+  /** @domName MediaList.deleteMedium */
   void deleteMedium(String oldMedium) native "MediaList_deleteMedium_Callback";
 
+
+  /** @domName MediaList.item */
   String item(int index) native "MediaList_item_Callback";
 
 }
@@ -21615,34 +16327,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MediaQueryList
-abstract class MediaQueryList {
+class MediaQueryList extends NativeFieldWrapperClass1 {
+  MediaQueryList.internal();
+
 
   /** @domName MediaQueryList.matches */
-  bool get matches;
-
-  /** @domName MediaQueryList.media */
-  String get media;
-
-  /** @domName MediaQueryList.addListener */
-  void addListener(MediaQueryListListener listener);
-
-  /** @domName MediaQueryList.removeListener */
-  void removeListener(MediaQueryListListener listener);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaQueryListImpl extends NativeFieldWrapperClass1 implements MediaQueryList {
-
   bool get matches native "MediaQueryList_matches_Getter";
 
+
+  /** @domName MediaQueryList.media */
   String get media native "MediaQueryList_media_Getter";
 
+
+  /** @domName MediaQueryList.addListener */
   void addListener(MediaQueryListListener listener) native "MediaQueryList_addListener_Callback";
 
+
+  /** @domName MediaQueryList.removeListener */
   void removeListener(MediaQueryListListener listener) native "MediaQueryList_removeListener_Callback";
 
 }
@@ -21653,10 +16354,13 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MediaQueryListListener
-abstract class MediaQueryListListener {
+class MediaQueryListListener extends NativeFieldWrapperClass1 {
+  MediaQueryListListener.internal();
+
 
   /** @domName MediaQueryListListener.queryChanged */
-  void queryChanged(MediaQueryList list);
+  void queryChanged(MediaQueryList list) native "MediaQueryListListener_queryChanged_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -21665,68 +16369,53 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MediaSource
-abstract class MediaSource implements EventTarget {
+class MediaSource extends EventTarget {
 
   factory MediaSource() => _MediaSourceFactoryProvider.createMediaSource();
+  MediaSource.internal(): super.internal();
+
 
   /** @domName MediaSource.activeSourceBuffers */
-  SourceBufferList get activeSourceBuffers;
-
-  /** @domName MediaSource.duration */
-  num duration;
-
-  /** @domName MediaSource.readyState */
-  String get readyState;
-
-  /** @domName MediaSource.sourceBuffers */
-  SourceBufferList get sourceBuffers;
-
-  /** @domName MediaSource.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MediaSource.addSourceBuffer */
-  SourceBuffer addSourceBuffer(String type);
-
-  /** @domName MediaSource.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName MediaSource.endOfStream */
-  void endOfStream(String error);
-
-  /** @domName MediaSource.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MediaSource.removeSourceBuffer */
-  void removeSourceBuffer(SourceBuffer buffer);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaSourceImpl extends _EventTargetImpl implements MediaSource {
-
   SourceBufferList get activeSourceBuffers native "MediaSource_activeSourceBuffers_Getter";
 
+
+  /** @domName MediaSource.duration */
   num get duration native "MediaSource_duration_Getter";
 
+
+  /** @domName MediaSource.duration */
   void set duration(num value) native "MediaSource_duration_Setter";
 
+
+  /** @domName MediaSource.readyState */
   String get readyState native "MediaSource_readyState_Getter";
 
+
+  /** @domName MediaSource.sourceBuffers */
   SourceBufferList get sourceBuffers native "MediaSource_sourceBuffers_Getter";
 
+
+  /** @domName MediaSource.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_addEventListener_Callback";
 
+
+  /** @domName MediaSource.addSourceBuffer */
   SourceBuffer addSourceBuffer(String type) native "MediaSource_addSourceBuffer_Callback";
 
+
+  /** @domName MediaSource.dispatchEvent */
   bool $dom_dispatchEvent(Event event) native "MediaSource_dispatchEvent_Callback";
 
+
+  /** @domName MediaSource.endOfStream */
   void endOfStream(String error) native "MediaSource_endOfStream_Callback";
 
+
+  /** @domName MediaSource.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_removeEventListener_Callback";
 
+
+  /** @domName MediaSource.removeSourceBuffer */
   void removeSourceBuffer(SourceBuffer buffer) native "MediaSource_removeSourceBuffer_Callback";
 
 }
@@ -21737,44 +16426,55 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MediaStream
-abstract class MediaStream implements EventTarget {
+class MediaStream extends EventTarget {
 
   factory MediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) => _MediaStreamFactoryProvider.createMediaStream(audioTracks, videoTracks);
+  MediaStream.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  MediaStreamEvents get on;
+  MediaStreamEvents get on =>
+    new MediaStreamEvents(this);
 
   static const int ENDED = 2;
 
   static const int LIVE = 1;
 
+
   /** @domName MediaStream.audioTracks */
-  MediaStreamTrackList get audioTracks;
+  MediaStreamTrackList get audioTracks native "MediaStream_audioTracks_Getter";
+
 
   /** @domName MediaStream.label */
-  String get label;
+  String get label native "MediaStream_label_Getter";
+
 
   /** @domName MediaStream.readyState */
-  int get readyState;
+  int get readyState native "MediaStream_readyState_Getter";
+
 
   /** @domName MediaStream.videoTracks */
-  MediaStreamTrackList get videoTracks;
+  MediaStreamTrackList get videoTracks native "MediaStream_videoTracks_Getter";
+
 
   /** @domName MediaStream.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_addEventListener_Callback";
+
 
   /** @domName MediaStream.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
+  bool $dom_dispatchEvent(Event event) native "MediaStream_dispatchEvent_Callback";
+
 
   /** @domName MediaStream.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_removeEventListener_Callback";
+
 }
 
-abstract class MediaStreamEvents implements Events {
+class MediaStreamEvents extends Events {
+  MediaStreamEvents(EventTarget _ptr) : super(_ptr);
 
-  EventListenerList get ended;
+  EventListenerList get ended => this['ended'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -21783,19 +16483,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MediaStreamAudioSourceNode
-abstract class MediaStreamAudioSourceNode implements AudioSourceNode {
+class MediaStreamAudioSourceNode extends AudioSourceNode {
+  MediaStreamAudioSourceNode.internal(): super.internal();
+
 
   /** @domName MediaStreamAudioSourceNode.mediaStream */
-  MediaStream get mediaStream;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaStreamAudioSourceNodeImpl extends _AudioSourceNodeImpl implements MediaStreamAudioSourceNode {
-
   MediaStream get mediaStream native "MediaStreamAudioSourceNode_mediaStream_Getter";
 
 }
@@ -21806,19 +16498,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MediaStreamEvent
-abstract class MediaStreamEvent implements Event {
+class MediaStreamEvent extends Event {
+  MediaStreamEvent.internal(): super.internal();
+
 
   /** @domName MediaStreamEvent.stream */
-  MediaStream get stream;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaStreamEventImpl extends _EventImpl implements MediaStreamEvent {
-
   MediaStream get stream native "MediaStreamEvent_stream_Getter";
 
 }
@@ -21828,141 +16512,15 @@
 
 // WARNING: Do not edit - generated code.
 
-class _MediaStreamImpl extends _EventTargetImpl implements MediaStream {
-
-  _MediaStreamEventsImpl get on =>
-    new _MediaStreamEventsImpl(this);
-
-  MediaStreamTrackList get audioTracks native "MediaStream_audioTracks_Getter";
-
-  String get label native "MediaStream_label_Getter";
-
-  int get readyState native "MediaStream_readyState_Getter";
-
-  MediaStreamTrackList get videoTracks native "MediaStream_videoTracks_Getter";
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_addEventListener_Callback";
-
-  bool $dom_dispatchEvent(Event event) native "MediaStream_dispatchEvent_Callback";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_removeEventListener_Callback";
-
-}
-
-class _MediaStreamEventsImpl extends _EventsImpl implements MediaStreamEvents {
-  _MediaStreamEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get ended => this['ended'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaStreamListImpl extends NativeFieldWrapperClass1 implements List<MediaStream> {
-
-  int get length native "MediaStreamList_length_Getter";
-
-  MediaStream operator[](int index) native "MediaStreamList_item_Callback";
-
-  void operator[]=(int index, MediaStream value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<MediaStream> mixins.
-  // MediaStream is the element type.
-
-  // From Iterable<MediaStream>:
-
-  Iterator<MediaStream> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<MediaStream>(this);
-  }
-
-  // From Collection<MediaStream>:
-
-  void add(MediaStream value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(MediaStream value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<MediaStream> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(MediaStream element) => _Collections.contains(this, element);
-
-  void forEach(void f(MediaStream element)) => _Collections.forEach(this, f);
-
-  Collection map(f(MediaStream element)) => _Collections.map(this, [], f);
-
-  Collection<MediaStream> filter(bool f(MediaStream element)) =>
-     _Collections.filter(this, <MediaStream>[], f);
-
-  bool every(bool f(MediaStream element)) => _Collections.every(this, f);
-
-  bool some(bool f(MediaStream element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<MediaStream>:
-
-  void sort([Comparator<MediaStream> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(MediaStream element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(MediaStream element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  MediaStream get last => this[length - 1];
-
-  MediaStream removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<MediaStream> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [MediaStream initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<MediaStream> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <MediaStream>[]);
-
-  // -- end List<MediaStream> mixins.
-
-  MediaStream item(int index) native "MediaStreamList_item_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName MediaStreamTrack
-abstract class MediaStreamTrack implements EventTarget {
+class MediaStreamTrack extends EventTarget {
+  MediaStreamTrack.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  MediaStreamTrackEvents get on;
+  MediaStreamTrackEvents get on =>
+    new MediaStreamTrackEvents(this);
 
   static const int ENDED = 2;
 
@@ -21970,90 +16528,42 @@
 
   static const int MUTED = 1;
 
+
   /** @domName MediaStreamTrack.enabled */
-  bool enabled;
-
-  /** @domName MediaStreamTrack.kind */
-  String get kind;
-
-  /** @domName MediaStreamTrack.label */
-  String get label;
-
-  /** @domName MediaStreamTrack.readyState */
-  int get readyState;
-
-  /** @domName MediaStreamTrack.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MediaStreamTrack.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName MediaStreamTrack.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class MediaStreamTrackEvents implements Events {
-
-  EventListenerList get ended;
-
-  EventListenerList get mute;
-
-  EventListenerList get unmute;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName MediaStreamTrackEvent
-abstract class MediaStreamTrackEvent implements Event {
-
-  /** @domName MediaStreamTrackEvent.track */
-  MediaStreamTrack get track;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaStreamTrackEventImpl extends _EventImpl implements MediaStreamTrackEvent {
-
-  MediaStreamTrack get track native "MediaStreamTrackEvent_track_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MediaStreamTrackImpl extends _EventTargetImpl implements MediaStreamTrack {
-
-  _MediaStreamTrackEventsImpl get on =>
-    new _MediaStreamTrackEventsImpl(this);
-
   bool get enabled native "MediaStreamTrack_enabled_Getter";
 
+
+  /** @domName MediaStreamTrack.enabled */
   void set enabled(bool value) native "MediaStreamTrack_enabled_Setter";
 
+
+  /** @domName MediaStreamTrack.kind */
   String get kind native "MediaStreamTrack_kind_Getter";
 
+
+  /** @domName MediaStreamTrack.label */
   String get label native "MediaStreamTrack_label_Getter";
 
+
+  /** @domName MediaStreamTrack.readyState */
   int get readyState native "MediaStreamTrack_readyState_Getter";
 
+
+  /** @domName MediaStreamTrack.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_addEventListener_Callback";
 
+
+  /** @domName MediaStreamTrack.dispatchEvent */
   bool $dom_dispatchEvent(Event event) native "MediaStreamTrack_dispatchEvent_Callback";
 
+
+  /** @domName MediaStreamTrack.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_removeEventListener_Callback";
 
 }
 
-class _MediaStreamTrackEventsImpl extends _EventsImpl implements MediaStreamTrackEvents {
-  _MediaStreamTrackEventsImpl(_ptr) : super(_ptr);
+class MediaStreamTrackEvents extends Events {
+  MediaStreamTrackEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get ended => this['ended'];
 
@@ -22067,41 +16577,14 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName MediaStreamTrackList
-abstract class MediaStreamTrackList implements EventTarget {
+/// @domName MediaStreamTrackEvent
+class MediaStreamTrackEvent extends Event {
+  MediaStreamTrackEvent.internal(): super.internal();
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  MediaStreamTrackListEvents get on;
 
-  /** @domName MediaStreamTrackList.length */
-  int get length;
+  /** @domName MediaStreamTrackEvent.track */
+  MediaStreamTrack get track native "MediaStreamTrackEvent_track_Getter";
 
-  /** @domName MediaStreamTrackList.add */
-  void add(MediaStreamTrack track);
-
-  /** @domName MediaStreamTrackList.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MediaStreamTrackList.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName MediaStreamTrackList.item */
-  MediaStreamTrack item(int index);
-
-  /** @domName MediaStreamTrackList.remove */
-  void remove(MediaStreamTrack track);
-
-  /** @domName MediaStreamTrackList.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class MediaStreamTrackListEvents implements Events {
-
-  EventListenerList get addTrack;
-
-  EventListenerList get removeTrack;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -22109,29 +16592,48 @@
 
 // WARNING: Do not edit - generated code.
 
-class _MediaStreamTrackListImpl extends _EventTargetImpl implements MediaStreamTrackList {
+/// @domName MediaStreamTrackList
+class MediaStreamTrackList extends EventTarget {
+  MediaStreamTrackList.internal(): super.internal();
 
-  _MediaStreamTrackListEventsImpl get on =>
-    new _MediaStreamTrackListEventsImpl(this);
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  MediaStreamTrackListEvents get on =>
+    new MediaStreamTrackListEvents(this);
 
+
+  /** @domName MediaStreamTrackList.length */
   int get length native "MediaStreamTrackList_length_Getter";
 
+
+  /** @domName MediaStreamTrackList.add */
   void add(MediaStreamTrack track) native "MediaStreamTrackList_add_Callback";
 
+
+  /** @domName MediaStreamTrackList.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrackList_addEventListener_Callback";
 
+
+  /** @domName MediaStreamTrackList.dispatchEvent */
   bool $dom_dispatchEvent(Event event) native "MediaStreamTrackList_dispatchEvent_Callback";
 
+
+  /** @domName MediaStreamTrackList.item */
   MediaStreamTrack item(int index) native "MediaStreamTrackList_item_Callback";
 
+
+  /** @domName MediaStreamTrackList.remove */
   void remove(MediaStreamTrack track) native "MediaStreamTrackList_remove_Callback";
 
+
+  /** @domName MediaStreamTrackList.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrackList_removeEventListener_Callback";
 
 }
 
-class _MediaStreamTrackListEventsImpl extends _EventsImpl implements MediaStreamTrackListEvents {
-  _MediaStreamTrackListEventsImpl(_ptr) : super(_ptr);
+class MediaStreamTrackListEvents extends Events {
+  MediaStreamTrackListEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get addTrack => this['addtrack'];
 
@@ -22144,29 +16646,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MemoryInfo
-abstract class MemoryInfo {
+class MemoryInfo extends NativeFieldWrapperClass1 {
+  MemoryInfo.internal();
+
 
   /** @domName MemoryInfo.jsHeapSizeLimit */
-  int get jsHeapSizeLimit;
-
-  /** @domName MemoryInfo.totalJSHeapSize */
-  int get totalJSHeapSize;
-
-  /** @domName MemoryInfo.usedJSHeapSize */
-  int get usedJSHeapSize;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MemoryInfoImpl extends NativeFieldWrapperClass1 implements MemoryInfo {
-
   int get jsHeapSizeLimit native "MemoryInfo_jsHeapSizeLimit_Getter";
 
+
+  /** @domName MemoryInfo.totalJSHeapSize */
   int get totalJSHeapSize native "MemoryInfo_totalJSHeapSize_Getter";
 
+
+  /** @domName MemoryInfo.usedJSHeapSize */
   int get usedJSHeapSize native "MemoryInfo_usedJSHeapSize_Getter";
 
 }
@@ -22177,23 +16669,17 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLMenuElement
-abstract class MenuElement implements Element {
+class MenuElement extends _Element_Merged {
 
   factory MenuElement() => _Elements.createMenuElement();
+  MenuElement.internal(): super.internal();
+
 
   /** @domName HTMLMenuElement.compact */
-  bool compact;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MenuElementImpl extends _ElementImpl_Merged implements MenuElement {
-
   bool get compact native "HTMLMenuElement_compact_Getter";
 
+
+  /** @domName HTMLMenuElement.compact */
   void set compact(bool value) native "HTMLMenuElement_compact_Setter";
 
 }
@@ -22204,26 +16690,17 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MessageChannel
-abstract class MessageChannel {
+class MessageChannel extends NativeFieldWrapperClass1 {
 
   factory MessageChannel() => _MessageChannelFactoryProvider.createMessageChannel();
+  MessageChannel.internal();
+
 
   /** @domName MessageChannel.port1 */
-  MessagePort get port1;
-
-  /** @domName MessageChannel.port2 */
-  MessagePort get port2;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MessageChannelImpl extends NativeFieldWrapperClass1 implements MessageChannel {
-
   MessagePort get port1 native "MessageChannel_port1_Getter";
 
+
+  /** @domName MessageChannel.port2 */
   MessagePort get port2 native "MessageChannel_port2_Getter";
 
 }
@@ -22234,49 +16711,35 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MessageEvent
-abstract class MessageEvent implements Event {
+class MessageEvent extends Event {
+  MessageEvent.internal(): super.internal();
+
 
   /** @domName MessageEvent.data */
-  Object get data;
-
-  /** @domName MessageEvent.lastEventId */
-  String get lastEventId;
-
-  /** @domName MessageEvent.origin */
-  String get origin;
-
-  /** @domName MessageEvent.ports */
-  List get ports;
-
-  /** @domName MessageEvent.source */
-  Window get source;
-
-  /** @domName MessageEvent.initMessageEvent */
-  void initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List messagePorts);
-
-  /** @domName MessageEvent.webkitInitMessageEvent */
-  void webkitInitMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List transferables);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MessageEventImpl extends _EventImpl implements MessageEvent {
-
   Object get data native "MessageEvent_data_Getter";
 
+
+  /** @domName MessageEvent.lastEventId */
   String get lastEventId native "MessageEvent_lastEventId_Getter";
 
+
+  /** @domName MessageEvent.origin */
   String get origin native "MessageEvent_origin_Getter";
 
+
+  /** @domName MessageEvent.ports */
   List get ports native "MessageEvent_ports_Getter";
 
+
+  /** @domName MessageEvent.source */
   Window get source native "MessageEvent_source_Getter";
 
+
+  /** @domName MessageEvent.initMessageEvent */
   void initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List messagePorts) native "MessageEvent_initMessageEvent_Callback";
 
+
+  /** @domName MessageEvent.webkitInitMessageEvent */
   void webkitInitMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List transferables) native "MessageEvent_webkitInitMessageEvent_Callback";
 
 }
@@ -22287,63 +16750,43 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MessagePort
-abstract class MessagePort implements EventTarget {
+class MessagePort extends EventTarget {
+  MessagePort.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  MessagePortEvents get on;
+  MessagePortEvents get on =>
+    new MessagePortEvents(this);
+
 
   /** @domName MessagePort.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MessagePort.close */
-  void close();
-
-  /** @domName MessagePort.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName MessagePort.postMessage */
-  void postMessage(Object message, [List messagePorts]);
-
-  /** @domName MessagePort.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName MessagePort.start */
-  void start();
-}
-
-abstract class MessagePortEvents implements Events {
-
-  EventListenerList get message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MessagePortImpl extends _EventTargetImpl implements MessagePort {
-
-  _MessagePortEventsImpl get on =>
-    new _MessagePortEventsImpl(this);
-
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_addEventListener_Callback";
 
+
+  /** @domName MessagePort.close */
   void close() native "MessagePort_close_Callback";
 
+
+  /** @domName MessagePort.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "MessagePort_dispatchEvent_Callback";
 
+
+  /** @domName MessagePort.postMessage */
   void postMessage(Object message, [List messagePorts]) native "MessagePort_postMessage_Callback";
 
+
+  /** @domName MessagePort.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_removeEventListener_Callback";
 
+
+  /** @domName MessagePort.start */
   void start() native "MessagePort_start_Callback";
 
 }
 
-class _MessagePortEventsImpl extends _EventsImpl implements MessagePortEvents {
-  _MessagePortEventsImpl(_ptr) : super(_ptr);
+class MessagePortEvents extends Events {
+  MessagePortEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get message => this['message'];
 }
@@ -22354,42 +16797,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLMetaElement
-abstract class MetaElement implements Element {
+class MetaElement extends _Element_Merged {
+  MetaElement.internal(): super.internal();
+
 
   /** @domName HTMLMetaElement.content */
-  String content;
-
-  /** @domName HTMLMetaElement.httpEquiv */
-  String httpEquiv;
-
-  /** @domName HTMLMetaElement.name */
-  String name;
-
-  /** @domName HTMLMetaElement.scheme */
-  String scheme;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MetaElementImpl extends _ElementImpl_Merged implements MetaElement {
-
   String get content native "HTMLMetaElement_content_Getter";
 
+
+  /** @domName HTMLMetaElement.content */
   void set content(String value) native "HTMLMetaElement_content_Setter";
 
+
+  /** @domName HTMLMetaElement.httpEquiv */
   String get httpEquiv native "HTMLMetaElement_httpEquiv_Getter";
 
+
+  /** @domName HTMLMetaElement.httpEquiv */
   void set httpEquiv(String value) native "HTMLMetaElement_httpEquiv_Setter";
 
+
+  /** @domName HTMLMetaElement.name */
   String get name native "HTMLMetaElement_name_Getter";
 
+
+  /** @domName HTMLMetaElement.name */
   void set name(String value) native "HTMLMetaElement_name_Setter";
 
+
+  /** @domName HTMLMetaElement.scheme */
   String get scheme native "HTMLMetaElement_scheme_Getter";
 
+
+  /** @domName HTMLMetaElement.scheme */
   void set scheme(String value) native "HTMLMetaElement_scheme_Setter";
 
 }
@@ -22400,13 +16840,17 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Metadata
-abstract class Metadata {
+class Metadata extends NativeFieldWrapperClass1 {
+  Metadata.internal();
+
 
   /** @domName Metadata.modificationTime */
-  Date get modificationTime;
+  Date get modificationTime native "Metadata_modificationTime_Getter";
+
 
   /** @domName Metadata.size */
-  int get size;
+  int get size native "Metadata_size_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -22422,77 +16866,62 @@
 
 // WARNING: Do not edit - generated code.
 
-class _MetadataImpl extends NativeFieldWrapperClass1 implements Metadata {
-
-  Date get modificationTime native "Metadata_modificationTime_Getter";
-
-  int get size native "Metadata_size_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName HTMLMeterElement
-abstract class MeterElement implements Element {
+class MeterElement extends _Element_Merged {
 
   factory MeterElement() => _Elements.createMeterElement();
+  MeterElement.internal(): super.internal();
+
 
   /** @domName HTMLMeterElement.high */
-  num high;
-
-  /** @domName HTMLMeterElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLMeterElement.low */
-  num low;
-
-  /** @domName HTMLMeterElement.max */
-  num max;
-
-  /** @domName HTMLMeterElement.min */
-  num min;
-
-  /** @domName HTMLMeterElement.optimum */
-  num optimum;
-
-  /** @domName HTMLMeterElement.value */
-  num value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MeterElementImpl extends _ElementImpl_Merged implements MeterElement {
-
   num get high native "HTMLMeterElement_high_Getter";
 
+
+  /** @domName HTMLMeterElement.high */
   void set high(num value) native "HTMLMeterElement_high_Setter";
 
+
+  /** @domName HTMLMeterElement.labels */
   List<Node> get labels native "HTMLMeterElement_labels_Getter";
 
+
+  /** @domName HTMLMeterElement.low */
   num get low native "HTMLMeterElement_low_Getter";
 
+
+  /** @domName HTMLMeterElement.low */
   void set low(num value) native "HTMLMeterElement_low_Setter";
 
+
+  /** @domName HTMLMeterElement.max */
   num get max native "HTMLMeterElement_max_Getter";
 
+
+  /** @domName HTMLMeterElement.max */
   void set max(num value) native "HTMLMeterElement_max_Setter";
 
+
+  /** @domName HTMLMeterElement.min */
   num get min native "HTMLMeterElement_min_Getter";
 
+
+  /** @domName HTMLMeterElement.min */
   void set min(num value) native "HTMLMeterElement_min_Setter";
 
+
+  /** @domName HTMLMeterElement.optimum */
   num get optimum native "HTMLMeterElement_optimum_Getter";
 
+
+  /** @domName HTMLMeterElement.optimum */
   void set optimum(num value) native "HTMLMeterElement_optimum_Setter";
 
+
+  /** @domName HTMLMeterElement.value */
   num get value native "HTMLMeterElement_value_Getter";
 
+
+  /** @domName HTMLMeterElement.value */
   void set value(num value) native "HTMLMeterElement_value_Setter";
 
 }
@@ -22503,28 +16932,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLModElement
-abstract class ModElement implements Element {
+class ModElement extends _Element_Merged {
+  ModElement.internal(): super.internal();
+
 
   /** @domName HTMLModElement.cite */
-  String cite;
-
-  /** @domName HTMLModElement.dateTime */
-  String dateTime;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ModElementImpl extends _ElementImpl_Merged implements ModElement {
-
   String get cite native "HTMLModElement_cite_Getter";
 
+
+  /** @domName HTMLModElement.cite */
   void set cite(String value) native "HTMLModElement_cite_Setter";
 
+
+  /** @domName HTMLModElement.dateTime */
   String get dateTime native "HTMLModElement_dateTime_Getter";
 
+
+  /** @domName HTMLModElement.dateTime */
   void set dateTime(String value) native "HTMLModElement_dateTime_Setter";
 
 }
@@ -22534,12 +16958,9 @@
 
 // WARNING: Do not edit - generated code.
 
-
-/// @domName MouseEvent
-abstract class MouseEvent implements UIEvent {
-
-  factory MouseEvent(String type, Window view, int detail, int screenX, int screenY,
-      int clientX, int clientY, int button, [bool canBubble = true,
+class MouseEvent extends UIEvent {
+  factory MouseEvent(String type, Window view, int detail, int screenX,
+      int screenY, int clientX, int clientY, int button, [bool canBubble = true,
       bool cancelable = true, bool ctrlKey = false, bool altKey = false,
       bool shiftKey = false, bool metaKey = false,
       EventTarget relatedTarget = null]) =>
@@ -22548,114 +16969,86 @@
           clientX, clientY, button, canBubble, cancelable,
           ctrlKey, altKey, shiftKey, metaKey,
           relatedTarget);
+  MouseEvent.internal(): super.internal();
 
 
   /** @domName MouseEvent.altKey */
-  bool get altKey;
-
-  /** @domName MouseEvent.button */
-  int get button;
-
-  /** @domName MouseEvent.clientX */
-  int get clientX;
-
-  /** @domName MouseEvent.clientY */
-  int get clientY;
-
-  /** @domName MouseEvent.ctrlKey */
-  bool get ctrlKey;
-
-  /** @domName MouseEvent.dataTransfer */
-  Clipboard get dataTransfer;
-
-  /** @domName MouseEvent.fromElement */
-  Node get fromElement;
-
-  /** @domName MouseEvent.metaKey */
-  bool get metaKey;
-
-  /** @domName MouseEvent.offsetX */
-  int get offsetX;
-
-  /** @domName MouseEvent.offsetY */
-  int get offsetY;
-
-  /** @domName MouseEvent.relatedTarget */
-  EventTarget get relatedTarget;
-
-  /** @domName MouseEvent.screenX */
-  int get screenX;
-
-  /** @domName MouseEvent.screenY */
-  int get screenY;
-
-  /** @domName MouseEvent.shiftKey */
-  bool get shiftKey;
-
-  /** @domName MouseEvent.toElement */
-  Node get toElement;
-
-  /** @domName MouseEvent.webkitMovementX */
-  int get webkitMovementX;
-
-  /** @domName MouseEvent.webkitMovementY */
-  int get webkitMovementY;
-
-  /** @domName MouseEvent.x */
-  int get x;
-
-  /** @domName MouseEvent.y */
-  int get y;
-
-  /** @domName MouseEvent.initMouseEvent */
-  void $dom_initMouseEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MouseEventImpl extends _UIEventImpl implements MouseEvent {
-
   bool get altKey native "MouseEvent_altKey_Getter";
 
+
+  /** @domName MouseEvent.button */
   int get button native "MouseEvent_button_Getter";
 
+
+  /** @domName MouseEvent.clientX */
   int get clientX native "MouseEvent_clientX_Getter";
 
+
+  /** @domName MouseEvent.clientY */
   int get clientY native "MouseEvent_clientY_Getter";
 
+
+  /** @domName MouseEvent.ctrlKey */
   bool get ctrlKey native "MouseEvent_ctrlKey_Getter";
 
+
+  /** @domName MouseEvent.dataTransfer */
   Clipboard get dataTransfer native "MouseEvent_dataTransfer_Getter";
 
+
+  /** @domName MouseEvent.fromElement */
   Node get fromElement native "MouseEvent_fromElement_Getter";
 
+
+  /** @domName MouseEvent.metaKey */
   bool get metaKey native "MouseEvent_metaKey_Getter";
 
+
+  /** @domName MouseEvent.offsetX */
   int get offsetX native "MouseEvent_offsetX_Getter";
 
+
+  /** @domName MouseEvent.offsetY */
   int get offsetY native "MouseEvent_offsetY_Getter";
 
+
+  /** @domName MouseEvent.relatedTarget */
   EventTarget get relatedTarget native "MouseEvent_relatedTarget_Getter";
 
+
+  /** @domName MouseEvent.screenX */
   int get screenX native "MouseEvent_screenX_Getter";
 
+
+  /** @domName MouseEvent.screenY */
   int get screenY native "MouseEvent_screenY_Getter";
 
+
+  /** @domName MouseEvent.shiftKey */
   bool get shiftKey native "MouseEvent_shiftKey_Getter";
 
+
+  /** @domName MouseEvent.toElement */
   Node get toElement native "MouseEvent_toElement_Getter";
 
+
+  /** @domName MouseEvent.webkitMovementX */
   int get webkitMovementX native "MouseEvent_webkitMovementX_Getter";
 
+
+  /** @domName MouseEvent.webkitMovementY */
   int get webkitMovementY native "MouseEvent_webkitMovementY_Getter";
 
+
+  /** @domName MouseEvent.x */
   int get x native "MouseEvent_x_Getter";
 
+
+  /** @domName MouseEvent.y */
   int get y native "MouseEvent_y_Getter";
 
+
+  /** @domName MouseEvent.initMouseEvent */
   void $dom_initMouseEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) native "MouseEvent_initMouseEvent_Callback";
 
 }
@@ -22674,7 +17067,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MutationEvent
-abstract class MutationEvent implements Event {
+class MutationEvent extends Event {
+  MutationEvent.internal(): super.internal();
 
   static const int ADDITION = 2;
 
@@ -22682,42 +17076,28 @@
 
   static const int REMOVAL = 3;
 
+
   /** @domName MutationEvent.attrChange */
-  int get attrChange;
-
-  /** @domName MutationEvent.attrName */
-  String get attrName;
-
-  /** @domName MutationEvent.newValue */
-  String get newValue;
-
-  /** @domName MutationEvent.prevValue */
-  String get prevValue;
-
-  /** @domName MutationEvent.relatedNode */
-  Node get relatedNode;
-
-  /** @domName MutationEvent.initMutationEvent */
-  void initMutationEvent(String type, bool canBubble, bool cancelable, Node relatedNode, String prevValue, String newValue, String attrName, int attrChange);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MutationEventImpl extends _EventImpl implements MutationEvent {
-
   int get attrChange native "MutationEvent_attrChange_Getter";
 
+
+  /** @domName MutationEvent.attrName */
   String get attrName native "MutationEvent_attrName_Getter";
 
+
+  /** @domName MutationEvent.newValue */
   String get newValue native "MutationEvent_newValue_Getter";
 
+
+  /** @domName MutationEvent.prevValue */
   String get prevValue native "MutationEvent_prevValue_Getter";
 
+
+  /** @domName MutationEvent.relatedNode */
   Node get relatedNode native "MutationEvent_relatedNode_Getter";
 
+
+  /** @domName MutationEvent.initMutationEvent */
   void initMutationEvent(String type, bool canBubble, bool cancelable, Node relatedNode, String prevValue, String newValue, String attrName, int attrChange) native "MutationEvent_initMutationEvent_Callback";
 
 }
@@ -22725,40 +17105,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-
-/// @domName MutationObserver
-abstract class MutationObserver {
+class MutationObserver extends NativeFieldWrapperClass1 {
 
   factory MutationObserver(MutationCallback callback) => _MutationObserverFactoryProvider.createMutationObserver(callback);
+  MutationObserver.internal();
+
 
   /** @domName MutationObserver.disconnect */
-  void disconnect();
-
-  /** @domName MutationObserver.takeRecords */
-  List<MutationRecord> takeRecords();
-
-  void observe(Node target,
-               {Map options,
-                bool childList,
-                bool attributes,
-                bool characterData,
-                bool subtree,
-                bool attributeOldValue,
-                bool characterDataOldValue,
-                List<String> attributeFilter});
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _MutationObserverImpl extends NativeFieldWrapperClass1 implements MutationObserver {
-
   void disconnect() native "MutationObserver_disconnect_Callback";
 
+
+  /** @domName MutationObserver._observe */
   void _observe(Node target, Map options) native "MutationObserver__observe_Callback";
 
+
+  /** @domName MutationObserver.takeRecords */
   List<MutationRecord> takeRecords() native "MutationObserver_takeRecords_Callback";
 
   void observe(Node target,
@@ -22818,7 +17179,7 @@
   static _add(m, String key, value) { m[key] = value; }
   static _fixupList(list) => list;
 
-  _call(Node target, options) {
+  void _call(Node target, options) {
     _observe(target, options);
   }
 
@@ -22830,59 +17191,43 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName MutationRecord
-abstract class MutationRecord {
+class MutationRecord extends NativeFieldWrapperClass1 {
+  MutationRecord.internal();
+
 
   /** @domName MutationRecord.addedNodes */
-  List<Node> get addedNodes;
-
-  /** @domName MutationRecord.attributeName */
-  String get attributeName;
-
-  /** @domName MutationRecord.attributeNamespace */
-  String get attributeNamespace;
-
-  /** @domName MutationRecord.nextSibling */
-  Node get nextSibling;
-
-  /** @domName MutationRecord.oldValue */
-  String get oldValue;
-
-  /** @domName MutationRecord.previousSibling */
-  Node get previousSibling;
-
-  /** @domName MutationRecord.removedNodes */
-  List<Node> get removedNodes;
-
-  /** @domName MutationRecord.target */
-  Node get target;
-
-  /** @domName MutationRecord.type */
-  String get type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _MutationRecordImpl extends NativeFieldWrapperClass1 implements MutationRecord {
-
   List<Node> get addedNodes native "MutationRecord_addedNodes_Getter";
 
+
+  /** @domName MutationRecord.attributeName */
   String get attributeName native "MutationRecord_attributeName_Getter";
 
+
+  /** @domName MutationRecord.attributeNamespace */
   String get attributeNamespace native "MutationRecord_attributeNamespace_Getter";
 
+
+  /** @domName MutationRecord.nextSibling */
   Node get nextSibling native "MutationRecord_nextSibling_Getter";
 
+
+  /** @domName MutationRecord.oldValue */
   String get oldValue native "MutationRecord_oldValue_Getter";
 
+
+  /** @domName MutationRecord.previousSibling */
   Node get previousSibling native "MutationRecord_previousSibling_Getter";
 
+
+  /** @domName MutationRecord.removedNodes */
   List<Node> get removedNodes native "MutationRecord_removedNodes_Getter";
 
+
+  /** @domName MutationRecord.target */
   Node get target native "MutationRecord_target_Getter";
 
+
+  /** @domName MutationRecord.type */
   String get type native "MutationRecord_type_Getter";
 
 }
@@ -22893,40 +17238,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName NamedNodeMap
-abstract class NamedNodeMap implements List<Node> {
+class NamedNodeMap extends NativeFieldWrapperClass1 implements List<Node> {
+  NamedNodeMap.internal();
+
 
   /** @domName NamedNodeMap.length */
-  int get length;
-
-  /** @domName NamedNodeMap.getNamedItem */
-  Node getNamedItem(String name);
-
-  /** @domName NamedNodeMap.getNamedItemNS */
-  Node getNamedItemNS(String namespaceURI, String localName);
-
-  /** @domName NamedNodeMap.item */
-  Node item(int index);
-
-  /** @domName NamedNodeMap.removeNamedItem */
-  Node removeNamedItem(String name);
-
-  /** @domName NamedNodeMap.removeNamedItemNS */
-  Node removeNamedItemNS(String namespaceURI, String localName);
-
-  /** @domName NamedNodeMap.setNamedItem */
-  Node setNamedItem(Node node);
-
-  /** @domName NamedNodeMap.setNamedItemNS */
-  Node setNamedItemNS(Node node);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _NamedNodeMapImpl extends NativeFieldWrapperClass1 implements NamedNodeMap {
-
   int get length native "NamedNodeMap_length_Getter";
 
   Node operator[](int index) native "NamedNodeMap_item_Callback";
@@ -23012,18 +17328,32 @@
 
   // -- end List<Node> mixins.
 
+
+  /** @domName NamedNodeMap.getNamedItem */
   Node getNamedItem(String name) native "NamedNodeMap_getNamedItem_Callback";
 
+
+  /** @domName NamedNodeMap.getNamedItemNS */
   Node getNamedItemNS(String namespaceURI, String localName) native "NamedNodeMap_getNamedItemNS_Callback";
 
+
+  /** @domName NamedNodeMap.item */
   Node item(int index) native "NamedNodeMap_item_Callback";
 
+
+  /** @domName NamedNodeMap.removeNamedItem */
   Node removeNamedItem(String name) native "NamedNodeMap_removeNamedItem_Callback";
 
+
+  /** @domName NamedNodeMap.removeNamedItemNS */
   Node removeNamedItemNS(String namespaceURI, String localName) native "NamedNodeMap_removeNamedItemNS_Callback";
 
+
+  /** @domName NamedNodeMap.setNamedItem */
   Node setNamedItem(Node node) native "NamedNodeMap_setNamedItem_Callback";
 
+
+  /** @domName NamedNodeMap.setNamedItemNS */
   Node setNamedItemNS(Node node) native "NamedNodeMap_setNamedItemNS_Callback";
 
 }
@@ -23034,114 +17364,87 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Navigator
-abstract class Navigator {
+class Navigator extends NativeFieldWrapperClass1 {
+  Navigator.internal();
+
 
   /** @domName Navigator.appCodeName */
-  String get appCodeName;
-
-  /** @domName Navigator.appName */
-  String get appName;
-
-  /** @domName Navigator.appVersion */
-  String get appVersion;
-
-  /** @domName Navigator.cookieEnabled */
-  bool get cookieEnabled;
-
-  /** @domName Navigator.geolocation */
-  Geolocation get geolocation;
-
-  /** @domName Navigator.language */
-  String get language;
-
-  /** @domName Navigator.mimeTypes */
-  DOMMimeTypeArray get mimeTypes;
-
-  /** @domName Navigator.onLine */
-  bool get onLine;
-
-  /** @domName Navigator.platform */
-  String get platform;
-
-  /** @domName Navigator.plugins */
-  DOMPluginArray get plugins;
-
-  /** @domName Navigator.product */
-  String get product;
-
-  /** @domName Navigator.productSub */
-  String get productSub;
-
-  /** @domName Navigator.userAgent */
-  String get userAgent;
-
-  /** @domName Navigator.vendor */
-  String get vendor;
-
-  /** @domName Navigator.vendorSub */
-  String get vendorSub;
-
-  /** @domName Navigator.webkitBattery */
-  BatteryManager get webkitBattery;
-
-  /** @domName Navigator.getStorageUpdates */
-  void getStorageUpdates();
-
-  /** @domName Navigator.javaEnabled */
-  bool javaEnabled();
-
-  /** @domName Navigator.webkitGetGamepads */
-  List<Gamepad> webkitGetGamepads();
-
-  /** @domName Navigator.webkitGetUserMedia */
-  void webkitGetUserMedia(Map options, NavigatorUserMediaSuccessCallback successCallback, [NavigatorUserMediaErrorCallback errorCallback]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _NavigatorImpl extends NativeFieldWrapperClass1 implements Navigator {
-
   String get appCodeName native "Navigator_appCodeName_Getter";
 
+
+  /** @domName Navigator.appName */
   String get appName native "Navigator_appName_Getter";
 
+
+  /** @domName Navigator.appVersion */
   String get appVersion native "Navigator_appVersion_Getter";
 
+
+  /** @domName Navigator.cookieEnabled */
   bool get cookieEnabled native "Navigator_cookieEnabled_Getter";
 
+
+  /** @domName Navigator.geolocation */
   Geolocation get geolocation native "Navigator_geolocation_Getter";
 
+
+  /** @domName Navigator.language */
   String get language native "Navigator_language_Getter";
 
+
+  /** @domName Navigator.mimeTypes */
   DOMMimeTypeArray get mimeTypes native "Navigator_mimeTypes_Getter";
 
+
+  /** @domName Navigator.onLine */
   bool get onLine native "Navigator_onLine_Getter";
 
+
+  /** @domName Navigator.platform */
   String get platform native "Navigator_platform_Getter";
 
+
+  /** @domName Navigator.plugins */
   DOMPluginArray get plugins native "Navigator_plugins_Getter";
 
+
+  /** @domName Navigator.product */
   String get product native "Navigator_product_Getter";
 
+
+  /** @domName Navigator.productSub */
   String get productSub native "Navigator_productSub_Getter";
 
+
+  /** @domName Navigator.userAgent */
   String get userAgent native "Navigator_userAgent_Getter";
 
+
+  /** @domName Navigator.vendor */
   String get vendor native "Navigator_vendor_Getter";
 
+
+  /** @domName Navigator.vendorSub */
   String get vendorSub native "Navigator_vendorSub_Getter";
 
+
+  /** @domName Navigator.webkitBattery */
   BatteryManager get webkitBattery native "Navigator_webkitBattery_Getter";
 
+
+  /** @domName Navigator.getStorageUpdates */
   void getStorageUpdates() native "Navigator_getStorageUpdates_Callback";
 
+
+  /** @domName Navigator.javaEnabled */
   bool javaEnabled() native "Navigator_javaEnabled_Callback";
 
+
+  /** @domName Navigator.webkitGetGamepads */
   List<Gamepad> webkitGetGamepads() native "Navigator_webkitGetGamepads_Callback";
 
+
+  /** @domName Navigator.webkitGetUserMedia */
   void webkitGetUserMedia(Map options, NavigatorUserMediaSuccessCallback successCallback, [NavigatorUserMediaErrorCallback errorCallback]) native "Navigator_webkitGetUserMedia_Callback";
 
 }
@@ -23152,12 +17455,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName NavigatorUserMediaError
-abstract class NavigatorUserMediaError {
+class NavigatorUserMediaError extends NativeFieldWrapperClass1 {
+  NavigatorUserMediaError.internal();
 
   static const int PERMISSION_DENIED = 1;
 
+
   /** @domName NavigatorUserMediaError.code */
-  int get code;
+  int get code native "NavigatorUserMediaError_code_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -23173,231 +17479,42 @@
 
 // WARNING: Do not edit - generated code.
 
-class _NavigatorUserMediaErrorImpl extends NativeFieldWrapperClass1 implements NavigatorUserMediaError {
-
-  int get code native "NavigatorUserMediaError_code_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 
 typedef void NavigatorUserMediaSuccessCallback(LocalMediaStream stream);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-
-/// @domName Node
-abstract class Node implements EventTarget {
-  List<Node> get nodes;
-
-  void set nodes(Collection<Node> value);
-
-  /**
-   * Replaces this node with another node.
-   * @domName Node.replaceChild
-   */
-  Node replaceWith(Node otherNode);
-
-  /**
-   * Removes this node from the DOM.
-   * @domName Node.removeChild
-   */
-  void remove();
-
-
-  static const int ATTRIBUTE_NODE = 2;
-
-  static const int CDATA_SECTION_NODE = 4;
-
-  static const int COMMENT_NODE = 8;
-
-  static const int DOCUMENT_FRAGMENT_NODE = 11;
-
-  static const int DOCUMENT_NODE = 9;
-
-  static const int DOCUMENT_POSITION_CONTAINED_BY = 0x10;
-
-  static const int DOCUMENT_POSITION_CONTAINS = 0x08;
-
-  static const int DOCUMENT_POSITION_DISCONNECTED = 0x01;
-
-  static const int DOCUMENT_POSITION_FOLLOWING = 0x04;
-
-  static const int DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
-
-  static const int DOCUMENT_POSITION_PRECEDING = 0x02;
-
-  static const int DOCUMENT_TYPE_NODE = 10;
-
-  static const int ELEMENT_NODE = 1;
-
-  static const int ENTITY_NODE = 6;
-
-  static const int ENTITY_REFERENCE_NODE = 5;
-
-  static const int NOTATION_NODE = 12;
-
-  static const int PROCESSING_INSTRUCTION_NODE = 7;
-
-  static const int TEXT_NODE = 3;
-
-  /** @domName Node.attributes */
-  NamedNodeMap get $dom_attributes;
-
-  /** @domName Node.childNodes */
-  List<Node> get $dom_childNodes;
-
-  /** @domName Node.firstChild */
-  Node get $dom_firstChild;
-
-  /** @domName Node.lastChild */
-  Node get $dom_lastChild;
-
-  /** @domName Node.nextSibling */
-  Node get nextNode;
-
-  /** @domName Node.nodeType */
-  int get $dom_nodeType;
-
-  /** @domName Node.ownerDocument */
-  Document get document;
-
-  /** @domName Node.parentNode */
-  Node get parent;
-
-  /** @domName Node.previousSibling */
-  Node get previousNode;
-
-  /** @domName Node.textContent */
-  String text;
-
-  /** @domName Node.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Node.appendChild */
-  Node $dom_appendChild(Node newChild);
-
-  /** @domName Node.cloneNode */
-  Node clone(bool deep);
-
-  /** @domName Node.contains */
-  bool contains(Node other);
-
-  /** @domName Node.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName Node.hasChildNodes */
-  bool hasChildNodes();
-
-  /** @domName Node.insertBefore */
-  Node insertBefore(Node newChild, Node refChild);
-
-  /** @domName Node.removeChild */
-  Node $dom_removeChild(Node oldChild);
-
-  /** @domName Node.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Node.replaceChild */
-  Node $dom_replaceChild(Node newChild, Node oldChild);
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName NodeFilter
-abstract class NodeFilter {
-
-  static const int FILTER_ACCEPT = 1;
-
-  static const int FILTER_REJECT = 2;
-
-  static const int FILTER_SKIP = 3;
-
-  static const int SHOW_ALL = 0xFFFFFFFF;
-
-  static const int SHOW_ATTRIBUTE = 0x00000002;
-
-  static const int SHOW_CDATA_SECTION = 0x00000008;
-
-  static const int SHOW_COMMENT = 0x00000080;
-
-  static const int SHOW_DOCUMENT = 0x00000100;
-
-  static const int SHOW_DOCUMENT_FRAGMENT = 0x00000400;
-
-  static const int SHOW_DOCUMENT_TYPE = 0x00000200;
-
-  static const int SHOW_ELEMENT = 0x00000001;
-
-  static const int SHOW_ENTITY = 0x00000020;
-
-  static const int SHOW_ENTITY_REFERENCE = 0x00000010;
-
-  static const int SHOW_NOTATION = 0x00000800;
-
-  static const int SHOW_PROCESSING_INSTRUCTION = 0x00000040;
-
-  static const int SHOW_TEXT = 0x00000004;
-
-  /** @domName NodeFilter.acceptNode */
-  int acceptNode(Node n);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _NodeFilterImpl extends NativeFieldWrapperClass1 implements NodeFilter {
-
-  int acceptNode(Node n) native "NodeFilter_acceptNode_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
 /**
  * Lazy implementation of the child nodes of an element that does not request
  * the actual child nodes of an element until strictly necessary greatly
  * improving performance for the typical cases where it is not required.
  */
 class _ChildNodeListLazy implements List {
-  final _NodeImpl _this;
+  final Node _this;
 
   _ChildNodeListLazy(this._this);
 
 
-  _NodeImpl get first => _this.$dom_firstChild;
-  _NodeImpl get last => _this.$dom_lastChild;
+  Node get first => _this.$dom_firstChild;
+  Node get last => _this.$dom_lastChild;
 
-  void add(_NodeImpl value) {
+  void add(Node value) {
     _this.$dom_appendChild(value);
   }
 
-  void addLast(_NodeImpl value) {
+  void addLast(Node value) {
     _this.$dom_appendChild(value);
   }
 
 
-  void addAll(Collection<_NodeImpl> collection) {
-    for (_NodeImpl node in collection) {
+  void addAll(Collection<Node> collection) {
+    for (Node node in collection) {
       _this.$dom_appendChild(node);
     }
   }
 
-  _NodeImpl removeLast() {
+  Node removeLast() {
     final result = last;
     if (result != null) {
       _this.$dom_removeChild(result);
@@ -23409,7 +17526,7 @@
     _this.text = '';
   }
 
-  void operator []=(int index, _NodeImpl value) {
+  void operator []=(int index, Node value) {
     _this.$dom_replaceChild(value, this[index]);
   }
 
@@ -23468,10 +17585,10 @@
   // a local copy of $dom_childNodes is more efficient.
   int get length => _this.$dom_childNodes.length;
 
-  _NodeImpl operator[](int index) => _this.$dom_childNodes[index];
+  Node operator[](int index) => _this.$dom_childNodes[index];
 }
 
-class _NodeImpl extends _EventTargetImpl implements Node {
+class Node extends EventTarget {
   _ChildNodeListLazy get nodes {
     return new _ChildNodeListLazy(this);
   }
@@ -23486,18 +17603,26 @@
     }
   }
 
-  // TODO(jacobr): should we throw an exception if parent is already null?
-  // TODO(vsm): Use the native remove when available.
+  /**
+   * Removes this node from the DOM.
+   * @domName Node.removeChild
+   */
   void remove() {
+    // TODO(jacobr): should we throw an exception if parent is already null?
+    // TODO(vsm): Use the native remove when available.
     if (this.parent != null) {
-      final _NodeImpl parent = this.parent;
+      final Node parent = this.parent;
       parent.$dom_removeChild(this);
     }
   }
 
-  _NodeImpl replaceWith(Node otherNode) {
+  /**
+   * Replaces this node with another node.
+   * @domName Node.replaceChild
+   */
+  Node replaceWith(Node otherNode) {
     try {
-      final _NodeImpl parent = this.parent;
+      final Node parent = this.parent;
       parent.$dom_replaceChild(otherNode, this);
     } catch (e) {
 
@@ -23505,47 +17630,126 @@
     return this;
   }
 
+  Node.internal(): super.internal();
 
+  static const int ATTRIBUTE_NODE = 2;
+
+  static const int CDATA_SECTION_NODE = 4;
+
+  static const int COMMENT_NODE = 8;
+
+  static const int DOCUMENT_FRAGMENT_NODE = 11;
+
+  static const int DOCUMENT_NODE = 9;
+
+  static const int DOCUMENT_POSITION_CONTAINED_BY = 0x10;
+
+  static const int DOCUMENT_POSITION_CONTAINS = 0x08;
+
+  static const int DOCUMENT_POSITION_DISCONNECTED = 0x01;
+
+  static const int DOCUMENT_POSITION_FOLLOWING = 0x04;
+
+  static const int DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
+
+  static const int DOCUMENT_POSITION_PRECEDING = 0x02;
+
+  static const int DOCUMENT_TYPE_NODE = 10;
+
+  static const int ELEMENT_NODE = 1;
+
+  static const int ENTITY_NODE = 6;
+
+  static const int ENTITY_REFERENCE_NODE = 5;
+
+  static const int NOTATION_NODE = 12;
+
+  static const int PROCESSING_INSTRUCTION_NODE = 7;
+
+  static const int TEXT_NODE = 3;
+
+
+  /** @domName Node.attributes */
   NamedNodeMap get $dom_attributes native "Node_attributes_Getter";
 
+
+  /** @domName Node.childNodes */
   List<Node> get $dom_childNodes native "Node_childNodes_Getter";
 
+
+  /** @domName Node.firstChild */
   Node get $dom_firstChild native "Node_firstChild_Getter";
 
+
+  /** @domName Node.lastChild */
   Node get $dom_lastChild native "Node_lastChild_Getter";
 
+
+  /** @domName Node.nextSibling */
   Node get nextNode native "Node_nextSibling_Getter";
 
+
+  /** @domName Node.nodeType */
   int get $dom_nodeType native "Node_nodeType_Getter";
 
+
+  /** @domName Node.ownerDocument */
   Document get document native "Node_ownerDocument_Getter";
 
+
+  /** @domName Node.parentNode */
   Node get parent native "Node_parentNode_Getter";
 
+
+  /** @domName Node.previousSibling */
   Node get previousNode native "Node_previousSibling_Getter";
 
+
+  /** @domName Node.textContent */
   String get text native "Node_textContent_Getter";
 
+
+  /** @domName Node.textContent */
   void set text(String value) native "Node_textContent_Setter";
 
+
+  /** @domName Node.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Node_addEventListener_Callback";
 
+
+  /** @domName Node.appendChild */
   Node $dom_appendChild(Node newChild) native "Node_appendChild_Callback";
 
+
+  /** @domName Node.cloneNode */
   Node clone(bool deep) native "Node_cloneNode_Callback";
 
+
+  /** @domName Node.contains */
   bool contains(Node other) native "Node_contains_Callback";
 
+
+  /** @domName Node.dispatchEvent */
   bool $dom_dispatchEvent(Event event) native "Node_dispatchEvent_Callback";
 
+
+  /** @domName Node.hasChildNodes */
   bool hasChildNodes() native "Node_hasChildNodes_Callback";
 
+
+  /** @domName Node.insertBefore */
   Node insertBefore(Node newChild, Node refChild) native "Node_insertBefore_Callback";
 
+
+  /** @domName Node.removeChild */
   Node $dom_removeChild(Node oldChild) native "Node_removeChild_Callback";
 
+
+  /** @domName Node.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Node_removeEventListener_Callback";
 
+
+  /** @domName Node.replaceChild */
   Node $dom_replaceChild(Node newChild, Node oldChild) native "Node_replaceChild_Callback";
 
 }
@@ -23555,35 +17759,46 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName NodeIterator
-abstract class NodeIterator {
+/// @domName NodeFilter
+class NodeFilter extends NativeFieldWrapperClass1 {
+  NodeFilter.internal();
 
-  /** @domName NodeIterator.expandEntityReferences */
-  bool get expandEntityReferences;
+  static const int FILTER_ACCEPT = 1;
 
-  /** @domName NodeIterator.filter */
-  NodeFilter get filter;
+  static const int FILTER_REJECT = 2;
 
-  /** @domName NodeIterator.pointerBeforeReferenceNode */
-  bool get pointerBeforeReferenceNode;
+  static const int FILTER_SKIP = 3;
 
-  /** @domName NodeIterator.referenceNode */
-  Node get referenceNode;
+  static const int SHOW_ALL = 0xFFFFFFFF;
 
-  /** @domName NodeIterator.root */
-  Node get root;
+  static const int SHOW_ATTRIBUTE = 0x00000002;
 
-  /** @domName NodeIterator.whatToShow */
-  int get whatToShow;
+  static const int SHOW_CDATA_SECTION = 0x00000008;
 
-  /** @domName NodeIterator.detach */
-  void detach();
+  static const int SHOW_COMMENT = 0x00000080;
 
-  /** @domName NodeIterator.nextNode */
-  Node nextNode();
+  static const int SHOW_DOCUMENT = 0x00000100;
 
-  /** @domName NodeIterator.previousNode */
-  Node previousNode();
+  static const int SHOW_DOCUMENT_FRAGMENT = 0x00000400;
+
+  static const int SHOW_DOCUMENT_TYPE = 0x00000200;
+
+  static const int SHOW_ELEMENT = 0x00000001;
+
+  static const int SHOW_ENTITY = 0x00000020;
+
+  static const int SHOW_ENTITY_REFERENCE = 0x00000010;
+
+  static const int SHOW_NOTATION = 0x00000800;
+
+  static const int SHOW_PROCESSING_INSTRUCTION = 0x00000040;
+
+  static const int SHOW_TEXT = 0x00000004;
+
+
+  /** @domName NodeFilter.acceptNode */
+  int acceptNode(Node n) native "NodeFilter_acceptNode_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -23591,48 +17806,47 @@
 
 // WARNING: Do not edit - generated code.
 
-class _NodeIteratorImpl extends NativeFieldWrapperClass1 implements NodeIterator {
+/// @domName NodeIterator
+class NodeIterator extends NativeFieldWrapperClass1 {
+  NodeIterator.internal();
 
+
+  /** @domName NodeIterator.expandEntityReferences */
   bool get expandEntityReferences native "NodeIterator_expandEntityReferences_Getter";
 
+
+  /** @domName NodeIterator.filter */
   NodeFilter get filter native "NodeIterator_filter_Getter";
 
+
+  /** @domName NodeIterator.pointerBeforeReferenceNode */
   bool get pointerBeforeReferenceNode native "NodeIterator_pointerBeforeReferenceNode_Getter";
 
+
+  /** @domName NodeIterator.referenceNode */
   Node get referenceNode native "NodeIterator_referenceNode_Getter";
 
+
+  /** @domName NodeIterator.root */
   Node get root native "NodeIterator_root_Getter";
 
+
+  /** @domName NodeIterator.whatToShow */
   int get whatToShow native "NodeIterator_whatToShow_Getter";
 
+
+  /** @domName NodeIterator.detach */
   void detach() native "NodeIterator_detach_Callback";
 
+
+  /** @domName NodeIterator.nextNode */
   Node nextNode() native "NodeIterator_nextNode_Callback";
 
+
+  /** @domName NodeIterator.previousNode */
   Node previousNode() native "NodeIterator_previousNode_Callback";
 
 }
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName NodeList
-abstract class NodeList implements List<Node> {
-
-  List<Node> filter(bool f(Node element));
-
-  List<Node> getRange(int start, int length);
-
-  Node get first;
-
-
-  /** @domName NodeList.length */
-  int get length;
-
-}
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -23716,8 +17930,8 @@
     new _NodeListWrapper(_list.getRange(start, rangeLength));
 }
 
-class _NodeListImpl extends NativeFieldWrapperClass1 implements NodeList {
-  _NodeImpl _parent;
+class NodeList extends NativeFieldWrapperClass1 implements List<Node> {
+  Node _parent;
 
   // -- start List<Node> mixins.
   // Node is the element type.
@@ -23733,21 +17947,21 @@
 
   // From Collection<Node>:
 
-  void add(_NodeImpl value) {
+  void add(Node value) {
     _parent.$dom_appendChild(value);
   }
 
-  void addLast(_NodeImpl value) {
+  void addLast(Node value) {
     _parent.$dom_appendChild(value);
   }
 
-  void addAll(Collection<_NodeImpl> collection) {
-    for (_NodeImpl node in collection) {
+  void addAll(Collection<Node> collection) {
+    for (Node node in collection) {
       _parent.$dom_appendChild(node);
     }
   }
 
-  _NodeImpl removeLast() {
+  Node removeLast() {
     final result = this.last;
     if (result != null) {
       _parent.$dom_removeChild(result);
@@ -23759,7 +17973,7 @@
     _parent.text = '';
   }
 
-  void operator []=(int index, _NodeImpl value) {
+  void operator []=(int index, Node value) {
     _parent.$dom_replaceChild(value, this[index]);
   }
 
@@ -23808,11 +18022,16 @@
 
   // -- end List<Node> mixins.
 
+  NodeList.internal();
 
+
+  /** @domName NodeList.length */
   int get length native "NodeList_length_Getter";
 
   Node operator[](int index) native "NodeList_item_Callback";
 
+
+  /** @domName NodeList.item */
   Node _item(int index) native "NodeList_item_Callback";
 
 }
@@ -23823,24 +18042,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Notation
-abstract class Notation implements Node {
+class Notation extends Node {
+  Notation.internal(): super.internal();
+
 
   /** @domName Notation.publicId */
-  String get publicId;
-
-  /** @domName Notation.systemId */
-  String get systemId;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _NotationImpl extends _NodeImpl implements Notation {
-
   String get publicId native "Notation_publicId_Getter";
 
+
+  /** @domName Notation.systemId */
   String get systemId native "Notation_systemId_Getter";
 
 }
@@ -23851,7 +18061,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Notification
-abstract class Notification implements EventTarget {
+class Notification extends EventTarget {
 
   factory Notification(String title, [Map options]) {
     if (!?options) {
@@ -23859,139 +18069,74 @@
     }
     return _NotificationFactoryProvider.createNotification(title, options);
   }
+  Notification.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  NotificationEvents get on;
+  NotificationEvents get on =>
+    new NotificationEvents(this);
+
 
   /** @domName Notification.dir */
-  String dir;
-
-  /** @domName Notification.permission */
-  String get permission;
-
-  /** @domName Notification.replaceId */
-  String replaceId;
-
-  /** @domName Notification.tag */
-  String tag;
-
-  /** @domName Notification.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Notification.cancel */
-  void cancel();
-
-  /** @domName Notification.close */
-  void close();
-
-  /** @domName Notification.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName Notification.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName Notification.requestPermission */
-  static final requestPermission = _NotificationImpl.requestPermission;
-
-  /** @domName Notification.show */
-  void show();
-}
-
-abstract class NotificationEvents implements Events {
-
-  EventListenerList get click;
-
-  EventListenerList get close;
-
-  EventListenerList get display;
-
-  EventListenerList get error;
-
-  EventListenerList get show;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName NotificationCenter
-abstract class NotificationCenter {
-
-  /** @domName NotificationCenter.checkPermission */
-  int checkPermission();
-
-  /** @domName NotificationCenter.createHTMLNotification */
-  Notification createHTMLNotification(String url);
-
-  /** @domName NotificationCenter.createNotification */
-  Notification createNotification(String iconUrl, String title, String body);
-
-  /** @domName NotificationCenter.requestPermission */
-  void requestPermission(VoidCallback callback);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _NotificationCenterImpl extends NativeFieldWrapperClass1 implements NotificationCenter {
-
-  int checkPermission() native "NotificationCenter_checkPermission_Callback";
-
-  Notification createHTMLNotification(String url) native "NotificationCenter_createHTMLNotification_Callback";
-
-  Notification createNotification(String iconUrl, String title, String body) native "NotificationCenter_createNotification_Callback";
-
-  void requestPermission(VoidCallback callback) native "NotificationCenter_requestPermission_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _NotificationImpl extends _EventTargetImpl implements Notification {
-
-  _NotificationEventsImpl get on =>
-    new _NotificationEventsImpl(this);
-
   String get dir native "Notification_dir_Getter";
 
+
+  /** @domName Notification.dir */
   void set dir(String value) native "Notification_dir_Setter";
 
+
+  /** @domName Notification.permission */
   String get permission native "Notification_permission_Getter";
 
+
+  /** @domName Notification.replaceId */
   String get replaceId native "Notification_replaceId_Getter";
 
+
+  /** @domName Notification.replaceId */
   void set replaceId(String value) native "Notification_replaceId_Setter";
 
+
+  /** @domName Notification.tag */
   String get tag native "Notification_tag_Getter";
 
+
+  /** @domName Notification.tag */
   void set tag(String value) native "Notification_tag_Setter";
 
+
+  /** @domName Notification.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_addEventListener_Callback";
 
+
+  /** @domName Notification.cancel */
   void cancel() native "Notification_cancel_Callback";
 
+
+  /** @domName Notification.close */
   void close() native "Notification_close_Callback";
 
+
+  /** @domName Notification.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "Notification_dispatchEvent_Callback";
 
+
+  /** @domName Notification.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_removeEventListener_Callback";
 
+
+  /** @domName Notification.requestPermission */
   static void requestPermission(NotificationPermissionCallback callback) native "Notification_requestPermission_Callback";
 
+
+  /** @domName Notification.show */
   void show() native "Notification_show_Callback";
 
 }
 
-class _NotificationEventsImpl extends _EventsImpl implements NotificationEvents {
-  _NotificationEventsImpl(_ptr) : super(_ptr);
+class NotificationEvents extends Events {
+  NotificationEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get click => this['click'];
 
@@ -24009,6 +18154,33 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName NotificationCenter
+class NotificationCenter extends NativeFieldWrapperClass1 {
+  NotificationCenter.internal();
+
+
+  /** @domName NotificationCenter.checkPermission */
+  int checkPermission() native "NotificationCenter_checkPermission_Callback";
+
+
+  /** @domName NotificationCenter.createHTMLNotification */
+  Notification createHTMLNotification(String url) native "NotificationCenter_createHTMLNotification_Callback";
+
+
+  /** @domName NotificationCenter.createNotification */
+  Notification createNotification(String iconUrl, String title, String body) native "NotificationCenter_createNotification_Callback";
+
+
+  /** @domName NotificationCenter.requestPermission */
+  void requestPermission(VoidCallback callback) native "NotificationCenter_requestPermission_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 
 typedef void NotificationPermissionCallback(String permission);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24018,15 +18190,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName OESElementIndexUint
-abstract class OESElementIndexUint {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _OESElementIndexUintImpl extends NativeFieldWrapperClass1 implements OESElementIndexUint {
+class OESElementIndexUint extends NativeFieldWrapperClass1 {
+  OESElementIndexUint.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24036,17 +18201,10 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName OESStandardDerivatives
-abstract class OESStandardDerivatives {
+class OESStandardDerivatives extends NativeFieldWrapperClass1 {
+  OESStandardDerivatives.internal();
 
   static const int FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _OESStandardDerivativesImpl extends NativeFieldWrapperClass1 implements OESStandardDerivatives {
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24056,15 +18214,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName OESTextureFloat
-abstract class OESTextureFloat {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _OESTextureFloatImpl extends NativeFieldWrapperClass1 implements OESTextureFloat {
+class OESTextureFloat extends NativeFieldWrapperClass1 {
+  OESTextureFloat.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24074,36 +18225,25 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName OESVertexArrayObject
-abstract class OESVertexArrayObject {
+class OESVertexArrayObject extends NativeFieldWrapperClass1 {
+  OESVertexArrayObject.internal();
 
   static const int VERTEX_ARRAY_BINDING_OES = 0x85B5;
 
+
   /** @domName OESVertexArrayObject.bindVertexArrayOES */
-  void bindVertexArrayOES(WebGLVertexArrayObjectOES arrayObject);
-
-  /** @domName OESVertexArrayObject.createVertexArrayOES */
-  WebGLVertexArrayObjectOES createVertexArrayOES();
-
-  /** @domName OESVertexArrayObject.deleteVertexArrayOES */
-  void deleteVertexArrayOES(WebGLVertexArrayObjectOES arrayObject);
-
-  /** @domName OESVertexArrayObject.isVertexArrayOES */
-  bool isVertexArrayOES(WebGLVertexArrayObjectOES arrayObject);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _OESVertexArrayObjectImpl extends NativeFieldWrapperClass1 implements OESVertexArrayObject {
-
   void bindVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
 
+
+  /** @domName OESVertexArrayObject.createVertexArrayOES */
   WebGLVertexArrayObjectOES createVertexArrayOES() native "OESVertexArrayObject_createVertexArrayOES_Callback";
 
+
+  /** @domName OESVertexArrayObject.deleteVertexArrayOES */
   void deleteVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";
 
+
+  /** @domName OESVertexArrayObject.isVertexArrayOES */
   bool isVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback";
 
 }
@@ -24114,44 +18254,41 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLOListElement
-abstract class OListElement implements Element {
+class OListElement extends _Element_Merged {
 
   factory OListElement() => _Elements.createOListElement();
+  OListElement.internal(): super.internal();
+
 
   /** @domName HTMLOListElement.compact */
-  bool compact;
-
-  /** @domName HTMLOListElement.reversed */
-  bool reversed;
-
-  /** @domName HTMLOListElement.start */
-  int start;
-
-  /** @domName HTMLOListElement.type */
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _OListElementImpl extends _ElementImpl_Merged implements OListElement {
-
   bool get compact native "HTMLOListElement_compact_Getter";
 
+
+  /** @domName HTMLOListElement.compact */
   void set compact(bool value) native "HTMLOListElement_compact_Setter";
 
+
+  /** @domName HTMLOListElement.reversed */
   bool get reversed native "HTMLOListElement_reversed_Getter";
 
+
+  /** @domName HTMLOListElement.reversed */
   void set reversed(bool value) native "HTMLOListElement_reversed_Setter";
 
+
+  /** @domName HTMLOListElement.start */
   int get start native "HTMLOListElement_start_Getter";
 
+
+  /** @domName HTMLOListElement.start */
   void set start(int value) native "HTMLOListElement_start_Setter";
 
+
+  /** @domName HTMLOListElement.type */
   String get type native "HTMLOListElement_type_Getter";
 
+
+  /** @domName HTMLOListElement.type */
   void set type(String value) native "HTMLOListElement_type_Setter";
 
 }
@@ -24162,158 +18299,161 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLObjectElement
-abstract class ObjectElement implements Element {
+class ObjectElement extends _Element_Merged {
 
   factory ObjectElement() => _Elements.createObjectElement();
+  ObjectElement.internal(): super.internal();
+
 
   /** @domName HTMLObjectElement.align */
-  String align;
-
-  /** @domName HTMLObjectElement.archive */
-  String archive;
-
-  /** @domName HTMLObjectElement.border */
-  String border;
-
-  /** @domName HTMLObjectElement.code */
-  String code;
-
-  /** @domName HTMLObjectElement.codeBase */
-  String codeBase;
-
-  /** @domName HTMLObjectElement.codeType */
-  String codeType;
-
-  /** @domName HTMLObjectElement.data */
-  String data;
-
-  /** @domName HTMLObjectElement.declare */
-  bool declare;
-
-  /** @domName HTMLObjectElement.form */
-  FormElement get form;
-
-  /** @domName HTMLObjectElement.height */
-  String height;
-
-  /** @domName HTMLObjectElement.hspace */
-  int hspace;
-
-  /** @domName HTMLObjectElement.name */
-  String name;
-
-  /** @domName HTMLObjectElement.standby */
-  String standby;
-
-  /** @domName HTMLObjectElement.type */
-  String type;
-
-  /** @domName HTMLObjectElement.useMap */
-  String useMap;
-
-  /** @domName HTMLObjectElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLObjectElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLObjectElement.vspace */
-  int vspace;
-
-  /** @domName HTMLObjectElement.width */
-  String width;
-
-  /** @domName HTMLObjectElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLObjectElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLObjectElement.setCustomValidity */
-  void setCustomValidity(String error);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ObjectElementImpl extends _ElementImpl_Merged implements ObjectElement {
-
   String get align native "HTMLObjectElement_align_Getter";
 
+
+  /** @domName HTMLObjectElement.align */
   void set align(String value) native "HTMLObjectElement_align_Setter";
 
+
+  /** @domName HTMLObjectElement.archive */
   String get archive native "HTMLObjectElement_archive_Getter";
 
+
+  /** @domName HTMLObjectElement.archive */
   void set archive(String value) native "HTMLObjectElement_archive_Setter";
 
+
+  /** @domName HTMLObjectElement.border */
   String get border native "HTMLObjectElement_border_Getter";
 
+
+  /** @domName HTMLObjectElement.border */
   void set border(String value) native "HTMLObjectElement_border_Setter";
 
+
+  /** @domName HTMLObjectElement.code */
   String get code native "HTMLObjectElement_code_Getter";
 
+
+  /** @domName HTMLObjectElement.code */
   void set code(String value) native "HTMLObjectElement_code_Setter";
 
+
+  /** @domName HTMLObjectElement.codeBase */
   String get codeBase native "HTMLObjectElement_codeBase_Getter";
 
+
+  /** @domName HTMLObjectElement.codeBase */
   void set codeBase(String value) native "HTMLObjectElement_codeBase_Setter";
 
+
+  /** @domName HTMLObjectElement.codeType */
   String get codeType native "HTMLObjectElement_codeType_Getter";
 
+
+  /** @domName HTMLObjectElement.codeType */
   void set codeType(String value) native "HTMLObjectElement_codeType_Setter";
 
+
+  /** @domName HTMLObjectElement.data */
   String get data native "HTMLObjectElement_data_Getter";
 
+
+  /** @domName HTMLObjectElement.data */
   void set data(String value) native "HTMLObjectElement_data_Setter";
 
+
+  /** @domName HTMLObjectElement.declare */
   bool get declare native "HTMLObjectElement_declare_Getter";
 
+
+  /** @domName HTMLObjectElement.declare */
   void set declare(bool value) native "HTMLObjectElement_declare_Setter";
 
+
+  /** @domName HTMLObjectElement.form */
   FormElement get form native "HTMLObjectElement_form_Getter";
 
+
+  /** @domName HTMLObjectElement.height */
   String get height native "HTMLObjectElement_height_Getter";
 
+
+  /** @domName HTMLObjectElement.height */
   void set height(String value) native "HTMLObjectElement_height_Setter";
 
+
+  /** @domName HTMLObjectElement.hspace */
   int get hspace native "HTMLObjectElement_hspace_Getter";
 
+
+  /** @domName HTMLObjectElement.hspace */
   void set hspace(int value) native "HTMLObjectElement_hspace_Setter";
 
+
+  /** @domName HTMLObjectElement.name */
   String get name native "HTMLObjectElement_name_Getter";
 
+
+  /** @domName HTMLObjectElement.name */
   void set name(String value) native "HTMLObjectElement_name_Setter";
 
+
+  /** @domName HTMLObjectElement.standby */
   String get standby native "HTMLObjectElement_standby_Getter";
 
+
+  /** @domName HTMLObjectElement.standby */
   void set standby(String value) native "HTMLObjectElement_standby_Setter";
 
+
+  /** @domName HTMLObjectElement.type */
   String get type native "HTMLObjectElement_type_Getter";
 
+
+  /** @domName HTMLObjectElement.type */
   void set type(String value) native "HTMLObjectElement_type_Setter";
 
+
+  /** @domName HTMLObjectElement.useMap */
   String get useMap native "HTMLObjectElement_useMap_Getter";
 
+
+  /** @domName HTMLObjectElement.useMap */
   void set useMap(String value) native "HTMLObjectElement_useMap_Setter";
 
+
+  /** @domName HTMLObjectElement.validationMessage */
   String get validationMessage native "HTMLObjectElement_validationMessage_Getter";
 
+
+  /** @domName HTMLObjectElement.validity */
   ValidityState get validity native "HTMLObjectElement_validity_Getter";
 
+
+  /** @domName HTMLObjectElement.vspace */
   int get vspace native "HTMLObjectElement_vspace_Getter";
 
+
+  /** @domName HTMLObjectElement.vspace */
   void set vspace(int value) native "HTMLObjectElement_vspace_Setter";
 
+
+  /** @domName HTMLObjectElement.width */
   String get width native "HTMLObjectElement_width_Getter";
 
+
+  /** @domName HTMLObjectElement.width */
   void set width(String value) native "HTMLObjectElement_width_Setter";
 
+
+  /** @domName HTMLObjectElement.willValidate */
   bool get willValidate native "HTMLObjectElement_willValidate_Getter";
 
+
+  /** @domName HTMLObjectElement.checkValidity */
   bool checkValidity() native "HTMLObjectElement_checkValidity_Callback";
 
+
+  /** @domName HTMLObjectElement.setCustomValidity */
   void setCustomValidity(String error) native "HTMLObjectElement_setCustomValidity_Callback";
 
 }
@@ -24324,19 +18464,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName OfflineAudioCompletionEvent
-abstract class OfflineAudioCompletionEvent implements Event {
+class OfflineAudioCompletionEvent extends Event {
+  OfflineAudioCompletionEvent.internal(): super.internal();
+
 
   /** @domName OfflineAudioCompletionEvent.renderedBuffer */
-  AudioBuffer get renderedBuffer;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _OfflineAudioCompletionEventImpl extends _EventImpl implements OfflineAudioCompletionEvent {
-
   AudioBuffer get renderedBuffer native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
 
 }
@@ -24347,30 +18479,25 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLOptGroupElement
-abstract class OptGroupElement implements Element {
+class OptGroupElement extends _Element_Merged {
 
   factory OptGroupElement() => _Elements.createOptGroupElement();
+  OptGroupElement.internal(): super.internal();
+
 
   /** @domName HTMLOptGroupElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLOptGroupElement.label */
-  String label;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _OptGroupElementImpl extends _ElementImpl_Merged implements OptGroupElement {
-
   bool get disabled native "HTMLOptGroupElement_disabled_Getter";
 
+
+  /** @domName HTMLOptGroupElement.disabled */
   void set disabled(bool value) native "HTMLOptGroupElement_disabled_Setter";
 
+
+  /** @domName HTMLOptGroupElement.label */
   String get label native "HTMLOptGroupElement_label_Getter";
 
+
+  /** @domName HTMLOptGroupElement.label */
   void set label(String value) native "HTMLOptGroupElement_label_Setter";
 
 }
@@ -24381,7 +18508,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLOptionElement
-abstract class OptionElement implements Element {
+class OptionElement extends _Element_Merged {
 
   factory OptionElement([String data, String value, bool defaultSelected, bool selected]) {
     if (!?data) {
@@ -24398,58 +18525,54 @@
     }
     return _OptionElementFactoryProvider.createOptionElement(data, value, defaultSelected, selected);
   }
+  OptionElement.internal(): super.internal();
+
 
   /** @domName HTMLOptionElement.defaultSelected */
-  bool defaultSelected;
-
-  /** @domName HTMLOptionElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLOptionElement.form */
-  FormElement get form;
-
-  /** @domName HTMLOptionElement.index */
-  int get index;
-
-  /** @domName HTMLOptionElement.label */
-  String label;
-
-  /** @domName HTMLOptionElement.selected */
-  bool selected;
-
-  /** @domName HTMLOptionElement.value */
-  String value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _OptionElementImpl extends _ElementImpl_Merged implements OptionElement {
-
   bool get defaultSelected native "HTMLOptionElement_defaultSelected_Getter";
 
+
+  /** @domName HTMLOptionElement.defaultSelected */
   void set defaultSelected(bool value) native "HTMLOptionElement_defaultSelected_Setter";
 
+
+  /** @domName HTMLOptionElement.disabled */
   bool get disabled native "HTMLOptionElement_disabled_Getter";
 
+
+  /** @domName HTMLOptionElement.disabled */
   void set disabled(bool value) native "HTMLOptionElement_disabled_Setter";
 
+
+  /** @domName HTMLOptionElement.form */
   FormElement get form native "HTMLOptionElement_form_Getter";
 
+
+  /** @domName HTMLOptionElement.index */
   int get index native "HTMLOptionElement_index_Getter";
 
+
+  /** @domName HTMLOptionElement.label */
   String get label native "HTMLOptionElement_label_Getter";
 
+
+  /** @domName HTMLOptionElement.label */
   void set label(String value) native "HTMLOptionElement_label_Setter";
 
+
+  /** @domName HTMLOptionElement.selected */
   bool get selected native "HTMLOptionElement_selected_Getter";
 
+
+  /** @domName HTMLOptionElement.selected */
   void set selected(bool value) native "HTMLOptionElement_selected_Setter";
 
+
+  /** @domName HTMLOptionElement.value */
   String get value native "HTMLOptionElement_value_Getter";
 
+
+  /** @domName HTMLOptionElement.value */
   void set value(String value) native "HTMLOptionElement_value_Setter";
 
 }
@@ -24460,7 +18583,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName OscillatorNode
-abstract class OscillatorNode implements AudioSourceNode {
+class OscillatorNode extends AudioSourceNode {
+  OscillatorNode.internal(): super.internal();
 
   static const int CUSTOM = 4;
 
@@ -24480,49 +18604,36 @@
 
   static const int UNSCHEDULED_STATE = 0;
 
+
   /** @domName OscillatorNode.detune */
-  AudioParam get detune;
-
-  /** @domName OscillatorNode.frequency */
-  AudioParam get frequency;
-
-  /** @domName OscillatorNode.playbackState */
-  int get playbackState;
-
-  /** @domName OscillatorNode.type */
-  int type;
-
-  /** @domName OscillatorNode.setWaveTable */
-  void setWaveTable(WaveTable waveTable);
-
-  /** @domName OscillatorNode.start */
-  void start(num when);
-
-  /** @domName OscillatorNode.stop */
-  void stop(num when);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _OscillatorNodeImpl extends _AudioSourceNodeImpl implements OscillatorNode {
-
   AudioParam get detune native "OscillatorNode_detune_Getter";
 
+
+  /** @domName OscillatorNode.frequency */
   AudioParam get frequency native "OscillatorNode_frequency_Getter";
 
+
+  /** @domName OscillatorNode.playbackState */
   int get playbackState native "OscillatorNode_playbackState_Getter";
 
+
+  /** @domName OscillatorNode.type */
   int get type native "OscillatorNode_type_Getter";
 
+
+  /** @domName OscillatorNode.type */
   void set type(int value) native "OscillatorNode_type_Setter";
 
+
+  /** @domName OscillatorNode.setWaveTable */
   void setWaveTable(WaveTable waveTable) native "OscillatorNode_setWaveTable_Callback";
 
+
+  /** @domName OscillatorNode.start */
   void start(num when) native "OscillatorNode_start_Callback";
 
+
+  /** @domName OscillatorNode.stop */
   void stop(num when) native "OscillatorNode_stop_Callback";
 
 }
@@ -24533,84 +18644,73 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLOutputElement
-abstract class OutputElement implements Element {
+class OutputElement extends _Element_Merged {
 
   factory OutputElement() => _Elements.createOutputElement();
+  OutputElement.internal(): super.internal();
+
 
   /** @domName HTMLOutputElement.defaultValue */
-  String defaultValue;
-
-  /** @domName HTMLOutputElement.form */
-  FormElement get form;
-
-  /** @domName HTMLOutputElement.htmlFor */
-  DOMSettableTokenList htmlFor;
-
-  /** @domName HTMLOutputElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLOutputElement.name */
-  String name;
-
-  /** @domName HTMLOutputElement.type */
-  String get type;
-
-  /** @domName HTMLOutputElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLOutputElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLOutputElement.value */
-  String value;
-
-  /** @domName HTMLOutputElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLOutputElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLOutputElement.setCustomValidity */
-  void setCustomValidity(String error);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _OutputElementImpl extends _ElementImpl_Merged implements OutputElement {
-
   String get defaultValue native "HTMLOutputElement_defaultValue_Getter";
 
+
+  /** @domName HTMLOutputElement.defaultValue */
   void set defaultValue(String value) native "HTMLOutputElement_defaultValue_Setter";
 
+
+  /** @domName HTMLOutputElement.form */
   FormElement get form native "HTMLOutputElement_form_Getter";
 
+
+  /** @domName HTMLOutputElement.htmlFor */
   DOMSettableTokenList get htmlFor native "HTMLOutputElement_htmlFor_Getter";
 
+
+  /** @domName HTMLOutputElement.htmlFor */
   void set htmlFor(DOMSettableTokenList value) native "HTMLOutputElement_htmlFor_Setter";
 
+
+  /** @domName HTMLOutputElement.labels */
   List<Node> get labels native "HTMLOutputElement_labels_Getter";
 
+
+  /** @domName HTMLOutputElement.name */
   String get name native "HTMLOutputElement_name_Getter";
 
+
+  /** @domName HTMLOutputElement.name */
   void set name(String value) native "HTMLOutputElement_name_Setter";
 
+
+  /** @domName HTMLOutputElement.type */
   String get type native "HTMLOutputElement_type_Getter";
 
+
+  /** @domName HTMLOutputElement.validationMessage */
   String get validationMessage native "HTMLOutputElement_validationMessage_Getter";
 
+
+  /** @domName HTMLOutputElement.validity */
   ValidityState get validity native "HTMLOutputElement_validity_Getter";
 
+
+  /** @domName HTMLOutputElement.value */
   String get value native "HTMLOutputElement_value_Getter";
 
+
+  /** @domName HTMLOutputElement.value */
   void set value(String value) native "HTMLOutputElement_value_Setter";
 
+
+  /** @domName HTMLOutputElement.willValidate */
   bool get willValidate native "HTMLOutputElement_willValidate_Getter";
 
+
+  /** @domName HTMLOutputElement.checkValidity */
   bool checkValidity() native "HTMLOutputElement_checkValidity_Callback";
 
+
+  /** @domName HTMLOutputElement.setCustomValidity */
   void setCustomValidity(String error) native "HTMLOutputElement_setCustomValidity_Callback";
 
 }
@@ -24621,7 +18721,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName OverflowEvent
-abstract class OverflowEvent implements Event {
+class OverflowEvent extends Event {
+  OverflowEvent.internal(): super.internal();
 
   static const int BOTH = 2;
 
@@ -24629,27 +18730,16 @@
 
   static const int VERTICAL = 1;
 
+
   /** @domName OverflowEvent.horizontalOverflow */
-  bool get horizontalOverflow;
-
-  /** @domName OverflowEvent.orient */
-  int get orient;
-
-  /** @domName OverflowEvent.verticalOverflow */
-  bool get verticalOverflow;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _OverflowEventImpl extends _EventImpl implements OverflowEvent {
-
   bool get horizontalOverflow native "OverflowEvent_horizontalOverflow_Getter";
 
+
+  /** @domName OverflowEvent.orient */
   int get orient native "OverflowEvent_orient_Getter";
 
+
+  /** @domName OverflowEvent.verticalOverflow */
   bool get verticalOverflow native "OverflowEvent_verticalOverflow_Getter";
 
 }
@@ -24660,24 +18750,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName PagePopupController
-abstract class PagePopupController {
+class PagePopupController extends NativeFieldWrapperClass1 {
+  PagePopupController.internal();
+
 
   /** @domName PagePopupController.localizeNumberString */
-  String localizeNumberString(String numberString);
-
-  /** @domName PagePopupController.setValueAndClosePopup */
-  void setValueAndClosePopup(int numberValue, String stringValue);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _PagePopupControllerImpl extends NativeFieldWrapperClass1 implements PagePopupController {
-
   String localizeNumberString(String numberString) native "PagePopupController_localizeNumberString_Callback";
 
+
+  /** @domName PagePopupController.setValueAndClosePopup */
   void setValueAndClosePopup(int numberValue, String stringValue) native "PagePopupController_setValueAndClosePopup_Callback";
 
 }
@@ -24688,19 +18769,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName PageTransitionEvent
-abstract class PageTransitionEvent implements Event {
+class PageTransitionEvent extends Event {
+  PageTransitionEvent.internal(): super.internal();
+
 
   /** @domName PageTransitionEvent.persisted */
-  bool get persisted;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _PageTransitionEventImpl extends _EventImpl implements PageTransitionEvent {
-
   bool get persisted native "PageTransitionEvent_persisted_Getter";
 
 }
@@ -24711,7 +18784,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName PannerNode
-abstract class PannerNode implements AudioNode {
+class PannerNode extends AudioNode {
+  PannerNode.internal(): super.internal();
 
   static const int EQUALPOWER = 0;
 
@@ -24725,93 +18799,88 @@
 
   static const int SOUNDFIELD = 2;
 
+
   /** @domName PannerNode.coneGain */
-  AudioGain get coneGain;
-
-  /** @domName PannerNode.coneInnerAngle */
-  num coneInnerAngle;
-
-  /** @domName PannerNode.coneOuterAngle */
-  num coneOuterAngle;
-
-  /** @domName PannerNode.coneOuterGain */
-  num coneOuterGain;
-
-  /** @domName PannerNode.distanceGain */
-  AudioGain get distanceGain;
-
-  /** @domName PannerNode.distanceModel */
-  int distanceModel;
-
-  /** @domName PannerNode.maxDistance */
-  num maxDistance;
-
-  /** @domName PannerNode.panningModel */
-  int panningModel;
-
-  /** @domName PannerNode.refDistance */
-  num refDistance;
-
-  /** @domName PannerNode.rolloffFactor */
-  num rolloffFactor;
-
-  /** @domName PannerNode.setOrientation */
-  void setOrientation(num x, num y, num z);
-
-  /** @domName PannerNode.setPosition */
-  void setPosition(num x, num y, num z);
-
-  /** @domName PannerNode.setVelocity */
-  void setVelocity(num x, num y, num z);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _PannerNodeImpl extends _AudioNodeImpl implements PannerNode {
-
   AudioGain get coneGain native "PannerNode_coneGain_Getter";
 
+
+  /** @domName PannerNode.coneInnerAngle */
   num get coneInnerAngle native "PannerNode_coneInnerAngle_Getter";
 
+
+  /** @domName PannerNode.coneInnerAngle */
   void set coneInnerAngle(num value) native "PannerNode_coneInnerAngle_Setter";
 
+
+  /** @domName PannerNode.coneOuterAngle */
   num get coneOuterAngle native "PannerNode_coneOuterAngle_Getter";
 
+
+  /** @domName PannerNode.coneOuterAngle */
   void set coneOuterAngle(num value) native "PannerNode_coneOuterAngle_Setter";
 
+
+  /** @domName PannerNode.coneOuterGain */
   num get coneOuterGain native "PannerNode_coneOuterGain_Getter";
 
+
+  /** @domName PannerNode.coneOuterGain */
   void set coneOuterGain(num value) native "PannerNode_coneOuterGain_Setter";
 
+
+  /** @domName PannerNode.distanceGain */
   AudioGain get distanceGain native "PannerNode_distanceGain_Getter";
 
+
+  /** @domName PannerNode.distanceModel */
   int get distanceModel native "PannerNode_distanceModel_Getter";
 
+
+  /** @domName PannerNode.distanceModel */
   void set distanceModel(int value) native "PannerNode_distanceModel_Setter";
 
+
+  /** @domName PannerNode.maxDistance */
   num get maxDistance native "PannerNode_maxDistance_Getter";
 
+
+  /** @domName PannerNode.maxDistance */
   void set maxDistance(num value) native "PannerNode_maxDistance_Setter";
 
+
+  /** @domName PannerNode.panningModel */
   int get panningModel native "PannerNode_panningModel_Getter";
 
+
+  /** @domName PannerNode.panningModel */
   void set panningModel(int value) native "PannerNode_panningModel_Setter";
 
+
+  /** @domName PannerNode.refDistance */
   num get refDistance native "PannerNode_refDistance_Getter";
 
+
+  /** @domName PannerNode.refDistance */
   void set refDistance(num value) native "PannerNode_refDistance_Setter";
 
+
+  /** @domName PannerNode.rolloffFactor */
   num get rolloffFactor native "PannerNode_rolloffFactor_Getter";
 
+
+  /** @domName PannerNode.rolloffFactor */
   void set rolloffFactor(num value) native "PannerNode_rolloffFactor_Setter";
 
+
+  /** @domName PannerNode.setOrientation */
   void setOrientation(num x, num y, num z) native "PannerNode_setOrientation_Callback";
 
+
+  /** @domName PannerNode.setPosition */
   void setPosition(num x, num y, num z) native "PannerNode_setPosition_Callback";
 
+
+  /** @domName PannerNode.setVelocity */
   void setVelocity(num x, num y, num z) native "PannerNode_setVelocity_Callback";
 
 }
@@ -24822,23 +18891,17 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLParagraphElement
-abstract class ParagraphElement implements Element {
+class ParagraphElement extends _Element_Merged {
 
   factory ParagraphElement() => _Elements.createParagraphElement();
+  ParagraphElement.internal(): super.internal();
+
 
   /** @domName HTMLParagraphElement.align */
-  String align;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ParagraphElementImpl extends _ElementImpl_Merged implements ParagraphElement {
-
   String get align native "HTMLParagraphElement_align_Getter";
 
+
+  /** @domName HTMLParagraphElement.align */
   void set align(String value) native "HTMLParagraphElement_align_Setter";
 
 }
@@ -24849,44 +18912,41 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLParamElement
-abstract class ParamElement implements Element {
+class ParamElement extends _Element_Merged {
 
   factory ParamElement() => _Elements.createParamElement();
+  ParamElement.internal(): super.internal();
+
 
   /** @domName HTMLParamElement.name */
-  String name;
-
-  /** @domName HTMLParamElement.type */
-  String type;
-
-  /** @domName HTMLParamElement.value */
-  String value;
-
-  /** @domName HTMLParamElement.valueType */
-  String valueType;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ParamElementImpl extends _ElementImpl_Merged implements ParamElement {
-
   String get name native "HTMLParamElement_name_Getter";
 
+
+  /** @domName HTMLParamElement.name */
   void set name(String value) native "HTMLParamElement_name_Setter";
 
+
+  /** @domName HTMLParamElement.type */
   String get type native "HTMLParamElement_type_Getter";
 
+
+  /** @domName HTMLParamElement.type */
   void set type(String value) native "HTMLParamElement_type_Setter";
 
+
+  /** @domName HTMLParamElement.value */
   String get value native "HTMLParamElement_value_Getter";
 
+
+  /** @domName HTMLParamElement.value */
   void set value(String value) native "HTMLParamElement_value_Setter";
 
+
+  /** @domName HTMLParamElement.valueType */
   String get valueType native "HTMLParamElement_valueType_Getter";
 
+
+  /** @domName HTMLParamElement.valueType */
   void set valueType(String value) native "HTMLParamElement_valueType_Setter";
 
 }
@@ -24897,14 +18957,16 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName PeerConnection00
-abstract class PeerConnection00 implements EventTarget {
+class PeerConnection00 extends EventTarget {
 
   factory PeerConnection00(String serverConfiguration, IceCallback iceCallback) => _PeerConnection00FactoryProvider.createPeerConnection00(serverConfiguration, iceCallback);
+  PeerConnection00.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  PeerConnection00Events get on;
+  PeerConnection00Events get on =>
+    new PeerConnection00Events(this);
 
   static const int ACTIVE = 2;
 
@@ -24934,124 +18996,82 @@
 
   static const int SDP_PRANSWER = 0x200;
 
+
   /** @domName PeerConnection00.iceState */
-  int get iceState;
-
-  /** @domName PeerConnection00.localDescription */
-  SessionDescription get localDescription;
-
-  /** @domName PeerConnection00.localStreams */
-  List<MediaStream> get localStreams;
-
-  /** @domName PeerConnection00.readyState */
-  int get readyState;
-
-  /** @domName PeerConnection00.remoteDescription */
-  SessionDescription get remoteDescription;
-
-  /** @domName PeerConnection00.remoteStreams */
-  List<MediaStream> get remoteStreams;
-
-  /** @domName PeerConnection00.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName PeerConnection00.addStream */
-  void addStream(MediaStream stream, [Map mediaStreamHints]);
-
-  /** @domName PeerConnection00.close */
-  void close();
-
-  /** @domName PeerConnection00.createAnswer */
-  SessionDescription createAnswer(String offer, [Map mediaHints]);
-
-  /** @domName PeerConnection00.createOffer */
-  SessionDescription createOffer([Map mediaHints]);
-
-  /** @domName PeerConnection00.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName PeerConnection00.processIceMessage */
-  void processIceMessage(IceCandidate candidate);
-
-  /** @domName PeerConnection00.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName PeerConnection00.removeStream */
-  void removeStream(MediaStream stream);
-
-  /** @domName PeerConnection00.setLocalDescription */
-  void setLocalDescription(int action, SessionDescription desc);
-
-  /** @domName PeerConnection00.setRemoteDescription */
-  void setRemoteDescription(int action, SessionDescription desc);
-
-  /** @domName PeerConnection00.startIce */
-  void startIce([Map iceOptions]);
-}
-
-abstract class PeerConnection00Events implements Events {
-
-  EventListenerList get addStream;
-
-  EventListenerList get connecting;
-
-  EventListenerList get open;
-
-  EventListenerList get removeStream;
-
-  EventListenerList get stateChange;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _PeerConnection00Impl extends _EventTargetImpl implements PeerConnection00 {
-
-  _PeerConnection00EventsImpl get on =>
-    new _PeerConnection00EventsImpl(this);
-
   int get iceState native "PeerConnection00_iceState_Getter";
 
+
+  /** @domName PeerConnection00.localDescription */
   SessionDescription get localDescription native "PeerConnection00_localDescription_Getter";
 
+
+  /** @domName PeerConnection00.localStreams */
   List<MediaStream> get localStreams native "PeerConnection00_localStreams_Getter";
 
+
+  /** @domName PeerConnection00.readyState */
   int get readyState native "PeerConnection00_readyState_Getter";
 
+
+  /** @domName PeerConnection00.remoteDescription */
   SessionDescription get remoteDescription native "PeerConnection00_remoteDescription_Getter";
 
+
+  /** @domName PeerConnection00.remoteStreams */
   List<MediaStream> get remoteStreams native "PeerConnection00_remoteStreams_Getter";
 
+
+  /** @domName PeerConnection00.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "PeerConnection00_addEventListener_Callback";
 
+
+  /** @domName PeerConnection00.addStream */
   void addStream(MediaStream stream, [Map mediaStreamHints]) native "PeerConnection00_addStream_Callback";
 
+
+  /** @domName PeerConnection00.close */
   void close() native "PeerConnection00_close_Callback";
 
+
+  /** @domName PeerConnection00.createAnswer */
   SessionDescription createAnswer(String offer, [Map mediaHints]) native "PeerConnection00_createAnswer_Callback";
 
+
+  /** @domName PeerConnection00.createOffer */
   SessionDescription createOffer([Map mediaHints]) native "PeerConnection00_createOffer_Callback";
 
+
+  /** @domName PeerConnection00.dispatchEvent */
   bool $dom_dispatchEvent(Event event) native "PeerConnection00_dispatchEvent_Callback";
 
+
+  /** @domName PeerConnection00.processIceMessage */
   void processIceMessage(IceCandidate candidate) native "PeerConnection00_processIceMessage_Callback";
 
+
+  /** @domName PeerConnection00.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "PeerConnection00_removeEventListener_Callback";
 
+
+  /** @domName PeerConnection00.removeStream */
   void removeStream(MediaStream stream) native "PeerConnection00_removeStream_Callback";
 
+
+  /** @domName PeerConnection00.setLocalDescription */
   void setLocalDescription(int action, SessionDescription desc) native "PeerConnection00_setLocalDescription_Callback";
 
+
+  /** @domName PeerConnection00.setRemoteDescription */
   void setRemoteDescription(int action, SessionDescription desc) native "PeerConnection00_setRemoteDescription_Callback";
 
+
+  /** @domName PeerConnection00.startIce */
   void startIce([Map iceOptions]) native "PeerConnection00_startIce_Callback";
 
 }
 
-class _PeerConnection00EventsImpl extends _EventsImpl implements PeerConnection00Events {
-  _PeerConnection00EventsImpl(_ptr) : super(_ptr);
+class PeerConnection00Events extends Events {
+  PeerConnection00Events(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get addStream => this['addstream'];
 
@@ -25070,34 +19090,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Performance
-abstract class Performance implements EventTarget {
+class Performance extends EventTarget {
+  Performance.internal(): super.internal();
+
 
   /** @domName Performance.memory */
-  MemoryInfo get memory;
-
-  /** @domName Performance.navigation */
-  PerformanceNavigation get navigation;
-
-  /** @domName Performance.timing */
-  PerformanceTiming get timing;
-
-  /** @domName Performance.now */
-  num now();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _PerformanceImpl extends _EventTargetImpl implements Performance {
-
   MemoryInfo get memory native "Performance_memory_Getter";
 
+
+  /** @domName Performance.navigation */
   PerformanceNavigation get navigation native "Performance_navigation_Getter";
 
+
+  /** @domName Performance.timing */
   PerformanceTiming get timing native "Performance_timing_Getter";
 
+
+  /** @domName Performance.now */
   num now() native "Performance_now_Callback";
 
 }
@@ -25108,7 +19117,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName PerformanceNavigation
-abstract class PerformanceNavigation {
+class PerformanceNavigation extends NativeFieldWrapperClass1 {
+  PerformanceNavigation.internal();
 
   static const int TYPE_BACK_FORWARD = 2;
 
@@ -25118,22 +19128,12 @@
 
   static const int TYPE_RESERVED = 255;
 
+
   /** @domName PerformanceNavigation.redirectCount */
-  int get redirectCount;
-
-  /** @domName PerformanceNavigation.type */
-  int get type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _PerformanceNavigationImpl extends NativeFieldWrapperClass1 implements PerformanceNavigation {
-
   int get redirectCount native "PerformanceNavigation_redirectCount_Getter";
 
+
+  /** @domName PerformanceNavigation.type */
   int get type native "PerformanceNavigation_type_Getter";
 
 }
@@ -25144,119 +19144,91 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName PerformanceTiming
-abstract class PerformanceTiming {
+class PerformanceTiming extends NativeFieldWrapperClass1 {
+  PerformanceTiming.internal();
+
 
   /** @domName PerformanceTiming.connectEnd */
-  int get connectEnd;
-
-  /** @domName PerformanceTiming.connectStart */
-  int get connectStart;
-
-  /** @domName PerformanceTiming.domComplete */
-  int get domComplete;
-
-  /** @domName PerformanceTiming.domContentLoadedEventEnd */
-  int get domContentLoadedEventEnd;
-
-  /** @domName PerformanceTiming.domContentLoadedEventStart */
-  int get domContentLoadedEventStart;
-
-  /** @domName PerformanceTiming.domInteractive */
-  int get domInteractive;
-
-  /** @domName PerformanceTiming.domLoading */
-  int get domLoading;
-
-  /** @domName PerformanceTiming.domainLookupEnd */
-  int get domainLookupEnd;
-
-  /** @domName PerformanceTiming.domainLookupStart */
-  int get domainLookupStart;
-
-  /** @domName PerformanceTiming.fetchStart */
-  int get fetchStart;
-
-  /** @domName PerformanceTiming.loadEventEnd */
-  int get loadEventEnd;
-
-  /** @domName PerformanceTiming.loadEventStart */
-  int get loadEventStart;
-
-  /** @domName PerformanceTiming.navigationStart */
-  int get navigationStart;
-
-  /** @domName PerformanceTiming.redirectEnd */
-  int get redirectEnd;
-
-  /** @domName PerformanceTiming.redirectStart */
-  int get redirectStart;
-
-  /** @domName PerformanceTiming.requestStart */
-  int get requestStart;
-
-  /** @domName PerformanceTiming.responseEnd */
-  int get responseEnd;
-
-  /** @domName PerformanceTiming.responseStart */
-  int get responseStart;
-
-  /** @domName PerformanceTiming.secureConnectionStart */
-  int get secureConnectionStart;
-
-  /** @domName PerformanceTiming.unloadEventEnd */
-  int get unloadEventEnd;
-
-  /** @domName PerformanceTiming.unloadEventStart */
-  int get unloadEventStart;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _PerformanceTimingImpl extends NativeFieldWrapperClass1 implements PerformanceTiming {
-
   int get connectEnd native "PerformanceTiming_connectEnd_Getter";
 
+
+  /** @domName PerformanceTiming.connectStart */
   int get connectStart native "PerformanceTiming_connectStart_Getter";
 
+
+  /** @domName PerformanceTiming.domComplete */
   int get domComplete native "PerformanceTiming_domComplete_Getter";
 
+
+  /** @domName PerformanceTiming.domContentLoadedEventEnd */
   int get domContentLoadedEventEnd native "PerformanceTiming_domContentLoadedEventEnd_Getter";
 
+
+  /** @domName PerformanceTiming.domContentLoadedEventStart */
   int get domContentLoadedEventStart native "PerformanceTiming_domContentLoadedEventStart_Getter";
 
+
+  /** @domName PerformanceTiming.domInteractive */
   int get domInteractive native "PerformanceTiming_domInteractive_Getter";
 
+
+  /** @domName PerformanceTiming.domLoading */
   int get domLoading native "PerformanceTiming_domLoading_Getter";
 
+
+  /** @domName PerformanceTiming.domainLookupEnd */
   int get domainLookupEnd native "PerformanceTiming_domainLookupEnd_Getter";
 
+
+  /** @domName PerformanceTiming.domainLookupStart */
   int get domainLookupStart native "PerformanceTiming_domainLookupStart_Getter";
 
+
+  /** @domName PerformanceTiming.fetchStart */
   int get fetchStart native "PerformanceTiming_fetchStart_Getter";
 
+
+  /** @domName PerformanceTiming.loadEventEnd */
   int get loadEventEnd native "PerformanceTiming_loadEventEnd_Getter";
 
+
+  /** @domName PerformanceTiming.loadEventStart */
   int get loadEventStart native "PerformanceTiming_loadEventStart_Getter";
 
+
+  /** @domName PerformanceTiming.navigationStart */
   int get navigationStart native "PerformanceTiming_navigationStart_Getter";
 
+
+  /** @domName PerformanceTiming.redirectEnd */
   int get redirectEnd native "PerformanceTiming_redirectEnd_Getter";
 
+
+  /** @domName PerformanceTiming.redirectStart */
   int get redirectStart native "PerformanceTiming_redirectStart_Getter";
 
+
+  /** @domName PerformanceTiming.requestStart */
   int get requestStart native "PerformanceTiming_requestStart_Getter";
 
+
+  /** @domName PerformanceTiming.responseEnd */
   int get responseEnd native "PerformanceTiming_responseEnd_Getter";
 
+
+  /** @domName PerformanceTiming.responseStart */
   int get responseStart native "PerformanceTiming_responseStart_Getter";
 
+
+  /** @domName PerformanceTiming.secureConnectionStart */
   int get secureConnectionStart native "PerformanceTiming_secureConnectionStart_Getter";
 
+
+  /** @domName PerformanceTiming.unloadEventEnd */
   int get unloadEventEnd native "PerformanceTiming_unloadEventEnd_Getter";
 
+
+  /** @domName PerformanceTiming.unloadEventStart */
   int get unloadEventStart native "PerformanceTiming_unloadEventStart_Getter";
 
 }
@@ -25266,32 +19238,24 @@
 
 // WARNING: Do not edit - generated code.
 
-
-/// @domName WebKitPoint
-abstract class Point {
-
+class Point extends NativeFieldWrapperClass1 {
   factory Point(num x, num y) => _PointFactoryProvider.createPoint(x, y);
+  Point.internal();
+
 
   /** @domName WebKitPoint.x */
-  num x;
-
-  /** @domName WebKitPoint.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _PointImpl extends NativeFieldWrapperClass1 implements Point {
-
   num get x native "WebKitPoint_x_Getter";
 
+
+  /** @domName WebKitPoint.x */
   void set x(num value) native "WebKitPoint_x_Setter";
 
+
+  /** @domName WebKitPoint.y */
   num get y native "WebKitPoint_y_Getter";
 
+
+  /** @domName WebKitPoint.y */
   void set y(num value) native "WebKitPoint_y_Setter";
 
 }
@@ -25302,19 +19266,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName PopStateEvent
-abstract class PopStateEvent implements Event {
+class PopStateEvent extends Event {
+  PopStateEvent.internal(): super.internal();
+
 
   /** @domName PopStateEvent.state */
-  Object get state;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _PopStateEventImpl extends _EventImpl implements PopStateEvent {
-
   Object get state native "PopStateEvent_state_Getter";
 
 }
@@ -25333,7 +19289,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName PositionError
-abstract class PositionError {
+class PositionError extends NativeFieldWrapperClass1 {
+  PositionError.internal();
 
   static const int PERMISSION_DENIED = 1;
 
@@ -25341,11 +19298,14 @@
 
   static const int TIMEOUT = 3;
 
+
   /** @domName PositionError.code */
-  int get code;
+  int get code native "PositionError_code_Getter";
+
 
   /** @domName PositionError.message */
-  String get message;
+  String get message native "PositionError_message_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25361,44 +19321,26 @@
 
 // WARNING: Do not edit - generated code.
 
-class _PositionErrorImpl extends NativeFieldWrapperClass1 implements PositionError {
-
-  int get code native "PositionError_code_Getter";
-
-  String get message native "PositionError_message_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName HTMLPreElement
-abstract class PreElement implements Element {
+class PreElement extends _Element_Merged {
 
   factory PreElement() => _Elements.createPreElement();
+  PreElement.internal(): super.internal();
+
 
   /** @domName HTMLPreElement.width */
-  int width;
-
-  /** @domName HTMLPreElement.wrap */
-  bool wrap;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _PreElementImpl extends _ElementImpl_Merged implements PreElement {
-
   int get width native "HTMLPreElement_width_Getter";
 
+
+  /** @domName HTMLPreElement.width */
   void set width(int value) native "HTMLPreElement_width_Setter";
 
+
+  /** @domName HTMLPreElement.wrap */
   bool get wrap native "HTMLPreElement_wrap_Getter";
 
+
+  /** @domName HTMLPreElement.wrap */
   void set wrap(bool value) native "HTMLPreElement_wrap_Setter";
 
 }
@@ -25409,31 +19351,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ProcessingInstruction
-abstract class ProcessingInstruction implements Node {
+class ProcessingInstruction extends Node {
+  ProcessingInstruction.internal(): super.internal();
+
 
   /** @domName ProcessingInstruction.data */
-  String data;
-
-  /** @domName ProcessingInstruction.sheet */
-  StyleSheet get sheet;
-
-  /** @domName ProcessingInstruction.target */
-  String get target;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ProcessingInstructionImpl extends _NodeImpl implements ProcessingInstruction {
-
   String get data native "ProcessingInstruction_data_Getter";
 
+
+  /** @domName ProcessingInstruction.data */
   void set data(String value) native "ProcessingInstruction_data_Setter";
 
+
+  /** @domName ProcessingInstruction.sheet */
   StyleSheet get sheet native "ProcessingInstruction_sheet_Getter";
 
+
+  /** @domName ProcessingInstruction.target */
   String get target native "ProcessingInstruction_target_Getter";
 
 }
@@ -25444,40 +19378,33 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLProgressElement
-abstract class ProgressElement implements Element {
+class ProgressElement extends _Element_Merged {
 
   factory ProgressElement() => _Elements.createProgressElement();
+  ProgressElement.internal(): super.internal();
+
 
   /** @domName HTMLProgressElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLProgressElement.max */
-  num max;
-
-  /** @domName HTMLProgressElement.position */
-  num get position;
-
-  /** @domName HTMLProgressElement.value */
-  num value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ProgressElementImpl extends _ElementImpl_Merged implements ProgressElement {
-
   List<Node> get labels native "HTMLProgressElement_labels_Getter";
 
+
+  /** @domName HTMLProgressElement.max */
   num get max native "HTMLProgressElement_max_Getter";
 
+
+  /** @domName HTMLProgressElement.max */
   void set max(num value) native "HTMLProgressElement_max_Setter";
 
+
+  /** @domName HTMLProgressElement.position */
   num get position native "HTMLProgressElement_position_Getter";
 
+
+  /** @domName HTMLProgressElement.value */
   num get value native "HTMLProgressElement_value_Getter";
 
+
+  /** @domName HTMLProgressElement.value */
   void set value(num value) native "HTMLProgressElement_value_Setter";
 
 }
@@ -25488,29 +19415,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ProgressEvent
-abstract class ProgressEvent implements Event {
+class ProgressEvent extends Event {
+  ProgressEvent.internal(): super.internal();
+
 
   /** @domName ProgressEvent.lengthComputable */
-  bool get lengthComputable;
-
-  /** @domName ProgressEvent.loaded */
-  int get loaded;
-
-  /** @domName ProgressEvent.total */
-  int get total;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ProgressEventImpl extends _EventImpl implements ProgressEvent {
-
   bool get lengthComputable native "ProgressEvent_lengthComputable_Getter";
 
+
+  /** @domName ProgressEvent.loaded */
   int get loaded native "ProgressEvent_loaded_Getter";
 
+
+  /** @domName ProgressEvent.total */
   int get total native "ProgressEvent_total_Getter";
 
 }
@@ -25521,21 +19438,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLQuoteElement
-abstract class QuoteElement implements Element {
+class QuoteElement extends _Element_Merged {
+  QuoteElement.internal(): super.internal();
+
 
   /** @domName HTMLQuoteElement.cite */
-  String cite;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _QuoteElementImpl extends _ElementImpl_Merged implements QuoteElement {
-
   String get cite native "HTMLQuoteElement_cite_Getter";
 
+
+  /** @domName HTMLQuoteElement.cite */
   void set cite(String value) native "HTMLQuoteElement_cite_Setter";
 
 }
@@ -25546,29 +19457,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName RGBColor
-abstract class RGBColor {
+class RGBColor extends NativeFieldWrapperClass1 {
+  RGBColor.internal();
+
 
   /** @domName RGBColor.blue */
-  CSSPrimitiveValue get blue;
-
-  /** @domName RGBColor.green */
-  CSSPrimitiveValue get green;
-
-  /** @domName RGBColor.red */
-  CSSPrimitiveValue get red;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _RGBColorImpl extends NativeFieldWrapperClass1 implements RGBColor {
-
   CSSPrimitiveValue get blue native "RGBColor_blue_Getter";
 
+
+  /** @domName RGBColor.green */
   CSSPrimitiveValue get green native "RGBColor_green_Getter";
 
+
+  /** @domName RGBColor.red */
   CSSPrimitiveValue get red native "RGBColor_red_Getter";
 
 }
@@ -25579,106 +19480,53 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName RTCDataChannel
-abstract class RTCDataChannel implements EventTarget {
+class RTCDataChannel extends EventTarget {
+  RTCDataChannel.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  RTCDataChannelEvents get on;
+  RTCDataChannelEvents get on =>
+    new RTCDataChannelEvents(this);
+
 
   /** @domName RTCDataChannel.binaryType */
-  String binaryType;
-
-  /** @domName RTCDataChannel.bufferedAmount */
-  int get bufferedAmount;
-
-  /** @domName RTCDataChannel.label */
-  String get label;
-
-  /** @domName RTCDataChannel.readyState */
-  String get readyState;
-
-  /** @domName RTCDataChannel.reliable */
-  bool get reliable;
-
-  /** @domName RTCDataChannel.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName RTCDataChannel.close */
-  void close();
-
-  /** @domName RTCDataChannel.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName RTCDataChannel.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName RTCDataChannel.send */
-  void send(data);
-}
-
-abstract class RTCDataChannelEvents implements Events {
-
-  EventListenerList get close;
-
-  EventListenerList get error;
-
-  EventListenerList get message;
-
-  EventListenerList get open;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RTCDataChannelEvent
-abstract class RTCDataChannelEvent implements Event {
-
-  /** @domName RTCDataChannelEvent.channel */
-  RTCDataChannel get channel;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _RTCDataChannelEventImpl extends _EventImpl implements RTCDataChannelEvent {
-
-  RTCDataChannel get channel native "RTCDataChannelEvent_channel_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _RTCDataChannelImpl extends _EventTargetImpl implements RTCDataChannel {
-
-  _RTCDataChannelEventsImpl get on =>
-    new _RTCDataChannelEventsImpl(this);
-
   String get binaryType native "RTCDataChannel_binaryType_Getter";
 
+
+  /** @domName RTCDataChannel.binaryType */
   void set binaryType(String value) native "RTCDataChannel_binaryType_Setter";
 
+
+  /** @domName RTCDataChannel.bufferedAmount */
   int get bufferedAmount native "RTCDataChannel_bufferedAmount_Getter";
 
+
+  /** @domName RTCDataChannel.label */
   String get label native "RTCDataChannel_label_Getter";
 
+
+  /** @domName RTCDataChannel.readyState */
   String get readyState native "RTCDataChannel_readyState_Getter";
 
+
+  /** @domName RTCDataChannel.reliable */
   bool get reliable native "RTCDataChannel_reliable_Getter";
 
+
+  /** @domName RTCDataChannel.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_addEventListener_Callback";
 
+
+  /** @domName RTCDataChannel.close */
   void close() native "RTCDataChannel_close_Callback";
 
+
+  /** @domName RTCDataChannel.dispatchEvent */
   bool $dom_dispatchEvent(Event event) native "RTCDataChannel_dispatchEvent_Callback";
 
+
+  /** @domName RTCDataChannel.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_removeEventListener_Callback";
 
   void send(data) {
@@ -25701,18 +19549,26 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName RTCDataChannel.send_1 */
   void _send_1(data) native "RTCDataChannel_send_1_Callback";
 
+
+  /** @domName RTCDataChannel.send_2 */
   void _send_2(data) native "RTCDataChannel_send_2_Callback";
 
+
+  /** @domName RTCDataChannel.send_3 */
   void _send_3(data) native "RTCDataChannel_send_3_Callback";
 
+
+  /** @domName RTCDataChannel.send_4 */
   void _send_4(data) native "RTCDataChannel_send_4_Callback";
 
 }
 
-class _RTCDataChannelEventsImpl extends _EventsImpl implements RTCDataChannelEvents {
-  _RTCDataChannelEventsImpl(_ptr) : super(_ptr);
+class RTCDataChannelEvents extends Events {
+  RTCDataChannelEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get close => this['close'];
 
@@ -25728,6 +19584,21 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName RTCDataChannelEvent
+class RTCDataChannelEvent extends Event {
+  RTCDataChannelEvent.internal(): super.internal();
+
+
+  /** @domName RTCDataChannelEvent.channel */
+  RTCDataChannel get channel native "RTCDataChannelEvent_channel_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 
 typedef void RTCErrorCallback(String errorInformation);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25737,54 +19608,21 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName RTCIceCandidate
-abstract class RTCIceCandidate {
+class RTCIceCandidate extends NativeFieldWrapperClass1 {
 
   factory RTCIceCandidate(Map dictionary) => _RTCIceCandidateFactoryProvider.createRTCIceCandidate(dictionary);
+  RTCIceCandidate.internal();
+
 
   /** @domName RTCIceCandidate.candidate */
-  String get candidate;
-
-  /** @domName RTCIceCandidate.sdpMLineIndex */
-  int get sdpMLineIndex;
-
-  /** @domName RTCIceCandidate.sdpMid */
-  String get sdpMid;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RTCIceCandidateEvent
-abstract class RTCIceCandidateEvent implements Event {
-
-  /** @domName RTCIceCandidateEvent.candidate */
-  RTCIceCandidate get candidate;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _RTCIceCandidateEventImpl extends _EventImpl implements RTCIceCandidateEvent {
-
-  RTCIceCandidate get candidate native "RTCIceCandidateEvent_candidate_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _RTCIceCandidateImpl extends NativeFieldWrapperClass1 implements RTCIceCandidate {
-
   String get candidate native "RTCIceCandidate_candidate_Getter";
 
+
+  /** @domName RTCIceCandidate.sdpMLineIndex */
   int get sdpMLineIndex native "RTCIceCandidate_sdpMLineIndex_Getter";
 
+
+  /** @domName RTCIceCandidate.sdpMid */
   String get sdpMid native "RTCIceCandidate_sdpMid_Getter";
 
 }
@@ -25794,97 +19632,14 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName RTCPeerConnection
-abstract class RTCPeerConnection implements EventTarget {
+/// @domName RTCIceCandidateEvent
+class RTCIceCandidateEvent extends Event {
+  RTCIceCandidateEvent.internal(): super.internal();
 
-  factory RTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
-    if (!?mediaConstraints) {
-      return _RTCPeerConnectionFactoryProvider.createRTCPeerConnection(rtcIceServers);
-    }
-    return _RTCPeerConnectionFactoryProvider.createRTCPeerConnection(rtcIceServers, mediaConstraints);
-  }
 
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  RTCPeerConnectionEvents get on;
+  /** @domName RTCIceCandidateEvent.candidate */
+  RTCIceCandidate get candidate native "RTCIceCandidateEvent_candidate_Getter";
 
-  /** @domName RTCPeerConnection.iceState */
-  String get iceState;
-
-  /** @domName RTCPeerConnection.localDescription */
-  RTCSessionDescription get localDescription;
-
-  /** @domName RTCPeerConnection.localStreams */
-  List<MediaStream> get localStreams;
-
-  /** @domName RTCPeerConnection.readyState */
-  String get readyState;
-
-  /** @domName RTCPeerConnection.remoteDescription */
-  RTCSessionDescription get remoteDescription;
-
-  /** @domName RTCPeerConnection.remoteStreams */
-  List<MediaStream> get remoteStreams;
-
-  /** @domName RTCPeerConnection.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName RTCPeerConnection.addIceCandidate */
-  void addIceCandidate(RTCIceCandidate candidate);
-
-  /** @domName RTCPeerConnection.addStream */
-  void addStream(MediaStream stream, [Map mediaConstraints]);
-
-  /** @domName RTCPeerConnection.close */
-  void close();
-
-  /** @domName RTCPeerConnection.createAnswer */
-  void createAnswer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]);
-
-  /** @domName RTCPeerConnection.createDataChannel */
-  RTCDataChannel createDataChannel(String label, [Map options]);
-
-  /** @domName RTCPeerConnection.createOffer */
-  void createOffer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]);
-
-  /** @domName RTCPeerConnection.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName RTCPeerConnection.getStats */
-  void getStats(RTCStatsCallback successCallback, MediaStreamTrack selector);
-
-  /** @domName RTCPeerConnection.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName RTCPeerConnection.removeStream */
-  void removeStream(MediaStream stream);
-
-  /** @domName RTCPeerConnection.setLocalDescription */
-  void setLocalDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]);
-
-  /** @domName RTCPeerConnection.setRemoteDescription */
-  void setRemoteDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]);
-
-  /** @domName RTCPeerConnection.updateIce */
-  void updateIce([Map configuration, Map mediaConstraints]);
-}
-
-abstract class RTCPeerConnectionEvents implements Events {
-
-  EventListenerList get addStream;
-
-  EventListenerList get iceCandidate;
-
-  EventListenerList get iceChange;
-
-  EventListenerList get negotiationNeeded;
-
-  EventListenerList get open;
-
-  EventListenerList get removeStream;
-
-  EventListenerList get stateChange;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25892,55 +19647,107 @@
 
 // WARNING: Do not edit - generated code.
 
-class _RTCPeerConnectionImpl extends _EventTargetImpl implements RTCPeerConnection {
+/// @domName RTCPeerConnection
+class RTCPeerConnection extends EventTarget {
 
-  _RTCPeerConnectionEventsImpl get on =>
-    new _RTCPeerConnectionEventsImpl(this);
+  factory RTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
+    if (!?mediaConstraints) {
+      return _RTCPeerConnectionFactoryProvider.createRTCPeerConnection(rtcIceServers);
+    }
+    return _RTCPeerConnectionFactoryProvider.createRTCPeerConnection(rtcIceServers, mediaConstraints);
+  }
+  RTCPeerConnection.internal(): super.internal();
 
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  RTCPeerConnectionEvents get on =>
+    new RTCPeerConnectionEvents(this);
+
+
+  /** @domName RTCPeerConnection.iceState */
   String get iceState native "RTCPeerConnection_iceState_Getter";
 
+
+  /** @domName RTCPeerConnection.localDescription */
   RTCSessionDescription get localDescription native "RTCPeerConnection_localDescription_Getter";
 
+
+  /** @domName RTCPeerConnection.localStreams */
   List<MediaStream> get localStreams native "RTCPeerConnection_localStreams_Getter";
 
+
+  /** @domName RTCPeerConnection.readyState */
   String get readyState native "RTCPeerConnection_readyState_Getter";
 
+
+  /** @domName RTCPeerConnection.remoteDescription */
   RTCSessionDescription get remoteDescription native "RTCPeerConnection_remoteDescription_Getter";
 
+
+  /** @domName RTCPeerConnection.remoteStreams */
   List<MediaStream> get remoteStreams native "RTCPeerConnection_remoteStreams_Getter";
 
+
+  /** @domName RTCPeerConnection.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_addEventListener_Callback";
 
+
+  /** @domName RTCPeerConnection.addIceCandidate */
   void addIceCandidate(RTCIceCandidate candidate) native "RTCPeerConnection_addIceCandidate_Callback";
 
+
+  /** @domName RTCPeerConnection.addStream */
   void addStream(MediaStream stream, [Map mediaConstraints]) native "RTCPeerConnection_addStream_Callback";
 
+
+  /** @domName RTCPeerConnection.close */
   void close() native "RTCPeerConnection_close_Callback";
 
+
+  /** @domName RTCPeerConnection.createAnswer */
   void createAnswer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createAnswer_Callback";
 
+
+  /** @domName RTCPeerConnection.createDataChannel */
   RTCDataChannel createDataChannel(String label, [Map options]) native "RTCPeerConnection_createDataChannel_Callback";
 
+
+  /** @domName RTCPeerConnection.createOffer */
   void createOffer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createOffer_Callback";
 
+
+  /** @domName RTCPeerConnection.dispatchEvent */
   bool $dom_dispatchEvent(Event event) native "RTCPeerConnection_dispatchEvent_Callback";
 
+
+  /** @domName RTCPeerConnection.getStats */
   void getStats(RTCStatsCallback successCallback, MediaStreamTrack selector) native "RTCPeerConnection_getStats_Callback";
 
+
+  /** @domName RTCPeerConnection.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_removeEventListener_Callback";
 
+
+  /** @domName RTCPeerConnection.removeStream */
   void removeStream(MediaStream stream) native "RTCPeerConnection_removeStream_Callback";
 
+
+  /** @domName RTCPeerConnection.setLocalDescription */
   void setLocalDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]) native "RTCPeerConnection_setLocalDescription_Callback";
 
+
+  /** @domName RTCPeerConnection.setRemoteDescription */
   void setRemoteDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]) native "RTCPeerConnection_setRemoteDescription_Callback";
 
+
+  /** @domName RTCPeerConnection.updateIce */
   void updateIce([Map configuration, Map mediaConstraints]) native "RTCPeerConnection_updateIce_Callback";
 
 }
 
-class _RTCPeerConnectionEventsImpl extends _EventsImpl implements RTCPeerConnectionEvents {
-  _RTCPeerConnectionEventsImpl(_ptr) : super(_ptr);
+class RTCPeerConnectionEvents extends Events {
+  RTCPeerConnectionEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get addStream => this['addstream'];
 
@@ -25963,15 +19770,27 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName RTCSessionDescription
-abstract class RTCSessionDescription {
+class RTCSessionDescription extends NativeFieldWrapperClass1 {
 
   factory RTCSessionDescription(Map dictionary) => _RTCSessionDescriptionFactoryProvider.createRTCSessionDescription(dictionary);
+  RTCSessionDescription.internal();
+
 
   /** @domName RTCSessionDescription.sdp */
-  String sdp;
+  String get sdp native "RTCSessionDescription_sdp_Getter";
+
+
+  /** @domName RTCSessionDescription.sdp */
+  void set sdp(String value) native "RTCSessionDescription_sdp_Setter";
+
 
   /** @domName RTCSessionDescription.type */
-  String type;
+  String get type native "RTCSessionDescription_type_Getter";
+
+
+  /** @domName RTCSessionDescription.type */
+  void set type(String value) native "RTCSessionDescription_type_Setter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25987,23 +19806,6 @@
 
 // WARNING: Do not edit - generated code.
 
-class _RTCSessionDescriptionImpl extends NativeFieldWrapperClass1 implements RTCSessionDescription {
-
-  String get sdp native "RTCSessionDescription_sdp_Getter";
-
-  void set sdp(String value) native "RTCSessionDescription_sdp_Setter";
-
-  String get type native "RTCSessionDescription_type_Getter";
-
-  void set type(String value) native "RTCSessionDescription_type_Setter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 
 typedef void RTCStatsCallback(RTCStatsResponse response);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26013,24 +19815,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName RTCStatsElement
-abstract class RTCStatsElement {
+class RTCStatsElement extends NativeFieldWrapperClass1 {
+  RTCStatsElement.internal();
+
 
   /** @domName RTCStatsElement.timestamp */
-  Date get timestamp;
-
-  /** @domName RTCStatsElement.stat */
-  String stat(String name);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _RTCStatsElementImpl extends NativeFieldWrapperClass1 implements RTCStatsElement {
-
   Date get timestamp native "RTCStatsElement_timestamp_Getter";
 
+
+  /** @domName RTCStatsElement.stat */
   String stat(String name) native "RTCStatsElement_stat_Callback";
 
 }
@@ -26041,24 +19834,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName RTCStatsReport
-abstract class RTCStatsReport {
+class RTCStatsReport extends NativeFieldWrapperClass1 {
+  RTCStatsReport.internal();
+
 
   /** @domName RTCStatsReport.local */
-  RTCStatsElement get local;
-
-  /** @domName RTCStatsReport.remote */
-  RTCStatsElement get remote;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _RTCStatsReportImpl extends NativeFieldWrapperClass1 implements RTCStatsReport {
-
   RTCStatsElement get local native "RTCStatsReport_local_Getter";
 
+
+  /** @domName RTCStatsReport.remote */
   RTCStatsElement get remote native "RTCStatsReport_remote_Getter";
 
 }
@@ -26069,19 +19853,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName RTCStatsResponse
-abstract class RTCStatsResponse {
+class RTCStatsResponse extends NativeFieldWrapperClass1 {
+  RTCStatsResponse.internal();
+
 
   /** @domName RTCStatsResponse.result */
-  List<RTCStatsReport> result();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _RTCStatsResponseImpl extends NativeFieldWrapperClass1 implements RTCStatsResponse {
-
   List<RTCStatsReport> result() native "RTCStatsResponse_result_Callback";
 
 }
@@ -26092,21 +19868,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName RadioNodeList
-abstract class RadioNodeList implements NodeList {
+class RadioNodeList extends NodeList {
+  RadioNodeList.internal(): super.internal();
+
 
   /** @domName RadioNodeList.value */
-  String value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _RadioNodeListImpl extends _NodeListImpl implements RadioNodeList {
-
   String get value native "RadioNodeList_value_Getter";
 
+
+  /** @domName RadioNodeList.value */
   void set value(String value) native "RadioNodeList_value_Setter";
 
 }
@@ -26117,7 +19887,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Range
-abstract class Range {
+class Range extends NativeFieldWrapperClass1 {
+  Range.internal();
 
   static const int END_TO_END = 2;
 
@@ -26135,209 +19906,128 @@
 
   static const int START_TO_START = 0;
 
+
   /** @domName Range.collapsed */
-  bool get collapsed;
-
-  /** @domName Range.commonAncestorContainer */
-  Node get commonAncestorContainer;
-
-  /** @domName Range.endContainer */
-  Node get endContainer;
-
-  /** @domName Range.endOffset */
-  int get endOffset;
-
-  /** @domName Range.startContainer */
-  Node get startContainer;
-
-  /** @domName Range.startOffset */
-  int get startOffset;
-
-  /** @domName Range.cloneContents */
-  DocumentFragment cloneContents();
-
-  /** @domName Range.cloneRange */
-  Range cloneRange();
-
-  /** @domName Range.collapse */
-  void collapse(bool toStart);
-
-  /** @domName Range.compareNode */
-  int compareNode(Node refNode);
-
-  /** @domName Range.comparePoint */
-  int comparePoint(Node refNode, int offset);
-
-  /** @domName Range.createContextualFragment */
-  DocumentFragment createContextualFragment(String html);
-
-  /** @domName Range.deleteContents */
-  void deleteContents();
-
-  /** @domName Range.detach */
-  void detach();
-
-  /** @domName Range.expand */
-  void expand(String unit);
-
-  /** @domName Range.extractContents */
-  DocumentFragment extractContents();
-
-  /** @domName Range.getBoundingClientRect */
-  ClientRect getBoundingClientRect();
-
-  /** @domName Range.getClientRects */
-  List<ClientRect> getClientRects();
-
-  /** @domName Range.insertNode */
-  void insertNode(Node newNode);
-
-  /** @domName Range.intersectsNode */
-  bool intersectsNode(Node refNode);
-
-  /** @domName Range.isPointInRange */
-  bool isPointInRange(Node refNode, int offset);
-
-  /** @domName Range.selectNode */
-  void selectNode(Node refNode);
-
-  /** @domName Range.selectNodeContents */
-  void selectNodeContents(Node refNode);
-
-  /** @domName Range.setEnd */
-  void setEnd(Node refNode, int offset);
-
-  /** @domName Range.setEndAfter */
-  void setEndAfter(Node refNode);
-
-  /** @domName Range.setEndBefore */
-  void setEndBefore(Node refNode);
-
-  /** @domName Range.setStart */
-  void setStart(Node refNode, int offset);
-
-  /** @domName Range.setStartAfter */
-  void setStartAfter(Node refNode);
-
-  /** @domName Range.setStartBefore */
-  void setStartBefore(Node refNode);
-
-  /** @domName Range.surroundContents */
-  void surroundContents(Node newParent);
-
-  /** @domName Range.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName RangeException
-abstract class RangeException {
-
-  static const int BAD_BOUNDARYPOINTS_ERR = 1;
-
-  static const int INVALID_NODE_TYPE_ERR = 2;
-
-  /** @domName RangeException.code */
-  int get code;
-
-  /** @domName RangeException.message */
-  String get message;
-
-  /** @domName RangeException.name */
-  String get name;
-
-  /** @domName RangeException.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _RangeExceptionImpl extends NativeFieldWrapperClass1 implements RangeException {
-
-  int get code native "RangeException_code_Getter";
-
-  String get message native "RangeException_message_Getter";
-
-  String get name native "RangeException_name_Getter";
-
-  String toString() native "RangeException_toString_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _RangeImpl extends NativeFieldWrapperClass1 implements Range {
-
   bool get collapsed native "Range_collapsed_Getter";
 
+
+  /** @domName Range.commonAncestorContainer */
   Node get commonAncestorContainer native "Range_commonAncestorContainer_Getter";
 
+
+  /** @domName Range.endContainer */
   Node get endContainer native "Range_endContainer_Getter";
 
+
+  /** @domName Range.endOffset */
   int get endOffset native "Range_endOffset_Getter";
 
+
+  /** @domName Range.startContainer */
   Node get startContainer native "Range_startContainer_Getter";
 
+
+  /** @domName Range.startOffset */
   int get startOffset native "Range_startOffset_Getter";
 
+
+  /** @domName Range.cloneContents */
   DocumentFragment cloneContents() native "Range_cloneContents_Callback";
 
+
+  /** @domName Range.cloneRange */
   Range cloneRange() native "Range_cloneRange_Callback";
 
+
+  /** @domName Range.collapse */
   void collapse(bool toStart) native "Range_collapse_Callback";
 
+
+  /** @domName Range.compareNode */
   int compareNode(Node refNode) native "Range_compareNode_Callback";
 
+
+  /** @domName Range.comparePoint */
   int comparePoint(Node refNode, int offset) native "Range_comparePoint_Callback";
 
+
+  /** @domName Range.createContextualFragment */
   DocumentFragment createContextualFragment(String html) native "Range_createContextualFragment_Callback";
 
+
+  /** @domName Range.deleteContents */
   void deleteContents() native "Range_deleteContents_Callback";
 
+
+  /** @domName Range.detach */
   void detach() native "Range_detach_Callback";
 
+
+  /** @domName Range.expand */
   void expand(String unit) native "Range_expand_Callback";
 
+
+  /** @domName Range.extractContents */
   DocumentFragment extractContents() native "Range_extractContents_Callback";
 
+
+  /** @domName Range.getBoundingClientRect */
   ClientRect getBoundingClientRect() native "Range_getBoundingClientRect_Callback";
 
+
+  /** @domName Range.getClientRects */
   List<ClientRect> getClientRects() native "Range_getClientRects_Callback";
 
+
+  /** @domName Range.insertNode */
   void insertNode(Node newNode) native "Range_insertNode_Callback";
 
+
+  /** @domName Range.intersectsNode */
   bool intersectsNode(Node refNode) native "Range_intersectsNode_Callback";
 
+
+  /** @domName Range.isPointInRange */
   bool isPointInRange(Node refNode, int offset) native "Range_isPointInRange_Callback";
 
+
+  /** @domName Range.selectNode */
   void selectNode(Node refNode) native "Range_selectNode_Callback";
 
+
+  /** @domName Range.selectNodeContents */
   void selectNodeContents(Node refNode) native "Range_selectNodeContents_Callback";
 
+
+  /** @domName Range.setEnd */
   void setEnd(Node refNode, int offset) native "Range_setEnd_Callback";
 
+
+  /** @domName Range.setEndAfter */
   void setEndAfter(Node refNode) native "Range_setEndAfter_Callback";
 
+
+  /** @domName Range.setEndBefore */
   void setEndBefore(Node refNode) native "Range_setEndBefore_Callback";
 
+
+  /** @domName Range.setStart */
   void setStart(Node refNode, int offset) native "Range_setStart_Callback";
 
+
+  /** @domName Range.setStartAfter */
   void setStartAfter(Node refNode) native "Range_setStartAfter_Callback";
 
+
+  /** @domName Range.setStartBefore */
   void setStartBefore(Node refNode) native "Range_setStartBefore_Callback";
 
+
+  /** @domName Range.surroundContents */
   void surroundContents(Node newParent) native "Range_surroundContents_Callback";
 
+
+  /** @domName Range.toString */
   String toString() native "Range_toString_Callback";
 
 }
@@ -26347,20 +20037,30 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName Rect
-abstract class Rect {
+/// @domName RangeException
+class RangeException extends NativeFieldWrapperClass1 {
+  RangeException.internal();
 
-  /** @domName Rect.bottom */
-  CSSPrimitiveValue get bottom;
+  static const int BAD_BOUNDARYPOINTS_ERR = 1;
 
-  /** @domName Rect.left */
-  CSSPrimitiveValue get left;
+  static const int INVALID_NODE_TYPE_ERR = 2;
 
-  /** @domName Rect.right */
-  CSSPrimitiveValue get right;
 
-  /** @domName Rect.top */
-  CSSPrimitiveValue get top;
+  /** @domName RangeException.code */
+  int get code native "RangeException_code_Getter";
+
+
+  /** @domName RangeException.message */
+  String get message native "RangeException_message_Getter";
+
+
+  /** @domName RangeException.name */
+  String get name native "RangeException_name_Getter";
+
+
+  /** @domName RangeException.toString */
+  String toString() native "RangeException_toString_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -26368,14 +20068,24 @@
 
 // WARNING: Do not edit - generated code.
 
-class _RectImpl extends NativeFieldWrapperClass1 implements Rect {
+/// @domName Rect
+class Rect extends NativeFieldWrapperClass1 {
+  Rect.internal();
 
+
+  /** @domName Rect.bottom */
   CSSPrimitiveValue get bottom native "Rect_bottom_Getter";
 
+
+  /** @domName Rect.left */
   CSSPrimitiveValue get left native "Rect_left_Getter";
 
+
+  /** @domName Rect.right */
   CSSPrimitiveValue get right native "Rect_right_Getter";
 
+
+  /** @domName Rect.top */
   CSSPrimitiveValue get top native "Rect_top_Getter";
 
 }
@@ -26394,7 +20104,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SQLError
-abstract class SQLError {
+class SQLError extends NativeFieldWrapperClass1 {
+  SQLError.internal();
 
   static const int CONSTRAINT_ERR = 6;
 
@@ -26412,22 +20123,12 @@
 
   static const int VERSION_ERR = 2;
 
+
   /** @domName SQLError.code */
-  int get code;
-
-  /** @domName SQLError.message */
-  String get message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SQLErrorImpl extends NativeFieldWrapperClass1 implements SQLError {
-
   int get code native "SQLError_code_Getter";
 
+
+  /** @domName SQLError.message */
   String get message native "SQLError_message_Getter";
 
 }
@@ -26438,7 +20139,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SQLException
-abstract class SQLException {
+class SQLException extends NativeFieldWrapperClass1 {
+  SQLException.internal();
 
   static const int CONSTRAINT_ERR = 6;
 
@@ -26456,22 +20158,12 @@
 
   static const int VERSION_ERR = 2;
 
+
   /** @domName SQLException.code */
-  int get code;
-
-  /** @domName SQLException.message */
-  String get message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SQLExceptionImpl extends NativeFieldWrapperClass1 implements SQLException {
-
   int get code native "SQLException_code_Getter";
 
+
+  /** @domName SQLException.message */
   String get message native "SQLException_message_Getter";
 
 }
@@ -26482,29 +20174,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SQLResultSet
-abstract class SQLResultSet {
+class SQLResultSet extends NativeFieldWrapperClass1 {
+  SQLResultSet.internal();
+
 
   /** @domName SQLResultSet.insertId */
-  int get insertId;
-
-  /** @domName SQLResultSet.rows */
-  SQLResultSetRowList get rows;
-
-  /** @domName SQLResultSet.rowsAffected */
-  int get rowsAffected;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SQLResultSetImpl extends NativeFieldWrapperClass1 implements SQLResultSet {
-
   int get insertId native "SQLResultSet_insertId_Getter";
 
+
+  /** @domName SQLResultSet.rows */
   SQLResultSetRowList get rows native "SQLResultSet_rows_Getter";
 
+
+  /** @domName SQLResultSet.rowsAffected */
   int get rowsAffected native "SQLResultSet_rowsAffected_Getter";
 
 }
@@ -26515,22 +20197,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SQLResultSetRowList
-abstract class SQLResultSetRowList implements List<Map> {
+class SQLResultSetRowList extends NativeFieldWrapperClass1 implements List<Map> {
+  SQLResultSetRowList.internal();
+
 
   /** @domName SQLResultSetRowList.length */
-  int get length;
-
-  /** @domName SQLResultSetRowList.item */
-  Map item(int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SQLResultSetRowListImpl extends NativeFieldWrapperClass1 implements SQLResultSetRowList {
-
   int get length native "SQLResultSetRowList_length_Getter";
 
   Map operator[](int index) native "SQLResultSetRowList_item_Callback";
@@ -26616,6 +20287,8 @@
 
   // -- end List<Map> mixins.
 
+
+  /** @domName SQLResultSetRowList.item */
   Map item(int index) native "SQLResultSetRowList_item_Callback";
 
 }
@@ -26642,10 +20315,13 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SQLTransaction
-abstract class SQLTransaction {
+class SQLTransaction extends NativeFieldWrapperClass1 {
+  SQLTransaction.internal();
+
 
   /** @domName SQLTransaction.executeSql */
-  void executeSql(String sqlStatement, List arguments, [SQLStatementCallback callback, SQLStatementErrorCallback errorCallback]);
+  void executeSql(String sqlStatement, List arguments, [SQLStatementCallback callback, SQLStatementErrorCallback errorCallback]) native "SQLTransaction_executeSql_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -26669,22 +20345,14 @@
 
 // WARNING: Do not edit - generated code.
 
-class _SQLTransactionImpl extends NativeFieldWrapperClass1 implements SQLTransaction {
-
-  void executeSql(String sqlStatement, List arguments, [SQLStatementCallback callback, SQLStatementErrorCallback errorCallback]) native "SQLTransaction_executeSql_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName SQLTransactionSync
-abstract class SQLTransactionSync {
+class SQLTransactionSync extends NativeFieldWrapperClass1 {
+  SQLTransactionSync.internal();
+
 
   /** @domName SQLTransactionSync.executeSql */
-  SQLResultSet executeSql(String sqlStatement, List arguments);
+  SQLResultSet executeSql(String sqlStatement, List arguments) native "SQLTransactionSync_executeSql_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -26700,71 +20368,92 @@
 
 // WARNING: Do not edit - generated code.
 
-class _SQLTransactionSyncImpl extends NativeFieldWrapperClass1 implements SQLTransactionSync {
-
-  SQLResultSet executeSql(String sqlStatement, List arguments) native "SQLTransactionSync_executeSql_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName SVGAElement
-abstract class SVGAElement implements SVGElement, SVGURIReference, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+class SVGAElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable {
+  SVGAElement.internal(): super.internal();
+
 
   /** @domName SVGAElement.target */
-  SVGAnimatedString get target;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAElementImpl extends _SVGElementImpl implements SVGAElement {
-
   SVGAnimatedString get target native "SVGAElement_target_Getter";
 
+
+  /** @domName SVGAElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGAElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGAElement.xmllang */
   String get xmllang native "SVGAElement_xmllang_Getter";
 
+
+  /** @domName SVGAElement.xmllang */
   void set xmllang(String value) native "SVGAElement_xmllang_Setter";
 
+
+  /** @domName SVGAElement.xmlspace */
   String get xmlspace native "SVGAElement_xmlspace_Getter";
 
+
+  /** @domName SVGAElement.xmlspace */
   void set xmlspace(String value) native "SVGAElement_xmlspace_Setter";
 
+
+  /** @domName SVGAElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGAElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGAElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGAElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGAElement.getBBox */
   SVGRect getBBox() native "SVGAElement_getBBox_Callback";
 
+
+  /** @domName SVGAElement.getCTM */
   SVGMatrix getCTM() native "SVGAElement_getCTM_Callback";
 
+
+  /** @domName SVGAElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGAElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGAElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGAElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGAElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGAElement_className_Getter";
 
+
+  /** @domName SVGAElement.style */
   CSSStyleDeclaration get style native "SVGAElement_style_Getter";
 
+
+  /** @domName SVGAElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGAElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGAElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGAElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGAElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGAElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGAElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGAElement_systemLanguage_Getter";
 
+
+  /** @domName SVGAElement.hasExtension */
   bool hasExtension(String extension) native "SVGAElement_hasExtension_Callback";
 
+
+  /** @domName SVGAElement.transform */
   SVGAnimatedTransformList get transform native "SVGAElement_transform_Getter";
 
+
+  /** @domName SVGAElement.href */
   SVGAnimatedString get href native "SVGAElement_href_Getter";
 
 }
@@ -26775,15 +20464,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAltGlyphDefElement
-abstract class SVGAltGlyphDefElement implements SVGElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAltGlyphDefElementImpl extends _SVGElementImpl implements SVGAltGlyphDefElement {
+class SVGAltGlyphDefElement extends SVGElement {
+  SVGAltGlyphDefElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26793,30 +20475,27 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAltGlyphElement
-abstract class SVGAltGlyphElement implements SVGTextPositioningElement, SVGURIReference {
+class SVGAltGlyphElement extends SVGTextPositioningElement implements SVGURIReference {
+  SVGAltGlyphElement.internal(): super.internal();
+
 
   /** @domName SVGAltGlyphElement.format */
-  String format;
-
-  /** @domName SVGAltGlyphElement.glyphRef */
-  String glyphRef;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAltGlyphElementImpl extends _SVGTextPositioningElementImpl implements SVGAltGlyphElement {
-
   String get format native "SVGAltGlyphElement_format_Getter";
 
+
+  /** @domName SVGAltGlyphElement.format */
   void set format(String value) native "SVGAltGlyphElement_format_Setter";
 
+
+  /** @domName SVGAltGlyphElement.glyphRef */
   String get glyphRef native "SVGAltGlyphElement_glyphRef_Getter";
 
+
+  /** @domName SVGAltGlyphElement.glyphRef */
   void set glyphRef(String value) native "SVGAltGlyphElement_glyphRef_Setter";
 
+
+  /** @domName SVGAltGlyphElement.href */
   SVGAnimatedString get href native "SVGAltGlyphElement_href_Getter";
 
 }
@@ -26827,15 +20506,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAltGlyphItemElement
-abstract class SVGAltGlyphItemElement implements SVGElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAltGlyphItemElementImpl extends _SVGElementImpl implements SVGAltGlyphItemElement {
+class SVGAltGlyphItemElement extends SVGElement {
+  SVGAltGlyphItemElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26845,7 +20517,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAngle
-abstract class SVGAngle {
+class SVGAngle extends NativeFieldWrapperClass1 {
+  SVGAngle.internal();
 
   static const int SVG_ANGLETYPE_DEG = 2;
 
@@ -26857,48 +20530,40 @@
 
   static const int SVG_ANGLETYPE_UNSPECIFIED = 1;
 
+
   /** @domName SVGAngle.unitType */
-  int get unitType;
-
-  /** @domName SVGAngle.value */
-  num value;
-
-  /** @domName SVGAngle.valueAsString */
-  String valueAsString;
-
-  /** @domName SVGAngle.valueInSpecifiedUnits */
-  num valueInSpecifiedUnits;
-
-  /** @domName SVGAngle.convertToSpecifiedUnits */
-  void convertToSpecifiedUnits(int unitType);
-
-  /** @domName SVGAngle.newValueSpecifiedUnits */
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAngleImpl extends NativeFieldWrapperClass1 implements SVGAngle {
-
   int get unitType native "SVGAngle_unitType_Getter";
 
+
+  /** @domName SVGAngle.value */
   num get value native "SVGAngle_value_Getter";
 
+
+  /** @domName SVGAngle.value */
   void set value(num value) native "SVGAngle_value_Setter";
 
+
+  /** @domName SVGAngle.valueAsString */
   String get valueAsString native "SVGAngle_valueAsString_Getter";
 
+
+  /** @domName SVGAngle.valueAsString */
   void set valueAsString(String value) native "SVGAngle_valueAsString_Setter";
 
+
+  /** @domName SVGAngle.valueInSpecifiedUnits */
   num get valueInSpecifiedUnits native "SVGAngle_valueInSpecifiedUnits_Getter";
 
+
+  /** @domName SVGAngle.valueInSpecifiedUnits */
   void set valueInSpecifiedUnits(num value) native "SVGAngle_valueInSpecifiedUnits_Setter";
 
+
+  /** @domName SVGAngle.convertToSpecifiedUnits */
   void convertToSpecifiedUnits(int unitType) native "SVGAngle_convertToSpecifiedUnits_Callback";
 
+
+  /** @domName SVGAngle.newValueSpecifiedUnits */
   void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native "SVGAngle_newValueSpecifiedUnits_Callback";
 
 }
@@ -26909,15 +20574,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimateColorElement
-abstract class SVGAnimateColorElement implements SVGAnimationElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimateColorElementImpl extends _SVGAnimationElementImpl implements SVGAnimateColorElement {
+class SVGAnimateColorElement extends SVGAnimationElement {
+  SVGAnimateColorElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26927,15 +20585,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimateElement
-abstract class SVGAnimateElement implements SVGAnimationElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimateElementImpl extends _SVGAnimationElementImpl implements SVGAnimateElement {
+class SVGAnimateElement extends SVGAnimationElement {
+  SVGAnimateElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26945,15 +20596,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimateMotionElement
-abstract class SVGAnimateMotionElement implements SVGAnimationElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimateMotionElementImpl extends _SVGAnimationElementImpl implements SVGAnimateMotionElement {
+class SVGAnimateMotionElement extends SVGAnimationElement {
+  SVGAnimateMotionElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26963,15 +20607,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimateTransformElement
-abstract class SVGAnimateTransformElement implements SVGAnimationElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimateTransformElementImpl extends _SVGAnimationElementImpl implements SVGAnimateTransformElement {
+class SVGAnimateTransformElement extends SVGAnimationElement {
+  SVGAnimateTransformElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26981,24 +20618,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimatedAngle
-abstract class SVGAnimatedAngle {
+class SVGAnimatedAngle extends NativeFieldWrapperClass1 {
+  SVGAnimatedAngle.internal();
+
 
   /** @domName SVGAnimatedAngle.animVal */
-  SVGAngle get animVal;
-
-  /** @domName SVGAnimatedAngle.baseVal */
-  SVGAngle get baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimatedAngleImpl extends NativeFieldWrapperClass1 implements SVGAnimatedAngle {
-
   SVGAngle get animVal native "SVGAnimatedAngle_animVal_Getter";
 
+
+  /** @domName SVGAnimatedAngle.baseVal */
   SVGAngle get baseVal native "SVGAnimatedAngle_baseVal_Getter";
 
 }
@@ -27009,26 +20637,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimatedBoolean
-abstract class SVGAnimatedBoolean {
+class SVGAnimatedBoolean extends NativeFieldWrapperClass1 {
+  SVGAnimatedBoolean.internal();
+
 
   /** @domName SVGAnimatedBoolean.animVal */
-  bool get animVal;
-
-  /** @domName SVGAnimatedBoolean.baseVal */
-  bool baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimatedBooleanImpl extends NativeFieldWrapperClass1 implements SVGAnimatedBoolean {
-
   bool get animVal native "SVGAnimatedBoolean_animVal_Getter";
 
+
+  /** @domName SVGAnimatedBoolean.baseVal */
   bool get baseVal native "SVGAnimatedBoolean_baseVal_Getter";
 
+
+  /** @domName SVGAnimatedBoolean.baseVal */
   void set baseVal(bool value) native "SVGAnimatedBoolean_baseVal_Setter";
 
 }
@@ -27039,26 +20660,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimatedEnumeration
-abstract class SVGAnimatedEnumeration {
+class SVGAnimatedEnumeration extends NativeFieldWrapperClass1 {
+  SVGAnimatedEnumeration.internal();
+
 
   /** @domName SVGAnimatedEnumeration.animVal */
-  int get animVal;
-
-  /** @domName SVGAnimatedEnumeration.baseVal */
-  int baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimatedEnumerationImpl extends NativeFieldWrapperClass1 implements SVGAnimatedEnumeration {
-
   int get animVal native "SVGAnimatedEnumeration_animVal_Getter";
 
+
+  /** @domName SVGAnimatedEnumeration.baseVal */
   int get baseVal native "SVGAnimatedEnumeration_baseVal_Getter";
 
+
+  /** @domName SVGAnimatedEnumeration.baseVal */
   void set baseVal(int value) native "SVGAnimatedEnumeration_baseVal_Setter";
 
 }
@@ -27069,26 +20683,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimatedInteger
-abstract class SVGAnimatedInteger {
+class SVGAnimatedInteger extends NativeFieldWrapperClass1 {
+  SVGAnimatedInteger.internal();
+
 
   /** @domName SVGAnimatedInteger.animVal */
-  int get animVal;
-
-  /** @domName SVGAnimatedInteger.baseVal */
-  int baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimatedIntegerImpl extends NativeFieldWrapperClass1 implements SVGAnimatedInteger {
-
   int get animVal native "SVGAnimatedInteger_animVal_Getter";
 
+
+  /** @domName SVGAnimatedInteger.baseVal */
   int get baseVal native "SVGAnimatedInteger_baseVal_Getter";
 
+
+  /** @domName SVGAnimatedInteger.baseVal */
   void set baseVal(int value) native "SVGAnimatedInteger_baseVal_Setter";
 
 }
@@ -27099,24 +20706,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimatedLength
-abstract class SVGAnimatedLength {
+class SVGAnimatedLength extends NativeFieldWrapperClass1 {
+  SVGAnimatedLength.internal();
+
 
   /** @domName SVGAnimatedLength.animVal */
-  SVGLength get animVal;
-
-  /** @domName SVGAnimatedLength.baseVal */
-  SVGLength get baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimatedLengthImpl extends NativeFieldWrapperClass1 implements SVGAnimatedLength {
-
   SVGLength get animVal native "SVGAnimatedLength_animVal_Getter";
 
+
+  /** @domName SVGAnimatedLength.baseVal */
   SVGLength get baseVal native "SVGAnimatedLength_baseVal_Getter";
 
 }
@@ -27127,24 +20725,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimatedLengthList
-abstract class SVGAnimatedLengthList implements List<SVGAnimatedLength> {
+class SVGAnimatedLengthList extends NativeFieldWrapperClass1 implements List<SVGAnimatedLength> {
+  SVGAnimatedLengthList.internal();
+
 
   /** @domName SVGAnimatedLengthList.animVal */
-  SVGLengthList get animVal;
-
-  /** @domName SVGAnimatedLengthList.baseVal */
-  SVGLengthList get baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimatedLengthListImpl extends NativeFieldWrapperClass1 implements SVGAnimatedLengthList {
-
   SVGLengthList get animVal native "SVGAnimatedLengthList_animVal_Getter";
 
+
+  /** @domName SVGAnimatedLengthList.baseVal */
   SVGLengthList get baseVal native "SVGAnimatedLengthList_baseVal_Getter";
 
   SVGAnimatedLength operator[](int index) native "SVGAnimatedLengthList_item_Callback";
@@ -27238,26 +20827,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimatedNumber
-abstract class SVGAnimatedNumber {
+class SVGAnimatedNumber extends NativeFieldWrapperClass1 {
+  SVGAnimatedNumber.internal();
+
 
   /** @domName SVGAnimatedNumber.animVal */
-  num get animVal;
-
-  /** @domName SVGAnimatedNumber.baseVal */
-  num baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimatedNumberImpl extends NativeFieldWrapperClass1 implements SVGAnimatedNumber {
-
   num get animVal native "SVGAnimatedNumber_animVal_Getter";
 
+
+  /** @domName SVGAnimatedNumber.baseVal */
   num get baseVal native "SVGAnimatedNumber_baseVal_Getter";
 
+
+  /** @domName SVGAnimatedNumber.baseVal */
   void set baseVal(num value) native "SVGAnimatedNumber_baseVal_Setter";
 
 }
@@ -27268,24 +20850,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimatedNumberList
-abstract class SVGAnimatedNumberList implements List<SVGAnimatedNumber> {
+class SVGAnimatedNumberList extends NativeFieldWrapperClass1 implements List<SVGAnimatedNumber> {
+  SVGAnimatedNumberList.internal();
+
 
   /** @domName SVGAnimatedNumberList.animVal */
-  SVGNumberList get animVal;
-
-  /** @domName SVGAnimatedNumberList.baseVal */
-  SVGNumberList get baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimatedNumberListImpl extends NativeFieldWrapperClass1 implements SVGAnimatedNumberList {
-
   SVGNumberList get animVal native "SVGAnimatedNumberList_animVal_Getter";
 
+
+  /** @domName SVGAnimatedNumberList.baseVal */
   SVGNumberList get baseVal native "SVGAnimatedNumberList_baseVal_Getter";
 
   SVGAnimatedNumber operator[](int index) native "SVGAnimatedNumberList_item_Callback";
@@ -27379,24 +20952,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimatedPreserveAspectRatio
-abstract class SVGAnimatedPreserveAspectRatio {
+class SVGAnimatedPreserveAspectRatio extends NativeFieldWrapperClass1 {
+  SVGAnimatedPreserveAspectRatio.internal();
+
 
   /** @domName SVGAnimatedPreserveAspectRatio.animVal */
-  SVGPreserveAspectRatio get animVal;
-
-  /** @domName SVGAnimatedPreserveAspectRatio.baseVal */
-  SVGPreserveAspectRatio get baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimatedPreserveAspectRatioImpl extends NativeFieldWrapperClass1 implements SVGAnimatedPreserveAspectRatio {
-
   SVGPreserveAspectRatio get animVal native "SVGAnimatedPreserveAspectRatio_animVal_Getter";
 
+
+  /** @domName SVGAnimatedPreserveAspectRatio.baseVal */
   SVGPreserveAspectRatio get baseVal native "SVGAnimatedPreserveAspectRatio_baseVal_Getter";
 
 }
@@ -27407,24 +20971,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimatedRect
-abstract class SVGAnimatedRect {
+class SVGAnimatedRect extends NativeFieldWrapperClass1 {
+  SVGAnimatedRect.internal();
+
 
   /** @domName SVGAnimatedRect.animVal */
-  SVGRect get animVal;
-
-  /** @domName SVGAnimatedRect.baseVal */
-  SVGRect get baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimatedRectImpl extends NativeFieldWrapperClass1 implements SVGAnimatedRect {
-
   SVGRect get animVal native "SVGAnimatedRect_animVal_Getter";
 
+
+  /** @domName SVGAnimatedRect.baseVal */
   SVGRect get baseVal native "SVGAnimatedRect_baseVal_Getter";
 
 }
@@ -27435,26 +20990,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimatedString
-abstract class SVGAnimatedString {
+class SVGAnimatedString extends NativeFieldWrapperClass1 {
+  SVGAnimatedString.internal();
+
 
   /** @domName SVGAnimatedString.animVal */
-  String get animVal;
-
-  /** @domName SVGAnimatedString.baseVal */
-  String baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimatedStringImpl extends NativeFieldWrapperClass1 implements SVGAnimatedString {
-
   String get animVal native "SVGAnimatedString_animVal_Getter";
 
+
+  /** @domName SVGAnimatedString.baseVal */
   String get baseVal native "SVGAnimatedString_baseVal_Getter";
 
+
+  /** @domName SVGAnimatedString.baseVal */
   void set baseVal(String value) native "SVGAnimatedString_baseVal_Setter";
 
 }
@@ -27465,24 +21013,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimatedTransformList
-abstract class SVGAnimatedTransformList implements List<SVGAnimateTransformElement> {
+class SVGAnimatedTransformList extends NativeFieldWrapperClass1 implements List<SVGAnimateTransformElement> {
+  SVGAnimatedTransformList.internal();
+
 
   /** @domName SVGAnimatedTransformList.animVal */
-  SVGTransformList get animVal;
-
-  /** @domName SVGAnimatedTransformList.baseVal */
-  SVGTransformList get baseVal;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimatedTransformListImpl extends NativeFieldWrapperClass1 implements SVGAnimatedTransformList {
-
   SVGTransformList get animVal native "SVGAnimatedTransformList_animVal_Getter";
 
+
+  /** @domName SVGAnimatedTransformList.baseVal */
   SVGTransformList get baseVal native "SVGAnimatedTransformList_baseVal_Getter";
 
   SVGAnimateTransformElement operator[](int index) native "SVGAnimatedTransformList_item_Callback";
@@ -27576,52 +21115,59 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGAnimationElement
-abstract class SVGAnimationElement implements SVGElement, SVGTests, SVGExternalResourcesRequired, ElementTimeControl {
+class SVGAnimationElement extends SVGElement implements ElementTimeControl, SVGTests, SVGExternalResourcesRequired {
+  SVGAnimationElement.internal(): super.internal();
+
 
   /** @domName SVGAnimationElement.targetElement */
-  SVGElement get targetElement;
-
-  /** @domName SVGAnimationElement.getCurrentTime */
-  num getCurrentTime();
-
-  /** @domName SVGAnimationElement.getSimpleDuration */
-  num getSimpleDuration();
-
-  /** @domName SVGAnimationElement.getStartTime */
-  num getStartTime();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGAnimationElementImpl extends _SVGElementImpl implements SVGAnimationElement {
-
   SVGElement get targetElement native "SVGAnimationElement_targetElement_Getter";
 
+
+  /** @domName SVGAnimationElement.getCurrentTime */
   num getCurrentTime() native "SVGAnimationElement_getCurrentTime_Callback";
 
+
+  /** @domName SVGAnimationElement.getSimpleDuration */
   num getSimpleDuration() native "SVGAnimationElement_getSimpleDuration_Callback";
 
+
+  /** @domName SVGAnimationElement.getStartTime */
   num getStartTime() native "SVGAnimationElement_getStartTime_Callback";
 
+
+  /** @domName SVGAnimationElement.beginElement */
   void beginElement() native "SVGAnimationElement_beginElement_Callback";
 
+
+  /** @domName SVGAnimationElement.beginElementAt */
   void beginElementAt(num offset) native "SVGAnimationElement_beginElementAt_Callback";
 
+
+  /** @domName SVGAnimationElement.endElement */
   void endElement() native "SVGAnimationElement_endElement_Callback";
 
+
+  /** @domName SVGAnimationElement.endElementAt */
   void endElementAt(num offset) native "SVGAnimationElement_endElementAt_Callback";
 
+
+  /** @domName SVGAnimationElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGAnimationElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGAnimationElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGAnimationElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGAnimationElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGAnimationElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGAnimationElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGAnimationElement_systemLanguage_Getter";
 
+
+  /** @domName SVGAnimationElement.hasExtension */
   bool hasExtension(String extension) native "SVGAnimationElement_hasExtension_Callback";
 
 }
@@ -27632,67 +21178,95 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGCircleElement
-abstract class SVGCircleElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+class SVGCircleElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
+  SVGCircleElement.internal(): super.internal();
+
 
   /** @domName SVGCircleElement.cx */
-  SVGAnimatedLength get cx;
-
-  /** @domName SVGCircleElement.cy */
-  SVGAnimatedLength get cy;
-
-  /** @domName SVGCircleElement.r */
-  SVGAnimatedLength get r;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGCircleElementImpl extends _SVGElementImpl implements SVGCircleElement {
-
   SVGAnimatedLength get cx native "SVGCircleElement_cx_Getter";
 
+
+  /** @domName SVGCircleElement.cy */
   SVGAnimatedLength get cy native "SVGCircleElement_cy_Getter";
 
+
+  /** @domName SVGCircleElement.r */
   SVGAnimatedLength get r native "SVGCircleElement_r_Getter";
 
+
+  /** @domName SVGCircleElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGCircleElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGCircleElement.xmllang */
   String get xmllang native "SVGCircleElement_xmllang_Getter";
 
+
+  /** @domName SVGCircleElement.xmllang */
   void set xmllang(String value) native "SVGCircleElement_xmllang_Setter";
 
+
+  /** @domName SVGCircleElement.xmlspace */
   String get xmlspace native "SVGCircleElement_xmlspace_Getter";
 
+
+  /** @domName SVGCircleElement.xmlspace */
   void set xmlspace(String value) native "SVGCircleElement_xmlspace_Setter";
 
+
+  /** @domName SVGCircleElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGCircleElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGCircleElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGCircleElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGCircleElement.getBBox */
   SVGRect getBBox() native "SVGCircleElement_getBBox_Callback";
 
+
+  /** @domName SVGCircleElement.getCTM */
   SVGMatrix getCTM() native "SVGCircleElement_getCTM_Callback";
 
+
+  /** @domName SVGCircleElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGCircleElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGCircleElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGCircleElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGCircleElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGCircleElement_className_Getter";
 
+
+  /** @domName SVGCircleElement.style */
   CSSStyleDeclaration get style native "SVGCircleElement_style_Getter";
 
+
+  /** @domName SVGCircleElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGCircleElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGCircleElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGCircleElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGCircleElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGCircleElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGCircleElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGCircleElement_systemLanguage_Getter";
 
+
+  /** @domName SVGCircleElement.hasExtension */
   bool hasExtension(String extension) native "SVGCircleElement_hasExtension_Callback";
 
+
+  /** @domName SVGCircleElement.transform */
   SVGAnimatedTransformList get transform native "SVGCircleElement_transform_Getter";
 
 }
@@ -27703,57 +21277,87 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGClipPathElement
-abstract class SVGClipPathElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+class SVGClipPathElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
+  SVGClipPathElement.internal(): super.internal();
+
 
   /** @domName SVGClipPathElement.clipPathUnits */
-  SVGAnimatedEnumeration get clipPathUnits;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGClipPathElementImpl extends _SVGElementImpl implements SVGClipPathElement {
-
   SVGAnimatedEnumeration get clipPathUnits native "SVGClipPathElement_clipPathUnits_Getter";
 
+
+  /** @domName SVGClipPathElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGClipPathElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGClipPathElement.xmllang */
   String get xmllang native "SVGClipPathElement_xmllang_Getter";
 
+
+  /** @domName SVGClipPathElement.xmllang */
   void set xmllang(String value) native "SVGClipPathElement_xmllang_Setter";
 
+
+  /** @domName SVGClipPathElement.xmlspace */
   String get xmlspace native "SVGClipPathElement_xmlspace_Getter";
 
+
+  /** @domName SVGClipPathElement.xmlspace */
   void set xmlspace(String value) native "SVGClipPathElement_xmlspace_Setter";
 
+
+  /** @domName SVGClipPathElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGClipPathElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGClipPathElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGClipPathElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGClipPathElement.getBBox */
   SVGRect getBBox() native "SVGClipPathElement_getBBox_Callback";
 
+
+  /** @domName SVGClipPathElement.getCTM */
   SVGMatrix getCTM() native "SVGClipPathElement_getCTM_Callback";
 
+
+  /** @domName SVGClipPathElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGClipPathElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGClipPathElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGClipPathElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGClipPathElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGClipPathElement_className_Getter";
 
+
+  /** @domName SVGClipPathElement.style */
   CSSStyleDeclaration get style native "SVGClipPathElement_style_Getter";
 
+
+  /** @domName SVGClipPathElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGClipPathElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGClipPathElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGClipPathElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGClipPathElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGClipPathElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGClipPathElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGClipPathElement_systemLanguage_Getter";
 
+
+  /** @domName SVGClipPathElement.hasExtension */
   bool hasExtension(String extension) native "SVGClipPathElement_hasExtension_Callback";
 
+
+  /** @domName SVGClipPathElement.transform */
   SVGAnimatedTransformList get transform native "SVGClipPathElement_transform_Getter";
 
 }
@@ -27764,7 +21368,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGColor
-abstract class SVGColor implements CSSValue {
+class SVGColor extends CSSValue {
+  SVGColor.internal(): super.internal();
 
   static const int SVG_COLORTYPE_CURRENTCOLOR = 3;
 
@@ -27774,37 +21379,24 @@
 
   static const int SVG_COLORTYPE_UNKNOWN = 0;
 
+
   /** @domName SVGColor.colorType */
-  int get colorType;
-
-  /** @domName SVGColor.rgbColor */
-  RGBColor get rgbColor;
-
-  /** @domName SVGColor.setColor */
-  void setColor(int colorType, String rgbColor, String iccColor);
-
-  /** @domName SVGColor.setRGBColor */
-  void setRGBColor(String rgbColor);
-
-  /** @domName SVGColor.setRGBColorICCColor */
-  void setRGBColorICCColor(String rgbColor, String iccColor);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGColorImpl extends _CSSValueImpl implements SVGColor {
-
   int get colorType native "SVGColor_colorType_Getter";
 
+
+  /** @domName SVGColor.rgbColor */
   RGBColor get rgbColor native "SVGColor_rgbColor_Getter";
 
+
+  /** @domName SVGColor.setColor */
   void setColor(int colorType, String rgbColor, String iccColor) native "SVGColor_setColor_Callback";
 
+
+  /** @domName SVGColor.setRGBColor */
   void setRGBColor(String rgbColor) native "SVGColor_setRGBColor_Callback";
 
+
+  /** @domName SVGColor.setRGBColorICCColor */
   void setRGBColorICCColor(String rgbColor, String iccColor) native "SVGColor_setRGBColorICCColor_Callback";
 
 }
@@ -27815,7 +21407,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGComponentTransferFunctionElement
-abstract class SVGComponentTransferFunctionElement implements SVGElement {
+class SVGComponentTransferFunctionElement extends SVGElement {
+  SVGComponentTransferFunctionElement.internal(): super.internal();
 
   static const int SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
 
@@ -27829,47 +21422,32 @@
 
   static const int SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;
 
+
   /** @domName SVGComponentTransferFunctionElement.amplitude */
-  SVGAnimatedNumber get amplitude;
-
-  /** @domName SVGComponentTransferFunctionElement.exponent */
-  SVGAnimatedNumber get exponent;
-
-  /** @domName SVGComponentTransferFunctionElement.intercept */
-  SVGAnimatedNumber get intercept;
-
-  /** @domName SVGComponentTransferFunctionElement.offset */
-  SVGAnimatedNumber get offset;
-
-  /** @domName SVGComponentTransferFunctionElement.slope */
-  SVGAnimatedNumber get slope;
-
-  /** @domName SVGComponentTransferFunctionElement.tableValues */
-  SVGAnimatedNumberList get tableValues;
-
-  /** @domName SVGComponentTransferFunctionElement.type */
-  SVGAnimatedEnumeration get type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGComponentTransferFunctionElementImpl extends _SVGElementImpl implements SVGComponentTransferFunctionElement {
-
   SVGAnimatedNumber get amplitude native "SVGComponentTransferFunctionElement_amplitude_Getter";
 
+
+  /** @domName SVGComponentTransferFunctionElement.exponent */
   SVGAnimatedNumber get exponent native "SVGComponentTransferFunctionElement_exponent_Getter";
 
+
+  /** @domName SVGComponentTransferFunctionElement.intercept */
   SVGAnimatedNumber get intercept native "SVGComponentTransferFunctionElement_intercept_Getter";
 
+
+  /** @domName SVGComponentTransferFunctionElement.offset */
   SVGAnimatedNumber get offset native "SVGComponentTransferFunctionElement_offset_Getter";
 
+
+  /** @domName SVGComponentTransferFunctionElement.slope */
   SVGAnimatedNumber get slope native "SVGComponentTransferFunctionElement_slope_Getter";
 
+
+  /** @domName SVGComponentTransferFunctionElement.tableValues */
   SVGAnimatedNumberList get tableValues native "SVGComponentTransferFunctionElement_tableValues_Getter";
 
+
+  /** @domName SVGComponentTransferFunctionElement.type */
   SVGAnimatedEnumeration get type native "SVGComponentTransferFunctionElement_type_Getter";
 
 }
@@ -27880,36 +21458,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGCursorElement
-abstract class SVGCursorElement implements SVGElement, SVGURIReference, SVGTests, SVGExternalResourcesRequired {
+class SVGCursorElement extends SVGElement implements SVGURIReference, SVGTests, SVGExternalResourcesRequired {
+  SVGCursorElement.internal(): super.internal();
+
 
   /** @domName SVGCursorElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGCursorElement.y */
-  SVGAnimatedLength get y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGCursorElementImpl extends _SVGElementImpl implements SVGCursorElement {
-
   SVGAnimatedLength get x native "SVGCursorElement_x_Getter";
 
+
+  /** @domName SVGCursorElement.y */
   SVGAnimatedLength get y native "SVGCursorElement_y_Getter";
 
+
+  /** @domName SVGCursorElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGCursorElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGCursorElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGCursorElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGCursorElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGCursorElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGCursorElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGCursorElement_systemLanguage_Getter";
 
+
+  /** @domName SVGCursorElement.hasExtension */
   bool hasExtension(String extension) native "SVGCursorElement_hasExtension_Callback";
 
+
+  /** @domName SVGCursorElement.href */
   SVGAnimatedString get href native "SVGCursorElement_href_Getter";
 
 }
@@ -27920,52 +21501,83 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGDefsElement
-abstract class SVGDefsElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+class SVGDefsElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
+  SVGDefsElement.internal(): super.internal();
 
-// WARNING: Do not edit - generated code.
 
-class _SVGDefsElementImpl extends _SVGElementImpl implements SVGDefsElement {
-
+  /** @domName SVGDefsElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGDefsElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGDefsElement.xmllang */
   String get xmllang native "SVGDefsElement_xmllang_Getter";
 
+
+  /** @domName SVGDefsElement.xmllang */
   void set xmllang(String value) native "SVGDefsElement_xmllang_Setter";
 
+
+  /** @domName SVGDefsElement.xmlspace */
   String get xmlspace native "SVGDefsElement_xmlspace_Getter";
 
+
+  /** @domName SVGDefsElement.xmlspace */
   void set xmlspace(String value) native "SVGDefsElement_xmlspace_Setter";
 
+
+  /** @domName SVGDefsElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGDefsElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGDefsElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGDefsElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGDefsElement.getBBox */
   SVGRect getBBox() native "SVGDefsElement_getBBox_Callback";
 
+
+  /** @domName SVGDefsElement.getCTM */
   SVGMatrix getCTM() native "SVGDefsElement_getCTM_Callback";
 
+
+  /** @domName SVGDefsElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGDefsElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGDefsElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGDefsElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGDefsElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGDefsElement_className_Getter";
 
+
+  /** @domName SVGDefsElement.style */
   CSSStyleDeclaration get style native "SVGDefsElement_style_Getter";
 
+
+  /** @domName SVGDefsElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGDefsElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGDefsElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGDefsElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGDefsElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGDefsElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGDefsElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGDefsElement_systemLanguage_Getter";
 
+
+  /** @domName SVGDefsElement.hasExtension */
   bool hasExtension(String extension) native "SVGDefsElement_hasExtension_Callback";
 
+
+  /** @domName SVGDefsElement.transform */
   SVGAnimatedTransformList get transform native "SVGDefsElement_transform_Getter";
 
 }
@@ -27976,28 +21588,35 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGDescElement
-abstract class SVGDescElement implements SVGElement, SVGLangSpace, SVGStylable {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+class SVGDescElement extends SVGElement implements SVGLangSpace, SVGStylable {
+  SVGDescElement.internal(): super.internal();
 
-// WARNING: Do not edit - generated code.
 
-class _SVGDescElementImpl extends _SVGElementImpl implements SVGDescElement {
-
+  /** @domName SVGDescElement.xmllang */
   String get xmllang native "SVGDescElement_xmllang_Getter";
 
+
+  /** @domName SVGDescElement.xmllang */
   void set xmllang(String value) native "SVGDescElement_xmllang_Setter";
 
+
+  /** @domName SVGDescElement.xmlspace */
   String get xmlspace native "SVGDescElement_xmlspace_Getter";
 
+
+  /** @domName SVGDescElement.xmlspace */
   void set xmlspace(String value) native "SVGDescElement_xmlspace_Setter";
 
+
+  /** @domName SVGDescElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGDescElement_className_Getter";
 
+
+  /** @domName SVGDescElement.style */
   CSSStyleDeclaration get style native "SVGDescElement_style_Getter";
 
+
+  /** @domName SVGDescElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGDescElement_getPresentationAttribute_Callback";
 
 }
@@ -28008,56 +21627,18 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGDocument
-abstract class SVGDocument implements Document {
+class SVGDocument extends Document {
+  SVGDocument.internal(): super.internal();
+
 
   /** @domName SVGDocument.rootElement */
-  SVGSVGElement get rootElement;
-
-  /** @domName SVGDocument.createEvent */
-  Event $dom_createEvent(String eventType);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGDocumentImpl extends _DocumentImpl implements SVGDocument {
-
   SVGSVGElement get rootElement native "SVGDocument_rootElement_Getter";
 
+
+  /** @domName SVGDocument.createEvent */
   Event $dom_createEvent(String eventType) native "SVGDocument_createEvent_Callback";
 
 }
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName SVGElement
-abstract class SVGElement implements Element {
-
-  factory SVGElement.tag(String tag) =>
-      _SVGElementFactoryProvider.createSVGElement_tag(tag);
-  factory SVGElement.svg(String svg) =>
-      _SVGElementFactoryProvider.createSVGElement_svg(svg);
-
-  SVGElement clone(bool deep);
-
-
-  /** @domName SVGElement.id */
-  String id;
-
-  /** @domName SVGElement.ownerSVGElement */
-  SVGSVGElement get ownerSVGElement;
-
-  /** @domName SVGElement.viewportElement */
-  SVGElement get viewportElement;
-
-  /** @domName SVGElement.xmlbase */
-  String xmlbase;
-
-}
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -28072,8 +21653,13 @@
   }
 }
 
-class _SVGElementImpl extends _ElementImpl implements SVGElement {
-  CSSClassSet get classes {
+class SVGElement extends Element {
+  factory SVGElement.tag(String tag) =>
+      _SVGElementFactoryProvider.createSVGElement_tag(tag);
+  factory SVGElement.svg(String svg) =>
+      _SVGElementFactoryProvider.createSVGElement_svg(svg);
+
+  CssClassSet get classes {
     if (_cssClassSet == null) {
       _cssClassSet = new _AttributeClassSet(_ptr);
     }
@@ -28110,17 +21696,30 @@
     this.elements = container.elements[0].elements;
   }
 
+  SVGElement.internal(): super.internal();
 
+
+  /** @domName SVGElement.id */
   String get id native "SVGElement_id_Getter";
 
+
+  /** @domName SVGElement.id */
   void set id(String value) native "SVGElement_id_Setter";
 
+
+  /** @domName SVGElement.ownerSVGElement */
   SVGSVGElement get ownerSVGElement native "SVGElement_ownerSVGElement_Getter";
 
+
+  /** @domName SVGElement.viewportElement */
   SVGElement get viewportElement native "SVGElement_viewportElement_Getter";
 
+
+  /** @domName SVGElement.xmlbase */
   String get xmlbase native "SVGElement_xmlbase_Getter";
 
+
+  /** @domName SVGElement.xmlbase */
   void set xmlbase(String value) native "SVGElement_xmlbase_Setter";
 
 }
@@ -28131,151 +21730,51 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGElementInstance
-abstract class SVGElementInstance implements EventTarget {
+class SVGElementInstance extends EventTarget {
+  SVGElementInstance.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  SVGElementInstanceEvents get on;
+  SVGElementInstanceEvents get on =>
+    new SVGElementInstanceEvents(this);
+
 
   /** @domName SVGElementInstance.childNodes */
-  List<SVGElementInstance> get childNodes;
-
-  /** @domName SVGElementInstance.correspondingElement */
-  SVGElement get correspondingElement;
-
-  /** @domName SVGElementInstance.correspondingUseElement */
-  SVGUseElement get correspondingUseElement;
-
-  /** @domName SVGElementInstance.firstChild */
-  SVGElementInstance get firstChild;
-
-  /** @domName SVGElementInstance.lastChild */
-  SVGElementInstance get lastChild;
-
-  /** @domName SVGElementInstance.nextSibling */
-  SVGElementInstance get nextSibling;
-
-  /** @domName SVGElementInstance.parentNode */
-  SVGElementInstance get parentNode;
-
-  /** @domName SVGElementInstance.previousSibling */
-  SVGElementInstance get previousSibling;
-}
-
-abstract class SVGElementInstanceEvents implements Events {
-
-  EventListenerList get abort;
-
-  EventListenerList get beforeCopy;
-
-  EventListenerList get beforeCut;
-
-  EventListenerList get beforePaste;
-
-  EventListenerList get blur;
-
-  EventListenerList get change;
-
-  EventListenerList get click;
-
-  EventListenerList get contextMenu;
-
-  EventListenerList get copy;
-
-  EventListenerList get cut;
-
-  EventListenerList get doubleClick;
-
-  EventListenerList get drag;
-
-  EventListenerList get dragEnd;
-
-  EventListenerList get dragEnter;
-
-  EventListenerList get dragLeave;
-
-  EventListenerList get dragOver;
-
-  EventListenerList get dragStart;
-
-  EventListenerList get drop;
-
-  EventListenerList get error;
-
-  EventListenerList get focus;
-
-  EventListenerList get input;
-
-  EventListenerList get keyDown;
-
-  EventListenerList get keyPress;
-
-  EventListenerList get keyUp;
-
-  EventListenerList get load;
-
-  EventListenerList get mouseDown;
-
-  EventListenerList get mouseMove;
-
-  EventListenerList get mouseOut;
-
-  EventListenerList get mouseOver;
-
-  EventListenerList get mouseUp;
-
-  EventListenerList get mouseWheel;
-
-  EventListenerList get paste;
-
-  EventListenerList get reset;
-
-  EventListenerList get resize;
-
-  EventListenerList get scroll;
-
-  EventListenerList get search;
-
-  EventListenerList get select;
-
-  EventListenerList get selectStart;
-
-  EventListenerList get submit;
-
-  EventListenerList get unload;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGElementInstanceImpl extends _EventTargetImpl implements SVGElementInstance {
-
-  _SVGElementInstanceEventsImpl get on =>
-    new _SVGElementInstanceEventsImpl(this);
-
   List<SVGElementInstance> get childNodes native "SVGElementInstance_childNodes_Getter";
 
+
+  /** @domName SVGElementInstance.correspondingElement */
   SVGElement get correspondingElement native "SVGElementInstance_correspondingElement_Getter";
 
+
+  /** @domName SVGElementInstance.correspondingUseElement */
   SVGUseElement get correspondingUseElement native "SVGElementInstance_correspondingUseElement_Getter";
 
+
+  /** @domName SVGElementInstance.firstChild */
   SVGElementInstance get firstChild native "SVGElementInstance_firstChild_Getter";
 
+
+  /** @domName SVGElementInstance.lastChild */
   SVGElementInstance get lastChild native "SVGElementInstance_lastChild_Getter";
 
+
+  /** @domName SVGElementInstance.nextSibling */
   SVGElementInstance get nextSibling native "SVGElementInstance_nextSibling_Getter";
 
+
+  /** @domName SVGElementInstance.parentNode */
   SVGElementInstance get parentNode native "SVGElementInstance_parentNode_Getter";
 
+
+  /** @domName SVGElementInstance.previousSibling */
   SVGElementInstance get previousSibling native "SVGElementInstance_previousSibling_Getter";
 
 }
 
-class _SVGElementInstanceEventsImpl extends _EventsImpl implements SVGElementInstanceEvents {
-  _SVGElementInstanceEventsImpl(_ptr) : super(_ptr);
+class SVGElementInstanceEvents extends Events {
+  SVGElementInstanceEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get abort => this['abort'];
 
@@ -28363,169 +21862,100 @@
 
 // WARNING: Do not edit - generated code.
 
-class _SVGElementInstanceListImpl extends NativeFieldWrapperClass1 implements List<SVGElementInstance> {
-
-  int get length native "SVGElementInstanceList_length_Getter";
-
-  SVGElementInstance operator[](int index) native "SVGElementInstanceList_item_Callback";
-
-  void operator[]=(int index, SVGElementInstance value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SVGElementInstance> mixins.
-  // SVGElementInstance is the element type.
-
-  // From Iterable<SVGElementInstance>:
-
-  Iterator<SVGElementInstance> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SVGElementInstance>(this);
-  }
-
-  // From Collection<SVGElementInstance>:
-
-  void add(SVGElementInstance value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SVGElementInstance value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SVGElementInstance> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SVGElementInstance element) => _Collections.contains(this, element);
-
-  void forEach(void f(SVGElementInstance element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SVGElementInstance element)) => _Collections.map(this, [], f);
-
-  Collection<SVGElementInstance> filter(bool f(SVGElementInstance element)) =>
-     _Collections.filter(this, <SVGElementInstance>[], f);
-
-  bool every(bool f(SVGElementInstance element)) => _Collections.every(this, f);
-
-  bool some(bool f(SVGElementInstance element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SVGElementInstance>:
-
-  void sort([Comparator<SVGElementInstance> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SVGElementInstance element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SVGElementInstance element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SVGElementInstance get last => this[length - 1];
-
-  SVGElementInstance removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SVGElementInstance> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SVGElementInstance initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SVGElementInstance> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SVGElementInstance>[]);
-
-  // -- end List<SVGElementInstance> mixins.
-
-  SVGElementInstance item(int index) native "SVGElementInstanceList_item_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName SVGEllipseElement
-abstract class SVGEllipseElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+class SVGEllipseElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
+  SVGEllipseElement.internal(): super.internal();
+
 
   /** @domName SVGEllipseElement.cx */
-  SVGAnimatedLength get cx;
-
-  /** @domName SVGEllipseElement.cy */
-  SVGAnimatedLength get cy;
-
-  /** @domName SVGEllipseElement.rx */
-  SVGAnimatedLength get rx;
-
-  /** @domName SVGEllipseElement.ry */
-  SVGAnimatedLength get ry;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGEllipseElementImpl extends _SVGElementImpl implements SVGEllipseElement {
-
   SVGAnimatedLength get cx native "SVGEllipseElement_cx_Getter";
 
+
+  /** @domName SVGEllipseElement.cy */
   SVGAnimatedLength get cy native "SVGEllipseElement_cy_Getter";
 
+
+  /** @domName SVGEllipseElement.rx */
   SVGAnimatedLength get rx native "SVGEllipseElement_rx_Getter";
 
+
+  /** @domName SVGEllipseElement.ry */
   SVGAnimatedLength get ry native "SVGEllipseElement_ry_Getter";
 
+
+  /** @domName SVGEllipseElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGEllipseElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGEllipseElement.xmllang */
   String get xmllang native "SVGEllipseElement_xmllang_Getter";
 
+
+  /** @domName SVGEllipseElement.xmllang */
   void set xmllang(String value) native "SVGEllipseElement_xmllang_Setter";
 
+
+  /** @domName SVGEllipseElement.xmlspace */
   String get xmlspace native "SVGEllipseElement_xmlspace_Getter";
 
+
+  /** @domName SVGEllipseElement.xmlspace */
   void set xmlspace(String value) native "SVGEllipseElement_xmlspace_Setter";
 
+
+  /** @domName SVGEllipseElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGEllipseElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGEllipseElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGEllipseElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGEllipseElement.getBBox */
   SVGRect getBBox() native "SVGEllipseElement_getBBox_Callback";
 
+
+  /** @domName SVGEllipseElement.getCTM */
   SVGMatrix getCTM() native "SVGEllipseElement_getCTM_Callback";
 
+
+  /** @domName SVGEllipseElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGEllipseElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGEllipseElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGEllipseElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGEllipseElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGEllipseElement_className_Getter";
 
+
+  /** @domName SVGEllipseElement.style */
   CSSStyleDeclaration get style native "SVGEllipseElement_style_Getter";
 
+
+  /** @domName SVGEllipseElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGEllipseElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGEllipseElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGEllipseElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGEllipseElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGEllipseElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGEllipseElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGEllipseElement_systemLanguage_Getter";
 
+
+  /** @domName SVGEllipseElement.hasExtension */
   bool hasExtension(String extension) native "SVGEllipseElement_hasExtension_Callback";
 
+
+  /** @domName SVGEllipseElement.transform */
   SVGAnimatedTransformList get transform native "SVGEllipseElement_transform_Getter";
 
 }
@@ -28536,7 +21966,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGException
-abstract class SVGException {
+class SVGException extends NativeFieldWrapperClass1 {
+  SVGException.internal();
 
   static const int SVG_INVALID_VALUE_ERR = 1;
 
@@ -28544,32 +21975,20 @@
 
   static const int SVG_WRONG_TYPE_ERR = 0;
 
+
   /** @domName SVGException.code */
-  int get code;
-
-  /** @domName SVGException.message */
-  String get message;
-
-  /** @domName SVGException.name */
-  String get name;
-
-  /** @domName SVGException.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGExceptionImpl extends NativeFieldWrapperClass1 implements SVGException {
-
   int get code native "SVGException_code_Getter";
 
+
+  /** @domName SVGException.message */
   String get message native "SVGException_message_Getter";
 
+
+  /** @domName SVGException.name */
   String get name native "SVGException_name_Getter";
 
+
+  /** @domName SVGException.toString */
   String toString() native "SVGException_toString_Callback";
 
 }
@@ -28580,10 +21999,13 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGExternalResourcesRequired
-abstract class SVGExternalResourcesRequired {
+class SVGExternalResourcesRequired extends NativeFieldWrapperClass1 {
+  SVGExternalResourcesRequired.internal();
+
 
   /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
-  SVGAnimatedBoolean get externalResourcesRequired;
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGExternalResourcesRequired_externalResourcesRequired_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -28592,7 +22014,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEBlendElement
-abstract class SVGFEBlendElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFEBlendElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFEBlendElement.internal(): super.internal();
 
   static const int SVG_FEBLEND_MODE_DARKEN = 4;
 
@@ -28606,43 +22029,48 @@
 
   static const int SVG_FEBLEND_MODE_UNKNOWN = 0;
 
+
   /** @domName SVGFEBlendElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEBlendElement.in2 */
-  SVGAnimatedString get in2;
-
-  /** @domName SVGFEBlendElement.mode */
-  SVGAnimatedEnumeration get mode;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEBlendElementImpl extends _SVGElementImpl implements SVGFEBlendElement {
-
   SVGAnimatedString get in1 native "SVGFEBlendElement_in1_Getter";
 
+
+  /** @domName SVGFEBlendElement.in2 */
   SVGAnimatedString get in2 native "SVGFEBlendElement_in2_Getter";
 
+
+  /** @domName SVGFEBlendElement.mode */
   SVGAnimatedEnumeration get mode native "SVGFEBlendElement_mode_Getter";
 
+
+  /** @domName SVGFEBlendElement.height */
   SVGAnimatedLength get height native "SVGFEBlendElement_height_Getter";
 
+
+  /** @domName SVGFEBlendElement.result */
   SVGAnimatedString get result native "SVGFEBlendElement_result_Getter";
 
+
+  /** @domName SVGFEBlendElement.width */
   SVGAnimatedLength get width native "SVGFEBlendElement_width_Getter";
 
+
+  /** @domName SVGFEBlendElement.x */
   SVGAnimatedLength get x native "SVGFEBlendElement_x_Getter";
 
+
+  /** @domName SVGFEBlendElement.y */
   SVGAnimatedLength get y native "SVGFEBlendElement_y_Getter";
 
+
+  /** @domName SVGFEBlendElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFEBlendElement_className_Getter";
 
+
+  /** @domName SVGFEBlendElement.style */
   CSSStyleDeclaration get style native "SVGFEBlendElement_style_Getter";
 
+
+  /** @domName SVGFEBlendElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFEBlendElement_getPresentationAttribute_Callback";
 
 }
@@ -28653,7 +22081,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEColorMatrixElement
-abstract class SVGFEColorMatrixElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFEColorMatrixElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFEColorMatrixElement.internal(): super.internal();
 
   static const int SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
 
@@ -28665,43 +22094,48 @@
 
   static const int SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
 
+
   /** @domName SVGFEColorMatrixElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEColorMatrixElement.type */
-  SVGAnimatedEnumeration get type;
-
-  /** @domName SVGFEColorMatrixElement.values */
-  SVGAnimatedNumberList get values;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEColorMatrixElementImpl extends _SVGElementImpl implements SVGFEColorMatrixElement {
-
   SVGAnimatedString get in1 native "SVGFEColorMatrixElement_in1_Getter";
 
+
+  /** @domName SVGFEColorMatrixElement.type */
   SVGAnimatedEnumeration get type native "SVGFEColorMatrixElement_type_Getter";
 
+
+  /** @domName SVGFEColorMatrixElement.values */
   SVGAnimatedNumberList get values native "SVGFEColorMatrixElement_values_Getter";
 
+
+  /** @domName SVGFEColorMatrixElement.height */
   SVGAnimatedLength get height native "SVGFEColorMatrixElement_height_Getter";
 
+
+  /** @domName SVGFEColorMatrixElement.result */
   SVGAnimatedString get result native "SVGFEColorMatrixElement_result_Getter";
 
+
+  /** @domName SVGFEColorMatrixElement.width */
   SVGAnimatedLength get width native "SVGFEColorMatrixElement_width_Getter";
 
+
+  /** @domName SVGFEColorMatrixElement.x */
   SVGAnimatedLength get x native "SVGFEColorMatrixElement_x_Getter";
 
+
+  /** @domName SVGFEColorMatrixElement.y */
   SVGAnimatedLength get y native "SVGFEColorMatrixElement_y_Getter";
 
+
+  /** @domName SVGFEColorMatrixElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFEColorMatrixElement_className_Getter";
 
+
+  /** @domName SVGFEColorMatrixElement.style */
   CSSStyleDeclaration get style native "SVGFEColorMatrixElement_style_Getter";
 
+
+  /** @domName SVGFEColorMatrixElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFEColorMatrixElement_getPresentationAttribute_Callback";
 
 }
@@ -28712,35 +22146,43 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEComponentTransferElement
-abstract class SVGFEComponentTransferElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFEComponentTransferElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFEComponentTransferElement.internal(): super.internal();
+
 
   /** @domName SVGFEComponentTransferElement.in1 */
-  SVGAnimatedString get in1;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEComponentTransferElementImpl extends _SVGElementImpl implements SVGFEComponentTransferElement {
-
   SVGAnimatedString get in1 native "SVGFEComponentTransferElement_in1_Getter";
 
+
+  /** @domName SVGFEComponentTransferElement.height */
   SVGAnimatedLength get height native "SVGFEComponentTransferElement_height_Getter";
 
+
+  /** @domName SVGFEComponentTransferElement.result */
   SVGAnimatedString get result native "SVGFEComponentTransferElement_result_Getter";
 
+
+  /** @domName SVGFEComponentTransferElement.width */
   SVGAnimatedLength get width native "SVGFEComponentTransferElement_width_Getter";
 
+
+  /** @domName SVGFEComponentTransferElement.x */
   SVGAnimatedLength get x native "SVGFEComponentTransferElement_x_Getter";
 
+
+  /** @domName SVGFEComponentTransferElement.y */
   SVGAnimatedLength get y native "SVGFEComponentTransferElement_y_Getter";
 
+
+  /** @domName SVGFEComponentTransferElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFEComponentTransferElement_className_Getter";
 
+
+  /** @domName SVGFEComponentTransferElement.style */
   CSSStyleDeclaration get style native "SVGFEComponentTransferElement_style_Getter";
 
+
+  /** @domName SVGFEComponentTransferElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFEComponentTransferElement_getPresentationAttribute_Callback";
 
 }
@@ -28751,7 +22193,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFECompositeElement
-abstract class SVGFECompositeElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFECompositeElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFECompositeElement.internal(): super.internal();
 
   static const int SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
 
@@ -28767,63 +22210,64 @@
 
   static const int SVG_FECOMPOSITE_OPERATOR_XOR = 5;
 
+
   /** @domName SVGFECompositeElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFECompositeElement.in2 */
-  SVGAnimatedString get in2;
-
-  /** @domName SVGFECompositeElement.k1 */
-  SVGAnimatedNumber get k1;
-
-  /** @domName SVGFECompositeElement.k2 */
-  SVGAnimatedNumber get k2;
-
-  /** @domName SVGFECompositeElement.k3 */
-  SVGAnimatedNumber get k3;
-
-  /** @domName SVGFECompositeElement.k4 */
-  SVGAnimatedNumber get k4;
-
-  /** @domName SVGFECompositeElement.operator */
-  SVGAnimatedEnumeration get operator;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFECompositeElementImpl extends _SVGElementImpl implements SVGFECompositeElement {
-
   SVGAnimatedString get in1 native "SVGFECompositeElement_in1_Getter";
 
+
+  /** @domName SVGFECompositeElement.in2 */
   SVGAnimatedString get in2 native "SVGFECompositeElement_in2_Getter";
 
+
+  /** @domName SVGFECompositeElement.k1 */
   SVGAnimatedNumber get k1 native "SVGFECompositeElement_k1_Getter";
 
+
+  /** @domName SVGFECompositeElement.k2 */
   SVGAnimatedNumber get k2 native "SVGFECompositeElement_k2_Getter";
 
+
+  /** @domName SVGFECompositeElement.k3 */
   SVGAnimatedNumber get k3 native "SVGFECompositeElement_k3_Getter";
 
+
+  /** @domName SVGFECompositeElement.k4 */
   SVGAnimatedNumber get k4 native "SVGFECompositeElement_k4_Getter";
 
+
+  /** @domName SVGFECompositeElement.operator */
   SVGAnimatedEnumeration get operator native "SVGFECompositeElement_operator_Getter";
 
+
+  /** @domName SVGFECompositeElement.height */
   SVGAnimatedLength get height native "SVGFECompositeElement_height_Getter";
 
+
+  /** @domName SVGFECompositeElement.result */
   SVGAnimatedString get result native "SVGFECompositeElement_result_Getter";
 
+
+  /** @domName SVGFECompositeElement.width */
   SVGAnimatedLength get width native "SVGFECompositeElement_width_Getter";
 
+
+  /** @domName SVGFECompositeElement.x */
   SVGAnimatedLength get x native "SVGFECompositeElement_x_Getter";
 
+
+  /** @domName SVGFECompositeElement.y */
   SVGAnimatedLength get y native "SVGFECompositeElement_y_Getter";
 
+
+  /** @domName SVGFECompositeElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFECompositeElement_className_Getter";
 
+
+  /** @domName SVGFECompositeElement.style */
   CSSStyleDeclaration get style native "SVGFECompositeElement_style_Getter";
 
+
+  /** @domName SVGFECompositeElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFECompositeElement_getPresentationAttribute_Callback";
 
 }
@@ -28834,7 +22278,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEConvolveMatrixElement
-abstract class SVGFEConvolveMatrixElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFEConvolveMatrixElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFEConvolveMatrixElement.internal(): super.internal();
 
   static const int SVG_EDGEMODE_DUPLICATE = 1;
 
@@ -28844,88 +22289,84 @@
 
   static const int SVG_EDGEMODE_WRAP = 2;
 
+
   /** @domName SVGFEConvolveMatrixElement.bias */
-  SVGAnimatedNumber get bias;
-
-  /** @domName SVGFEConvolveMatrixElement.divisor */
-  SVGAnimatedNumber get divisor;
-
-  /** @domName SVGFEConvolveMatrixElement.edgeMode */
-  SVGAnimatedEnumeration get edgeMode;
-
-  /** @domName SVGFEConvolveMatrixElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEConvolveMatrixElement.kernelMatrix */
-  SVGAnimatedNumberList get kernelMatrix;
-
-  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthX */
-  SVGAnimatedNumber get kernelUnitLengthX;
-
-  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthY */
-  SVGAnimatedNumber get kernelUnitLengthY;
-
-  /** @domName SVGFEConvolveMatrixElement.orderX */
-  SVGAnimatedInteger get orderX;
-
-  /** @domName SVGFEConvolveMatrixElement.orderY */
-  SVGAnimatedInteger get orderY;
-
-  /** @domName SVGFEConvolveMatrixElement.preserveAlpha */
-  SVGAnimatedBoolean get preserveAlpha;
-
-  /** @domName SVGFEConvolveMatrixElement.targetX */
-  SVGAnimatedInteger get targetX;
-
-  /** @domName SVGFEConvolveMatrixElement.targetY */
-  SVGAnimatedInteger get targetY;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEConvolveMatrixElementImpl extends _SVGElementImpl implements SVGFEConvolveMatrixElement {
-
   SVGAnimatedNumber get bias native "SVGFEConvolveMatrixElement_bias_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.divisor */
   SVGAnimatedNumber get divisor native "SVGFEConvolveMatrixElement_divisor_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.edgeMode */
   SVGAnimatedEnumeration get edgeMode native "SVGFEConvolveMatrixElement_edgeMode_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.in1 */
   SVGAnimatedString get in1 native "SVGFEConvolveMatrixElement_in1_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.kernelMatrix */
   SVGAnimatedNumberList get kernelMatrix native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthX */
   SVGAnimatedNumber get kernelUnitLengthX native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthY */
   SVGAnimatedNumber get kernelUnitLengthY native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.orderX */
   SVGAnimatedInteger get orderX native "SVGFEConvolveMatrixElement_orderX_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.orderY */
   SVGAnimatedInteger get orderY native "SVGFEConvolveMatrixElement_orderY_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.preserveAlpha */
   SVGAnimatedBoolean get preserveAlpha native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.targetX */
   SVGAnimatedInteger get targetX native "SVGFEConvolveMatrixElement_targetX_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.targetY */
   SVGAnimatedInteger get targetY native "SVGFEConvolveMatrixElement_targetY_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.height */
   SVGAnimatedLength get height native "SVGFEConvolveMatrixElement_height_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.result */
   SVGAnimatedString get result native "SVGFEConvolveMatrixElement_result_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.width */
   SVGAnimatedLength get width native "SVGFEConvolveMatrixElement_width_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.x */
   SVGAnimatedLength get x native "SVGFEConvolveMatrixElement_x_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.y */
   SVGAnimatedLength get y native "SVGFEConvolveMatrixElement_y_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFEConvolveMatrixElement_className_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.style */
   CSSStyleDeclaration get style native "SVGFEConvolveMatrixElement_style_Getter";
 
+
+  /** @domName SVGFEConvolveMatrixElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFEConvolveMatrixElement_getPresentationAttribute_Callback";
 
 }
@@ -28936,55 +22377,59 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEDiffuseLightingElement
-abstract class SVGFEDiffuseLightingElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFEDiffuseLightingElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFEDiffuseLightingElement.internal(): super.internal();
+
 
   /** @domName SVGFEDiffuseLightingElement.diffuseConstant */
-  SVGAnimatedNumber get diffuseConstant;
-
-  /** @domName SVGFEDiffuseLightingElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthX */
-  SVGAnimatedNumber get kernelUnitLengthX;
-
-  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthY */
-  SVGAnimatedNumber get kernelUnitLengthY;
-
-  /** @domName SVGFEDiffuseLightingElement.surfaceScale */
-  SVGAnimatedNumber get surfaceScale;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEDiffuseLightingElementImpl extends _SVGElementImpl implements SVGFEDiffuseLightingElement {
-
   SVGAnimatedNumber get diffuseConstant native "SVGFEDiffuseLightingElement_diffuseConstant_Getter";
 
+
+  /** @domName SVGFEDiffuseLightingElement.in1 */
   SVGAnimatedString get in1 native "SVGFEDiffuseLightingElement_in1_Getter";
 
+
+  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthX */
   SVGAnimatedNumber get kernelUnitLengthX native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";
 
+
+  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthY */
   SVGAnimatedNumber get kernelUnitLengthY native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";
 
+
+  /** @domName SVGFEDiffuseLightingElement.surfaceScale */
   SVGAnimatedNumber get surfaceScale native "SVGFEDiffuseLightingElement_surfaceScale_Getter";
 
+
+  /** @domName SVGFEDiffuseLightingElement.height */
   SVGAnimatedLength get height native "SVGFEDiffuseLightingElement_height_Getter";
 
+
+  /** @domName SVGFEDiffuseLightingElement.result */
   SVGAnimatedString get result native "SVGFEDiffuseLightingElement_result_Getter";
 
+
+  /** @domName SVGFEDiffuseLightingElement.width */
   SVGAnimatedLength get width native "SVGFEDiffuseLightingElement_width_Getter";
 
+
+  /** @domName SVGFEDiffuseLightingElement.x */
   SVGAnimatedLength get x native "SVGFEDiffuseLightingElement_x_Getter";
 
+
+  /** @domName SVGFEDiffuseLightingElement.y */
   SVGAnimatedLength get y native "SVGFEDiffuseLightingElement_y_Getter";
 
+
+  /** @domName SVGFEDiffuseLightingElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFEDiffuseLightingElement_className_Getter";
 
+
+  /** @domName SVGFEDiffuseLightingElement.style */
   CSSStyleDeclaration get style native "SVGFEDiffuseLightingElement_style_Getter";
 
+
+  /** @domName SVGFEDiffuseLightingElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFEDiffuseLightingElement_getPresentationAttribute_Callback";
 
 }
@@ -28995,7 +22440,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEDisplacementMapElement
-abstract class SVGFEDisplacementMapElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFEDisplacementMapElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFEDisplacementMapElement.internal(): super.internal();
 
   static const int SVG_CHANNEL_A = 4;
 
@@ -29007,53 +22453,56 @@
 
   static const int SVG_CHANNEL_UNKNOWN = 0;
 
+
   /** @domName SVGFEDisplacementMapElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEDisplacementMapElement.in2 */
-  SVGAnimatedString get in2;
-
-  /** @domName SVGFEDisplacementMapElement.scale */
-  SVGAnimatedNumber get scale;
-
-  /** @domName SVGFEDisplacementMapElement.xChannelSelector */
-  SVGAnimatedEnumeration get xChannelSelector;
-
-  /** @domName SVGFEDisplacementMapElement.yChannelSelector */
-  SVGAnimatedEnumeration get yChannelSelector;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEDisplacementMapElementImpl extends _SVGElementImpl implements SVGFEDisplacementMapElement {
-
   SVGAnimatedString get in1 native "SVGFEDisplacementMapElement_in1_Getter";
 
+
+  /** @domName SVGFEDisplacementMapElement.in2 */
   SVGAnimatedString get in2 native "SVGFEDisplacementMapElement_in2_Getter";
 
+
+  /** @domName SVGFEDisplacementMapElement.scale */
   SVGAnimatedNumber get scale native "SVGFEDisplacementMapElement_scale_Getter";
 
+
+  /** @domName SVGFEDisplacementMapElement.xChannelSelector */
   SVGAnimatedEnumeration get xChannelSelector native "SVGFEDisplacementMapElement_xChannelSelector_Getter";
 
+
+  /** @domName SVGFEDisplacementMapElement.yChannelSelector */
   SVGAnimatedEnumeration get yChannelSelector native "SVGFEDisplacementMapElement_yChannelSelector_Getter";
 
+
+  /** @domName SVGFEDisplacementMapElement.height */
   SVGAnimatedLength get height native "SVGFEDisplacementMapElement_height_Getter";
 
+
+  /** @domName SVGFEDisplacementMapElement.result */
   SVGAnimatedString get result native "SVGFEDisplacementMapElement_result_Getter";
 
+
+  /** @domName SVGFEDisplacementMapElement.width */
   SVGAnimatedLength get width native "SVGFEDisplacementMapElement_width_Getter";
 
+
+  /** @domName SVGFEDisplacementMapElement.x */
   SVGAnimatedLength get x native "SVGFEDisplacementMapElement_x_Getter";
 
+
+  /** @domName SVGFEDisplacementMapElement.y */
   SVGAnimatedLength get y native "SVGFEDisplacementMapElement_y_Getter";
 
+
+  /** @domName SVGFEDisplacementMapElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFEDisplacementMapElement_className_Getter";
 
+
+  /** @domName SVGFEDisplacementMapElement.style */
   CSSStyleDeclaration get style native "SVGFEDisplacementMapElement_style_Getter";
 
+
+  /** @domName SVGFEDisplacementMapElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFEDisplacementMapElement_getPresentationAttribute_Callback";
 
 }
@@ -29064,24 +22513,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEDistantLightElement
-abstract class SVGFEDistantLightElement implements SVGElement {
+class SVGFEDistantLightElement extends SVGElement {
+  SVGFEDistantLightElement.internal(): super.internal();
+
 
   /** @domName SVGFEDistantLightElement.azimuth */
-  SVGAnimatedNumber get azimuth;
-
-  /** @domName SVGFEDistantLightElement.elevation */
-  SVGAnimatedNumber get elevation;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEDistantLightElementImpl extends _SVGElementImpl implements SVGFEDistantLightElement {
-
   SVGAnimatedNumber get azimuth native "SVGFEDistantLightElement_azimuth_Getter";
 
+
+  /** @domName SVGFEDistantLightElement.elevation */
   SVGAnimatedNumber get elevation native "SVGFEDistantLightElement_elevation_Getter";
 
 }
@@ -29092,60 +22532,63 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEDropShadowElement
-abstract class SVGFEDropShadowElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFEDropShadowElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFEDropShadowElement.internal(): super.internal();
+
 
   /** @domName SVGFEDropShadowElement.dx */
-  SVGAnimatedNumber get dx;
-
-  /** @domName SVGFEDropShadowElement.dy */
-  SVGAnimatedNumber get dy;
-
-  /** @domName SVGFEDropShadowElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEDropShadowElement.stdDeviationX */
-  SVGAnimatedNumber get stdDeviationX;
-
-  /** @domName SVGFEDropShadowElement.stdDeviationY */
-  SVGAnimatedNumber get stdDeviationY;
-
-  /** @domName SVGFEDropShadowElement.setStdDeviation */
-  void setStdDeviation(num stdDeviationX, num stdDeviationY);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEDropShadowElementImpl extends _SVGElementImpl implements SVGFEDropShadowElement {
-
   SVGAnimatedNumber get dx native "SVGFEDropShadowElement_dx_Getter";
 
+
+  /** @domName SVGFEDropShadowElement.dy */
   SVGAnimatedNumber get dy native "SVGFEDropShadowElement_dy_Getter";
 
+
+  /** @domName SVGFEDropShadowElement.in1 */
   SVGAnimatedString get in1 native "SVGFEDropShadowElement_in1_Getter";
 
+
+  /** @domName SVGFEDropShadowElement.stdDeviationX */
   SVGAnimatedNumber get stdDeviationX native "SVGFEDropShadowElement_stdDeviationX_Getter";
 
+
+  /** @domName SVGFEDropShadowElement.stdDeviationY */
   SVGAnimatedNumber get stdDeviationY native "SVGFEDropShadowElement_stdDeviationY_Getter";
 
+
+  /** @domName SVGFEDropShadowElement.setStdDeviation */
   void setStdDeviation(num stdDeviationX, num stdDeviationY) native "SVGFEDropShadowElement_setStdDeviation_Callback";
 
+
+  /** @domName SVGFEDropShadowElement.height */
   SVGAnimatedLength get height native "SVGFEDropShadowElement_height_Getter";
 
+
+  /** @domName SVGFEDropShadowElement.result */
   SVGAnimatedString get result native "SVGFEDropShadowElement_result_Getter";
 
+
+  /** @domName SVGFEDropShadowElement.width */
   SVGAnimatedLength get width native "SVGFEDropShadowElement_width_Getter";
 
+
+  /** @domName SVGFEDropShadowElement.x */
   SVGAnimatedLength get x native "SVGFEDropShadowElement_x_Getter";
 
+
+  /** @domName SVGFEDropShadowElement.y */
   SVGAnimatedLength get y native "SVGFEDropShadowElement_y_Getter";
 
+
+  /** @domName SVGFEDropShadowElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFEDropShadowElement_className_Getter";
 
+
+  /** @domName SVGFEDropShadowElement.style */
   CSSStyleDeclaration get style native "SVGFEDropShadowElement_style_Getter";
 
+
+  /** @domName SVGFEDropShadowElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFEDropShadowElement_getPresentationAttribute_Callback";
 
 }
@@ -29156,30 +22599,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEFloodElement
-abstract class SVGFEFloodElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+class SVGFEFloodElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFEFloodElement.internal(): super.internal();
 
-// WARNING: Do not edit - generated code.
 
-class _SVGFEFloodElementImpl extends _SVGElementImpl implements SVGFEFloodElement {
-
+  /** @domName SVGFEFloodElement.height */
   SVGAnimatedLength get height native "SVGFEFloodElement_height_Getter";
 
+
+  /** @domName SVGFEFloodElement.result */
   SVGAnimatedString get result native "SVGFEFloodElement_result_Getter";
 
+
+  /** @domName SVGFEFloodElement.width */
   SVGAnimatedLength get width native "SVGFEFloodElement_width_Getter";
 
+
+  /** @domName SVGFEFloodElement.x */
   SVGAnimatedLength get x native "SVGFEFloodElement_x_Getter";
 
+
+  /** @domName SVGFEFloodElement.y */
   SVGAnimatedLength get y native "SVGFEFloodElement_y_Getter";
 
+
+  /** @domName SVGFEFloodElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFEFloodElement_className_Getter";
 
+
+  /** @domName SVGFEFloodElement.style */
   CSSStyleDeclaration get style native "SVGFEFloodElement_style_Getter";
 
+
+  /** @domName SVGFEFloodElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFEFloodElement_getPresentationAttribute_Callback";
 
 }
@@ -29190,15 +22642,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEFuncAElement
-abstract class SVGFEFuncAElement implements SVGComponentTransferFunctionElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEFuncAElementImpl extends _SVGComponentTransferFunctionElementImpl implements SVGFEFuncAElement {
+class SVGFEFuncAElement extends SVGComponentTransferFunctionElement {
+  SVGFEFuncAElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29208,15 +22653,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEFuncBElement
-abstract class SVGFEFuncBElement implements SVGComponentTransferFunctionElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEFuncBElementImpl extends _SVGComponentTransferFunctionElementImpl implements SVGFEFuncBElement {
+class SVGFEFuncBElement extends SVGComponentTransferFunctionElement {
+  SVGFEFuncBElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29226,15 +22664,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEFuncGElement
-abstract class SVGFEFuncGElement implements SVGComponentTransferFunctionElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEFuncGElementImpl extends _SVGComponentTransferFunctionElementImpl implements SVGFEFuncGElement {
+class SVGFEFuncGElement extends SVGComponentTransferFunctionElement {
+  SVGFEFuncGElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29244,15 +22675,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEFuncRElement
-abstract class SVGFEFuncRElement implements SVGComponentTransferFunctionElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEFuncRElementImpl extends _SVGComponentTransferFunctionElementImpl implements SVGFEFuncRElement {
+class SVGFEFuncRElement extends SVGComponentTransferFunctionElement {
+  SVGFEFuncRElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29262,50 +22686,55 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEGaussianBlurElement
-abstract class SVGFEGaussianBlurElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFEGaussianBlurElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFEGaussianBlurElement.internal(): super.internal();
+
 
   /** @domName SVGFEGaussianBlurElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEGaussianBlurElement.stdDeviationX */
-  SVGAnimatedNumber get stdDeviationX;
-
-  /** @domName SVGFEGaussianBlurElement.stdDeviationY */
-  SVGAnimatedNumber get stdDeviationY;
-
-  /** @domName SVGFEGaussianBlurElement.setStdDeviation */
-  void setStdDeviation(num stdDeviationX, num stdDeviationY);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEGaussianBlurElementImpl extends _SVGElementImpl implements SVGFEGaussianBlurElement {
-
   SVGAnimatedString get in1 native "SVGFEGaussianBlurElement_in1_Getter";
 
+
+  /** @domName SVGFEGaussianBlurElement.stdDeviationX */
   SVGAnimatedNumber get stdDeviationX native "SVGFEGaussianBlurElement_stdDeviationX_Getter";
 
+
+  /** @domName SVGFEGaussianBlurElement.stdDeviationY */
   SVGAnimatedNumber get stdDeviationY native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
 
+
+  /** @domName SVGFEGaussianBlurElement.setStdDeviation */
   void setStdDeviation(num stdDeviationX, num stdDeviationY) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";
 
+
+  /** @domName SVGFEGaussianBlurElement.height */
   SVGAnimatedLength get height native "SVGFEGaussianBlurElement_height_Getter";
 
+
+  /** @domName SVGFEGaussianBlurElement.result */
   SVGAnimatedString get result native "SVGFEGaussianBlurElement_result_Getter";
 
+
+  /** @domName SVGFEGaussianBlurElement.width */
   SVGAnimatedLength get width native "SVGFEGaussianBlurElement_width_Getter";
 
+
+  /** @domName SVGFEGaussianBlurElement.x */
   SVGAnimatedLength get x native "SVGFEGaussianBlurElement_x_Getter";
 
+
+  /** @domName SVGFEGaussianBlurElement.y */
   SVGAnimatedLength get y native "SVGFEGaussianBlurElement_y_Getter";
 
+
+  /** @domName SVGFEGaussianBlurElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFEGaussianBlurElement_className_Getter";
 
+
+  /** @domName SVGFEGaussianBlurElement.style */
   CSSStyleDeclaration get style native "SVGFEGaussianBlurElement_style_Getter";
 
+
+  /** @domName SVGFEGaussianBlurElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFEGaussianBlurElement_getPresentationAttribute_Callback";
 
 }
@@ -29316,47 +22745,67 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEImageElement
-abstract class SVGFEImageElement implements SVGElement, SVGURIReference, SVGLangSpace, SVGExternalResourcesRequired, SVGFilterPrimitiveStandardAttributes {
+class SVGFEImageElement extends SVGElement implements SVGURIReference, SVGLangSpace, SVGFilterPrimitiveStandardAttributes, SVGExternalResourcesRequired {
+  SVGFEImageElement.internal(): super.internal();
+
 
   /** @domName SVGFEImageElement.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEImageElementImpl extends _SVGElementImpl implements SVGFEImageElement {
-
   SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGFEImageElement_preserveAspectRatio_Getter";
 
+
+  /** @domName SVGFEImageElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGFEImageElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGFEImageElement.height */
   SVGAnimatedLength get height native "SVGFEImageElement_height_Getter";
 
+
+  /** @domName SVGFEImageElement.result */
   SVGAnimatedString get result native "SVGFEImageElement_result_Getter";
 
+
+  /** @domName SVGFEImageElement.width */
   SVGAnimatedLength get width native "SVGFEImageElement_width_Getter";
 
+
+  /** @domName SVGFEImageElement.x */
   SVGAnimatedLength get x native "SVGFEImageElement_x_Getter";
 
+
+  /** @domName SVGFEImageElement.y */
   SVGAnimatedLength get y native "SVGFEImageElement_y_Getter";
 
+
+  /** @domName SVGFEImageElement.xmllang */
   String get xmllang native "SVGFEImageElement_xmllang_Getter";
 
+
+  /** @domName SVGFEImageElement.xmllang */
   void set xmllang(String value) native "SVGFEImageElement_xmllang_Setter";
 
+
+  /** @domName SVGFEImageElement.xmlspace */
   String get xmlspace native "SVGFEImageElement_xmlspace_Getter";
 
+
+  /** @domName SVGFEImageElement.xmlspace */
   void set xmlspace(String value) native "SVGFEImageElement_xmlspace_Setter";
 
+
+  /** @domName SVGFEImageElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFEImageElement_className_Getter";
 
+
+  /** @domName SVGFEImageElement.style */
   CSSStyleDeclaration get style native "SVGFEImageElement_style_Getter";
 
+
+  /** @domName SVGFEImageElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFEImageElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGFEImageElement.href */
   SVGAnimatedString get href native "SVGFEImageElement_href_Getter";
 
 }
@@ -29367,30 +22816,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEMergeElement
-abstract class SVGFEMergeElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+class SVGFEMergeElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFEMergeElement.internal(): super.internal();
 
-// WARNING: Do not edit - generated code.
 
-class _SVGFEMergeElementImpl extends _SVGElementImpl implements SVGFEMergeElement {
-
+  /** @domName SVGFEMergeElement.height */
   SVGAnimatedLength get height native "SVGFEMergeElement_height_Getter";
 
+
+  /** @domName SVGFEMergeElement.result */
   SVGAnimatedString get result native "SVGFEMergeElement_result_Getter";
 
+
+  /** @domName SVGFEMergeElement.width */
   SVGAnimatedLength get width native "SVGFEMergeElement_width_Getter";
 
+
+  /** @domName SVGFEMergeElement.x */
   SVGAnimatedLength get x native "SVGFEMergeElement_x_Getter";
 
+
+  /** @domName SVGFEMergeElement.y */
   SVGAnimatedLength get y native "SVGFEMergeElement_y_Getter";
 
+
+  /** @domName SVGFEMergeElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFEMergeElement_className_Getter";
 
+
+  /** @domName SVGFEMergeElement.style */
   CSSStyleDeclaration get style native "SVGFEMergeElement_style_Getter";
 
+
+  /** @domName SVGFEMergeElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFEMergeElement_getPresentationAttribute_Callback";
 
 }
@@ -29401,19 +22859,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEMergeNodeElement
-abstract class SVGFEMergeNodeElement implements SVGElement {
+class SVGFEMergeNodeElement extends SVGElement {
+  SVGFEMergeNodeElement.internal(): super.internal();
+
 
   /** @domName SVGFEMergeNodeElement.in1 */
-  SVGAnimatedString get in1;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEMergeNodeElementImpl extends _SVGElementImpl implements SVGFEMergeNodeElement {
-
   SVGAnimatedString get in1 native "SVGFEMergeNodeElement_in1_Getter";
 
 }
@@ -29424,7 +22874,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEMorphologyElement
-abstract class SVGFEMorphologyElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFEMorphologyElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFEMorphologyElement.internal(): super.internal();
 
   static const int SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
 
@@ -29432,53 +22883,56 @@
 
   static const int SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
 
+
   /** @domName SVGFEMorphologyElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFEMorphologyElement.operator */
-  SVGAnimatedEnumeration get operator;
-
-  /** @domName SVGFEMorphologyElement.radiusX */
-  SVGAnimatedNumber get radiusX;
-
-  /** @domName SVGFEMorphologyElement.radiusY */
-  SVGAnimatedNumber get radiusY;
-
-  /** @domName SVGFEMorphologyElement.setRadius */
-  void setRadius(num radiusX, num radiusY);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEMorphologyElementImpl extends _SVGElementImpl implements SVGFEMorphologyElement {
-
   SVGAnimatedString get in1 native "SVGFEMorphologyElement_in1_Getter";
 
+
+  /** @domName SVGFEMorphologyElement.operator */
   SVGAnimatedEnumeration get operator native "SVGFEMorphologyElement_operator_Getter";
 
+
+  /** @domName SVGFEMorphologyElement.radiusX */
   SVGAnimatedNumber get radiusX native "SVGFEMorphologyElement_radiusX_Getter";
 
+
+  /** @domName SVGFEMorphologyElement.radiusY */
   SVGAnimatedNumber get radiusY native "SVGFEMorphologyElement_radiusY_Getter";
 
+
+  /** @domName SVGFEMorphologyElement.setRadius */
   void setRadius(num radiusX, num radiusY) native "SVGFEMorphologyElement_setRadius_Callback";
 
+
+  /** @domName SVGFEMorphologyElement.height */
   SVGAnimatedLength get height native "SVGFEMorphologyElement_height_Getter";
 
+
+  /** @domName SVGFEMorphologyElement.result */
   SVGAnimatedString get result native "SVGFEMorphologyElement_result_Getter";
 
+
+  /** @domName SVGFEMorphologyElement.width */
   SVGAnimatedLength get width native "SVGFEMorphologyElement_width_Getter";
 
+
+  /** @domName SVGFEMorphologyElement.x */
   SVGAnimatedLength get x native "SVGFEMorphologyElement_x_Getter";
 
+
+  /** @domName SVGFEMorphologyElement.y */
   SVGAnimatedLength get y native "SVGFEMorphologyElement_y_Getter";
 
+
+  /** @domName SVGFEMorphologyElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFEMorphologyElement_className_Getter";
 
+
+  /** @domName SVGFEMorphologyElement.style */
   CSSStyleDeclaration get style native "SVGFEMorphologyElement_style_Getter";
 
+
+  /** @domName SVGFEMorphologyElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFEMorphologyElement_getPresentationAttribute_Callback";
 
 }
@@ -29489,45 +22943,51 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEOffsetElement
-abstract class SVGFEOffsetElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFEOffsetElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFEOffsetElement.internal(): super.internal();
+
 
   /** @domName SVGFEOffsetElement.dx */
-  SVGAnimatedNumber get dx;
-
-  /** @domName SVGFEOffsetElement.dy */
-  SVGAnimatedNumber get dy;
-
-  /** @domName SVGFEOffsetElement.in1 */
-  SVGAnimatedString get in1;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEOffsetElementImpl extends _SVGElementImpl implements SVGFEOffsetElement {
-
   SVGAnimatedNumber get dx native "SVGFEOffsetElement_dx_Getter";
 
+
+  /** @domName SVGFEOffsetElement.dy */
   SVGAnimatedNumber get dy native "SVGFEOffsetElement_dy_Getter";
 
+
+  /** @domName SVGFEOffsetElement.in1 */
   SVGAnimatedString get in1 native "SVGFEOffsetElement_in1_Getter";
 
+
+  /** @domName SVGFEOffsetElement.height */
   SVGAnimatedLength get height native "SVGFEOffsetElement_height_Getter";
 
+
+  /** @domName SVGFEOffsetElement.result */
   SVGAnimatedString get result native "SVGFEOffsetElement_result_Getter";
 
+
+  /** @domName SVGFEOffsetElement.width */
   SVGAnimatedLength get width native "SVGFEOffsetElement_width_Getter";
 
+
+  /** @domName SVGFEOffsetElement.x */
   SVGAnimatedLength get x native "SVGFEOffsetElement_x_Getter";
 
+
+  /** @domName SVGFEOffsetElement.y */
   SVGAnimatedLength get y native "SVGFEOffsetElement_y_Getter";
 
+
+  /** @domName SVGFEOffsetElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFEOffsetElement_className_Getter";
 
+
+  /** @domName SVGFEOffsetElement.style */
   CSSStyleDeclaration get style native "SVGFEOffsetElement_style_Getter";
 
+
+  /** @domName SVGFEOffsetElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFEOffsetElement_getPresentationAttribute_Callback";
 
 }
@@ -29538,29 +22998,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFEPointLightElement
-abstract class SVGFEPointLightElement implements SVGElement {
+class SVGFEPointLightElement extends SVGElement {
+  SVGFEPointLightElement.internal(): super.internal();
+
 
   /** @domName SVGFEPointLightElement.x */
-  SVGAnimatedNumber get x;
-
-  /** @domName SVGFEPointLightElement.y */
-  SVGAnimatedNumber get y;
-
-  /** @domName SVGFEPointLightElement.z */
-  SVGAnimatedNumber get z;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFEPointLightElementImpl extends _SVGElementImpl implements SVGFEPointLightElement {
-
   SVGAnimatedNumber get x native "SVGFEPointLightElement_x_Getter";
 
+
+  /** @domName SVGFEPointLightElement.y */
   SVGAnimatedNumber get y native "SVGFEPointLightElement_y_Getter";
 
+
+  /** @domName SVGFEPointLightElement.z */
   SVGAnimatedNumber get z native "SVGFEPointLightElement_z_Getter";
 
 }
@@ -29571,50 +23021,55 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFESpecularLightingElement
-abstract class SVGFESpecularLightingElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFESpecularLightingElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFESpecularLightingElement.internal(): super.internal();
+
 
   /** @domName SVGFESpecularLightingElement.in1 */
-  SVGAnimatedString get in1;
-
-  /** @domName SVGFESpecularLightingElement.specularConstant */
-  SVGAnimatedNumber get specularConstant;
-
-  /** @domName SVGFESpecularLightingElement.specularExponent */
-  SVGAnimatedNumber get specularExponent;
-
-  /** @domName SVGFESpecularLightingElement.surfaceScale */
-  SVGAnimatedNumber get surfaceScale;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFESpecularLightingElementImpl extends _SVGElementImpl implements SVGFESpecularLightingElement {
-
   SVGAnimatedString get in1 native "SVGFESpecularLightingElement_in1_Getter";
 
+
+  /** @domName SVGFESpecularLightingElement.specularConstant */
   SVGAnimatedNumber get specularConstant native "SVGFESpecularLightingElement_specularConstant_Getter";
 
+
+  /** @domName SVGFESpecularLightingElement.specularExponent */
   SVGAnimatedNumber get specularExponent native "SVGFESpecularLightingElement_specularExponent_Getter";
 
+
+  /** @domName SVGFESpecularLightingElement.surfaceScale */
   SVGAnimatedNumber get surfaceScale native "SVGFESpecularLightingElement_surfaceScale_Getter";
 
+
+  /** @domName SVGFESpecularLightingElement.height */
   SVGAnimatedLength get height native "SVGFESpecularLightingElement_height_Getter";
 
+
+  /** @domName SVGFESpecularLightingElement.result */
   SVGAnimatedString get result native "SVGFESpecularLightingElement_result_Getter";
 
+
+  /** @domName SVGFESpecularLightingElement.width */
   SVGAnimatedLength get width native "SVGFESpecularLightingElement_width_Getter";
 
+
+  /** @domName SVGFESpecularLightingElement.x */
   SVGAnimatedLength get x native "SVGFESpecularLightingElement_x_Getter";
 
+
+  /** @domName SVGFESpecularLightingElement.y */
   SVGAnimatedLength get y native "SVGFESpecularLightingElement_y_Getter";
 
+
+  /** @domName SVGFESpecularLightingElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFESpecularLightingElement_className_Getter";
 
+
+  /** @domName SVGFESpecularLightingElement.style */
   CSSStyleDeclaration get style native "SVGFESpecularLightingElement_style_Getter";
 
+
+  /** @domName SVGFESpecularLightingElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFESpecularLightingElement_getPresentationAttribute_Callback";
 
 }
@@ -29625,54 +23080,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFESpotLightElement
-abstract class SVGFESpotLightElement implements SVGElement {
+class SVGFESpotLightElement extends SVGElement {
+  SVGFESpotLightElement.internal(): super.internal();
+
 
   /** @domName SVGFESpotLightElement.limitingConeAngle */
-  SVGAnimatedNumber get limitingConeAngle;
-
-  /** @domName SVGFESpotLightElement.pointsAtX */
-  SVGAnimatedNumber get pointsAtX;
-
-  /** @domName SVGFESpotLightElement.pointsAtY */
-  SVGAnimatedNumber get pointsAtY;
-
-  /** @domName SVGFESpotLightElement.pointsAtZ */
-  SVGAnimatedNumber get pointsAtZ;
-
-  /** @domName SVGFESpotLightElement.specularExponent */
-  SVGAnimatedNumber get specularExponent;
-
-  /** @domName SVGFESpotLightElement.x */
-  SVGAnimatedNumber get x;
-
-  /** @domName SVGFESpotLightElement.y */
-  SVGAnimatedNumber get y;
-
-  /** @domName SVGFESpotLightElement.z */
-  SVGAnimatedNumber get z;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFESpotLightElementImpl extends _SVGElementImpl implements SVGFESpotLightElement {
-
   SVGAnimatedNumber get limitingConeAngle native "SVGFESpotLightElement_limitingConeAngle_Getter";
 
+
+  /** @domName SVGFESpotLightElement.pointsAtX */
   SVGAnimatedNumber get pointsAtX native "SVGFESpotLightElement_pointsAtX_Getter";
 
+
+  /** @domName SVGFESpotLightElement.pointsAtY */
   SVGAnimatedNumber get pointsAtY native "SVGFESpotLightElement_pointsAtY_Getter";
 
+
+  /** @domName SVGFESpotLightElement.pointsAtZ */
   SVGAnimatedNumber get pointsAtZ native "SVGFESpotLightElement_pointsAtZ_Getter";
 
+
+  /** @domName SVGFESpotLightElement.specularExponent */
   SVGAnimatedNumber get specularExponent native "SVGFESpotLightElement_specularExponent_Getter";
 
+
+  /** @domName SVGFESpotLightElement.x */
   SVGAnimatedNumber get x native "SVGFESpotLightElement_x_Getter";
 
+
+  /** @domName SVGFESpotLightElement.y */
   SVGAnimatedNumber get y native "SVGFESpotLightElement_y_Getter";
 
+
+  /** @domName SVGFESpotLightElement.z */
   SVGAnimatedNumber get z native "SVGFESpotLightElement_z_Getter";
 
 }
@@ -29683,35 +23123,43 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFETileElement
-abstract class SVGFETileElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFETileElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFETileElement.internal(): super.internal();
+
 
   /** @domName SVGFETileElement.in1 */
-  SVGAnimatedString get in1;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFETileElementImpl extends _SVGElementImpl implements SVGFETileElement {
-
   SVGAnimatedString get in1 native "SVGFETileElement_in1_Getter";
 
+
+  /** @domName SVGFETileElement.height */
   SVGAnimatedLength get height native "SVGFETileElement_height_Getter";
 
+
+  /** @domName SVGFETileElement.result */
   SVGAnimatedString get result native "SVGFETileElement_result_Getter";
 
+
+  /** @domName SVGFETileElement.width */
   SVGAnimatedLength get width native "SVGFETileElement_width_Getter";
 
+
+  /** @domName SVGFETileElement.x */
   SVGAnimatedLength get x native "SVGFETileElement_x_Getter";
 
+
+  /** @domName SVGFETileElement.y */
   SVGAnimatedLength get y native "SVGFETileElement_y_Getter";
 
+
+  /** @domName SVGFETileElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFETileElement_className_Getter";
 
+
+  /** @domName SVGFETileElement.style */
   CSSStyleDeclaration get style native "SVGFETileElement_style_Getter";
 
+
+  /** @domName SVGFETileElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFETileElement_getPresentationAttribute_Callback";
 
 }
@@ -29722,7 +23170,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFETurbulenceElement
-abstract class SVGFETurbulenceElement implements SVGElement, SVGFilterPrimitiveStandardAttributes {
+class SVGFETurbulenceElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
+  SVGFETurbulenceElement.internal(): super.internal();
 
   static const int SVG_STITCHTYPE_NOSTITCH = 2;
 
@@ -29736,58 +23185,60 @@
 
   static const int SVG_TURBULENCE_TYPE_UNKNOWN = 0;
 
+
   /** @domName SVGFETurbulenceElement.baseFrequencyX */
-  SVGAnimatedNumber get baseFrequencyX;
-
-  /** @domName SVGFETurbulenceElement.baseFrequencyY */
-  SVGAnimatedNumber get baseFrequencyY;
-
-  /** @domName SVGFETurbulenceElement.numOctaves */
-  SVGAnimatedInteger get numOctaves;
-
-  /** @domName SVGFETurbulenceElement.seed */
-  SVGAnimatedNumber get seed;
-
-  /** @domName SVGFETurbulenceElement.stitchTiles */
-  SVGAnimatedEnumeration get stitchTiles;
-
-  /** @domName SVGFETurbulenceElement.type */
-  SVGAnimatedEnumeration get type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFETurbulenceElementImpl extends _SVGElementImpl implements SVGFETurbulenceElement {
-
   SVGAnimatedNumber get baseFrequencyX native "SVGFETurbulenceElement_baseFrequencyX_Getter";
 
+
+  /** @domName SVGFETurbulenceElement.baseFrequencyY */
   SVGAnimatedNumber get baseFrequencyY native "SVGFETurbulenceElement_baseFrequencyY_Getter";
 
+
+  /** @domName SVGFETurbulenceElement.numOctaves */
   SVGAnimatedInteger get numOctaves native "SVGFETurbulenceElement_numOctaves_Getter";
 
+
+  /** @domName SVGFETurbulenceElement.seed */
   SVGAnimatedNumber get seed native "SVGFETurbulenceElement_seed_Getter";
 
+
+  /** @domName SVGFETurbulenceElement.stitchTiles */
   SVGAnimatedEnumeration get stitchTiles native "SVGFETurbulenceElement_stitchTiles_Getter";
 
+
+  /** @domName SVGFETurbulenceElement.type */
   SVGAnimatedEnumeration get type native "SVGFETurbulenceElement_type_Getter";
 
+
+  /** @domName SVGFETurbulenceElement.height */
   SVGAnimatedLength get height native "SVGFETurbulenceElement_height_Getter";
 
+
+  /** @domName SVGFETurbulenceElement.result */
   SVGAnimatedString get result native "SVGFETurbulenceElement_result_Getter";
 
+
+  /** @domName SVGFETurbulenceElement.width */
   SVGAnimatedLength get width native "SVGFETurbulenceElement_width_Getter";
 
+
+  /** @domName SVGFETurbulenceElement.x */
   SVGAnimatedLength get x native "SVGFETurbulenceElement_x_Getter";
 
+
+  /** @domName SVGFETurbulenceElement.y */
   SVGAnimatedLength get y native "SVGFETurbulenceElement_y_Getter";
 
+
+  /** @domName SVGFETurbulenceElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFETurbulenceElement_className_Getter";
 
+
+  /** @domName SVGFETurbulenceElement.style */
   CSSStyleDeclaration get style native "SVGFETurbulenceElement_style_Getter";
 
+
+  /** @domName SVGFETurbulenceElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFETurbulenceElement_getPresentationAttribute_Callback";
 
 }
@@ -29798,77 +23249,79 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFilterElement
-abstract class SVGFilterElement implements SVGElement, SVGURIReference, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable {
+class SVGFilterElement extends SVGElement implements SVGURIReference, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable {
+  SVGFilterElement.internal(): super.internal();
+
 
   /** @domName SVGFilterElement.filterResX */
-  SVGAnimatedInteger get filterResX;
-
-  /** @domName SVGFilterElement.filterResY */
-  SVGAnimatedInteger get filterResY;
-
-  /** @domName SVGFilterElement.filterUnits */
-  SVGAnimatedEnumeration get filterUnits;
-
-  /** @domName SVGFilterElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGFilterElement.primitiveUnits */
-  SVGAnimatedEnumeration get primitiveUnits;
-
-  /** @domName SVGFilterElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGFilterElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGFilterElement.y */
-  SVGAnimatedLength get y;
-
-  /** @domName SVGFilterElement.setFilterRes */
-  void setFilterRes(int filterResX, int filterResY);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFilterElementImpl extends _SVGElementImpl implements SVGFilterElement {
-
   SVGAnimatedInteger get filterResX native "SVGFilterElement_filterResX_Getter";
 
+
+  /** @domName SVGFilterElement.filterResY */
   SVGAnimatedInteger get filterResY native "SVGFilterElement_filterResY_Getter";
 
+
+  /** @domName SVGFilterElement.filterUnits */
   SVGAnimatedEnumeration get filterUnits native "SVGFilterElement_filterUnits_Getter";
 
+
+  /** @domName SVGFilterElement.height */
   SVGAnimatedLength get height native "SVGFilterElement_height_Getter";
 
+
+  /** @domName SVGFilterElement.primitiveUnits */
   SVGAnimatedEnumeration get primitiveUnits native "SVGFilterElement_primitiveUnits_Getter";
 
+
+  /** @domName SVGFilterElement.width */
   SVGAnimatedLength get width native "SVGFilterElement_width_Getter";
 
+
+  /** @domName SVGFilterElement.x */
   SVGAnimatedLength get x native "SVGFilterElement_x_Getter";
 
+
+  /** @domName SVGFilterElement.y */
   SVGAnimatedLength get y native "SVGFilterElement_y_Getter";
 
+
+  /** @domName SVGFilterElement.setFilterRes */
   void setFilterRes(int filterResX, int filterResY) native "SVGFilterElement_setFilterRes_Callback";
 
+
+  /** @domName SVGFilterElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGFilterElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGFilterElement.xmllang */
   String get xmllang native "SVGFilterElement_xmllang_Getter";
 
+
+  /** @domName SVGFilterElement.xmllang */
   void set xmllang(String value) native "SVGFilterElement_xmllang_Setter";
 
+
+  /** @domName SVGFilterElement.xmlspace */
   String get xmlspace native "SVGFilterElement_xmlspace_Getter";
 
+
+  /** @domName SVGFilterElement.xmlspace */
   void set xmlspace(String value) native "SVGFilterElement_xmlspace_Setter";
 
+
+  /** @domName SVGFilterElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGFilterElement_className_Getter";
 
+
+  /** @domName SVGFilterElement.style */
   CSSStyleDeclaration get style native "SVGFilterElement_style_Getter";
 
+
+  /** @domName SVGFilterElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGFilterElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGFilterElement.href */
   SVGAnimatedString get href native "SVGFilterElement_href_Getter";
 
 }
@@ -29879,22 +23332,41 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFilterPrimitiveStandardAttributes
-abstract class SVGFilterPrimitiveStandardAttributes implements SVGStylable {
+class SVGFilterPrimitiveStandardAttributes extends NativeFieldWrapperClass1 implements SVGStylable {
+  SVGFilterPrimitiveStandardAttributes.internal();
+
 
   /** @domName SVGFilterPrimitiveStandardAttributes.height */
-  SVGAnimatedLength get height;
+  SVGAnimatedLength get height native "SVGFilterPrimitiveStandardAttributes_height_Getter";
+
 
   /** @domName SVGFilterPrimitiveStandardAttributes.result */
-  SVGAnimatedString get result;
+  SVGAnimatedString get result native "SVGFilterPrimitiveStandardAttributes_result_Getter";
+
 
   /** @domName SVGFilterPrimitiveStandardAttributes.width */
-  SVGAnimatedLength get width;
+  SVGAnimatedLength get width native "SVGFilterPrimitiveStandardAttributes_width_Getter";
+
 
   /** @domName SVGFilterPrimitiveStandardAttributes.x */
-  SVGAnimatedLength get x;
+  SVGAnimatedLength get x native "SVGFilterPrimitiveStandardAttributes_x_Getter";
+
 
   /** @domName SVGFilterPrimitiveStandardAttributes.y */
-  SVGAnimatedLength get y;
+  SVGAnimatedLength get y native "SVGFilterPrimitiveStandardAttributes_y_Getter";
+
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.className */
+  SVGAnimatedString get $dom_svgClassName native "SVGFilterPrimitiveStandardAttributes_className_Getter";
+
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.style */
+  CSSStyleDeclaration get style native "SVGFilterPrimitiveStandardAttributes_style_Getter";
+
+
+  /** @domName SVGFilterPrimitiveStandardAttributes.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native "SVGFilterPrimitiveStandardAttributes_getPresentationAttribute_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -29903,13 +23375,17 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFitToViewBox
-abstract class SVGFitToViewBox {
+class SVGFitToViewBox extends NativeFieldWrapperClass1 {
+  SVGFitToViewBox.internal();
+
 
   /** @domName SVGFitToViewBox.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio;
+  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGFitToViewBox_preserveAspectRatio_Getter";
+
 
   /** @domName SVGFitToViewBox.viewBox */
-  SVGAnimatedRect get viewBox;
+  SVGAnimatedRect get viewBox native "SVGFitToViewBox_viewBox_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -29918,15 +23394,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFontElement
-abstract class SVGFontElement implements SVGElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFontElementImpl extends _SVGElementImpl implements SVGFontElement {
+class SVGFontElement extends SVGElement {
+  SVGFontElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29936,15 +23405,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFontFaceElement
-abstract class SVGFontFaceElement implements SVGElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFontFaceElementImpl extends _SVGElementImpl implements SVGFontFaceElement {
+class SVGFontFaceElement extends SVGElement {
+  SVGFontFaceElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29954,15 +23416,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFontFaceFormatElement
-abstract class SVGFontFaceFormatElement implements SVGElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFontFaceFormatElementImpl extends _SVGElementImpl implements SVGFontFaceFormatElement {
+class SVGFontFaceFormatElement extends SVGElement {
+  SVGFontFaceFormatElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29972,15 +23427,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFontFaceNameElement
-abstract class SVGFontFaceNameElement implements SVGElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFontFaceNameElementImpl extends _SVGElementImpl implements SVGFontFaceNameElement {
+class SVGFontFaceNameElement extends SVGElement {
+  SVGFontFaceNameElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29990,15 +23438,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFontFaceSrcElement
-abstract class SVGFontFaceSrcElement implements SVGElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFontFaceSrcElementImpl extends _SVGElementImpl implements SVGFontFaceSrcElement {
+class SVGFontFaceSrcElement extends SVGElement {
+  SVGFontFaceSrcElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30008,15 +23449,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGFontFaceUriElement
-abstract class SVGFontFaceUriElement implements SVGElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGFontFaceUriElementImpl extends _SVGElementImpl implements SVGFontFaceUriElement {
+class SVGFontFaceUriElement extends SVGElement {
+  SVGFontFaceUriElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30026,72 +23460,99 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGForeignObjectElement
-abstract class SVGForeignObjectElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+class SVGForeignObjectElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
+  SVGForeignObjectElement.internal(): super.internal();
+
 
   /** @domName SVGForeignObjectElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGForeignObjectElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGForeignObjectElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGForeignObjectElement.y */
-  SVGAnimatedLength get y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGForeignObjectElementImpl extends _SVGElementImpl implements SVGForeignObjectElement {
-
   SVGAnimatedLength get height native "SVGForeignObjectElement_height_Getter";
 
+
+  /** @domName SVGForeignObjectElement.width */
   SVGAnimatedLength get width native "SVGForeignObjectElement_width_Getter";
 
+
+  /** @domName SVGForeignObjectElement.x */
   SVGAnimatedLength get x native "SVGForeignObjectElement_x_Getter";
 
+
+  /** @domName SVGForeignObjectElement.y */
   SVGAnimatedLength get y native "SVGForeignObjectElement_y_Getter";
 
+
+  /** @domName SVGForeignObjectElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGForeignObjectElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGForeignObjectElement.xmllang */
   String get xmllang native "SVGForeignObjectElement_xmllang_Getter";
 
+
+  /** @domName SVGForeignObjectElement.xmllang */
   void set xmllang(String value) native "SVGForeignObjectElement_xmllang_Setter";
 
+
+  /** @domName SVGForeignObjectElement.xmlspace */
   String get xmlspace native "SVGForeignObjectElement_xmlspace_Getter";
 
+
+  /** @domName SVGForeignObjectElement.xmlspace */
   void set xmlspace(String value) native "SVGForeignObjectElement_xmlspace_Setter";
 
+
+  /** @domName SVGForeignObjectElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGForeignObjectElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGForeignObjectElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGForeignObjectElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGForeignObjectElement.getBBox */
   SVGRect getBBox() native "SVGForeignObjectElement_getBBox_Callback";
 
+
+  /** @domName SVGForeignObjectElement.getCTM */
   SVGMatrix getCTM() native "SVGForeignObjectElement_getCTM_Callback";
 
+
+  /** @domName SVGForeignObjectElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGForeignObjectElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGForeignObjectElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGForeignObjectElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGForeignObjectElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGForeignObjectElement_className_Getter";
 
+
+  /** @domName SVGForeignObjectElement.style */
   CSSStyleDeclaration get style native "SVGForeignObjectElement_style_Getter";
 
+
+  /** @domName SVGForeignObjectElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGForeignObjectElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGForeignObjectElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGForeignObjectElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGForeignObjectElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGForeignObjectElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGForeignObjectElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGForeignObjectElement_systemLanguage_Getter";
 
+
+  /** @domName SVGForeignObjectElement.hasExtension */
   bool hasExtension(String extension) native "SVGForeignObjectElement_hasExtension_Callback";
 
+
+  /** @domName SVGForeignObjectElement.transform */
   SVGAnimatedTransformList get transform native "SVGForeignObjectElement_transform_Getter";
 
 }
@@ -30102,52 +23563,83 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGGElement
-abstract class SVGGElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+class SVGGElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
+  SVGGElement.internal(): super.internal();
 
-// WARNING: Do not edit - generated code.
 
-class _SVGGElementImpl extends _SVGElementImpl implements SVGGElement {
-
+  /** @domName SVGGElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGGElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGGElement.xmllang */
   String get xmllang native "SVGGElement_xmllang_Getter";
 
+
+  /** @domName SVGGElement.xmllang */
   void set xmllang(String value) native "SVGGElement_xmllang_Setter";
 
+
+  /** @domName SVGGElement.xmlspace */
   String get xmlspace native "SVGGElement_xmlspace_Getter";
 
+
+  /** @domName SVGGElement.xmlspace */
   void set xmlspace(String value) native "SVGGElement_xmlspace_Setter";
 
+
+  /** @domName SVGGElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGGElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGGElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGGElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGGElement.getBBox */
   SVGRect getBBox() native "SVGGElement_getBBox_Callback";
 
+
+  /** @domName SVGGElement.getCTM */
   SVGMatrix getCTM() native "SVGGElement_getCTM_Callback";
 
+
+  /** @domName SVGGElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGGElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGGElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGGElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGGElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGGElement_className_Getter";
 
+
+  /** @domName SVGGElement.style */
   CSSStyleDeclaration get style native "SVGGElement_style_Getter";
 
+
+  /** @domName SVGGElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGGElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGGElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGGElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGGElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGGElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGGElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGGElement_systemLanguage_Getter";
 
+
+  /** @domName SVGGElement.hasExtension */
   bool hasExtension(String extension) native "SVGGElement_hasExtension_Callback";
 
+
+  /** @domName SVGGElement.transform */
   SVGAnimatedTransformList get transform native "SVGGElement_transform_Getter";
 
 }
@@ -30158,15 +23650,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGGlyphElement
-abstract class SVGGlyphElement implements SVGElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGGlyphElementImpl extends _SVGElementImpl implements SVGGlyphElement {
+class SVGGlyphElement extends SVGElement {
+  SVGGlyphElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30176,64 +23661,71 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGGlyphRefElement
-abstract class SVGGlyphRefElement implements SVGElement, SVGURIReference, SVGStylable {
+class SVGGlyphRefElement extends SVGElement implements SVGURIReference, SVGStylable {
+  SVGGlyphRefElement.internal(): super.internal();
+
 
   /** @domName SVGGlyphRefElement.dx */
-  num dx;
-
-  /** @domName SVGGlyphRefElement.dy */
-  num dy;
-
-  /** @domName SVGGlyphRefElement.format */
-  String format;
-
-  /** @domName SVGGlyphRefElement.glyphRef */
-  String glyphRef;
-
-  /** @domName SVGGlyphRefElement.x */
-  num x;
-
-  /** @domName SVGGlyphRefElement.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGGlyphRefElementImpl extends _SVGElementImpl implements SVGGlyphRefElement {
-
   num get dx native "SVGGlyphRefElement_dx_Getter";
 
+
+  /** @domName SVGGlyphRefElement.dx */
   void set dx(num value) native "SVGGlyphRefElement_dx_Setter";
 
+
+  /** @domName SVGGlyphRefElement.dy */
   num get dy native "SVGGlyphRefElement_dy_Getter";
 
+
+  /** @domName SVGGlyphRefElement.dy */
   void set dy(num value) native "SVGGlyphRefElement_dy_Setter";
 
+
+  /** @domName SVGGlyphRefElement.format */
   String get format native "SVGGlyphRefElement_format_Getter";
 
+
+  /** @domName SVGGlyphRefElement.format */
   void set format(String value) native "SVGGlyphRefElement_format_Setter";
 
+
+  /** @domName SVGGlyphRefElement.glyphRef */
   String get glyphRef native "SVGGlyphRefElement_glyphRef_Getter";
 
+
+  /** @domName SVGGlyphRefElement.glyphRef */
   void set glyphRef(String value) native "SVGGlyphRefElement_glyphRef_Setter";
 
+
+  /** @domName SVGGlyphRefElement.x */
   num get x native "SVGGlyphRefElement_x_Getter";
 
+
+  /** @domName SVGGlyphRefElement.x */
   void set x(num value) native "SVGGlyphRefElement_x_Setter";
 
+
+  /** @domName SVGGlyphRefElement.y */
   num get y native "SVGGlyphRefElement_y_Getter";
 
+
+  /** @domName SVGGlyphRefElement.y */
   void set y(num value) native "SVGGlyphRefElement_y_Setter";
 
+
+  /** @domName SVGGlyphRefElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGGlyphRefElement_className_Getter";
 
+
+  /** @domName SVGGlyphRefElement.style */
   CSSStyleDeclaration get style native "SVGGlyphRefElement_style_Getter";
 
+
+  /** @domName SVGGlyphRefElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGGlyphRefElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGGlyphRefElement.href */
   SVGAnimatedString get href native "SVGGlyphRefElement_href_Getter";
 
 }
@@ -30244,7 +23736,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGGradientElement
-abstract class SVGGradientElement implements SVGElement, SVGURIReference, SVGExternalResourcesRequired, SVGStylable {
+class SVGGradientElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired, SVGStylable {
+  SVGGradientElement.internal(): super.internal();
 
   static const int SVG_SPREADMETHOD_PAD = 1;
 
@@ -30254,37 +23747,36 @@
 
   static const int SVG_SPREADMETHOD_UNKNOWN = 0;
 
+
   /** @domName SVGGradientElement.gradientTransform */
-  SVGAnimatedTransformList get gradientTransform;
-
-  /** @domName SVGGradientElement.gradientUnits */
-  SVGAnimatedEnumeration get gradientUnits;
-
-  /** @domName SVGGradientElement.spreadMethod */
-  SVGAnimatedEnumeration get spreadMethod;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGGradientElementImpl extends _SVGElementImpl implements SVGGradientElement {
-
   SVGAnimatedTransformList get gradientTransform native "SVGGradientElement_gradientTransform_Getter";
 
+
+  /** @domName SVGGradientElement.gradientUnits */
   SVGAnimatedEnumeration get gradientUnits native "SVGGradientElement_gradientUnits_Getter";
 
+
+  /** @domName SVGGradientElement.spreadMethod */
   SVGAnimatedEnumeration get spreadMethod native "SVGGradientElement_spreadMethod_Getter";
 
+
+  /** @domName SVGGradientElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGGradientElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGGradientElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGGradientElement_className_Getter";
 
+
+  /** @domName SVGGradientElement.style */
   CSSStyleDeclaration get style native "SVGGradientElement_style_Getter";
 
+
+  /** @domName SVGGradientElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGGradientElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGGradientElement.href */
   SVGAnimatedString get href native "SVGGradientElement_href_Getter";
 
 }
@@ -30295,15 +23787,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGHKernElement
-abstract class SVGHKernElement implements SVGElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGHKernElementImpl extends _SVGElementImpl implements SVGHKernElement {
+class SVGHKernElement extends SVGElement {
+  SVGHKernElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30313,79 +23798,107 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGImageElement
-abstract class SVGImageElement implements SVGElement, SVGURIReference, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+class SVGImageElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable {
+  SVGImageElement.internal(): super.internal();
+
 
   /** @domName SVGImageElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGImageElement.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio;
-
-  /** @domName SVGImageElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGImageElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGImageElement.y */
-  SVGAnimatedLength get y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGImageElementImpl extends _SVGElementImpl implements SVGImageElement {
-
   SVGAnimatedLength get height native "SVGImageElement_height_Getter";
 
+
+  /** @domName SVGImageElement.preserveAspectRatio */
   SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGImageElement_preserveAspectRatio_Getter";
 
+
+  /** @domName SVGImageElement.width */
   SVGAnimatedLength get width native "SVGImageElement_width_Getter";
 
+
+  /** @domName SVGImageElement.x */
   SVGAnimatedLength get x native "SVGImageElement_x_Getter";
 
+
+  /** @domName SVGImageElement.y */
   SVGAnimatedLength get y native "SVGImageElement_y_Getter";
 
+
+  /** @domName SVGImageElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGImageElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGImageElement.xmllang */
   String get xmllang native "SVGImageElement_xmllang_Getter";
 
+
+  /** @domName SVGImageElement.xmllang */
   void set xmllang(String value) native "SVGImageElement_xmllang_Setter";
 
+
+  /** @domName SVGImageElement.xmlspace */
   String get xmlspace native "SVGImageElement_xmlspace_Getter";
 
+
+  /** @domName SVGImageElement.xmlspace */
   void set xmlspace(String value) native "SVGImageElement_xmlspace_Setter";
 
+
+  /** @domName SVGImageElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGImageElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGImageElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGImageElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGImageElement.getBBox */
   SVGRect getBBox() native "SVGImageElement_getBBox_Callback";
 
+
+  /** @domName SVGImageElement.getCTM */
   SVGMatrix getCTM() native "SVGImageElement_getCTM_Callback";
 
+
+  /** @domName SVGImageElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGImageElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGImageElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGImageElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGImageElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGImageElement_className_Getter";
 
+
+  /** @domName SVGImageElement.style */
   CSSStyleDeclaration get style native "SVGImageElement_style_Getter";
 
+
+  /** @domName SVGImageElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGImageElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGImageElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGImageElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGImageElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGImageElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGImageElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGImageElement_systemLanguage_Getter";
 
+
+  /** @domName SVGImageElement.hasExtension */
   bool hasExtension(String extension) native "SVGImageElement_hasExtension_Callback";
 
+
+  /** @domName SVGImageElement.transform */
   SVGAnimatedTransformList get transform native "SVGImageElement_transform_Getter";
 
+
+  /** @domName SVGImageElement.href */
   SVGAnimatedString get href native "SVGImageElement_href_Getter";
 
 }
@@ -30396,13 +23909,25 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGLangSpace
-abstract class SVGLangSpace {
+class SVGLangSpace extends NativeFieldWrapperClass1 {
+  SVGLangSpace.internal();
+
 
   /** @domName SVGLangSpace.xmllang */
-  String xmllang;
+  String get xmllang native "SVGLangSpace_xmllang_Getter";
+
+
+  /** @domName SVGLangSpace.xmllang */
+  void set xmllang(String value) native "SVGLangSpace_xmllang_Setter";
+
 
   /** @domName SVGLangSpace.xmlspace */
-  String xmlspace;
+  String get xmlspace native "SVGLangSpace_xmlspace_Getter";
+
+
+  /** @domName SVGLangSpace.xmlspace */
+  void set xmlspace(String value) native "SVGLangSpace_xmlspace_Setter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -30411,7 +23936,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGLength
-abstract class SVGLength {
+class SVGLength extends NativeFieldWrapperClass1 {
+  SVGLength.internal();
 
   static const int SVG_LENGTHTYPE_CM = 6;
 
@@ -30435,48 +23961,40 @@
 
   static const int SVG_LENGTHTYPE_UNKNOWN = 0;
 
+
   /** @domName SVGLength.unitType */
-  int get unitType;
-
-  /** @domName SVGLength.value */
-  num value;
-
-  /** @domName SVGLength.valueAsString */
-  String valueAsString;
-
-  /** @domName SVGLength.valueInSpecifiedUnits */
-  num valueInSpecifiedUnits;
-
-  /** @domName SVGLength.convertToSpecifiedUnits */
-  void convertToSpecifiedUnits(int unitType);
-
-  /** @domName SVGLength.newValueSpecifiedUnits */
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGLengthImpl extends NativeFieldWrapperClass1 implements SVGLength {
-
   int get unitType native "SVGLength_unitType_Getter";
 
+
+  /** @domName SVGLength.value */
   num get value native "SVGLength_value_Getter";
 
+
+  /** @domName SVGLength.value */
   void set value(num value) native "SVGLength_value_Setter";
 
+
+  /** @domName SVGLength.valueAsString */
   String get valueAsString native "SVGLength_valueAsString_Getter";
 
+
+  /** @domName SVGLength.valueAsString */
   void set valueAsString(String value) native "SVGLength_valueAsString_Setter";
 
+
+  /** @domName SVGLength.valueInSpecifiedUnits */
   num get valueInSpecifiedUnits native "SVGLength_valueInSpecifiedUnits_Getter";
 
+
+  /** @domName SVGLength.valueInSpecifiedUnits */
   void set valueInSpecifiedUnits(num value) native "SVGLength_valueInSpecifiedUnits_Setter";
 
+
+  /** @domName SVGLength.convertToSpecifiedUnits */
   void convertToSpecifiedUnits(int unitType) native "SVGLength_convertToSpecifiedUnits_Callback";
 
+
+  /** @domName SVGLength.newValueSpecifiedUnits */
   void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native "SVGLength_newValueSpecifiedUnits_Callback";
 
 }
@@ -30487,40 +24005,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGLengthList
-abstract class SVGLengthList implements List<SVGLength> {
+class SVGLengthList extends NativeFieldWrapperClass1 implements List<SVGLength> {
+  SVGLengthList.internal();
+
 
   /** @domName SVGLengthList.numberOfItems */
-  int get numberOfItems;
-
-  /** @domName SVGLengthList.appendItem */
-  SVGLength appendItem(SVGLength item);
-
-  /** @domName SVGLengthList.clear */
-  void clear();
-
-  /** @domName SVGLengthList.getItem */
-  SVGLength getItem(int index);
-
-  /** @domName SVGLengthList.initialize */
-  SVGLength initialize(SVGLength item);
-
-  /** @domName SVGLengthList.insertItemBefore */
-  SVGLength insertItemBefore(SVGLength item, int index);
-
-  /** @domName SVGLengthList.removeItem */
-  SVGLength removeItem(int index);
-
-  /** @domName SVGLengthList.replaceItem */
-  SVGLength replaceItem(SVGLength item, int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGLengthListImpl extends NativeFieldWrapperClass1 implements SVGLengthList {
-
   int get numberOfItems native "SVGLengthList_numberOfItems_Getter";
 
   SVGLength operator[](int index) native "SVGLengthList_item_Callback";
@@ -30606,18 +24095,32 @@
 
   // -- end List<SVGLength> mixins.
 
+
+  /** @domName SVGLengthList.appendItem */
   SVGLength appendItem(SVGLength item) native "SVGLengthList_appendItem_Callback";
 
+
+  /** @domName SVGLengthList.clear */
   void clear() native "SVGLengthList_clear_Callback";
 
+
+  /** @domName SVGLengthList.getItem */
   SVGLength getItem(int index) native "SVGLengthList_getItem_Callback";
 
+
+  /** @domName SVGLengthList.initialize */
   SVGLength initialize(SVGLength item) native "SVGLengthList_initialize_Callback";
 
+
+  /** @domName SVGLengthList.insertItemBefore */
   SVGLength insertItemBefore(SVGLength item, int index) native "SVGLengthList_insertItemBefore_Callback";
 
+
+  /** @domName SVGLengthList.removeItem */
   SVGLength removeItem(int index) native "SVGLengthList_removeItem_Callback";
 
+
+  /** @domName SVGLengthList.replaceItem */
   SVGLength replaceItem(SVGLength item, int index) native "SVGLengthList_replaceItem_Callback";
 
 }
@@ -30628,72 +24131,99 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGLineElement
-abstract class SVGLineElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+class SVGLineElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
+  SVGLineElement.internal(): super.internal();
+
 
   /** @domName SVGLineElement.x1 */
-  SVGAnimatedLength get x1;
-
-  /** @domName SVGLineElement.x2 */
-  SVGAnimatedLength get x2;
-
-  /** @domName SVGLineElement.y1 */
-  SVGAnimatedLength get y1;
-
-  /** @domName SVGLineElement.y2 */
-  SVGAnimatedLength get y2;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGLineElementImpl extends _SVGElementImpl implements SVGLineElement {
-
   SVGAnimatedLength get x1 native "SVGLineElement_x1_Getter";
 
+
+  /** @domName SVGLineElement.x2 */
   SVGAnimatedLength get x2 native "SVGLineElement_x2_Getter";
 
+
+  /** @domName SVGLineElement.y1 */
   SVGAnimatedLength get y1 native "SVGLineElement_y1_Getter";
 
+
+  /** @domName SVGLineElement.y2 */
   SVGAnimatedLength get y2 native "SVGLineElement_y2_Getter";
 
+
+  /** @domName SVGLineElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGLineElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGLineElement.xmllang */
   String get xmllang native "SVGLineElement_xmllang_Getter";
 
+
+  /** @domName SVGLineElement.xmllang */
   void set xmllang(String value) native "SVGLineElement_xmllang_Setter";
 
+
+  /** @domName SVGLineElement.xmlspace */
   String get xmlspace native "SVGLineElement_xmlspace_Getter";
 
+
+  /** @domName SVGLineElement.xmlspace */
   void set xmlspace(String value) native "SVGLineElement_xmlspace_Setter";
 
+
+  /** @domName SVGLineElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGLineElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGLineElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGLineElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGLineElement.getBBox */
   SVGRect getBBox() native "SVGLineElement_getBBox_Callback";
 
+
+  /** @domName SVGLineElement.getCTM */
   SVGMatrix getCTM() native "SVGLineElement_getCTM_Callback";
 
+
+  /** @domName SVGLineElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGLineElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGLineElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGLineElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGLineElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGLineElement_className_Getter";
 
+
+  /** @domName SVGLineElement.style */
   CSSStyleDeclaration get style native "SVGLineElement_style_Getter";
 
+
+  /** @domName SVGLineElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGLineElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGLineElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGLineElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGLineElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGLineElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGLineElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGLineElement_systemLanguage_Getter";
 
+
+  /** @domName SVGLineElement.hasExtension */
   bool hasExtension(String extension) native "SVGLineElement_hasExtension_Callback";
 
+
+  /** @domName SVGLineElement.transform */
   SVGAnimatedTransformList get transform native "SVGLineElement_transform_Getter";
 
 }
@@ -30704,34 +24234,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGLinearGradientElement
-abstract class SVGLinearGradientElement implements SVGGradientElement {
+class SVGLinearGradientElement extends SVGGradientElement {
+  SVGLinearGradientElement.internal(): super.internal();
+
 
   /** @domName SVGLinearGradientElement.x1 */
-  SVGAnimatedLength get x1;
-
-  /** @domName SVGLinearGradientElement.x2 */
-  SVGAnimatedLength get x2;
-
-  /** @domName SVGLinearGradientElement.y1 */
-  SVGAnimatedLength get y1;
-
-  /** @domName SVGLinearGradientElement.y2 */
-  SVGAnimatedLength get y2;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGLinearGradientElementImpl extends _SVGGradientElementImpl implements SVGLinearGradientElement {
-
   SVGAnimatedLength get x1 native "SVGLinearGradientElement_x1_Getter";
 
+
+  /** @domName SVGLinearGradientElement.x2 */
   SVGAnimatedLength get x2 native "SVGLinearGradientElement_x2_Getter";
 
+
+  /** @domName SVGLinearGradientElement.y1 */
   SVGAnimatedLength get y1 native "SVGLinearGradientElement_y1_Getter";
 
+
+  /** @domName SVGLinearGradientElement.y2 */
   SVGAnimatedLength get y2 native "SVGLinearGradientElement_y2_Getter";
 
 }
@@ -30742,25 +24261,33 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGLocatable
-abstract class SVGLocatable {
+class SVGLocatable extends NativeFieldWrapperClass1 {
+  SVGLocatable.internal();
+
 
   /** @domName SVGLocatable.farthestViewportElement */
-  SVGElement get farthestViewportElement;
+  SVGElement get farthestViewportElement native "SVGLocatable_farthestViewportElement_Getter";
+
 
   /** @domName SVGLocatable.nearestViewportElement */
-  SVGElement get nearestViewportElement;
+  SVGElement get nearestViewportElement native "SVGLocatable_nearestViewportElement_Getter";
+
 
   /** @domName SVGLocatable.getBBox */
-  SVGRect getBBox();
+  SVGRect getBBox() native "SVGLocatable_getBBox_Callback";
+
 
   /** @domName SVGLocatable.getCTM */
-  SVGMatrix getCTM();
+  SVGMatrix getCTM() native "SVGLocatable_getCTM_Callback";
+
 
   /** @domName SVGLocatable.getScreenCTM */
-  SVGMatrix getScreenCTM();
+  SVGMatrix getScreenCTM() native "SVGLocatable_getScreenCTM_Callback";
+
 
   /** @domName SVGLocatable.getTransformToElement */
-  SVGMatrix getTransformToElement(SVGElement element);
+  SVGMatrix getTransformToElement(SVGElement element) native "SVGLocatable_getTransformToElement_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -30769,18 +24296,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGMPathElement
-abstract class SVGMPathElement implements SVGElement, SVGURIReference, SVGExternalResourcesRequired {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+class SVGMPathElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired {
+  SVGMPathElement.internal(): super.internal();
 
-// WARNING: Do not edit - generated code.
 
-class _SVGMPathElementImpl extends _SVGElementImpl implements SVGMPathElement {
-
+  /** @domName SVGMPathElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGMPathElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGMPathElement.href */
   SVGAnimatedString get href native "SVGMPathElement_href_Getter";
 
 }
@@ -30791,7 +24315,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGMarkerElement
-abstract class SVGMarkerElement implements SVGElement, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGFitToViewBox {
+class SVGMarkerElement extends SVGElement implements SVGLangSpace, SVGFitToViewBox, SVGExternalResourcesRequired, SVGStylable {
+  SVGMarkerElement.internal(): super.internal();
 
   static const int SVG_MARKERUNITS_STROKEWIDTH = 2;
 
@@ -30805,77 +24330,80 @@
 
   static const int SVG_MARKER_ORIENT_UNKNOWN = 0;
 
+
   /** @domName SVGMarkerElement.markerHeight */
-  SVGAnimatedLength get markerHeight;
-
-  /** @domName SVGMarkerElement.markerUnits */
-  SVGAnimatedEnumeration get markerUnits;
-
-  /** @domName SVGMarkerElement.markerWidth */
-  SVGAnimatedLength get markerWidth;
-
-  /** @domName SVGMarkerElement.orientAngle */
-  SVGAnimatedAngle get orientAngle;
-
-  /** @domName SVGMarkerElement.orientType */
-  SVGAnimatedEnumeration get orientType;
-
-  /** @domName SVGMarkerElement.refX */
-  SVGAnimatedLength get refX;
-
-  /** @domName SVGMarkerElement.refY */
-  SVGAnimatedLength get refY;
-
-  /** @domName SVGMarkerElement.setOrientToAngle */
-  void setOrientToAngle(SVGAngle angle);
-
-  /** @domName SVGMarkerElement.setOrientToAuto */
-  void setOrientToAuto();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGMarkerElementImpl extends _SVGElementImpl implements SVGMarkerElement {
-
   SVGAnimatedLength get markerHeight native "SVGMarkerElement_markerHeight_Getter";
 
+
+  /** @domName SVGMarkerElement.markerUnits */
   SVGAnimatedEnumeration get markerUnits native "SVGMarkerElement_markerUnits_Getter";
 
+
+  /** @domName SVGMarkerElement.markerWidth */
   SVGAnimatedLength get markerWidth native "SVGMarkerElement_markerWidth_Getter";
 
+
+  /** @domName SVGMarkerElement.orientAngle */
   SVGAnimatedAngle get orientAngle native "SVGMarkerElement_orientAngle_Getter";
 
+
+  /** @domName SVGMarkerElement.orientType */
   SVGAnimatedEnumeration get orientType native "SVGMarkerElement_orientType_Getter";
 
+
+  /** @domName SVGMarkerElement.refX */
   SVGAnimatedLength get refX native "SVGMarkerElement_refX_Getter";
 
+
+  /** @domName SVGMarkerElement.refY */
   SVGAnimatedLength get refY native "SVGMarkerElement_refY_Getter";
 
+
+  /** @domName SVGMarkerElement.setOrientToAngle */
   void setOrientToAngle(SVGAngle angle) native "SVGMarkerElement_setOrientToAngle_Callback";
 
+
+  /** @domName SVGMarkerElement.setOrientToAuto */
   void setOrientToAuto() native "SVGMarkerElement_setOrientToAuto_Callback";
 
+
+  /** @domName SVGMarkerElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGMarkerElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGMarkerElement.preserveAspectRatio */
   SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGMarkerElement_preserveAspectRatio_Getter";
 
+
+  /** @domName SVGMarkerElement.viewBox */
   SVGAnimatedRect get viewBox native "SVGMarkerElement_viewBox_Getter";
 
+
+  /** @domName SVGMarkerElement.xmllang */
   String get xmllang native "SVGMarkerElement_xmllang_Getter";
 
+
+  /** @domName SVGMarkerElement.xmllang */
   void set xmllang(String value) native "SVGMarkerElement_xmllang_Setter";
 
+
+  /** @domName SVGMarkerElement.xmlspace */
   String get xmlspace native "SVGMarkerElement_xmlspace_Getter";
 
+
+  /** @domName SVGMarkerElement.xmlspace */
   void set xmlspace(String value) native "SVGMarkerElement_xmlspace_Setter";
 
+
+  /** @domName SVGMarkerElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGMarkerElement_className_Getter";
 
+
+  /** @domName SVGMarkerElement.style */
   CSSStyleDeclaration get style native "SVGMarkerElement_style_Getter";
 
+
+  /** @domName SVGMarkerElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGMarkerElement_getPresentationAttribute_Callback";
 
 }
@@ -30886,68 +24414,79 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGMaskElement
-abstract class SVGMaskElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable {
+class SVGMaskElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGExternalResourcesRequired {
+  SVGMaskElement.internal(): super.internal();
+
 
   /** @domName SVGMaskElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGMaskElement.maskContentUnits */
-  SVGAnimatedEnumeration get maskContentUnits;
-
-  /** @domName SVGMaskElement.maskUnits */
-  SVGAnimatedEnumeration get maskUnits;
-
-  /** @domName SVGMaskElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGMaskElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGMaskElement.y */
-  SVGAnimatedLength get y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGMaskElementImpl extends _SVGElementImpl implements SVGMaskElement {
-
   SVGAnimatedLength get height native "SVGMaskElement_height_Getter";
 
+
+  /** @domName SVGMaskElement.maskContentUnits */
   SVGAnimatedEnumeration get maskContentUnits native "SVGMaskElement_maskContentUnits_Getter";
 
+
+  /** @domName SVGMaskElement.maskUnits */
   SVGAnimatedEnumeration get maskUnits native "SVGMaskElement_maskUnits_Getter";
 
+
+  /** @domName SVGMaskElement.width */
   SVGAnimatedLength get width native "SVGMaskElement_width_Getter";
 
+
+  /** @domName SVGMaskElement.x */
   SVGAnimatedLength get x native "SVGMaskElement_x_Getter";
 
+
+  /** @domName SVGMaskElement.y */
   SVGAnimatedLength get y native "SVGMaskElement_y_Getter";
 
+
+  /** @domName SVGMaskElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGMaskElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGMaskElement.xmllang */
   String get xmllang native "SVGMaskElement_xmllang_Getter";
 
+
+  /** @domName SVGMaskElement.xmllang */
   void set xmllang(String value) native "SVGMaskElement_xmllang_Setter";
 
+
+  /** @domName SVGMaskElement.xmlspace */
   String get xmlspace native "SVGMaskElement_xmlspace_Getter";
 
+
+  /** @domName SVGMaskElement.xmlspace */
   void set xmlspace(String value) native "SVGMaskElement_xmlspace_Setter";
 
+
+  /** @domName SVGMaskElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGMaskElement_className_Getter";
 
+
+  /** @domName SVGMaskElement.style */
   CSSStyleDeclaration get style native "SVGMaskElement_style_Getter";
 
+
+  /** @domName SVGMaskElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGMaskElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGMaskElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGMaskElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGMaskElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGMaskElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGMaskElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGMaskElement_systemLanguage_Getter";
 
+
+  /** @domName SVGMaskElement.hasExtension */
   bool hasExtension(String extension) native "SVGMaskElement_hasExtension_Callback";
 
 }
@@ -30958,111 +24497,99 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGMatrix
-abstract class SVGMatrix {
+class SVGMatrix extends NativeFieldWrapperClass1 {
+  SVGMatrix.internal();
+
 
   /** @domName SVGMatrix.a */
-  num a;
-
-  /** @domName SVGMatrix.b */
-  num b;
-
-  /** @domName SVGMatrix.c */
-  num c;
-
-  /** @domName SVGMatrix.d */
-  num d;
-
-  /** @domName SVGMatrix.e */
-  num e;
-
-  /** @domName SVGMatrix.f */
-  num f;
-
-  /** @domName SVGMatrix.flipX */
-  SVGMatrix flipX();
-
-  /** @domName SVGMatrix.flipY */
-  SVGMatrix flipY();
-
-  /** @domName SVGMatrix.inverse */
-  SVGMatrix inverse();
-
-  /** @domName SVGMatrix.multiply */
-  SVGMatrix multiply(SVGMatrix secondMatrix);
-
-  /** @domName SVGMatrix.rotate */
-  SVGMatrix rotate(num angle);
-
-  /** @domName SVGMatrix.rotateFromVector */
-  SVGMatrix rotateFromVector(num x, num y);
-
-  /** @domName SVGMatrix.scale */
-  SVGMatrix scale(num scaleFactor);
-
-  /** @domName SVGMatrix.scaleNonUniform */
-  SVGMatrix scaleNonUniform(num scaleFactorX, num scaleFactorY);
-
-  /** @domName SVGMatrix.skewX */
-  SVGMatrix skewX(num angle);
-
-  /** @domName SVGMatrix.skewY */
-  SVGMatrix skewY(num angle);
-
-  /** @domName SVGMatrix.translate */
-  SVGMatrix translate(num x, num y);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGMatrixImpl extends NativeFieldWrapperClass1 implements SVGMatrix {
-
   num get a native "SVGMatrix_a_Getter";
 
+
+  /** @domName SVGMatrix.a */
   void set a(num value) native "SVGMatrix_a_Setter";
 
+
+  /** @domName SVGMatrix.b */
   num get b native "SVGMatrix_b_Getter";
 
+
+  /** @domName SVGMatrix.b */
   void set b(num value) native "SVGMatrix_b_Setter";
 
+
+  /** @domName SVGMatrix.c */
   num get c native "SVGMatrix_c_Getter";
 
+
+  /** @domName SVGMatrix.c */
   void set c(num value) native "SVGMatrix_c_Setter";
 
+
+  /** @domName SVGMatrix.d */
   num get d native "SVGMatrix_d_Getter";
 
+
+  /** @domName SVGMatrix.d */
   void set d(num value) native "SVGMatrix_d_Setter";
 
+
+  /** @domName SVGMatrix.e */
   num get e native "SVGMatrix_e_Getter";
 
+
+  /** @domName SVGMatrix.e */
   void set e(num value) native "SVGMatrix_e_Setter";
 
+
+  /** @domName SVGMatrix.f */
   num get f native "SVGMatrix_f_Getter";
 
+
+  /** @domName SVGMatrix.f */
   void set f(num value) native "SVGMatrix_f_Setter";
 
+
+  /** @domName SVGMatrix.flipX */
   SVGMatrix flipX() native "SVGMatrix_flipX_Callback";
 
+
+  /** @domName SVGMatrix.flipY */
   SVGMatrix flipY() native "SVGMatrix_flipY_Callback";
 
+
+  /** @domName SVGMatrix.inverse */
   SVGMatrix inverse() native "SVGMatrix_inverse_Callback";
 
+
+  /** @domName SVGMatrix.multiply */
   SVGMatrix multiply(SVGMatrix secondMatrix) native "SVGMatrix_multiply_Callback";
 
+
+  /** @domName SVGMatrix.rotate */
   SVGMatrix rotate(num angle) native "SVGMatrix_rotate_Callback";
 
+
+  /** @domName SVGMatrix.rotateFromVector */
   SVGMatrix rotateFromVector(num x, num y) native "SVGMatrix_rotateFromVector_Callback";
 
+
+  /** @domName SVGMatrix.scale */
   SVGMatrix scale(num scaleFactor) native "SVGMatrix_scale_Callback";
 
+
+  /** @domName SVGMatrix.scaleNonUniform */
   SVGMatrix scaleNonUniform(num scaleFactorX, num scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback";
 
+
+  /** @domName SVGMatrix.skewX */
   SVGMatrix skewX(num angle) native "SVGMatrix_skewX_Callback";
 
+
+  /** @domName SVGMatrix.skewY */
   SVGMatrix skewY(num angle) native "SVGMatrix_skewY_Callback";
 
+
+  /** @domName SVGMatrix.translate */
   SVGMatrix translate(num x, num y) native "SVGMatrix_translate_Callback";
 
 }
@@ -31073,15 +24600,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGMetadataElement
-abstract class SVGMetadataElement implements SVGElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGMetadataElementImpl extends _SVGElementImpl implements SVGMetadataElement {
+class SVGMetadataElement extends SVGElement {
+  SVGMetadataElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31091,15 +24611,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGMissingGlyphElement
-abstract class SVGMissingGlyphElement implements SVGElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGMissingGlyphElementImpl extends _SVGElementImpl implements SVGMissingGlyphElement {
+class SVGMissingGlyphElement extends SVGElement {
+  SVGMissingGlyphElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31109,21 +24622,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGNumber
-abstract class SVGNumber {
+class SVGNumber extends NativeFieldWrapperClass1 {
+  SVGNumber.internal();
+
 
   /** @domName SVGNumber.value */
-  num value;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGNumberImpl extends NativeFieldWrapperClass1 implements SVGNumber {
-
   num get value native "SVGNumber_value_Getter";
 
+
+  /** @domName SVGNumber.value */
   void set value(num value) native "SVGNumber_value_Setter";
 
 }
@@ -31134,40 +24641,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGNumberList
-abstract class SVGNumberList implements List<SVGNumber> {
+class SVGNumberList extends NativeFieldWrapperClass1 implements List<SVGNumber> {
+  SVGNumberList.internal();
+
 
   /** @domName SVGNumberList.numberOfItems */
-  int get numberOfItems;
-
-  /** @domName SVGNumberList.appendItem */
-  SVGNumber appendItem(SVGNumber item);
-
-  /** @domName SVGNumberList.clear */
-  void clear();
-
-  /** @domName SVGNumberList.getItem */
-  SVGNumber getItem(int index);
-
-  /** @domName SVGNumberList.initialize */
-  SVGNumber initialize(SVGNumber item);
-
-  /** @domName SVGNumberList.insertItemBefore */
-  SVGNumber insertItemBefore(SVGNumber item, int index);
-
-  /** @domName SVGNumberList.removeItem */
-  SVGNumber removeItem(int index);
-
-  /** @domName SVGNumberList.replaceItem */
-  SVGNumber replaceItem(SVGNumber item, int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGNumberListImpl extends NativeFieldWrapperClass1 implements SVGNumberList {
-
   int get numberOfItems native "SVGNumberList_numberOfItems_Getter";
 
   SVGNumber operator[](int index) native "SVGNumberList_item_Callback";
@@ -31253,18 +24731,32 @@
 
   // -- end List<SVGNumber> mixins.
 
+
+  /** @domName SVGNumberList.appendItem */
   SVGNumber appendItem(SVGNumber item) native "SVGNumberList_appendItem_Callback";
 
+
+  /** @domName SVGNumberList.clear */
   void clear() native "SVGNumberList_clear_Callback";
 
+
+  /** @domName SVGNumberList.getItem */
   SVGNumber getItem(int index) native "SVGNumberList_getItem_Callback";
 
+
+  /** @domName SVGNumberList.initialize */
   SVGNumber initialize(SVGNumber item) native "SVGNumberList_initialize_Callback";
 
+
+  /** @domName SVGNumberList.insertItemBefore */
   SVGNumber insertItemBefore(SVGNumber item, int index) native "SVGNumberList_insertItemBefore_Callback";
 
+
+  /** @domName SVGNumberList.removeItem */
   SVGNumber removeItem(int index) native "SVGNumberList_removeItem_Callback";
 
+
+  /** @domName SVGNumberList.replaceItem */
   SVGNumber replaceItem(SVGNumber item, int index) native "SVGNumberList_replaceItem_Callback";
 
 }
@@ -31275,7 +24767,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPaint
-abstract class SVGPaint implements SVGColor {
+class SVGPaint extends SVGColor {
+  SVGPaint.internal(): super.internal();
 
   static const int SVG_PAINTTYPE_CURRENTCOLOR = 102;
 
@@ -31297,32 +24790,20 @@
 
   static const int SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106;
 
+
   /** @domName SVGPaint.paintType */
-  int get paintType;
-
-  /** @domName SVGPaint.uri */
-  String get uri;
-
-  /** @domName SVGPaint.setPaint */
-  void setPaint(int paintType, String uri, String rgbColor, String iccColor);
-
-  /** @domName SVGPaint.setUri */
-  void setUri(String uri);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPaintImpl extends _SVGColorImpl implements SVGPaint {
-
   int get paintType native "SVGPaint_paintType_Getter";
 
+
+  /** @domName SVGPaint.uri */
   String get uri native "SVGPaint_uri_Getter";
 
+
+  /** @domName SVGPaint.setPaint */
   void setPaint(int paintType, String uri, String rgbColor, String iccColor) native "SVGPaint_setPaint_Callback";
 
+
+  /** @domName SVGPaint.setUri */
   void setUri(String uri) native "SVGPaint_setUri_Callback";
 
 }
@@ -31333,187 +24814,191 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathElement
-abstract class SVGPathElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+class SVGPathElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
+  SVGPathElement.internal(): super.internal();
+
 
   /** @domName SVGPathElement.animatedNormalizedPathSegList */
-  SVGPathSegList get animatedNormalizedPathSegList;
-
-  /** @domName SVGPathElement.animatedPathSegList */
-  SVGPathSegList get animatedPathSegList;
-
-  /** @domName SVGPathElement.normalizedPathSegList */
-  SVGPathSegList get normalizedPathSegList;
-
-  /** @domName SVGPathElement.pathLength */
-  SVGAnimatedNumber get pathLength;
-
-  /** @domName SVGPathElement.pathSegList */
-  SVGPathSegList get pathSegList;
-
-  /** @domName SVGPathElement.createSVGPathSegArcAbs */
-  SVGPathSegArcAbs createSVGPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag);
-
-  /** @domName SVGPathElement.createSVGPathSegArcRel */
-  SVGPathSegArcRel createSVGPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag);
-
-  /** @domName SVGPathElement.createSVGPathSegClosePath */
-  SVGPathSegClosePath createSVGPathSegClosePath();
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicAbs */
-  SVGPathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicRel */
-  SVGPathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs */
-  SVGPathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel */
-  SVGPathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticAbs */
-  SVGPathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticRel */
-  SVGPathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs */
-  SVGPathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(num x, num y);
-
-  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel */
-  SVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(num x, num y);
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoAbs */
-  SVGPathSegLinetoAbs createSVGPathSegLinetoAbs(num x, num y);
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalAbs */
-  SVGPathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(num x);
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalRel */
-  SVGPathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(num x);
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoRel */
-  SVGPathSegLinetoRel createSVGPathSegLinetoRel(num x, num y);
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalAbs */
-  SVGPathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(num y);
-
-  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalRel */
-  SVGPathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(num y);
-
-  /** @domName SVGPathElement.createSVGPathSegMovetoAbs */
-  SVGPathSegMovetoAbs createSVGPathSegMovetoAbs(num x, num y);
-
-  /** @domName SVGPathElement.createSVGPathSegMovetoRel */
-  SVGPathSegMovetoRel createSVGPathSegMovetoRel(num x, num y);
-
-  /** @domName SVGPathElement.getPathSegAtLength */
-  int getPathSegAtLength(num distance);
-
-  /** @domName SVGPathElement.getPointAtLength */
-  SVGPoint getPointAtLength(num distance);
-
-  /** @domName SVGPathElement.getTotalLength */
-  num getTotalLength();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathElementImpl extends _SVGElementImpl implements SVGPathElement {
-
   SVGPathSegList get animatedNormalizedPathSegList native "SVGPathElement_animatedNormalizedPathSegList_Getter";
 
+
+  /** @domName SVGPathElement.animatedPathSegList */
   SVGPathSegList get animatedPathSegList native "SVGPathElement_animatedPathSegList_Getter";
 
+
+  /** @domName SVGPathElement.normalizedPathSegList */
   SVGPathSegList get normalizedPathSegList native "SVGPathElement_normalizedPathSegList_Getter";
 
+
+  /** @domName SVGPathElement.pathLength */
   SVGAnimatedNumber get pathLength native "SVGPathElement_pathLength_Getter";
 
+
+  /** @domName SVGPathElement.pathSegList */
   SVGPathSegList get pathSegList native "SVGPathElement_pathSegList_Getter";
 
+
+  /** @domName SVGPathElement.createSVGPathSegArcAbs */
   SVGPathSegArcAbs createSVGPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegArcRel */
   SVGPathSegArcRel createSVGPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegClosePath */
   SVGPathSegClosePath createSVGPathSegClosePath() native "SVGPathElement_createSVGPathSegClosePath_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicAbs */
   SVGPathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicRel */
   SVGPathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs */
   SVGPathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel */
   SVGPathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticAbs */
   SVGPathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticRel */
   SVGPathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs */
   SVGPathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel */
   SVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegLinetoAbs */
   SVGPathSegLinetoAbs createSVGPathSegLinetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalAbs */
   SVGPathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalRel */
   SVGPathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegLinetoRel */
   SVGPathSegLinetoRel createSVGPathSegLinetoRel(num x, num y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalAbs */
   SVGPathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalRel */
   SVGPathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegMovetoAbs */
   SVGPathSegMovetoAbs createSVGPathSegMovetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
 
+
+  /** @domName SVGPathElement.createSVGPathSegMovetoRel */
   SVGPathSegMovetoRel createSVGPathSegMovetoRel(num x, num y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
 
+
+  /** @domName SVGPathElement.getPathSegAtLength */
   int getPathSegAtLength(num distance) native "SVGPathElement_getPathSegAtLength_Callback";
 
+
+  /** @domName SVGPathElement.getPointAtLength */
   SVGPoint getPointAtLength(num distance) native "SVGPathElement_getPointAtLength_Callback";
 
+
+  /** @domName SVGPathElement.getTotalLength */
   num getTotalLength() native "SVGPathElement_getTotalLength_Callback";
 
+
+  /** @domName SVGPathElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGPathElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGPathElement.xmllang */
   String get xmllang native "SVGPathElement_xmllang_Getter";
 
+
+  /** @domName SVGPathElement.xmllang */
   void set xmllang(String value) native "SVGPathElement_xmllang_Setter";
 
+
+  /** @domName SVGPathElement.xmlspace */
   String get xmlspace native "SVGPathElement_xmlspace_Getter";
 
+
+  /** @domName SVGPathElement.xmlspace */
   void set xmlspace(String value) native "SVGPathElement_xmlspace_Setter";
 
+
+  /** @domName SVGPathElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGPathElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGPathElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGPathElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGPathElement.getBBox */
   SVGRect getBBox() native "SVGPathElement_getBBox_Callback";
 
+
+  /** @domName SVGPathElement.getCTM */
   SVGMatrix getCTM() native "SVGPathElement_getCTM_Callback";
 
+
+  /** @domName SVGPathElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGPathElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGPathElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGPathElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGPathElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGPathElement_className_Getter";
 
+
+  /** @domName SVGPathElement.style */
   CSSStyleDeclaration get style native "SVGPathElement_style_Getter";
 
+
+  /** @domName SVGPathElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGPathElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGPathElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGPathElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGPathElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGPathElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGPathElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGPathElement_systemLanguage_Getter";
 
+
+  /** @domName SVGPathElement.hasExtension */
   bool hasExtension(String extension) native "SVGPathElement_hasExtension_Callback";
 
+
+  /** @domName SVGPathElement.transform */
   SVGAnimatedTransformList get transform native "SVGPathElement_transform_Getter";
 
 }
@@ -31524,7 +25009,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSeg
-abstract class SVGPathSeg {
+class SVGPathSeg extends NativeFieldWrapperClass1 {
+  SVGPathSeg.internal();
 
   static const int PATHSEG_ARC_ABS = 10;
 
@@ -31566,11 +25052,14 @@
 
   static const int PATHSEG_UNKNOWN = 0;
 
+
   /** @domName SVGPathSeg.pathSegType */
-  int get pathSegType;
+  int get pathSegType native "SVGPathSeg_pathSegType_Getter";
+
 
   /** @domName SVGPathSeg.pathSegTypeAsLetter */
-  String get pathSegTypeAsLetter;
+  String get pathSegTypeAsLetter native "SVGPathSeg_pathSegTypeAsLetter_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -31579,63 +25068,63 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegArcAbs
-abstract class SVGPathSegArcAbs implements SVGPathSeg {
+class SVGPathSegArcAbs extends SVGPathSeg {
+  SVGPathSegArcAbs.internal(): super.internal();
+
 
   /** @domName SVGPathSegArcAbs.angle */
-  num angle;
-
-  /** @domName SVGPathSegArcAbs.largeArcFlag */
-  bool largeArcFlag;
-
-  /** @domName SVGPathSegArcAbs.r1 */
-  num r1;
-
-  /** @domName SVGPathSegArcAbs.r2 */
-  num r2;
-
-  /** @domName SVGPathSegArcAbs.sweepFlag */
-  bool sweepFlag;
-
-  /** @domName SVGPathSegArcAbs.x */
-  num x;
-
-  /** @domName SVGPathSegArcAbs.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegArcAbsImpl extends _SVGPathSegImpl implements SVGPathSegArcAbs {
-
   num get angle native "SVGPathSegArcAbs_angle_Getter";
 
+
+  /** @domName SVGPathSegArcAbs.angle */
   void set angle(num value) native "SVGPathSegArcAbs_angle_Setter";
 
+
+  /** @domName SVGPathSegArcAbs.largeArcFlag */
   bool get largeArcFlag native "SVGPathSegArcAbs_largeArcFlag_Getter";
 
+
+  /** @domName SVGPathSegArcAbs.largeArcFlag */
   void set largeArcFlag(bool value) native "SVGPathSegArcAbs_largeArcFlag_Setter";
 
+
+  /** @domName SVGPathSegArcAbs.r1 */
   num get r1 native "SVGPathSegArcAbs_r1_Getter";
 
+
+  /** @domName SVGPathSegArcAbs.r1 */
   void set r1(num value) native "SVGPathSegArcAbs_r1_Setter";
 
+
+  /** @domName SVGPathSegArcAbs.r2 */
   num get r2 native "SVGPathSegArcAbs_r2_Getter";
 
+
+  /** @domName SVGPathSegArcAbs.r2 */
   void set r2(num value) native "SVGPathSegArcAbs_r2_Setter";
 
+
+  /** @domName SVGPathSegArcAbs.sweepFlag */
   bool get sweepFlag native "SVGPathSegArcAbs_sweepFlag_Getter";
 
+
+  /** @domName SVGPathSegArcAbs.sweepFlag */
   void set sweepFlag(bool value) native "SVGPathSegArcAbs_sweepFlag_Setter";
 
+
+  /** @domName SVGPathSegArcAbs.x */
   num get x native "SVGPathSegArcAbs_x_Getter";
 
+
+  /** @domName SVGPathSegArcAbs.x */
   void set x(num value) native "SVGPathSegArcAbs_x_Setter";
 
+
+  /** @domName SVGPathSegArcAbs.y */
   num get y native "SVGPathSegArcAbs_y_Getter";
 
+
+  /** @domName SVGPathSegArcAbs.y */
   void set y(num value) native "SVGPathSegArcAbs_y_Setter";
 
 }
@@ -31646,63 +25135,63 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegArcRel
-abstract class SVGPathSegArcRel implements SVGPathSeg {
+class SVGPathSegArcRel extends SVGPathSeg {
+  SVGPathSegArcRel.internal(): super.internal();
+
 
   /** @domName SVGPathSegArcRel.angle */
-  num angle;
-
-  /** @domName SVGPathSegArcRel.largeArcFlag */
-  bool largeArcFlag;
-
-  /** @domName SVGPathSegArcRel.r1 */
-  num r1;
-
-  /** @domName SVGPathSegArcRel.r2 */
-  num r2;
-
-  /** @domName SVGPathSegArcRel.sweepFlag */
-  bool sweepFlag;
-
-  /** @domName SVGPathSegArcRel.x */
-  num x;
-
-  /** @domName SVGPathSegArcRel.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegArcRelImpl extends _SVGPathSegImpl implements SVGPathSegArcRel {
-
   num get angle native "SVGPathSegArcRel_angle_Getter";
 
+
+  /** @domName SVGPathSegArcRel.angle */
   void set angle(num value) native "SVGPathSegArcRel_angle_Setter";
 
+
+  /** @domName SVGPathSegArcRel.largeArcFlag */
   bool get largeArcFlag native "SVGPathSegArcRel_largeArcFlag_Getter";
 
+
+  /** @domName SVGPathSegArcRel.largeArcFlag */
   void set largeArcFlag(bool value) native "SVGPathSegArcRel_largeArcFlag_Setter";
 
+
+  /** @domName SVGPathSegArcRel.r1 */
   num get r1 native "SVGPathSegArcRel_r1_Getter";
 
+
+  /** @domName SVGPathSegArcRel.r1 */
   void set r1(num value) native "SVGPathSegArcRel_r1_Setter";
 
+
+  /** @domName SVGPathSegArcRel.r2 */
   num get r2 native "SVGPathSegArcRel_r2_Getter";
 
+
+  /** @domName SVGPathSegArcRel.r2 */
   void set r2(num value) native "SVGPathSegArcRel_r2_Setter";
 
+
+  /** @domName SVGPathSegArcRel.sweepFlag */
   bool get sweepFlag native "SVGPathSegArcRel_sweepFlag_Getter";
 
+
+  /** @domName SVGPathSegArcRel.sweepFlag */
   void set sweepFlag(bool value) native "SVGPathSegArcRel_sweepFlag_Setter";
 
+
+  /** @domName SVGPathSegArcRel.x */
   num get x native "SVGPathSegArcRel_x_Getter";
 
+
+  /** @domName SVGPathSegArcRel.x */
   void set x(num value) native "SVGPathSegArcRel_x_Setter";
 
+
+  /** @domName SVGPathSegArcRel.y */
   num get y native "SVGPathSegArcRel_y_Getter";
 
+
+  /** @domName SVGPathSegArcRel.y */
   void set y(num value) native "SVGPathSegArcRel_y_Setter";
 
 }
@@ -31713,15 +25202,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegClosePath
-abstract class SVGPathSegClosePath implements SVGPathSeg {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegClosePathImpl extends _SVGPathSegImpl implements SVGPathSegClosePath {
+class SVGPathSegClosePath extends SVGPathSeg {
+  SVGPathSegClosePath.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31731,56 +25213,55 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegCurvetoCubicAbs
-abstract class SVGPathSegCurvetoCubicAbs implements SVGPathSeg {
+class SVGPathSegCurvetoCubicAbs extends SVGPathSeg {
+  SVGPathSegCurvetoCubicAbs.internal(): super.internal();
+
 
   /** @domName SVGPathSegCurvetoCubicAbs.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoCubicAbs.x1 */
-  num x1;
-
-  /** @domName SVGPathSegCurvetoCubicAbs.x2 */
-  num x2;
-
-  /** @domName SVGPathSegCurvetoCubicAbs.y */
-  num y;
-
-  /** @domName SVGPathSegCurvetoCubicAbs.y1 */
-  num y1;
-
-  /** @domName SVGPathSegCurvetoCubicAbs.y2 */
-  num y2;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegCurvetoCubicAbsImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoCubicAbs {
-
   num get x native "SVGPathSegCurvetoCubicAbs_x_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicAbs.x */
   void set x(num value) native "SVGPathSegCurvetoCubicAbs_x_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicAbs.x1 */
   num get x1 native "SVGPathSegCurvetoCubicAbs_x1_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicAbs.x1 */
   void set x1(num value) native "SVGPathSegCurvetoCubicAbs_x1_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicAbs.x2 */
   num get x2 native "SVGPathSegCurvetoCubicAbs_x2_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicAbs.x2 */
   void set x2(num value) native "SVGPathSegCurvetoCubicAbs_x2_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicAbs.y */
   num get y native "SVGPathSegCurvetoCubicAbs_y_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicAbs.y */
   void set y(num value) native "SVGPathSegCurvetoCubicAbs_y_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicAbs.y1 */
   num get y1 native "SVGPathSegCurvetoCubicAbs_y1_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicAbs.y1 */
   void set y1(num value) native "SVGPathSegCurvetoCubicAbs_y1_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicAbs.y2 */
   num get y2 native "SVGPathSegCurvetoCubicAbs_y2_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicAbs.y2 */
   void set y2(num value) native "SVGPathSegCurvetoCubicAbs_y2_Setter";
 
 }
@@ -31791,56 +25272,55 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegCurvetoCubicRel
-abstract class SVGPathSegCurvetoCubicRel implements SVGPathSeg {
+class SVGPathSegCurvetoCubicRel extends SVGPathSeg {
+  SVGPathSegCurvetoCubicRel.internal(): super.internal();
+
 
   /** @domName SVGPathSegCurvetoCubicRel.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoCubicRel.x1 */
-  num x1;
-
-  /** @domName SVGPathSegCurvetoCubicRel.x2 */
-  num x2;
-
-  /** @domName SVGPathSegCurvetoCubicRel.y */
-  num y;
-
-  /** @domName SVGPathSegCurvetoCubicRel.y1 */
-  num y1;
-
-  /** @domName SVGPathSegCurvetoCubicRel.y2 */
-  num y2;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegCurvetoCubicRelImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoCubicRel {
-
   num get x native "SVGPathSegCurvetoCubicRel_x_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicRel.x */
   void set x(num value) native "SVGPathSegCurvetoCubicRel_x_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicRel.x1 */
   num get x1 native "SVGPathSegCurvetoCubicRel_x1_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicRel.x1 */
   void set x1(num value) native "SVGPathSegCurvetoCubicRel_x1_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicRel.x2 */
   num get x2 native "SVGPathSegCurvetoCubicRel_x2_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicRel.x2 */
   void set x2(num value) native "SVGPathSegCurvetoCubicRel_x2_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicRel.y */
   num get y native "SVGPathSegCurvetoCubicRel_y_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicRel.y */
   void set y(num value) native "SVGPathSegCurvetoCubicRel_y_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicRel.y1 */
   num get y1 native "SVGPathSegCurvetoCubicRel_y1_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicRel.y1 */
   void set y1(num value) native "SVGPathSegCurvetoCubicRel_y1_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicRel.y2 */
   num get y2 native "SVGPathSegCurvetoCubicRel_y2_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicRel.y2 */
   void set y2(num value) native "SVGPathSegCurvetoCubicRel_y2_Setter";
 
 }
@@ -31851,42 +25331,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegCurvetoCubicSmoothAbs
-abstract class SVGPathSegCurvetoCubicSmoothAbs implements SVGPathSeg {
+class SVGPathSegCurvetoCubicSmoothAbs extends SVGPathSeg {
+  SVGPathSegCurvetoCubicSmoothAbs.internal(): super.internal();
+
 
   /** @domName SVGPathSegCurvetoCubicSmoothAbs.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x2 */
-  num x2;
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y */
-  num y;
-
-  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y2 */
-  num y2;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegCurvetoCubicSmoothAbsImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoCubicSmoothAbs {
-
   num get x native "SVGPathSegCurvetoCubicSmoothAbs_x_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x */
   void set x(num value) native "SVGPathSegCurvetoCubicSmoothAbs_x_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x2 */
   num get x2 native "SVGPathSegCurvetoCubicSmoothAbs_x2_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x2 */
   void set x2(num value) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y */
   num get y native "SVGPathSegCurvetoCubicSmoothAbs_y_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y */
   void set y(num value) native "SVGPathSegCurvetoCubicSmoothAbs_y_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y2 */
   num get y2 native "SVGPathSegCurvetoCubicSmoothAbs_y2_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y2 */
   void set y2(num value) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Setter";
 
 }
@@ -31897,42 +25374,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegCurvetoCubicSmoothRel
-abstract class SVGPathSegCurvetoCubicSmoothRel implements SVGPathSeg {
+class SVGPathSegCurvetoCubicSmoothRel extends SVGPathSeg {
+  SVGPathSegCurvetoCubicSmoothRel.internal(): super.internal();
+
 
   /** @domName SVGPathSegCurvetoCubicSmoothRel.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.x2 */
-  num x2;
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.y */
-  num y;
-
-  /** @domName SVGPathSegCurvetoCubicSmoothRel.y2 */
-  num y2;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegCurvetoCubicSmoothRelImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoCubicSmoothRel {
-
   num get x native "SVGPathSegCurvetoCubicSmoothRel_x_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothRel.x */
   void set x(num value) native "SVGPathSegCurvetoCubicSmoothRel_x_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothRel.x2 */
   num get x2 native "SVGPathSegCurvetoCubicSmoothRel_x2_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothRel.x2 */
   void set x2(num value) native "SVGPathSegCurvetoCubicSmoothRel_x2_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothRel.y */
   num get y native "SVGPathSegCurvetoCubicSmoothRel_y_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothRel.y */
   void set y(num value) native "SVGPathSegCurvetoCubicSmoothRel_y_Setter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothRel.y2 */
   num get y2 native "SVGPathSegCurvetoCubicSmoothRel_y2_Getter";
 
+
+  /** @domName SVGPathSegCurvetoCubicSmoothRel.y2 */
   void set y2(num value) native "SVGPathSegCurvetoCubicSmoothRel_y2_Setter";
 
 }
@@ -31943,42 +25417,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegCurvetoQuadraticAbs
-abstract class SVGPathSegCurvetoQuadraticAbs implements SVGPathSeg {
+class SVGPathSegCurvetoQuadraticAbs extends SVGPathSeg {
+  SVGPathSegCurvetoQuadraticAbs.internal(): super.internal();
+
 
   /** @domName SVGPathSegCurvetoQuadraticAbs.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.x1 */
-  num x1;
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.y */
-  num y;
-
-  /** @domName SVGPathSegCurvetoQuadraticAbs.y1 */
-  num y1;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegCurvetoQuadraticAbsImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoQuadraticAbs {
-
   num get x native "SVGPathSegCurvetoQuadraticAbs_x_Getter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticAbs.x */
   void set x(num value) native "SVGPathSegCurvetoQuadraticAbs_x_Setter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticAbs.x1 */
   num get x1 native "SVGPathSegCurvetoQuadraticAbs_x1_Getter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticAbs.x1 */
   void set x1(num value) native "SVGPathSegCurvetoQuadraticAbs_x1_Setter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticAbs.y */
   num get y native "SVGPathSegCurvetoQuadraticAbs_y_Getter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticAbs.y */
   void set y(num value) native "SVGPathSegCurvetoQuadraticAbs_y_Setter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticAbs.y1 */
   num get y1 native "SVGPathSegCurvetoQuadraticAbs_y1_Getter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticAbs.y1 */
   void set y1(num value) native "SVGPathSegCurvetoQuadraticAbs_y1_Setter";
 
 }
@@ -31989,42 +25460,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegCurvetoQuadraticRel
-abstract class SVGPathSegCurvetoQuadraticRel implements SVGPathSeg {
+class SVGPathSegCurvetoQuadraticRel extends SVGPathSeg {
+  SVGPathSegCurvetoQuadraticRel.internal(): super.internal();
+
 
   /** @domName SVGPathSegCurvetoQuadraticRel.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.x1 */
-  num x1;
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.y */
-  num y;
-
-  /** @domName SVGPathSegCurvetoQuadraticRel.y1 */
-  num y1;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegCurvetoQuadraticRelImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoQuadraticRel {
-
   num get x native "SVGPathSegCurvetoQuadraticRel_x_Getter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticRel.x */
   void set x(num value) native "SVGPathSegCurvetoQuadraticRel_x_Setter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticRel.x1 */
   num get x1 native "SVGPathSegCurvetoQuadraticRel_x1_Getter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticRel.x1 */
   void set x1(num value) native "SVGPathSegCurvetoQuadraticRel_x1_Setter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticRel.y */
   num get y native "SVGPathSegCurvetoQuadraticRel_y_Getter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticRel.y */
   void set y(num value) native "SVGPathSegCurvetoQuadraticRel_y_Setter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticRel.y1 */
   num get y1 native "SVGPathSegCurvetoQuadraticRel_y1_Getter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticRel.y1 */
   void set y1(num value) native "SVGPathSegCurvetoQuadraticRel_y1_Setter";
 
 }
@@ -32035,28 +25503,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegCurvetoQuadraticSmoothAbs
-abstract class SVGPathSegCurvetoQuadraticSmoothAbs implements SVGPathSeg {
+class SVGPathSegCurvetoQuadraticSmoothAbs extends SVGPathSeg {
+  SVGPathSegCurvetoQuadraticSmoothAbs.internal(): super.internal();
+
 
   /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegCurvetoQuadraticSmoothAbsImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoQuadraticSmoothAbs {
-
   num get x native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.x */
   void set x(num value) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.y */
   num get y native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.y */
   void set y(num value) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter";
 
 }
@@ -32067,28 +25530,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegCurvetoQuadraticSmoothRel
-abstract class SVGPathSegCurvetoQuadraticSmoothRel implements SVGPathSeg {
+class SVGPathSegCurvetoQuadraticSmoothRel extends SVGPathSeg {
+  SVGPathSegCurvetoQuadraticSmoothRel.internal(): super.internal();
+
 
   /** @domName SVGPathSegCurvetoQuadraticSmoothRel.x */
-  num x;
-
-  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegCurvetoQuadraticSmoothRelImpl extends _SVGPathSegImpl implements SVGPathSegCurvetoQuadraticSmoothRel {
-
   num get x native "SVGPathSegCurvetoQuadraticSmoothRel_x_Getter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.x */
   void set x(num value) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Setter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.y */
   num get y native "SVGPathSegCurvetoQuadraticSmoothRel_y_Getter";
 
+
+  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.y */
   void set y(num value) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Setter";
 
 }
@@ -32098,42 +25556,24 @@
 
 // WARNING: Do not edit - generated code.
 
-class _SVGPathSegImpl extends NativeFieldWrapperClass1 implements SVGPathSeg {
-
-  int get pathSegType native "SVGPathSeg_pathSegType_Getter";
-
-  String get pathSegTypeAsLetter native "SVGPathSeg_pathSegTypeAsLetter_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName SVGPathSegLinetoAbs
-abstract class SVGPathSegLinetoAbs implements SVGPathSeg {
+class SVGPathSegLinetoAbs extends SVGPathSeg {
+  SVGPathSegLinetoAbs.internal(): super.internal();
+
 
   /** @domName SVGPathSegLinetoAbs.x */
-  num x;
-
-  /** @domName SVGPathSegLinetoAbs.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegLinetoAbsImpl extends _SVGPathSegImpl implements SVGPathSegLinetoAbs {
-
   num get x native "SVGPathSegLinetoAbs_x_Getter";
 
+
+  /** @domName SVGPathSegLinetoAbs.x */
   void set x(num value) native "SVGPathSegLinetoAbs_x_Setter";
 
+
+  /** @domName SVGPathSegLinetoAbs.y */
   num get y native "SVGPathSegLinetoAbs_y_Getter";
 
+
+  /** @domName SVGPathSegLinetoAbs.y */
   void set y(num value) native "SVGPathSegLinetoAbs_y_Setter";
 
 }
@@ -32144,21 +25584,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegLinetoHorizontalAbs
-abstract class SVGPathSegLinetoHorizontalAbs implements SVGPathSeg {
+class SVGPathSegLinetoHorizontalAbs extends SVGPathSeg {
+  SVGPathSegLinetoHorizontalAbs.internal(): super.internal();
+
 
   /** @domName SVGPathSegLinetoHorizontalAbs.x */
-  num x;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegLinetoHorizontalAbsImpl extends _SVGPathSegImpl implements SVGPathSegLinetoHorizontalAbs {
-
   num get x native "SVGPathSegLinetoHorizontalAbs_x_Getter";
 
+
+  /** @domName SVGPathSegLinetoHorizontalAbs.x */
   void set x(num value) native "SVGPathSegLinetoHorizontalAbs_x_Setter";
 
 }
@@ -32169,21 +25603,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegLinetoHorizontalRel
-abstract class SVGPathSegLinetoHorizontalRel implements SVGPathSeg {
+class SVGPathSegLinetoHorizontalRel extends SVGPathSeg {
+  SVGPathSegLinetoHorizontalRel.internal(): super.internal();
+
 
   /** @domName SVGPathSegLinetoHorizontalRel.x */
-  num x;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegLinetoHorizontalRelImpl extends _SVGPathSegImpl implements SVGPathSegLinetoHorizontalRel {
-
   num get x native "SVGPathSegLinetoHorizontalRel_x_Getter";
 
+
+  /** @domName SVGPathSegLinetoHorizontalRel.x */
   void set x(num value) native "SVGPathSegLinetoHorizontalRel_x_Setter";
 
 }
@@ -32194,28 +25622,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegLinetoRel
-abstract class SVGPathSegLinetoRel implements SVGPathSeg {
+class SVGPathSegLinetoRel extends SVGPathSeg {
+  SVGPathSegLinetoRel.internal(): super.internal();
+
 
   /** @domName SVGPathSegLinetoRel.x */
-  num x;
-
-  /** @domName SVGPathSegLinetoRel.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegLinetoRelImpl extends _SVGPathSegImpl implements SVGPathSegLinetoRel {
-
   num get x native "SVGPathSegLinetoRel_x_Getter";
 
+
+  /** @domName SVGPathSegLinetoRel.x */
   void set x(num value) native "SVGPathSegLinetoRel_x_Setter";
 
+
+  /** @domName SVGPathSegLinetoRel.y */
   num get y native "SVGPathSegLinetoRel_y_Getter";
 
+
+  /** @domName SVGPathSegLinetoRel.y */
   void set y(num value) native "SVGPathSegLinetoRel_y_Setter";
 
 }
@@ -32226,21 +25649,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegLinetoVerticalAbs
-abstract class SVGPathSegLinetoVerticalAbs implements SVGPathSeg {
+class SVGPathSegLinetoVerticalAbs extends SVGPathSeg {
+  SVGPathSegLinetoVerticalAbs.internal(): super.internal();
+
 
   /** @domName SVGPathSegLinetoVerticalAbs.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegLinetoVerticalAbsImpl extends _SVGPathSegImpl implements SVGPathSegLinetoVerticalAbs {
-
   num get y native "SVGPathSegLinetoVerticalAbs_y_Getter";
 
+
+  /** @domName SVGPathSegLinetoVerticalAbs.y */
   void set y(num value) native "SVGPathSegLinetoVerticalAbs_y_Setter";
 
 }
@@ -32251,21 +25668,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegLinetoVerticalRel
-abstract class SVGPathSegLinetoVerticalRel implements SVGPathSeg {
+class SVGPathSegLinetoVerticalRel extends SVGPathSeg {
+  SVGPathSegLinetoVerticalRel.internal(): super.internal();
+
 
   /** @domName SVGPathSegLinetoVerticalRel.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegLinetoVerticalRelImpl extends _SVGPathSegImpl implements SVGPathSegLinetoVerticalRel {
-
   num get y native "SVGPathSegLinetoVerticalRel_y_Getter";
 
+
+  /** @domName SVGPathSegLinetoVerticalRel.y */
   void set y(num value) native "SVGPathSegLinetoVerticalRel_y_Setter";
 
 }
@@ -32276,40 +25687,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegList
-abstract class SVGPathSegList implements List<SVGPathSeg> {
+class SVGPathSegList extends NativeFieldWrapperClass1 implements List<SVGPathSeg> {
+  SVGPathSegList.internal();
+
 
   /** @domName SVGPathSegList.numberOfItems */
-  int get numberOfItems;
-
-  /** @domName SVGPathSegList.appendItem */
-  SVGPathSeg appendItem(SVGPathSeg newItem);
-
-  /** @domName SVGPathSegList.clear */
-  void clear();
-
-  /** @domName SVGPathSegList.getItem */
-  SVGPathSeg getItem(int index);
-
-  /** @domName SVGPathSegList.initialize */
-  SVGPathSeg initialize(SVGPathSeg newItem);
-
-  /** @domName SVGPathSegList.insertItemBefore */
-  SVGPathSeg insertItemBefore(SVGPathSeg newItem, int index);
-
-  /** @domName SVGPathSegList.removeItem */
-  SVGPathSeg removeItem(int index);
-
-  /** @domName SVGPathSegList.replaceItem */
-  SVGPathSeg replaceItem(SVGPathSeg newItem, int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegListImpl extends NativeFieldWrapperClass1 implements SVGPathSegList {
-
   int get numberOfItems native "SVGPathSegList_numberOfItems_Getter";
 
   SVGPathSeg operator[](int index) native "SVGPathSegList_item_Callback";
@@ -32395,18 +25777,32 @@
 
   // -- end List<SVGPathSeg> mixins.
 
+
+  /** @domName SVGPathSegList.appendItem */
   SVGPathSeg appendItem(SVGPathSeg newItem) native "SVGPathSegList_appendItem_Callback";
 
+
+  /** @domName SVGPathSegList.clear */
   void clear() native "SVGPathSegList_clear_Callback";
 
+
+  /** @domName SVGPathSegList.getItem */
   SVGPathSeg getItem(int index) native "SVGPathSegList_getItem_Callback";
 
+
+  /** @domName SVGPathSegList.initialize */
   SVGPathSeg initialize(SVGPathSeg newItem) native "SVGPathSegList_initialize_Callback";
 
+
+  /** @domName SVGPathSegList.insertItemBefore */
   SVGPathSeg insertItemBefore(SVGPathSeg newItem, int index) native "SVGPathSegList_insertItemBefore_Callback";
 
+
+  /** @domName SVGPathSegList.removeItem */
   SVGPathSeg removeItem(int index) native "SVGPathSegList_removeItem_Callback";
 
+
+  /** @domName SVGPathSegList.replaceItem */
   SVGPathSeg replaceItem(SVGPathSeg newItem, int index) native "SVGPathSegList_replaceItem_Callback";
 
 }
@@ -32417,28 +25813,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegMovetoAbs
-abstract class SVGPathSegMovetoAbs implements SVGPathSeg {
+class SVGPathSegMovetoAbs extends SVGPathSeg {
+  SVGPathSegMovetoAbs.internal(): super.internal();
+
 
   /** @domName SVGPathSegMovetoAbs.x */
-  num x;
-
-  /** @domName SVGPathSegMovetoAbs.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegMovetoAbsImpl extends _SVGPathSegImpl implements SVGPathSegMovetoAbs {
-
   num get x native "SVGPathSegMovetoAbs_x_Getter";
 
+
+  /** @domName SVGPathSegMovetoAbs.x */
   void set x(num value) native "SVGPathSegMovetoAbs_x_Setter";
 
+
+  /** @domName SVGPathSegMovetoAbs.y */
   num get y native "SVGPathSegMovetoAbs_y_Getter";
 
+
+  /** @domName SVGPathSegMovetoAbs.y */
   void set y(num value) native "SVGPathSegMovetoAbs_y_Setter";
 
 }
@@ -32449,28 +25840,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPathSegMovetoRel
-abstract class SVGPathSegMovetoRel implements SVGPathSeg {
+class SVGPathSegMovetoRel extends SVGPathSeg {
+  SVGPathSegMovetoRel.internal(): super.internal();
+
 
   /** @domName SVGPathSegMovetoRel.x */
-  num x;
-
-  /** @domName SVGPathSegMovetoRel.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPathSegMovetoRelImpl extends _SVGPathSegImpl implements SVGPathSegMovetoRel {
-
   num get x native "SVGPathSegMovetoRel_x_Getter";
 
+
+  /** @domName SVGPathSegMovetoRel.x */
   void set x(num value) native "SVGPathSegMovetoRel_x_Setter";
 
+
+  /** @domName SVGPathSegMovetoRel.y */
   num get y native "SVGPathSegMovetoRel_y_Getter";
 
+
+  /** @domName SVGPathSegMovetoRel.y */
   void set y(num value) native "SVGPathSegMovetoRel_y_Setter";
 
 }
@@ -32481,79 +25867,95 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPatternElement
-abstract class SVGPatternElement implements SVGElement, SVGURIReference, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGFitToViewBox {
+class SVGPatternElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGFitToViewBox, SVGExternalResourcesRequired {
+  SVGPatternElement.internal(): super.internal();
+
 
   /** @domName SVGPatternElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGPatternElement.patternContentUnits */
-  SVGAnimatedEnumeration get patternContentUnits;
-
-  /** @domName SVGPatternElement.patternTransform */
-  SVGAnimatedTransformList get patternTransform;
-
-  /** @domName SVGPatternElement.patternUnits */
-  SVGAnimatedEnumeration get patternUnits;
-
-  /** @domName SVGPatternElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGPatternElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGPatternElement.y */
-  SVGAnimatedLength get y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPatternElementImpl extends _SVGElementImpl implements SVGPatternElement {
-
   SVGAnimatedLength get height native "SVGPatternElement_height_Getter";
 
+
+  /** @domName SVGPatternElement.patternContentUnits */
   SVGAnimatedEnumeration get patternContentUnits native "SVGPatternElement_patternContentUnits_Getter";
 
+
+  /** @domName SVGPatternElement.patternTransform */
   SVGAnimatedTransformList get patternTransform native "SVGPatternElement_patternTransform_Getter";
 
+
+  /** @domName SVGPatternElement.patternUnits */
   SVGAnimatedEnumeration get patternUnits native "SVGPatternElement_patternUnits_Getter";
 
+
+  /** @domName SVGPatternElement.width */
   SVGAnimatedLength get width native "SVGPatternElement_width_Getter";
 
+
+  /** @domName SVGPatternElement.x */
   SVGAnimatedLength get x native "SVGPatternElement_x_Getter";
 
+
+  /** @domName SVGPatternElement.y */
   SVGAnimatedLength get y native "SVGPatternElement_y_Getter";
 
+
+  /** @domName SVGPatternElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGPatternElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGPatternElement.preserveAspectRatio */
   SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGPatternElement_preserveAspectRatio_Getter";
 
+
+  /** @domName SVGPatternElement.viewBox */
   SVGAnimatedRect get viewBox native "SVGPatternElement_viewBox_Getter";
 
+
+  /** @domName SVGPatternElement.xmllang */
   String get xmllang native "SVGPatternElement_xmllang_Getter";
 
+
+  /** @domName SVGPatternElement.xmllang */
   void set xmllang(String value) native "SVGPatternElement_xmllang_Setter";
 
+
+  /** @domName SVGPatternElement.xmlspace */
   String get xmlspace native "SVGPatternElement_xmlspace_Getter";
 
+
+  /** @domName SVGPatternElement.xmlspace */
   void set xmlspace(String value) native "SVGPatternElement_xmlspace_Setter";
 
+
+  /** @domName SVGPatternElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGPatternElement_className_Getter";
 
+
+  /** @domName SVGPatternElement.style */
   CSSStyleDeclaration get style native "SVGPatternElement_style_Getter";
 
+
+  /** @domName SVGPatternElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGPatternElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGPatternElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGPatternElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGPatternElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGPatternElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGPatternElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGPatternElement_systemLanguage_Getter";
 
+
+  /** @domName SVGPatternElement.hasExtension */
   bool hasExtension(String extension) native "SVGPatternElement_hasExtension_Callback";
 
+
+  /** @domName SVGPatternElement.href */
   SVGAnimatedString get href native "SVGPatternElement_href_Getter";
 
 }
@@ -32564,33 +25966,27 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPoint
-abstract class SVGPoint {
+class SVGPoint extends NativeFieldWrapperClass1 {
+  SVGPoint.internal();
+
 
   /** @domName SVGPoint.x */
-  num x;
-
-  /** @domName SVGPoint.y */
-  num y;
-
-  /** @domName SVGPoint.matrixTransform */
-  SVGPoint matrixTransform(SVGMatrix matrix);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPointImpl extends NativeFieldWrapperClass1 implements SVGPoint {
-
   num get x native "SVGPoint_x_Getter";
 
+
+  /** @domName SVGPoint.x */
   void set x(num value) native "SVGPoint_x_Setter";
 
+
+  /** @domName SVGPoint.y */
   num get y native "SVGPoint_y_Getter";
 
+
+  /** @domName SVGPoint.y */
   void set y(num value) native "SVGPoint_y_Setter";
 
+
+  /** @domName SVGPoint.matrixTransform */
   SVGPoint matrixTransform(SVGMatrix matrix) native "SVGPoint_matrixTransform_Callback";
 
 }
@@ -32601,54 +25997,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPointList
-abstract class SVGPointList {
+class SVGPointList extends NativeFieldWrapperClass1 {
+  SVGPointList.internal();
+
 
   /** @domName SVGPointList.numberOfItems */
-  int get numberOfItems;
-
-  /** @domName SVGPointList.appendItem */
-  SVGPoint appendItem(SVGPoint item);
-
-  /** @domName SVGPointList.clear */
-  void clear();
-
-  /** @domName SVGPointList.getItem */
-  SVGPoint getItem(int index);
-
-  /** @domName SVGPointList.initialize */
-  SVGPoint initialize(SVGPoint item);
-
-  /** @domName SVGPointList.insertItemBefore */
-  SVGPoint insertItemBefore(SVGPoint item, int index);
-
-  /** @domName SVGPointList.removeItem */
-  SVGPoint removeItem(int index);
-
-  /** @domName SVGPointList.replaceItem */
-  SVGPoint replaceItem(SVGPoint item, int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPointListImpl extends NativeFieldWrapperClass1 implements SVGPointList {
-
   int get numberOfItems native "SVGPointList_numberOfItems_Getter";
 
+
+  /** @domName SVGPointList.appendItem */
   SVGPoint appendItem(SVGPoint item) native "SVGPointList_appendItem_Callback";
 
+
+  /** @domName SVGPointList.clear */
   void clear() native "SVGPointList_clear_Callback";
 
+
+  /** @domName SVGPointList.getItem */
   SVGPoint getItem(int index) native "SVGPointList_getItem_Callback";
 
+
+  /** @domName SVGPointList.initialize */
   SVGPoint initialize(SVGPoint item) native "SVGPointList_initialize_Callback";
 
+
+  /** @domName SVGPointList.insertItemBefore */
   SVGPoint insertItemBefore(SVGPoint item, int index) native "SVGPointList_insertItemBefore_Callback";
 
+
+  /** @domName SVGPointList.removeItem */
   SVGPoint removeItem(int index) native "SVGPointList_removeItem_Callback";
 
+
+  /** @domName SVGPointList.replaceItem */
   SVGPoint replaceItem(SVGPoint item, int index) native "SVGPointList_replaceItem_Callback";
 
 }
@@ -32659,62 +26040,91 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPolygonElement
-abstract class SVGPolygonElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+class SVGPolygonElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
+  SVGPolygonElement.internal(): super.internal();
+
 
   /** @domName SVGPolygonElement.animatedPoints */
-  SVGPointList get animatedPoints;
-
-  /** @domName SVGPolygonElement.points */
-  SVGPointList get points;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPolygonElementImpl extends _SVGElementImpl implements SVGPolygonElement {
-
   SVGPointList get animatedPoints native "SVGPolygonElement_animatedPoints_Getter";
 
+
+  /** @domName SVGPolygonElement.points */
   SVGPointList get points native "SVGPolygonElement_points_Getter";
 
+
+  /** @domName SVGPolygonElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGPolygonElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGPolygonElement.xmllang */
   String get xmllang native "SVGPolygonElement_xmllang_Getter";
 
+
+  /** @domName SVGPolygonElement.xmllang */
   void set xmllang(String value) native "SVGPolygonElement_xmllang_Setter";
 
+
+  /** @domName SVGPolygonElement.xmlspace */
   String get xmlspace native "SVGPolygonElement_xmlspace_Getter";
 
+
+  /** @domName SVGPolygonElement.xmlspace */
   void set xmlspace(String value) native "SVGPolygonElement_xmlspace_Setter";
 
+
+  /** @domName SVGPolygonElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGPolygonElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGPolygonElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGPolygonElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGPolygonElement.getBBox */
   SVGRect getBBox() native "SVGPolygonElement_getBBox_Callback";
 
+
+  /** @domName SVGPolygonElement.getCTM */
   SVGMatrix getCTM() native "SVGPolygonElement_getCTM_Callback";
 
+
+  /** @domName SVGPolygonElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGPolygonElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGPolygonElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGPolygonElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGPolygonElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGPolygonElement_className_Getter";
 
+
+  /** @domName SVGPolygonElement.style */
   CSSStyleDeclaration get style native "SVGPolygonElement_style_Getter";
 
+
+  /** @domName SVGPolygonElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGPolygonElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGPolygonElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGPolygonElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGPolygonElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGPolygonElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGPolygonElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGPolygonElement_systemLanguage_Getter";
 
+
+  /** @domName SVGPolygonElement.hasExtension */
   bool hasExtension(String extension) native "SVGPolygonElement_hasExtension_Callback";
 
+
+  /** @domName SVGPolygonElement.transform */
   SVGAnimatedTransformList get transform native "SVGPolygonElement_transform_Getter";
 
 }
@@ -32725,62 +26135,91 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPolylineElement
-abstract class SVGPolylineElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+class SVGPolylineElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
+  SVGPolylineElement.internal(): super.internal();
+
 
   /** @domName SVGPolylineElement.animatedPoints */
-  SVGPointList get animatedPoints;
-
-  /** @domName SVGPolylineElement.points */
-  SVGPointList get points;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPolylineElementImpl extends _SVGElementImpl implements SVGPolylineElement {
-
   SVGPointList get animatedPoints native "SVGPolylineElement_animatedPoints_Getter";
 
+
+  /** @domName SVGPolylineElement.points */
   SVGPointList get points native "SVGPolylineElement_points_Getter";
 
+
+  /** @domName SVGPolylineElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGPolylineElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGPolylineElement.xmllang */
   String get xmllang native "SVGPolylineElement_xmllang_Getter";
 
+
+  /** @domName SVGPolylineElement.xmllang */
   void set xmllang(String value) native "SVGPolylineElement_xmllang_Setter";
 
+
+  /** @domName SVGPolylineElement.xmlspace */
   String get xmlspace native "SVGPolylineElement_xmlspace_Getter";
 
+
+  /** @domName SVGPolylineElement.xmlspace */
   void set xmlspace(String value) native "SVGPolylineElement_xmlspace_Setter";
 
+
+  /** @domName SVGPolylineElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGPolylineElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGPolylineElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGPolylineElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGPolylineElement.getBBox */
   SVGRect getBBox() native "SVGPolylineElement_getBBox_Callback";
 
+
+  /** @domName SVGPolylineElement.getCTM */
   SVGMatrix getCTM() native "SVGPolylineElement_getCTM_Callback";
 
+
+  /** @domName SVGPolylineElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGPolylineElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGPolylineElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGPolylineElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGPolylineElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGPolylineElement_className_Getter";
 
+
+  /** @domName SVGPolylineElement.style */
   CSSStyleDeclaration get style native "SVGPolylineElement_style_Getter";
 
+
+  /** @domName SVGPolylineElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGPolylineElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGPolylineElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGPolylineElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGPolylineElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGPolylineElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGPolylineElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGPolylineElement_systemLanguage_Getter";
 
+
+  /** @domName SVGPolylineElement.hasExtension */
   bool hasExtension(String extension) native "SVGPolylineElement_hasExtension_Callback";
 
+
+  /** @domName SVGPolylineElement.transform */
   SVGAnimatedTransformList get transform native "SVGPolylineElement_transform_Getter";
 
 }
@@ -32791,7 +26230,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGPreserveAspectRatio
-abstract class SVGPreserveAspectRatio {
+class SVGPreserveAspectRatio extends NativeFieldWrapperClass1 {
+  SVGPreserveAspectRatio.internal();
 
   static const int SVG_MEETORSLICE_MEET = 1;
 
@@ -32821,26 +26261,20 @@
 
   static const int SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
 
+
   /** @domName SVGPreserveAspectRatio.align */
-  int align;
-
-  /** @domName SVGPreserveAspectRatio.meetOrSlice */
-  int meetOrSlice;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGPreserveAspectRatioImpl extends NativeFieldWrapperClass1 implements SVGPreserveAspectRatio {
-
   int get align native "SVGPreserveAspectRatio_align_Getter";
 
+
+  /** @domName SVGPreserveAspectRatio.align */
   void set align(int value) native "SVGPreserveAspectRatio_align_Setter";
 
+
+  /** @domName SVGPreserveAspectRatio.meetOrSlice */
   int get meetOrSlice native "SVGPreserveAspectRatio_meetOrSlice_Getter";
 
+
+  /** @domName SVGPreserveAspectRatio.meetOrSlice */
   void set meetOrSlice(int value) native "SVGPreserveAspectRatio_meetOrSlice_Setter";
 
 }
@@ -32851,44 +26285,31 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGRadialGradientElement
-abstract class SVGRadialGradientElement implements SVGGradientElement {
+class SVGRadialGradientElement extends SVGGradientElement {
+  SVGRadialGradientElement.internal(): super.internal();
+
 
   /** @domName SVGRadialGradientElement.cx */
-  SVGAnimatedLength get cx;
-
-  /** @domName SVGRadialGradientElement.cy */
-  SVGAnimatedLength get cy;
-
-  /** @domName SVGRadialGradientElement.fr */
-  SVGAnimatedLength get fr;
-
-  /** @domName SVGRadialGradientElement.fx */
-  SVGAnimatedLength get fx;
-
-  /** @domName SVGRadialGradientElement.fy */
-  SVGAnimatedLength get fy;
-
-  /** @domName SVGRadialGradientElement.r */
-  SVGAnimatedLength get r;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGRadialGradientElementImpl extends _SVGGradientElementImpl implements SVGRadialGradientElement {
-
   SVGAnimatedLength get cx native "SVGRadialGradientElement_cx_Getter";
 
+
+  /** @domName SVGRadialGradientElement.cy */
   SVGAnimatedLength get cy native "SVGRadialGradientElement_cy_Getter";
 
+
+  /** @domName SVGRadialGradientElement.fr */
   SVGAnimatedLength get fr native "SVGRadialGradientElement_fr_Getter";
 
+
+  /** @domName SVGRadialGradientElement.fx */
   SVGAnimatedLength get fx native "SVGRadialGradientElement_fx_Getter";
 
+
+  /** @domName SVGRadialGradientElement.fy */
   SVGAnimatedLength get fy native "SVGRadialGradientElement_fy_Getter";
 
+
+  /** @domName SVGRadialGradientElement.r */
   SVGAnimatedLength get r native "SVGRadialGradientElement_r_Getter";
 
 }
@@ -32899,128 +26320,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGRect
-abstract class SVGRect {
+class SVGRect extends NativeFieldWrapperClass1 {
+  SVGRect.internal();
+
 
   /** @domName SVGRect.height */
-  num height;
-
-  /** @domName SVGRect.width */
-  num width;
-
-  /** @domName SVGRect.x */
-  num x;
-
-  /** @domName SVGRect.y */
-  num y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SVGRectElement
-abstract class SVGRectElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-
-  /** @domName SVGRectElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGRectElement.rx */
-  SVGAnimatedLength get rx;
-
-  /** @domName SVGRectElement.ry */
-  SVGAnimatedLength get ry;
-
-  /** @domName SVGRectElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGRectElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGRectElement.y */
-  SVGAnimatedLength get y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGRectElementImpl extends _SVGElementImpl implements SVGRectElement {
-
-  SVGAnimatedLength get height native "SVGRectElement_height_Getter";
-
-  SVGAnimatedLength get rx native "SVGRectElement_rx_Getter";
-
-  SVGAnimatedLength get ry native "SVGRectElement_ry_Getter";
-
-  SVGAnimatedLength get width native "SVGRectElement_width_Getter";
-
-  SVGAnimatedLength get x native "SVGRectElement_x_Getter";
-
-  SVGAnimatedLength get y native "SVGRectElement_y_Getter";
-
-  SVGAnimatedBoolean get externalResourcesRequired native "SVGRectElement_externalResourcesRequired_Getter";
-
-  String get xmllang native "SVGRectElement_xmllang_Getter";
-
-  void set xmllang(String value) native "SVGRectElement_xmllang_Setter";
-
-  String get xmlspace native "SVGRectElement_xmlspace_Getter";
-
-  void set xmlspace(String value) native "SVGRectElement_xmlspace_Setter";
-
-  SVGElement get farthestViewportElement native "SVGRectElement_farthestViewportElement_Getter";
-
-  SVGElement get nearestViewportElement native "SVGRectElement_nearestViewportElement_Getter";
-
-  SVGRect getBBox() native "SVGRectElement_getBBox_Callback";
-
-  SVGMatrix getCTM() native "SVGRectElement_getCTM_Callback";
-
-  SVGMatrix getScreenCTM() native "SVGRectElement_getScreenCTM_Callback";
-
-  SVGMatrix getTransformToElement(SVGElement element) native "SVGRectElement_getTransformToElement_Callback";
-
-  SVGAnimatedString get $dom_svgClassName native "SVGRectElement_className_Getter";
-
-  CSSStyleDeclaration get style native "SVGRectElement_style_Getter";
-
-  CSSValue getPresentationAttribute(String name) native "SVGRectElement_getPresentationAttribute_Callback";
-
-  SVGStringList get requiredExtensions native "SVGRectElement_requiredExtensions_Getter";
-
-  SVGStringList get requiredFeatures native "SVGRectElement_requiredFeatures_Getter";
-
-  SVGStringList get systemLanguage native "SVGRectElement_systemLanguage_Getter";
-
-  bool hasExtension(String extension) native "SVGRectElement_hasExtension_Callback";
-
-  SVGAnimatedTransformList get transform native "SVGRectElement_transform_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGRectImpl extends NativeFieldWrapperClass1 implements SVGRect {
-
   num get height native "SVGRect_height_Getter";
 
+
+  /** @domName SVGRect.height */
   void set height(num value) native "SVGRect_height_Setter";
 
+
+  /** @domName SVGRect.width */
   num get width native "SVGRect_width_Getter";
 
+
+  /** @domName SVGRect.width */
   void set width(num value) native "SVGRect_width_Setter";
 
+
+  /** @domName SVGRect.x */
   num get x native "SVGRect_x_Getter";
 
+
+  /** @domName SVGRect.x */
   void set x(num value) native "SVGRect_x_Setter";
 
+
+  /** @domName SVGRect.y */
   num get y native "SVGRect_y_Getter";
 
+
+  /** @domName SVGRect.y */
   void set y(num value) native "SVGRect_y_Setter";
 
 }
@@ -33030,8 +26362,120 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName SVGRectElement
+class SVGRectElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
+  SVGRectElement.internal(): super.internal();
+
+
+  /** @domName SVGRectElement.height */
+  SVGAnimatedLength get height native "SVGRectElement_height_Getter";
+
+
+  /** @domName SVGRectElement.rx */
+  SVGAnimatedLength get rx native "SVGRectElement_rx_Getter";
+
+
+  /** @domName SVGRectElement.ry */
+  SVGAnimatedLength get ry native "SVGRectElement_ry_Getter";
+
+
+  /** @domName SVGRectElement.width */
+  SVGAnimatedLength get width native "SVGRectElement_width_Getter";
+
+
+  /** @domName SVGRectElement.x */
+  SVGAnimatedLength get x native "SVGRectElement_x_Getter";
+
+
+  /** @domName SVGRectElement.y */
+  SVGAnimatedLength get y native "SVGRectElement_y_Getter";
+
+
+  /** @domName SVGRectElement.externalResourcesRequired */
+  SVGAnimatedBoolean get externalResourcesRequired native "SVGRectElement_externalResourcesRequired_Getter";
+
+
+  /** @domName SVGRectElement.xmllang */
+  String get xmllang native "SVGRectElement_xmllang_Getter";
+
+
+  /** @domName SVGRectElement.xmllang */
+  void set xmllang(String value) native "SVGRectElement_xmllang_Setter";
+
+
+  /** @domName SVGRectElement.xmlspace */
+  String get xmlspace native "SVGRectElement_xmlspace_Getter";
+
+
+  /** @domName SVGRectElement.xmlspace */
+  void set xmlspace(String value) native "SVGRectElement_xmlspace_Setter";
+
+
+  /** @domName SVGRectElement.farthestViewportElement */
+  SVGElement get farthestViewportElement native "SVGRectElement_farthestViewportElement_Getter";
+
+
+  /** @domName SVGRectElement.nearestViewportElement */
+  SVGElement get nearestViewportElement native "SVGRectElement_nearestViewportElement_Getter";
+
+
+  /** @domName SVGRectElement.getBBox */
+  SVGRect getBBox() native "SVGRectElement_getBBox_Callback";
+
+
+  /** @domName SVGRectElement.getCTM */
+  SVGMatrix getCTM() native "SVGRectElement_getCTM_Callback";
+
+
+  /** @domName SVGRectElement.getScreenCTM */
+  SVGMatrix getScreenCTM() native "SVGRectElement_getScreenCTM_Callback";
+
+
+  /** @domName SVGRectElement.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native "SVGRectElement_getTransformToElement_Callback";
+
+
+  /** @domName SVGRectElement.className */
+  SVGAnimatedString get $dom_svgClassName native "SVGRectElement_className_Getter";
+
+
+  /** @domName SVGRectElement.style */
+  CSSStyleDeclaration get style native "SVGRectElement_style_Getter";
+
+
+  /** @domName SVGRectElement.getPresentationAttribute */
+  CSSValue getPresentationAttribute(String name) native "SVGRectElement_getPresentationAttribute_Callback";
+
+
+  /** @domName SVGRectElement.requiredExtensions */
+  SVGStringList get requiredExtensions native "SVGRectElement_requiredExtensions_Getter";
+
+
+  /** @domName SVGRectElement.requiredFeatures */
+  SVGStringList get requiredFeatures native "SVGRectElement_requiredFeatures_Getter";
+
+
+  /** @domName SVGRectElement.systemLanguage */
+  SVGStringList get systemLanguage native "SVGRectElement_systemLanguage_Getter";
+
+
+  /** @domName SVGRectElement.hasExtension */
+  bool hasExtension(String extension) native "SVGRectElement_hasExtension_Callback";
+
+
+  /** @domName SVGRectElement.transform */
+  SVGAnimatedTransformList get transform native "SVGRectElement_transform_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName SVGRenderingIntent
-abstract class SVGRenderingIntent {
+class SVGRenderingIntent extends NativeFieldWrapperClass1 {
+  SVGRenderingIntent.internal();
 
   static const int RENDERING_INTENT_ABSOLUTE_COLORIMETRIC = 5;
 
@@ -33044,273 +26488,267 @@
   static const int RENDERING_INTENT_SATURATION = 4;
 
   static const int RENDERING_INTENT_UNKNOWN = 0;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGRenderingIntentImpl extends NativeFieldWrapperClass1 implements SVGRenderingIntent {
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
-/// @domName SVGSVGElement
-abstract class SVGSVGElement extends SVGElement implements SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGLocatable, SVGFitToViewBox, SVGZoomAndPan {
+class SVGSVGElement extends SVGElement implements SVGZoomAndPan, SVGLocatable, SVGLangSpace, SVGTests, SVGStylable, SVGFitToViewBox, SVGExternalResourcesRequired {
   factory SVGSVGElement() => _SVGSVGElementFactoryProvider.createSVGSVGElement();
 
+  SVGSVGElement.internal(): super.internal();
+
 
   /** @domName SVGSVGElement.contentScriptType */
-  String contentScriptType;
-
-  /** @domName SVGSVGElement.contentStyleType */
-  String contentStyleType;
-
-  /** @domName SVGSVGElement.currentScale */
-  num currentScale;
-
-  /** @domName SVGSVGElement.currentTranslate */
-  SVGPoint get currentTranslate;
-
-  /** @domName SVGSVGElement.currentView */
-  SVGViewSpec get currentView;
-
-  /** @domName SVGSVGElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGSVGElement.pixelUnitToMillimeterX */
-  num get pixelUnitToMillimeterX;
-
-  /** @domName SVGSVGElement.pixelUnitToMillimeterY */
-  num get pixelUnitToMillimeterY;
-
-  /** @domName SVGSVGElement.screenPixelToMillimeterX */
-  num get screenPixelToMillimeterX;
-
-  /** @domName SVGSVGElement.screenPixelToMillimeterY */
-  num get screenPixelToMillimeterY;
-
-  /** @domName SVGSVGElement.useCurrentView */
-  bool get useCurrentView;
-
-  /** @domName SVGSVGElement.viewport */
-  SVGRect get viewport;
-
-  /** @domName SVGSVGElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGSVGElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGSVGElement.y */
-  SVGAnimatedLength get y;
-
-  /** @domName SVGSVGElement.animationsPaused */
-  bool animationsPaused();
-
-  /** @domName SVGSVGElement.checkEnclosure */
-  bool checkEnclosure(SVGElement element, SVGRect rect);
-
-  /** @domName SVGSVGElement.checkIntersection */
-  bool checkIntersection(SVGElement element, SVGRect rect);
-
-  /** @domName SVGSVGElement.createSVGAngle */
-  SVGAngle createSVGAngle();
-
-  /** @domName SVGSVGElement.createSVGLength */
-  SVGLength createSVGLength();
-
-  /** @domName SVGSVGElement.createSVGMatrix */
-  SVGMatrix createSVGMatrix();
-
-  /** @domName SVGSVGElement.createSVGNumber */
-  SVGNumber createSVGNumber();
-
-  /** @domName SVGSVGElement.createSVGPoint */
-  SVGPoint createSVGPoint();
-
-  /** @domName SVGSVGElement.createSVGRect */
-  SVGRect createSVGRect();
-
-  /** @domName SVGSVGElement.createSVGTransform */
-  SVGTransform createSVGTransform();
-
-  /** @domName SVGSVGElement.createSVGTransformFromMatrix */
-  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix);
-
-  /** @domName SVGSVGElement.deselectAll */
-  void deselectAll();
-
-  /** @domName SVGSVGElement.forceRedraw */
-  void forceRedraw();
-
-  /** @domName SVGSVGElement.getCurrentTime */
-  num getCurrentTime();
-
-  /** @domName SVGSVGElement.getElementById */
-  Element getElementById(String elementId);
-
-  /** @domName SVGSVGElement.getEnclosureList */
-  List<Node> getEnclosureList(SVGRect rect, SVGElement referenceElement);
-
-  /** @domName SVGSVGElement.getIntersectionList */
-  List<Node> getIntersectionList(SVGRect rect, SVGElement referenceElement);
-
-  /** @domName SVGSVGElement.pauseAnimations */
-  void pauseAnimations();
-
-  /** @domName SVGSVGElement.setCurrentTime */
-  void setCurrentTime(num seconds);
-
-  /** @domName SVGSVGElement.suspendRedraw */
-  int suspendRedraw(int maxWaitMilliseconds);
-
-  /** @domName SVGSVGElement.unpauseAnimations */
-  void unpauseAnimations();
-
-  /** @domName SVGSVGElement.unsuspendRedraw */
-  void unsuspendRedraw(int suspendHandleId);
-
-  /** @domName SVGSVGElement.unsuspendRedrawAll */
-  void unsuspendRedrawAll();
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGSVGElementImpl extends _SVGElementImpl implements SVGSVGElement {
-
   String get contentScriptType native "SVGSVGElement_contentScriptType_Getter";
 
+
+  /** @domName SVGSVGElement.contentScriptType */
   void set contentScriptType(String value) native "SVGSVGElement_contentScriptType_Setter";
 
+
+  /** @domName SVGSVGElement.contentStyleType */
   String get contentStyleType native "SVGSVGElement_contentStyleType_Getter";
 
+
+  /** @domName SVGSVGElement.contentStyleType */
   void set contentStyleType(String value) native "SVGSVGElement_contentStyleType_Setter";
 
+
+  /** @domName SVGSVGElement.currentScale */
   num get currentScale native "SVGSVGElement_currentScale_Getter";
 
+
+  /** @domName SVGSVGElement.currentScale */
   void set currentScale(num value) native "SVGSVGElement_currentScale_Setter";
 
+
+  /** @domName SVGSVGElement.currentTranslate */
   SVGPoint get currentTranslate native "SVGSVGElement_currentTranslate_Getter";
 
+
+  /** @domName SVGSVGElement.currentView */
   SVGViewSpec get currentView native "SVGSVGElement_currentView_Getter";
 
+
+  /** @domName SVGSVGElement.height */
   SVGAnimatedLength get height native "SVGSVGElement_height_Getter";
 
+
+  /** @domName SVGSVGElement.pixelUnitToMillimeterX */
   num get pixelUnitToMillimeterX native "SVGSVGElement_pixelUnitToMillimeterX_Getter";
 
+
+  /** @domName SVGSVGElement.pixelUnitToMillimeterY */
   num get pixelUnitToMillimeterY native "SVGSVGElement_pixelUnitToMillimeterY_Getter";
 
+
+  /** @domName SVGSVGElement.screenPixelToMillimeterX */
   num get screenPixelToMillimeterX native "SVGSVGElement_screenPixelToMillimeterX_Getter";
 
+
+  /** @domName SVGSVGElement.screenPixelToMillimeterY */
   num get screenPixelToMillimeterY native "SVGSVGElement_screenPixelToMillimeterY_Getter";
 
+
+  /** @domName SVGSVGElement.useCurrentView */
   bool get useCurrentView native "SVGSVGElement_useCurrentView_Getter";
 
+
+  /** @domName SVGSVGElement.viewport */
   SVGRect get viewport native "SVGSVGElement_viewport_Getter";
 
+
+  /** @domName SVGSVGElement.width */
   SVGAnimatedLength get width native "SVGSVGElement_width_Getter";
 
+
+  /** @domName SVGSVGElement.x */
   SVGAnimatedLength get x native "SVGSVGElement_x_Getter";
 
+
+  /** @domName SVGSVGElement.y */
   SVGAnimatedLength get y native "SVGSVGElement_y_Getter";
 
+
+  /** @domName SVGSVGElement.animationsPaused */
   bool animationsPaused() native "SVGSVGElement_animationsPaused_Callback";
 
+
+  /** @domName SVGSVGElement.checkEnclosure */
   bool checkEnclosure(SVGElement element, SVGRect rect) native "SVGSVGElement_checkEnclosure_Callback";
 
+
+  /** @domName SVGSVGElement.checkIntersection */
   bool checkIntersection(SVGElement element, SVGRect rect) native "SVGSVGElement_checkIntersection_Callback";
 
+
+  /** @domName SVGSVGElement.createSVGAngle */
   SVGAngle createSVGAngle() native "SVGSVGElement_createSVGAngle_Callback";
 
+
+  /** @domName SVGSVGElement.createSVGLength */
   SVGLength createSVGLength() native "SVGSVGElement_createSVGLength_Callback";
 
+
+  /** @domName SVGSVGElement.createSVGMatrix */
   SVGMatrix createSVGMatrix() native "SVGSVGElement_createSVGMatrix_Callback";
 
+
+  /** @domName SVGSVGElement.createSVGNumber */
   SVGNumber createSVGNumber() native "SVGSVGElement_createSVGNumber_Callback";
 
+
+  /** @domName SVGSVGElement.createSVGPoint */
   SVGPoint createSVGPoint() native "SVGSVGElement_createSVGPoint_Callback";
 
+
+  /** @domName SVGSVGElement.createSVGRect */
   SVGRect createSVGRect() native "SVGSVGElement_createSVGRect_Callback";
 
+
+  /** @domName SVGSVGElement.createSVGTransform */
   SVGTransform createSVGTransform() native "SVGSVGElement_createSVGTransform_Callback";
 
+
+  /** @domName SVGSVGElement.createSVGTransformFromMatrix */
   SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
 
+
+  /** @domName SVGSVGElement.deselectAll */
   void deselectAll() native "SVGSVGElement_deselectAll_Callback";
 
+
+  /** @domName SVGSVGElement.forceRedraw */
   void forceRedraw() native "SVGSVGElement_forceRedraw_Callback";
 
+
+  /** @domName SVGSVGElement.getCurrentTime */
   num getCurrentTime() native "SVGSVGElement_getCurrentTime_Callback";
 
+
+  /** @domName SVGSVGElement.getElementById */
   Element getElementById(String elementId) native "SVGSVGElement_getElementById_Callback";
 
+
+  /** @domName SVGSVGElement.getEnclosureList */
   List<Node> getEnclosureList(SVGRect rect, SVGElement referenceElement) native "SVGSVGElement_getEnclosureList_Callback";
 
+
+  /** @domName SVGSVGElement.getIntersectionList */
   List<Node> getIntersectionList(SVGRect rect, SVGElement referenceElement) native "SVGSVGElement_getIntersectionList_Callback";
 
+
+  /** @domName SVGSVGElement.pauseAnimations */
   void pauseAnimations() native "SVGSVGElement_pauseAnimations_Callback";
 
+
+  /** @domName SVGSVGElement.setCurrentTime */
   void setCurrentTime(num seconds) native "SVGSVGElement_setCurrentTime_Callback";
 
+
+  /** @domName SVGSVGElement.suspendRedraw */
   int suspendRedraw(int maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback";
 
+
+  /** @domName SVGSVGElement.unpauseAnimations */
   void unpauseAnimations() native "SVGSVGElement_unpauseAnimations_Callback";
 
+
+  /** @domName SVGSVGElement.unsuspendRedraw */
   void unsuspendRedraw(int suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback";
 
+
+  /** @domName SVGSVGElement.unsuspendRedrawAll */
   void unsuspendRedrawAll() native "SVGSVGElement_unsuspendRedrawAll_Callback";
 
+
+  /** @domName SVGSVGElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGSVGElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGSVGElement.preserveAspectRatio */
   SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSVGElement_preserveAspectRatio_Getter";
 
+
+  /** @domName SVGSVGElement.viewBox */
   SVGAnimatedRect get viewBox native "SVGSVGElement_viewBox_Getter";
 
+
+  /** @domName SVGSVGElement.xmllang */
   String get xmllang native "SVGSVGElement_xmllang_Getter";
 
+
+  /** @domName SVGSVGElement.xmllang */
   void set xmllang(String value) native "SVGSVGElement_xmllang_Setter";
 
+
+  /** @domName SVGSVGElement.xmlspace */
   String get xmlspace native "SVGSVGElement_xmlspace_Getter";
 
+
+  /** @domName SVGSVGElement.xmlspace */
   void set xmlspace(String value) native "SVGSVGElement_xmlspace_Setter";
 
+
+  /** @domName SVGSVGElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGSVGElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGSVGElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGSVGElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGSVGElement.getBBox */
   SVGRect getBBox() native "SVGSVGElement_getBBox_Callback";
 
+
+  /** @domName SVGSVGElement.getCTM */
   SVGMatrix getCTM() native "SVGSVGElement_getCTM_Callback";
 
+
+  /** @domName SVGSVGElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGSVGElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGSVGElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGSVGElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGSVGElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGSVGElement_className_Getter";
 
+
+  /** @domName SVGSVGElement.style */
   CSSStyleDeclaration get style native "SVGSVGElement_style_Getter";
 
+
+  /** @domName SVGSVGElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGSVGElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGSVGElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGSVGElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGSVGElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGSVGElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGSVGElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGSVGElement_systemLanguage_Getter";
 
+
+  /** @domName SVGSVGElement.hasExtension */
   bool hasExtension(String extension) native "SVGSVGElement_hasExtension_Callback";
 
+
+  /** @domName SVGSVGElement.zoomAndPan */
   int get zoomAndPan native "SVGSVGElement_zoomAndPan_Getter";
 
+
+  /** @domName SVGSVGElement.zoomAndPan */
   void set zoomAndPan(int value) native "SVGSVGElement_zoomAndPan_Setter";
 
 }
@@ -33321,25 +26759,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGScriptElement
-abstract class SVGScriptElement implements SVGElement, SVGURIReference, SVGExternalResourcesRequired {
+class SVGScriptElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired {
+  SVGScriptElement.internal(): super.internal();
+
 
   /** @domName SVGScriptElement.type */
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGScriptElementImpl extends _SVGElementImpl implements SVGScriptElement {
-
   String get type native "SVGScriptElement_type_Getter";
 
+
+  /** @domName SVGScriptElement.type */
   void set type(String value) native "SVGScriptElement_type_Setter";
 
+
+  /** @domName SVGScriptElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGScriptElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGScriptElement.href */
   SVGAnimatedString get href native "SVGScriptElement_href_Getter";
 
 }
@@ -33350,15 +26786,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGSetElement
-abstract class SVGSetElement implements SVGAnimationElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGSetElementImpl extends _SVGAnimationElementImpl implements SVGSetElement {
+class SVGSetElement extends SVGAnimationElement {
+  SVGSetElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33368,25 +26797,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGStopElement
-abstract class SVGStopElement implements SVGElement, SVGStylable {
+class SVGStopElement extends SVGElement implements SVGStylable {
+  SVGStopElement.internal(): super.internal();
+
 
   /** @domName SVGStopElement.offset */
-  SVGAnimatedNumber get offset;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGStopElementImpl extends _SVGElementImpl implements SVGStopElement {
-
   SVGAnimatedNumber get offset native "SVGStopElement_offset_Getter";
 
+
+  /** @domName SVGStopElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGStopElement_className_Getter";
 
+
+  /** @domName SVGStopElement.style */
   CSSStyleDeclaration get style native "SVGStopElement_style_Getter";
 
+
+  /** @domName SVGStopElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGStopElement_getPresentationAttribute_Callback";
 
 }
@@ -33397,40 +26824,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGStringList
-abstract class SVGStringList implements List<String> {
+class SVGStringList extends NativeFieldWrapperClass1 implements List<String> {
+  SVGStringList.internal();
+
 
   /** @domName SVGStringList.numberOfItems */
-  int get numberOfItems;
-
-  /** @domName SVGStringList.appendItem */
-  String appendItem(String item);
-
-  /** @domName SVGStringList.clear */
-  void clear();
-
-  /** @domName SVGStringList.getItem */
-  String getItem(int index);
-
-  /** @domName SVGStringList.initialize */
-  String initialize(String item);
-
-  /** @domName SVGStringList.insertItemBefore */
-  String insertItemBefore(String item, int index);
-
-  /** @domName SVGStringList.removeItem */
-  String removeItem(int index);
-
-  /** @domName SVGStringList.replaceItem */
-  String replaceItem(String item, int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGStringListImpl extends NativeFieldWrapperClass1 implements SVGStringList {
-
   int get numberOfItems native "SVGStringList_numberOfItems_Getter";
 
   String operator[](int index) native "SVGStringList_item_Callback";
@@ -33516,18 +26914,32 @@
 
   // -- end List<String> mixins.
 
+
+  /** @domName SVGStringList.appendItem */
   String appendItem(String item) native "SVGStringList_appendItem_Callback";
 
+
+  /** @domName SVGStringList.clear */
   void clear() native "SVGStringList_clear_Callback";
 
+
+  /** @domName SVGStringList.getItem */
   String getItem(int index) native "SVGStringList_getItem_Callback";
 
+
+  /** @domName SVGStringList.initialize */
   String initialize(String item) native "SVGStringList_initialize_Callback";
 
+
+  /** @domName SVGStringList.insertItemBefore */
   String insertItemBefore(String item, int index) native "SVGStringList_insertItemBefore_Callback";
 
+
+  /** @domName SVGStringList.removeItem */
   String removeItem(int index) native "SVGStringList_removeItem_Callback";
 
+
+  /** @domName SVGStringList.replaceItem */
   String replaceItem(String item, int index) native "SVGStringList_replaceItem_Callback";
 
 }
@@ -33538,16 +26950,21 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGStylable
-abstract class SVGStylable {
+class SVGStylable extends NativeFieldWrapperClass1 {
+  SVGStylable.internal();
+
 
   /** @domName SVGStylable.className */
-  SVGAnimatedString get $dom_svgClassName;
+  SVGAnimatedString get $dom_svgClassName native "SVGStylable_className_Getter";
+
 
   /** @domName SVGStylable.style */
-  CSSStyleDeclaration get style;
+  CSSStyleDeclaration get style native "SVGStylable_style_Getter";
+
 
   /** @domName SVGStylable.getPresentationAttribute */
-  CSSValue getPresentationAttribute(String name);
+  CSSValue getPresentationAttribute(String name) native "SVGStylable_getPresentationAttribute_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -33556,50 +26973,55 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGStyleElement
-abstract class SVGStyleElement implements SVGElement, SVGLangSpace {
+class SVGStyleElement extends SVGElement implements SVGLangSpace {
+  SVGStyleElement.internal(): super.internal();
+
 
   /** @domName SVGStyleElement.disabled */
-  bool disabled;
-
-  /** @domName SVGStyleElement.media */
-  String media;
-
-  /** @domName SVGStyleElement.title */
-  String title;
-
-  /** @domName SVGStyleElement.type */
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGStyleElementImpl extends _SVGElementImpl implements SVGStyleElement {
-
   bool get disabled native "SVGStyleElement_disabled_Getter";
 
+
+  /** @domName SVGStyleElement.disabled */
   void set disabled(bool value) native "SVGStyleElement_disabled_Setter";
 
+
+  /** @domName SVGStyleElement.media */
   String get media native "SVGStyleElement_media_Getter";
 
+
+  /** @domName SVGStyleElement.media */
   void set media(String value) native "SVGStyleElement_media_Setter";
 
+
+  /** @domName SVGStyleElement.title */
   String get title native "SVGStyleElement_title_Getter";
 
+
+  /** @domName SVGStyleElement.title */
   void set title(String value) native "SVGStyleElement_title_Setter";
 
+
+  /** @domName SVGStyleElement.type */
   String get type native "SVGStyleElement_type_Getter";
 
+
+  /** @domName SVGStyleElement.type */
   void set type(String value) native "SVGStyleElement_type_Setter";
 
+
+  /** @domName SVGStyleElement.xmllang */
   String get xmllang native "SVGStyleElement_xmllang_Getter";
 
+
+  /** @domName SVGStyleElement.xmllang */
   void set xmllang(String value) native "SVGStyleElement_xmllang_Setter";
 
+
+  /** @domName SVGStyleElement.xmlspace */
   String get xmlspace native "SVGStyleElement_xmlspace_Getter";
 
+
+  /** @domName SVGStyleElement.xmlspace */
   void set xmlspace(String value) native "SVGStyleElement_xmlspace_Setter";
 
 }
@@ -33610,52 +27032,83 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGSwitchElement
-abstract class SVGSwitchElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+class SVGSwitchElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
+  SVGSwitchElement.internal(): super.internal();
 
-// WARNING: Do not edit - generated code.
 
-class _SVGSwitchElementImpl extends _SVGElementImpl implements SVGSwitchElement {
-
+  /** @domName SVGSwitchElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGSwitchElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGSwitchElement.xmllang */
   String get xmllang native "SVGSwitchElement_xmllang_Getter";
 
+
+  /** @domName SVGSwitchElement.xmllang */
   void set xmllang(String value) native "SVGSwitchElement_xmllang_Setter";
 
+
+  /** @domName SVGSwitchElement.xmlspace */
   String get xmlspace native "SVGSwitchElement_xmlspace_Getter";
 
+
+  /** @domName SVGSwitchElement.xmlspace */
   void set xmlspace(String value) native "SVGSwitchElement_xmlspace_Setter";
 
+
+  /** @domName SVGSwitchElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGSwitchElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGSwitchElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGSwitchElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGSwitchElement.getBBox */
   SVGRect getBBox() native "SVGSwitchElement_getBBox_Callback";
 
+
+  /** @domName SVGSwitchElement.getCTM */
   SVGMatrix getCTM() native "SVGSwitchElement_getCTM_Callback";
 
+
+  /** @domName SVGSwitchElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGSwitchElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGSwitchElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGSwitchElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGSwitchElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGSwitchElement_className_Getter";
 
+
+  /** @domName SVGSwitchElement.style */
   CSSStyleDeclaration get style native "SVGSwitchElement_style_Getter";
 
+
+  /** @domName SVGSwitchElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGSwitchElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGSwitchElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGSwitchElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGSwitchElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGSwitchElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGSwitchElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGSwitchElement_systemLanguage_Getter";
 
+
+  /** @domName SVGSwitchElement.hasExtension */
   bool hasExtension(String extension) native "SVGSwitchElement_hasExtension_Callback";
 
+
+  /** @domName SVGSwitchElement.transform */
   SVGAnimatedTransformList get transform native "SVGSwitchElement_transform_Getter";
 
 }
@@ -33666,34 +27119,47 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGSymbolElement
-abstract class SVGSymbolElement implements SVGElement, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGFitToViewBox {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+class SVGSymbolElement extends SVGElement implements SVGLangSpace, SVGFitToViewBox, SVGExternalResourcesRequired, SVGStylable {
+  SVGSymbolElement.internal(): super.internal();
 
-// WARNING: Do not edit - generated code.
 
-class _SVGSymbolElementImpl extends _SVGElementImpl implements SVGSymbolElement {
-
+  /** @domName SVGSymbolElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGSymbolElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGSymbolElement.preserveAspectRatio */
   SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSymbolElement_preserveAspectRatio_Getter";
 
+
+  /** @domName SVGSymbolElement.viewBox */
   SVGAnimatedRect get viewBox native "SVGSymbolElement_viewBox_Getter";
 
+
+  /** @domName SVGSymbolElement.xmllang */
   String get xmllang native "SVGSymbolElement_xmllang_Getter";
 
+
+  /** @domName SVGSymbolElement.xmllang */
   void set xmllang(String value) native "SVGSymbolElement_xmllang_Setter";
 
+
+  /** @domName SVGSymbolElement.xmlspace */
   String get xmlspace native "SVGSymbolElement_xmlspace_Getter";
 
+
+  /** @domName SVGSymbolElement.xmlspace */
   void set xmlspace(String value) native "SVGSymbolElement_xmlspace_Setter";
 
+
+  /** @domName SVGSymbolElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGSymbolElement_className_Getter";
 
+
+  /** @domName SVGSymbolElement.style */
   CSSStyleDeclaration get style native "SVGSymbolElement_style_Getter";
 
+
+  /** @domName SVGSymbolElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGSymbolElement_getPresentationAttribute_Callback";
 
 }
@@ -33704,16 +27170,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGTRefElement
-abstract class SVGTRefElement implements SVGTextPositioningElement, SVGURIReference {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+class SVGTRefElement extends SVGTextPositioningElement implements SVGURIReference {
+  SVGTRefElement.internal(): super.internal();
 
-// WARNING: Do not edit - generated code.
 
-class _SVGTRefElementImpl extends _SVGTextPositioningElementImpl implements SVGTRefElement {
-
+  /** @domName SVGTRefElement.href */
   SVGAnimatedString get href native "SVGTRefElement_href_Getter";
 
 }
@@ -33724,15 +27185,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGTSpanElement
-abstract class SVGTSpanElement implements SVGTextPositioningElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGTSpanElementImpl extends _SVGTextPositioningElementImpl implements SVGTSpanElement {
+class SVGTSpanElement extends SVGTextPositioningElement {
+  SVGTSpanElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33742,19 +27196,25 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGTests
-abstract class SVGTests {
+class SVGTests extends NativeFieldWrapperClass1 {
+  SVGTests.internal();
+
 
   /** @domName SVGTests.requiredExtensions */
-  SVGStringList get requiredExtensions;
+  SVGStringList get requiredExtensions native "SVGTests_requiredExtensions_Getter";
+
 
   /** @domName SVGTests.requiredFeatures */
-  SVGStringList get requiredFeatures;
+  SVGStringList get requiredFeatures native "SVGTests_requiredFeatures_Getter";
+
 
   /** @domName SVGTests.systemLanguage */
-  SVGStringList get systemLanguage;
+  SVGStringList get systemLanguage native "SVGTests_systemLanguage_Getter";
+
 
   /** @domName SVGTests.hasExtension */
-  bool hasExtension(String extension);
+  bool hasExtension(String extension) native "SVGTests_hasExtension_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -33763,7 +27223,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGTextContentElement
-abstract class SVGTextContentElement implements SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable {
+class SVGTextContentElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGExternalResourcesRequired {
+  SVGTextContentElement.internal(): super.internal();
 
   static const int LENGTHADJUST_SPACING = 1;
 
@@ -33771,91 +27232,96 @@
 
   static const int LENGTHADJUST_UNKNOWN = 0;
 
+
   /** @domName SVGTextContentElement.lengthAdjust */
-  SVGAnimatedEnumeration get lengthAdjust;
-
-  /** @domName SVGTextContentElement.textLength */
-  SVGAnimatedLength get textLength;
-
-  /** @domName SVGTextContentElement.getCharNumAtPosition */
-  int getCharNumAtPosition(SVGPoint point);
-
-  /** @domName SVGTextContentElement.getComputedTextLength */
-  num getComputedTextLength();
-
-  /** @domName SVGTextContentElement.getEndPositionOfChar */
-  SVGPoint getEndPositionOfChar(int offset);
-
-  /** @domName SVGTextContentElement.getExtentOfChar */
-  SVGRect getExtentOfChar(int offset);
-
-  /** @domName SVGTextContentElement.getNumberOfChars */
-  int getNumberOfChars();
-
-  /** @domName SVGTextContentElement.getRotationOfChar */
-  num getRotationOfChar(int offset);
-
-  /** @domName SVGTextContentElement.getStartPositionOfChar */
-  SVGPoint getStartPositionOfChar(int offset);
-
-  /** @domName SVGTextContentElement.getSubStringLength */
-  num getSubStringLength(int offset, int length);
-
-  /** @domName SVGTextContentElement.selectSubString */
-  void selectSubString(int offset, int length);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGTextContentElementImpl extends _SVGElementImpl implements SVGTextContentElement {
-
   SVGAnimatedEnumeration get lengthAdjust native "SVGTextContentElement_lengthAdjust_Getter";
 
+
+  /** @domName SVGTextContentElement.textLength */
   SVGAnimatedLength get textLength native "SVGTextContentElement_textLength_Getter";
 
+
+  /** @domName SVGTextContentElement.getCharNumAtPosition */
   int getCharNumAtPosition(SVGPoint point) native "SVGTextContentElement_getCharNumAtPosition_Callback";
 
+
+  /** @domName SVGTextContentElement.getComputedTextLength */
   num getComputedTextLength() native "SVGTextContentElement_getComputedTextLength_Callback";
 
+
+  /** @domName SVGTextContentElement.getEndPositionOfChar */
   SVGPoint getEndPositionOfChar(int offset) native "SVGTextContentElement_getEndPositionOfChar_Callback";
 
+
+  /** @domName SVGTextContentElement.getExtentOfChar */
   SVGRect getExtentOfChar(int offset) native "SVGTextContentElement_getExtentOfChar_Callback";
 
+
+  /** @domName SVGTextContentElement.getNumberOfChars */
   int getNumberOfChars() native "SVGTextContentElement_getNumberOfChars_Callback";
 
+
+  /** @domName SVGTextContentElement.getRotationOfChar */
   num getRotationOfChar(int offset) native "SVGTextContentElement_getRotationOfChar_Callback";
 
+
+  /** @domName SVGTextContentElement.getStartPositionOfChar */
   SVGPoint getStartPositionOfChar(int offset) native "SVGTextContentElement_getStartPositionOfChar_Callback";
 
+
+  /** @domName SVGTextContentElement.getSubStringLength */
   num getSubStringLength(int offset, int length) native "SVGTextContentElement_getSubStringLength_Callback";
 
+
+  /** @domName SVGTextContentElement.selectSubString */
   void selectSubString(int offset, int length) native "SVGTextContentElement_selectSubString_Callback";
 
+
+  /** @domName SVGTextContentElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGTextContentElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGTextContentElement.xmllang */
   String get xmllang native "SVGTextContentElement_xmllang_Getter";
 
+
+  /** @domName SVGTextContentElement.xmllang */
   void set xmllang(String value) native "SVGTextContentElement_xmllang_Setter";
 
+
+  /** @domName SVGTextContentElement.xmlspace */
   String get xmlspace native "SVGTextContentElement_xmlspace_Getter";
 
+
+  /** @domName SVGTextContentElement.xmlspace */
   void set xmlspace(String value) native "SVGTextContentElement_xmlspace_Setter";
 
+
+  /** @domName SVGTextContentElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGTextContentElement_className_Getter";
 
+
+  /** @domName SVGTextContentElement.style */
   CSSStyleDeclaration get style native "SVGTextContentElement_style_Getter";
 
+
+  /** @domName SVGTextContentElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGTextContentElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGTextContentElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGTextContentElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGTextContentElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGTextContentElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGTextContentElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGTextContentElement_systemLanguage_Getter";
 
+
+  /** @domName SVGTextContentElement.hasExtension */
   bool hasExtension(String extension) native "SVGTextContentElement_hasExtension_Callback";
 
 }
@@ -33866,28 +27332,35 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGTextElement
-abstract class SVGTextElement implements SVGTextPositioningElement, SVGTransformable {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+class SVGTextElement extends SVGTextPositioningElement implements SVGTransformable {
+  SVGTextElement.internal(): super.internal();
 
-// WARNING: Do not edit - generated code.
 
-class _SVGTextElementImpl extends _SVGTextPositioningElementImpl implements SVGTextElement {
-
+  /** @domName SVGTextElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGTextElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGTextElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGTextElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGTextElement.getBBox */
   SVGRect getBBox() native "SVGTextElement_getBBox_Callback";
 
+
+  /** @domName SVGTextElement.getCTM */
   SVGMatrix getCTM() native "SVGTextElement_getCTM_Callback";
 
+
+  /** @domName SVGTextElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGTextElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGTextElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGTextElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGTextElement.transform */
   SVGAnimatedTransformList get transform native "SVGTextElement_transform_Getter";
 
 }
@@ -33898,7 +27371,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGTextPathElement
-abstract class SVGTextPathElement implements SVGTextContentElement, SVGURIReference {
+class SVGTextPathElement extends SVGTextContentElement implements SVGURIReference {
+  SVGTextPathElement.internal(): super.internal();
 
   static const int TEXTPATH_METHODTYPE_ALIGN = 1;
 
@@ -33912,29 +27386,20 @@
 
   static const int TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
 
+
   /** @domName SVGTextPathElement.method */
-  SVGAnimatedEnumeration get method;
-
-  /** @domName SVGTextPathElement.spacing */
-  SVGAnimatedEnumeration get spacing;
-
-  /** @domName SVGTextPathElement.startOffset */
-  SVGAnimatedLength get startOffset;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGTextPathElementImpl extends _SVGTextContentElementImpl implements SVGTextPathElement {
-
   SVGAnimatedEnumeration get method native "SVGTextPathElement_method_Getter";
 
+
+  /** @domName SVGTextPathElement.spacing */
   SVGAnimatedEnumeration get spacing native "SVGTextPathElement_spacing_Getter";
 
+
+  /** @domName SVGTextPathElement.startOffset */
   SVGAnimatedLength get startOffset native "SVGTextPathElement_startOffset_Getter";
 
+
+  /** @domName SVGTextPathElement.href */
   SVGAnimatedString get href native "SVGTextPathElement_href_Getter";
 
 }
@@ -33945,39 +27410,27 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGTextPositioningElement
-abstract class SVGTextPositioningElement implements SVGTextContentElement {
+class SVGTextPositioningElement extends SVGTextContentElement {
+  SVGTextPositioningElement.internal(): super.internal();
+
 
   /** @domName SVGTextPositioningElement.dx */
-  SVGAnimatedLengthList get dx;
-
-  /** @domName SVGTextPositioningElement.dy */
-  SVGAnimatedLengthList get dy;
-
-  /** @domName SVGTextPositioningElement.rotate */
-  SVGAnimatedNumberList get rotate;
-
-  /** @domName SVGTextPositioningElement.x */
-  SVGAnimatedLengthList get x;
-
-  /** @domName SVGTextPositioningElement.y */
-  SVGAnimatedLengthList get y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGTextPositioningElementImpl extends _SVGTextContentElementImpl implements SVGTextPositioningElement {
-
   SVGAnimatedLengthList get dx native "SVGTextPositioningElement_dx_Getter";
 
+
+  /** @domName SVGTextPositioningElement.dy */
   SVGAnimatedLengthList get dy native "SVGTextPositioningElement_dy_Getter";
 
+
+  /** @domName SVGTextPositioningElement.rotate */
   SVGAnimatedNumberList get rotate native "SVGTextPositioningElement_rotate_Getter";
 
+
+  /** @domName SVGTextPositioningElement.x */
   SVGAnimatedLengthList get x native "SVGTextPositioningElement_x_Getter";
 
+
+  /** @domName SVGTextPositioningElement.y */
   SVGAnimatedLengthList get y native "SVGTextPositioningElement_y_Getter";
 
 }
@@ -33988,28 +27441,35 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGTitleElement
-abstract class SVGTitleElement implements SVGElement, SVGLangSpace, SVGStylable {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
+class SVGTitleElement extends SVGElement implements SVGLangSpace, SVGStylable {
+  SVGTitleElement.internal(): super.internal();
 
-// WARNING: Do not edit - generated code.
 
-class _SVGTitleElementImpl extends _SVGElementImpl implements SVGTitleElement {
-
+  /** @domName SVGTitleElement.xmllang */
   String get xmllang native "SVGTitleElement_xmllang_Getter";
 
+
+  /** @domName SVGTitleElement.xmllang */
   void set xmllang(String value) native "SVGTitleElement_xmllang_Setter";
 
+
+  /** @domName SVGTitleElement.xmlspace */
   String get xmlspace native "SVGTitleElement_xmlspace_Getter";
 
+
+  /** @domName SVGTitleElement.xmlspace */
   void set xmlspace(String value) native "SVGTitleElement_xmlspace_Setter";
 
+
+  /** @domName SVGTitleElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGTitleElement_className_Getter";
 
+
+  /** @domName SVGTitleElement.style */
   CSSStyleDeclaration get style native "SVGTitleElement_style_Getter";
 
+
+  /** @domName SVGTitleElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGTitleElement_getPresentationAttribute_Callback";
 
 }
@@ -34020,7 +27480,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGTransform
-abstract class SVGTransform {
+class SVGTransform extends NativeFieldWrapperClass1 {
+  SVGTransform.internal();
 
   static const int SVG_TRANSFORM_MATRIX = 1;
 
@@ -34036,57 +27497,40 @@
 
   static const int SVG_TRANSFORM_UNKNOWN = 0;
 
+
   /** @domName SVGTransform.angle */
-  num get angle;
-
-  /** @domName SVGTransform.matrix */
-  SVGMatrix get matrix;
-
-  /** @domName SVGTransform.type */
-  int get type;
-
-  /** @domName SVGTransform.setMatrix */
-  void setMatrix(SVGMatrix matrix);
-
-  /** @domName SVGTransform.setRotate */
-  void setRotate(num angle, num cx, num cy);
-
-  /** @domName SVGTransform.setScale */
-  void setScale(num sx, num sy);
-
-  /** @domName SVGTransform.setSkewX */
-  void setSkewX(num angle);
-
-  /** @domName SVGTransform.setSkewY */
-  void setSkewY(num angle);
-
-  /** @domName SVGTransform.setTranslate */
-  void setTranslate(num tx, num ty);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGTransformImpl extends NativeFieldWrapperClass1 implements SVGTransform {
-
   num get angle native "SVGTransform_angle_Getter";
 
+
+  /** @domName SVGTransform.matrix */
   SVGMatrix get matrix native "SVGTransform_matrix_Getter";
 
+
+  /** @domName SVGTransform.type */
   int get type native "SVGTransform_type_Getter";
 
+
+  /** @domName SVGTransform.setMatrix */
   void setMatrix(SVGMatrix matrix) native "SVGTransform_setMatrix_Callback";
 
+
+  /** @domName SVGTransform.setRotate */
   void setRotate(num angle, num cx, num cy) native "SVGTransform_setRotate_Callback";
 
+
+  /** @domName SVGTransform.setScale */
   void setScale(num sx, num sy) native "SVGTransform_setScale_Callback";
 
+
+  /** @domName SVGTransform.setSkewX */
   void setSkewX(num angle) native "SVGTransform_setSkewX_Callback";
 
+
+  /** @domName SVGTransform.setSkewY */
   void setSkewY(num angle) native "SVGTransform_setSkewY_Callback";
 
+
+  /** @domName SVGTransform.setTranslate */
   void setTranslate(num tx, num ty) native "SVGTransform_setTranslate_Callback";
 
 }
@@ -34097,46 +27541,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGTransformList
-abstract class SVGTransformList implements List<SVGTransform> {
+class SVGTransformList extends NativeFieldWrapperClass1 implements List<SVGTransform> {
+  SVGTransformList.internal();
+
 
   /** @domName SVGTransformList.numberOfItems */
-  int get numberOfItems;
-
-  /** @domName SVGTransformList.appendItem */
-  SVGTransform appendItem(SVGTransform item);
-
-  /** @domName SVGTransformList.clear */
-  void clear();
-
-  /** @domName SVGTransformList.consolidate */
-  SVGTransform consolidate();
-
-  /** @domName SVGTransformList.createSVGTransformFromMatrix */
-  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix);
-
-  /** @domName SVGTransformList.getItem */
-  SVGTransform getItem(int index);
-
-  /** @domName SVGTransformList.initialize */
-  SVGTransform initialize(SVGTransform item);
-
-  /** @domName SVGTransformList.insertItemBefore */
-  SVGTransform insertItemBefore(SVGTransform item, int index);
-
-  /** @domName SVGTransformList.removeItem */
-  SVGTransform removeItem(int index);
-
-  /** @domName SVGTransformList.replaceItem */
-  SVGTransform replaceItem(SVGTransform item, int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGTransformListImpl extends NativeFieldWrapperClass1 implements SVGTransformList {
-
   int get numberOfItems native "SVGTransformList_numberOfItems_Getter";
 
   SVGTransform operator[](int index) native "SVGTransformList_item_Callback";
@@ -34222,22 +27631,40 @@
 
   // -- end List<SVGTransform> mixins.
 
+
+  /** @domName SVGTransformList.appendItem */
   SVGTransform appendItem(SVGTransform item) native "SVGTransformList_appendItem_Callback";
 
+
+  /** @domName SVGTransformList.clear */
   void clear() native "SVGTransformList_clear_Callback";
 
+
+  /** @domName SVGTransformList.consolidate */
   SVGTransform consolidate() native "SVGTransformList_consolidate_Callback";
 
+
+  /** @domName SVGTransformList.createSVGTransformFromMatrix */
   SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
 
+
+  /** @domName SVGTransformList.getItem */
   SVGTransform getItem(int index) native "SVGTransformList_getItem_Callback";
 
+
+  /** @domName SVGTransformList.initialize */
   SVGTransform initialize(SVGTransform item) native "SVGTransformList_initialize_Callback";
 
+
+  /** @domName SVGTransformList.insertItemBefore */
   SVGTransform insertItemBefore(SVGTransform item, int index) native "SVGTransformList_insertItemBefore_Callback";
 
+
+  /** @domName SVGTransformList.removeItem */
   SVGTransform removeItem(int index) native "SVGTransformList_removeItem_Callback";
 
+
+  /** @domName SVGTransformList.replaceItem */
   SVGTransform replaceItem(SVGTransform item, int index) native "SVGTransformList_replaceItem_Callback";
 
 }
@@ -34248,10 +27675,37 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGTransformable
-abstract class SVGTransformable implements SVGLocatable {
+class SVGTransformable extends NativeFieldWrapperClass1 implements SVGLocatable {
+  SVGTransformable.internal();
+
 
   /** @domName SVGTransformable.transform */
-  SVGAnimatedTransformList get transform;
+  SVGAnimatedTransformList get transform native "SVGTransformable_transform_Getter";
+
+
+  /** @domName SVGTransformable.farthestViewportElement */
+  SVGElement get farthestViewportElement native "SVGTransformable_farthestViewportElement_Getter";
+
+
+  /** @domName SVGTransformable.nearestViewportElement */
+  SVGElement get nearestViewportElement native "SVGTransformable_nearestViewportElement_Getter";
+
+
+  /** @domName SVGTransformable.getBBox */
+  SVGRect getBBox() native "SVGTransformable_getBBox_Callback";
+
+
+  /** @domName SVGTransformable.getCTM */
+  SVGMatrix getCTM() native "SVGTransformable_getCTM_Callback";
+
+
+  /** @domName SVGTransformable.getScreenCTM */
+  SVGMatrix getScreenCTM() native "SVGTransformable_getScreenCTM_Callback";
+
+
+  /** @domName SVGTransformable.getTransformToElement */
+  SVGMatrix getTransformToElement(SVGElement element) native "SVGTransformable_getTransformToElement_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -34260,10 +27714,13 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGURIReference
-abstract class SVGURIReference {
+class SVGURIReference extends NativeFieldWrapperClass1 {
+  SVGURIReference.internal();
+
 
   /** @domName SVGURIReference.href */
-  SVGAnimatedString get href;
+  SVGAnimatedString get href native "SVGURIReference_href_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -34272,21 +27729,14 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGUnitTypes
-abstract class SVGUnitTypes {
+class SVGUnitTypes extends NativeFieldWrapperClass1 {
+  SVGUnitTypes.internal();
 
   static const int SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
 
   static const int SVG_UNIT_TYPE_UNKNOWN = 0;
 
   static const int SVG_UNIT_TYPE_USERSPACEONUSE = 1;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGUnitTypesImpl extends NativeFieldWrapperClass1 implements SVGUnitTypes {
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34296,84 +27746,111 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGUseElement
-abstract class SVGUseElement implements SVGElement, SVGURIReference, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+class SVGUseElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable {
+  SVGUseElement.internal(): super.internal();
+
 
   /** @domName SVGUseElement.animatedInstanceRoot */
-  SVGElementInstance get animatedInstanceRoot;
-
-  /** @domName SVGUseElement.height */
-  SVGAnimatedLength get height;
-
-  /** @domName SVGUseElement.instanceRoot */
-  SVGElementInstance get instanceRoot;
-
-  /** @domName SVGUseElement.width */
-  SVGAnimatedLength get width;
-
-  /** @domName SVGUseElement.x */
-  SVGAnimatedLength get x;
-
-  /** @domName SVGUseElement.y */
-  SVGAnimatedLength get y;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGUseElementImpl extends _SVGElementImpl implements SVGUseElement {
-
   SVGElementInstance get animatedInstanceRoot native "SVGUseElement_animatedInstanceRoot_Getter";
 
+
+  /** @domName SVGUseElement.height */
   SVGAnimatedLength get height native "SVGUseElement_height_Getter";
 
+
+  /** @domName SVGUseElement.instanceRoot */
   SVGElementInstance get instanceRoot native "SVGUseElement_instanceRoot_Getter";
 
+
+  /** @domName SVGUseElement.width */
   SVGAnimatedLength get width native "SVGUseElement_width_Getter";
 
+
+  /** @domName SVGUseElement.x */
   SVGAnimatedLength get x native "SVGUseElement_x_Getter";
 
+
+  /** @domName SVGUseElement.y */
   SVGAnimatedLength get y native "SVGUseElement_y_Getter";
 
+
+  /** @domName SVGUseElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGUseElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGUseElement.xmllang */
   String get xmllang native "SVGUseElement_xmllang_Getter";
 
+
+  /** @domName SVGUseElement.xmllang */
   void set xmllang(String value) native "SVGUseElement_xmllang_Setter";
 
+
+  /** @domName SVGUseElement.xmlspace */
   String get xmlspace native "SVGUseElement_xmlspace_Getter";
 
+
+  /** @domName SVGUseElement.xmlspace */
   void set xmlspace(String value) native "SVGUseElement_xmlspace_Setter";
 
+
+  /** @domName SVGUseElement.farthestViewportElement */
   SVGElement get farthestViewportElement native "SVGUseElement_farthestViewportElement_Getter";
 
+
+  /** @domName SVGUseElement.nearestViewportElement */
   SVGElement get nearestViewportElement native "SVGUseElement_nearestViewportElement_Getter";
 
+
+  /** @domName SVGUseElement.getBBox */
   SVGRect getBBox() native "SVGUseElement_getBBox_Callback";
 
+
+  /** @domName SVGUseElement.getCTM */
   SVGMatrix getCTM() native "SVGUseElement_getCTM_Callback";
 
+
+  /** @domName SVGUseElement.getScreenCTM */
   SVGMatrix getScreenCTM() native "SVGUseElement_getScreenCTM_Callback";
 
+
+  /** @domName SVGUseElement.getTransformToElement */
   SVGMatrix getTransformToElement(SVGElement element) native "SVGUseElement_getTransformToElement_Callback";
 
+
+  /** @domName SVGUseElement.className */
   SVGAnimatedString get $dom_svgClassName native "SVGUseElement_className_Getter";
 
+
+  /** @domName SVGUseElement.style */
   CSSStyleDeclaration get style native "SVGUseElement_style_Getter";
 
+
+  /** @domName SVGUseElement.getPresentationAttribute */
   CSSValue getPresentationAttribute(String name) native "SVGUseElement_getPresentationAttribute_Callback";
 
+
+  /** @domName SVGUseElement.requiredExtensions */
   SVGStringList get requiredExtensions native "SVGUseElement_requiredExtensions_Getter";
 
+
+  /** @domName SVGUseElement.requiredFeatures */
   SVGStringList get requiredFeatures native "SVGUseElement_requiredFeatures_Getter";
 
+
+  /** @domName SVGUseElement.systemLanguage */
   SVGStringList get systemLanguage native "SVGUseElement_systemLanguage_Getter";
 
+
+  /** @domName SVGUseElement.hasExtension */
   bool hasExtension(String extension) native "SVGUseElement_hasExtension_Callback";
 
+
+  /** @domName SVGUseElement.transform */
   SVGAnimatedTransformList get transform native "SVGUseElement_transform_Getter";
 
+
+  /** @domName SVGUseElement.href */
   SVGAnimatedString get href native "SVGUseElement_href_Getter";
 
 }
@@ -34384,15 +27861,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGVKernElement
-abstract class SVGVKernElement implements SVGElement {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGVKernElementImpl extends _SVGElementImpl implements SVGVKernElement {
+class SVGVKernElement extends SVGElement {
+  SVGVKernElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34402,29 +27872,31 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGViewElement
-abstract class SVGViewElement implements SVGElement, SVGExternalResourcesRequired, SVGFitToViewBox, SVGZoomAndPan {
+class SVGViewElement extends SVGElement implements SVGFitToViewBox, SVGZoomAndPan, SVGExternalResourcesRequired {
+  SVGViewElement.internal(): super.internal();
+
 
   /** @domName SVGViewElement.viewTarget */
-  SVGStringList get viewTarget;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGViewElementImpl extends _SVGElementImpl implements SVGViewElement {
-
   SVGStringList get viewTarget native "SVGViewElement_viewTarget_Getter";
 
+
+  /** @domName SVGViewElement.externalResourcesRequired */
   SVGAnimatedBoolean get externalResourcesRequired native "SVGViewElement_externalResourcesRequired_Getter";
 
+
+  /** @domName SVGViewElement.preserveAspectRatio */
   SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGViewElement_preserveAspectRatio_Getter";
 
+
+  /** @domName SVGViewElement.viewBox */
   SVGAnimatedRect get viewBox native "SVGViewElement_viewBox_Getter";
 
+
+  /** @domName SVGViewElement.zoomAndPan */
   int get zoomAndPan native "SVGViewElement_zoomAndPan_Getter";
 
+
+  /** @domName SVGViewElement.zoomAndPan */
   void set zoomAndPan(int value) native "SVGViewElement_zoomAndPan_Setter";
 
 }
@@ -34435,61 +27907,47 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGViewSpec
-abstract class SVGViewSpec {
+class SVGViewSpec extends NativeFieldWrapperClass1 {
+  SVGViewSpec.internal();
+
 
   /** @domName SVGViewSpec.preserveAspectRatio */
-  SVGAnimatedPreserveAspectRatio get preserveAspectRatio;
-
-  /** @domName SVGViewSpec.preserveAspectRatioString */
-  String get preserveAspectRatioString;
-
-  /** @domName SVGViewSpec.transform */
-  SVGTransformList get transform;
-
-  /** @domName SVGViewSpec.transformString */
-  String get transformString;
-
-  /** @domName SVGViewSpec.viewBox */
-  SVGAnimatedRect get viewBox;
-
-  /** @domName SVGViewSpec.viewBoxString */
-  String get viewBoxString;
-
-  /** @domName SVGViewSpec.viewTarget */
-  SVGElement get viewTarget;
-
-  /** @domName SVGViewSpec.viewTargetString */
-  String get viewTargetString;
-
-  /** @domName SVGViewSpec.zoomAndPan */
-  int zoomAndPan;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGViewSpecImpl extends NativeFieldWrapperClass1 implements SVGViewSpec {
-
   SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGViewSpec_preserveAspectRatio_Getter";
 
+
+  /** @domName SVGViewSpec.preserveAspectRatioString */
   String get preserveAspectRatioString native "SVGViewSpec_preserveAspectRatioString_Getter";
 
+
+  /** @domName SVGViewSpec.transform */
   SVGTransformList get transform native "SVGViewSpec_transform_Getter";
 
+
+  /** @domName SVGViewSpec.transformString */
   String get transformString native "SVGViewSpec_transformString_Getter";
 
+
+  /** @domName SVGViewSpec.viewBox */
   SVGAnimatedRect get viewBox native "SVGViewSpec_viewBox_Getter";
 
+
+  /** @domName SVGViewSpec.viewBoxString */
   String get viewBoxString native "SVGViewSpec_viewBoxString_Getter";
 
+
+  /** @domName SVGViewSpec.viewTarget */
   SVGElement get viewTarget native "SVGViewSpec_viewTarget_Getter";
 
+
+  /** @domName SVGViewSpec.viewTargetString */
   String get viewTargetString native "SVGViewSpec_viewTargetString_Getter";
 
+
+  /** @domName SVGViewSpec.zoomAndPan */
   int get zoomAndPan native "SVGViewSpec_zoomAndPan_Getter";
 
+
+  /** @domName SVGViewSpec.zoomAndPan */
   void set zoomAndPan(int value) native "SVGViewSpec_zoomAndPan_Setter";
 
 }
@@ -34500,7 +27958,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGZoomAndPan
-abstract class SVGZoomAndPan {
+class SVGZoomAndPan extends NativeFieldWrapperClass1 {
+  SVGZoomAndPan.internal();
 
   static const int SVG_ZOOMANDPAN_DISABLE = 1;
 
@@ -34508,8 +27967,14 @@
 
   static const int SVG_ZOOMANDPAN_UNKNOWN = 0;
 
+
   /** @domName SVGZoomAndPan.zoomAndPan */
-  int zoomAndPan;
+  int get zoomAndPan native "SVGZoomAndPan_zoomAndPan_Getter";
+
+
+  /** @domName SVGZoomAndPan.zoomAndPan */
+  void set zoomAndPan(int value) native "SVGZoomAndPan_zoomAndPan_Setter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -34518,39 +27983,27 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SVGZoomEvent
-abstract class SVGZoomEvent implements UIEvent {
+class SVGZoomEvent extends UIEvent {
+  SVGZoomEvent.internal(): super.internal();
+
 
   /** @domName SVGZoomEvent.newScale */
-  num get newScale;
-
-  /** @domName SVGZoomEvent.newTranslate */
-  SVGPoint get newTranslate;
-
-  /** @domName SVGZoomEvent.previousScale */
-  num get previousScale;
-
-  /** @domName SVGZoomEvent.previousTranslate */
-  SVGPoint get previousTranslate;
-
-  /** @domName SVGZoomEvent.zoomRectScreen */
-  SVGRect get zoomRectScreen;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SVGZoomEventImpl extends _UIEventImpl implements SVGZoomEvent {
-
   num get newScale native "SVGZoomEvent_newScale_Getter";
 
+
+  /** @domName SVGZoomEvent.newTranslate */
   SVGPoint get newTranslate native "SVGZoomEvent_newTranslate_Getter";
 
+
+  /** @domName SVGZoomEvent.previousScale */
   num get previousScale native "SVGZoomEvent_previousScale_Getter";
 
+
+  /** @domName SVGZoomEvent.previousTranslate */
   SVGPoint get previousTranslate native "SVGZoomEvent_previousTranslate_Getter";
 
+
+  /** @domName SVGZoomEvent.zoomRectScreen */
   SVGRect get zoomRectScreen native "SVGZoomEvent_zoomRectScreen_Getter";
 
 }
@@ -34561,54 +28014,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Screen
-abstract class Screen {
+class Screen extends NativeFieldWrapperClass1 {
+  Screen.internal();
+
 
   /** @domName Screen.availHeight */
-  int get availHeight;
-
-  /** @domName Screen.availLeft */
-  int get availLeft;
-
-  /** @domName Screen.availTop */
-  int get availTop;
-
-  /** @domName Screen.availWidth */
-  int get availWidth;
-
-  /** @domName Screen.colorDepth */
-  int get colorDepth;
-
-  /** @domName Screen.height */
-  int get height;
-
-  /** @domName Screen.pixelDepth */
-  int get pixelDepth;
-
-  /** @domName Screen.width */
-  int get width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ScreenImpl extends NativeFieldWrapperClass1 implements Screen {
-
   int get availHeight native "Screen_availHeight_Getter";
 
+
+  /** @domName Screen.availLeft */
   int get availLeft native "Screen_availLeft_Getter";
 
+
+  /** @domName Screen.availTop */
   int get availTop native "Screen_availTop_Getter";
 
+
+  /** @domName Screen.availWidth */
   int get availWidth native "Screen_availWidth_Getter";
 
+
+  /** @domName Screen.colorDepth */
   int get colorDepth native "Screen_colorDepth_Getter";
 
+
+  /** @domName Screen.height */
   int get height native "Screen_height_Getter";
 
+
+  /** @domName Screen.pixelDepth */
   int get pixelDepth native "Screen_pixelDepth_Getter";
 
+
+  /** @domName Screen.width */
   int get width native "Screen_width_Getter";
 
 }
@@ -34619,72 +28057,73 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLScriptElement
-abstract class ScriptElement implements Element {
+class ScriptElement extends _Element_Merged {
 
   factory ScriptElement() => _Elements.createScriptElement();
+  ScriptElement.internal(): super.internal();
+
 
   /** @domName HTMLScriptElement.async */
-  bool async;
-
-  /** @domName HTMLScriptElement.charset */
-  String charset;
-
-  /** @domName HTMLScriptElement.crossOrigin */
-  String crossOrigin;
-
-  /** @domName HTMLScriptElement.defer */
-  bool defer;
-
-  /** @domName HTMLScriptElement.event */
-  String event;
-
-  /** @domName HTMLScriptElement.htmlFor */
-  String htmlFor;
-
-  /** @domName HTMLScriptElement.src */
-  String src;
-
-  /** @domName HTMLScriptElement.type */
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ScriptElementImpl extends _ElementImpl_Merged implements ScriptElement {
-
   bool get async native "HTMLScriptElement_async_Getter";
 
+
+  /** @domName HTMLScriptElement.async */
   void set async(bool value) native "HTMLScriptElement_async_Setter";
 
+
+  /** @domName HTMLScriptElement.charset */
   String get charset native "HTMLScriptElement_charset_Getter";
 
+
+  /** @domName HTMLScriptElement.charset */
   void set charset(String value) native "HTMLScriptElement_charset_Setter";
 
+
+  /** @domName HTMLScriptElement.crossOrigin */
   String get crossOrigin native "HTMLScriptElement_crossOrigin_Getter";
 
+
+  /** @domName HTMLScriptElement.crossOrigin */
   void set crossOrigin(String value) native "HTMLScriptElement_crossOrigin_Setter";
 
+
+  /** @domName HTMLScriptElement.defer */
   bool get defer native "HTMLScriptElement_defer_Getter";
 
+
+  /** @domName HTMLScriptElement.defer */
   void set defer(bool value) native "HTMLScriptElement_defer_Setter";
 
+
+  /** @domName HTMLScriptElement.event */
   String get event native "HTMLScriptElement_event_Getter";
 
+
+  /** @domName HTMLScriptElement.event */
   void set event(String value) native "HTMLScriptElement_event_Setter";
 
+
+  /** @domName HTMLScriptElement.htmlFor */
   String get htmlFor native "HTMLScriptElement_htmlFor_Getter";
 
+
+  /** @domName HTMLScriptElement.htmlFor */
   void set htmlFor(String value) native "HTMLScriptElement_htmlFor_Setter";
 
+
+  /** @domName HTMLScriptElement.src */
   String get src native "HTMLScriptElement_src_Getter";
 
+
+  /** @domName HTMLScriptElement.src */
   void set src(String value) native "HTMLScriptElement_src_Setter";
 
+
+  /** @domName HTMLScriptElement.type */
   String get type native "HTMLScriptElement_type_Getter";
 
+
+  /** @domName HTMLScriptElement.type */
   void set type(String value) native "HTMLScriptElement_type_Setter";
 
 }
@@ -34695,38 +28134,23 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ScriptProcessorNode
-abstract class ScriptProcessorNode implements AudioNode, EventTarget {
+class ScriptProcessorNode extends AudioNode implements EventTarget {
+  ScriptProcessorNode.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  ScriptProcessorNodeEvents get on;
+  ScriptProcessorNodeEvents get on =>
+    new ScriptProcessorNodeEvents(this);
+
 
   /** @domName ScriptProcessorNode.bufferSize */
-  int get bufferSize;
-}
-
-abstract class ScriptProcessorNodeEvents implements Events {
-
-  EventListenerList get audioProcess;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ScriptProcessorNodeImpl extends _AudioNodeImpl implements ScriptProcessorNode {
-
-  _ScriptProcessorNodeEventsImpl get on =>
-    new _ScriptProcessorNodeEventsImpl(this);
-
   int get bufferSize native "ScriptProcessorNode_bufferSize_Getter";
 
 }
 
-class _ScriptProcessorNodeEventsImpl extends _EventsImpl implements ScriptProcessorNodeEvents {
-  _ScriptProcessorNodeEventsImpl(_ptr) : super(_ptr);
+class ScriptProcessorNodeEvents extends Events {
+  ScriptProcessorNodeEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get audioProcess => this['audioprocess'];
 }
@@ -34737,29 +28161,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ScriptProfile
-abstract class ScriptProfile {
+class ScriptProfile extends NativeFieldWrapperClass1 {
+  ScriptProfile.internal();
+
 
   /** @domName ScriptProfile.head */
-  ScriptProfileNode get head;
-
-  /** @domName ScriptProfile.title */
-  String get title;
-
-  /** @domName ScriptProfile.uid */
-  int get uid;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ScriptProfileImpl extends NativeFieldWrapperClass1 implements ScriptProfile {
-
   ScriptProfileNode get head native "ScriptProfile_head_Getter";
 
+
+  /** @domName ScriptProfile.title */
   String get title native "ScriptProfile_title_Getter";
 
+
+  /** @domName ScriptProfile.uid */
   int get uid native "ScriptProfile_uid_Getter";
 
 }
@@ -34770,59 +28184,43 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ScriptProfileNode
-abstract class ScriptProfileNode {
+class ScriptProfileNode extends NativeFieldWrapperClass1 {
+  ScriptProfileNode.internal();
+
 
   /** @domName ScriptProfileNode.callUID */
-  int get callUID;
-
-  /** @domName ScriptProfileNode.functionName */
-  String get functionName;
-
-  /** @domName ScriptProfileNode.lineNumber */
-  int get lineNumber;
-
-  /** @domName ScriptProfileNode.numberOfCalls */
-  int get numberOfCalls;
-
-  /** @domName ScriptProfileNode.selfTime */
-  num get selfTime;
-
-  /** @domName ScriptProfileNode.totalTime */
-  num get totalTime;
-
-  /** @domName ScriptProfileNode.url */
-  String get url;
-
-  /** @domName ScriptProfileNode.visible */
-  bool get visible;
-
-  /** @domName ScriptProfileNode.children */
-  List<ScriptProfileNode> children();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ScriptProfileNodeImpl extends NativeFieldWrapperClass1 implements ScriptProfileNode {
-
   int get callUID native "ScriptProfileNode_callUID_Getter";
 
+
+  /** @domName ScriptProfileNode.functionName */
   String get functionName native "ScriptProfileNode_functionName_Getter";
 
+
+  /** @domName ScriptProfileNode.lineNumber */
   int get lineNumber native "ScriptProfileNode_lineNumber_Getter";
 
+
+  /** @domName ScriptProfileNode.numberOfCalls */
   int get numberOfCalls native "ScriptProfileNode_numberOfCalls_Getter";
 
+
+  /** @domName ScriptProfileNode.selfTime */
   num get selfTime native "ScriptProfileNode_selfTime_Getter";
 
+
+  /** @domName ScriptProfileNode.totalTime */
   num get totalTime native "ScriptProfileNode_totalTime_Getter";
 
+
+  /** @domName ScriptProfileNode.url */
   String get url native "ScriptProfileNode_url_Getter";
 
+
+  /** @domName ScriptProfileNode.visible */
   bool get visible native "ScriptProfileNode_visible_Getter";
 
+
+  /** @domName ScriptProfileNode.children */
   List<ScriptProfileNode> children() native "ScriptProfileNode_children_Callback";
 
 }
@@ -34833,139 +28231,129 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLSelectElement
-abstract class SelectElement implements Element {
+class SelectElement extends _Element_Merged {
 
   factory SelectElement() => _Elements.createSelectElement();
+  SelectElement.internal(): super.internal();
+
 
   /** @domName HTMLSelectElement.autofocus */
-  bool autofocus;
-
-  /** @domName HTMLSelectElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLSelectElement.form */
-  FormElement get form;
-
-  /** @domName HTMLSelectElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLSelectElement.length */
-  int length;
-
-  /** @domName HTMLSelectElement.multiple */
-  bool multiple;
-
-  /** @domName HTMLSelectElement.name */
-  String name;
-
-  /** @domName HTMLSelectElement.options */
-  HTMLOptionsCollection get options;
-
-  /** @domName HTMLSelectElement.required */
-  bool required;
-
-  /** @domName HTMLSelectElement.selectedIndex */
-  int selectedIndex;
-
-  /** @domName HTMLSelectElement.selectedOptions */
-  HTMLCollection get selectedOptions;
-
-  /** @domName HTMLSelectElement.size */
-  int size;
-
-  /** @domName HTMLSelectElement.type */
-  String get type;
-
-  /** @domName HTMLSelectElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLSelectElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLSelectElement.value */
-  String value;
-
-  /** @domName HTMLSelectElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLSelectElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLSelectElement.item */
-  Node item(int index);
-
-  /** @domName HTMLSelectElement.namedItem */
-  Node namedItem(String name);
-
-  /** @domName HTMLSelectElement.setCustomValidity */
-  void setCustomValidity(String error);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SelectElementImpl extends _ElementImpl_Merged implements SelectElement {
-
   bool get autofocus native "HTMLSelectElement_autofocus_Getter";
 
+
+  /** @domName HTMLSelectElement.autofocus */
   void set autofocus(bool value) native "HTMLSelectElement_autofocus_Setter";
 
+
+  /** @domName HTMLSelectElement.disabled */
   bool get disabled native "HTMLSelectElement_disabled_Getter";
 
+
+  /** @domName HTMLSelectElement.disabled */
   void set disabled(bool value) native "HTMLSelectElement_disabled_Setter";
 
+
+  /** @domName HTMLSelectElement.form */
   FormElement get form native "HTMLSelectElement_form_Getter";
 
+
+  /** @domName HTMLSelectElement.labels */
   List<Node> get labels native "HTMLSelectElement_labels_Getter";
 
+
+  /** @domName HTMLSelectElement.length */
   int get length native "HTMLSelectElement_length_Getter";
 
+
+  /** @domName HTMLSelectElement.length */
   void set length(int value) native "HTMLSelectElement_length_Setter";
 
+
+  /** @domName HTMLSelectElement.multiple */
   bool get multiple native "HTMLSelectElement_multiple_Getter";
 
+
+  /** @domName HTMLSelectElement.multiple */
   void set multiple(bool value) native "HTMLSelectElement_multiple_Setter";
 
+
+  /** @domName HTMLSelectElement.name */
   String get name native "HTMLSelectElement_name_Getter";
 
+
+  /** @domName HTMLSelectElement.name */
   void set name(String value) native "HTMLSelectElement_name_Setter";
 
+
+  /** @domName HTMLSelectElement.options */
   HTMLOptionsCollection get options native "HTMLSelectElement_options_Getter";
 
+
+  /** @domName HTMLSelectElement.required */
   bool get required native "HTMLSelectElement_required_Getter";
 
+
+  /** @domName HTMLSelectElement.required */
   void set required(bool value) native "HTMLSelectElement_required_Setter";
 
+
+  /** @domName HTMLSelectElement.selectedIndex */
   int get selectedIndex native "HTMLSelectElement_selectedIndex_Getter";
 
+
+  /** @domName HTMLSelectElement.selectedIndex */
   void set selectedIndex(int value) native "HTMLSelectElement_selectedIndex_Setter";
 
+
+  /** @domName HTMLSelectElement.selectedOptions */
   HTMLCollection get selectedOptions native "HTMLSelectElement_selectedOptions_Getter";
 
+
+  /** @domName HTMLSelectElement.size */
   int get size native "HTMLSelectElement_size_Getter";
 
+
+  /** @domName HTMLSelectElement.size */
   void set size(int value) native "HTMLSelectElement_size_Setter";
 
+
+  /** @domName HTMLSelectElement.type */
   String get type native "HTMLSelectElement_type_Getter";
 
+
+  /** @domName HTMLSelectElement.validationMessage */
   String get validationMessage native "HTMLSelectElement_validationMessage_Getter";
 
+
+  /** @domName HTMLSelectElement.validity */
   ValidityState get validity native "HTMLSelectElement_validity_Getter";
 
+
+  /** @domName HTMLSelectElement.value */
   String get value native "HTMLSelectElement_value_Getter";
 
+
+  /** @domName HTMLSelectElement.value */
   void set value(String value) native "HTMLSelectElement_value_Setter";
 
+
+  /** @domName HTMLSelectElement.willValidate */
   bool get willValidate native "HTMLSelectElement_willValidate_Getter";
 
+
+  /** @domName HTMLSelectElement.checkValidity */
   bool checkValidity() native "HTMLSelectElement_checkValidity_Callback";
 
+
+  /** @domName HTMLSelectElement.item */
   Node item(int index) native "HTMLSelectElement_item_Callback";
 
+
+  /** @domName HTMLSelectElement.namedItem */
   Node namedItem(String name) native "HTMLSelectElement_namedItem_Callback";
 
+
+  /** @domName HTMLSelectElement.setCustomValidity */
   void setCustomValidity(String error) native "HTMLSelectElement_setCustomValidity_Callback";
 
 }
@@ -34976,26 +28364,17 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SessionDescription
-abstract class SessionDescription {
+class SessionDescription extends NativeFieldWrapperClass1 {
 
   factory SessionDescription(String sdp) => _SessionDescriptionFactoryProvider.createSessionDescription(sdp);
+  SessionDescription.internal();
+
 
   /** @domName SessionDescription.addCandidate */
-  void addCandidate(IceCandidate candidate);
-
-  /** @domName SessionDescription.toSdp */
-  String toSdp();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SessionDescriptionImpl extends NativeFieldWrapperClass1 implements SessionDescription {
-
   void addCandidate(IceCandidate candidate) native "SessionDescription_addCandidate_Callback";
 
+
+  /** @domName SessionDescription.toSdp */
   String toSdp() native "SessionDescription_toSdp_Callback";
 
 }
@@ -35006,21 +28385,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLShadowElement
-abstract class ShadowElement implements Element {
+class ShadowElement extends _Element_Merged {
+  ShadowElement.internal(): super.internal();
+
 
   /** @domName HTMLShadowElement.resetStyleInheritance */
-  bool resetStyleInheritance;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ShadowElementImpl extends _ElementImpl_Merged implements ShadowElement {
-
   bool get resetStyleInheritance native "HTMLShadowElement_resetStyleInheritance_Getter";
 
+
+  /** @domName HTMLShadowElement.resetStyleInheritance */
   void set resetStyleInheritance(bool value) native "HTMLShadowElement_resetStyleInheritance_Setter";
 
 }
@@ -35030,71 +28403,57 @@
 
 // WARNING: Do not edit - generated code.
 
-
-/// @domName ShadowRoot
-abstract class ShadowRoot implements DocumentFragment {
+class ShadowRoot extends DocumentFragment {
 
   factory ShadowRoot(Element host) => _ShadowRootFactoryProvider.createShadowRoot(host);
+  ShadowRoot.internal(): super.internal();
+
 
   /** @domName ShadowRoot.activeElement */
-  Element get activeElement;
-
-  /** @domName ShadowRoot.applyAuthorStyles */
-  bool applyAuthorStyles;
-
-  /** @domName ShadowRoot.innerHTML */
-  String innerHTML;
-
-  /** @domName ShadowRoot.resetStyleInheritance */
-  bool resetStyleInheritance;
-
-  /** @domName ShadowRoot.cloneNode */
-  Node clone(bool deep);
-
-  /** @domName ShadowRoot.getElementById */
-  Element $dom_getElementById(String elementId);
-
-  /** @domName ShadowRoot.getElementsByClassName */
-  List<Node> $dom_getElementsByClassName(String className);
-
-  /** @domName ShadowRoot.getElementsByTagName */
-  List<Node> $dom_getElementsByTagName(String tagName);
-
-  /** @domName ShadowRoot.getSelection */
-  DOMSelection getSelection();
-
-  static bool get supported => _ShadowRootImpl.supported;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ShadowRootImpl extends _DocumentFragmentImpl implements ShadowRoot {
-
   Element get activeElement native "ShadowRoot_activeElement_Getter";
 
+
+  /** @domName ShadowRoot.applyAuthorStyles */
   bool get applyAuthorStyles native "ShadowRoot_applyAuthorStyles_Getter";
 
+
+  /** @domName ShadowRoot.applyAuthorStyles */
   void set applyAuthorStyles(bool value) native "ShadowRoot_applyAuthorStyles_Setter";
 
+
+  /** @domName ShadowRoot.innerHTML */
   String get innerHTML native "ShadowRoot_innerHTML_Getter";
 
+
+  /** @domName ShadowRoot.innerHTML */
   void set innerHTML(String value) native "ShadowRoot_innerHTML_Setter";
 
+
+  /** @domName ShadowRoot.resetStyleInheritance */
   bool get resetStyleInheritance native "ShadowRoot_resetStyleInheritance_Getter";
 
+
+  /** @domName ShadowRoot.resetStyleInheritance */
   void set resetStyleInheritance(bool value) native "ShadowRoot_resetStyleInheritance_Setter";
 
+
+  /** @domName ShadowRoot.cloneNode */
   Node clone(bool deep) native "ShadowRoot_cloneNode_Callback";
 
+
+  /** @domName ShadowRoot.getElementById */
   Element $dom_getElementById(String elementId) native "ShadowRoot_getElementById_Callback";
 
+
+  /** @domName ShadowRoot.getElementsByClassName */
   List<Node> $dom_getElementsByClassName(String className) native "ShadowRoot_getElementsByClassName_Callback";
 
+
+  /** @domName ShadowRoot.getElementsByTagName */
   List<Node> $dom_getElementsByTagName(String tagName) native "ShadowRoot_getElementsByTagName_Callback";
 
+
+  /** @domName ShadowRoot.getSelection */
   DOMSelection getSelection() native "ShadowRoot_getSelection_Callback";
 
   static bool get supported => _Utils.shadowRootSupported(window.document);
@@ -35106,7 +28465,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SharedWorker
-abstract class SharedWorker implements AbstractWorker {
+class SharedWorker extends AbstractWorker {
 
   factory SharedWorker(String scriptURL, [String name]) {
     if (!?name) {
@@ -35114,60 +28473,10 @@
     }
     return _SharedWorkerFactoryProvider.createSharedWorker(scriptURL, name);
   }
+  SharedWorker.internal(): super.internal();
+
 
   /** @domName SharedWorker.port */
-  MessagePort get port;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SharedWorkerContext
-abstract class SharedWorkerContext implements WorkerContext {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  SharedWorkerContextEvents get on;
-
-  /** @domName SharedWorkerContext.name */
-  String get name;
-}
-
-abstract class SharedWorkerContextEvents implements WorkerContextEvents {
-
-  EventListenerList get connect;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SharedWorkerContextImpl extends _WorkerContextImpl implements SharedWorkerContext {
-
-  _SharedWorkerContextEventsImpl get on =>
-    new _SharedWorkerContextEventsImpl(this);
-
-  String get name native "SharedWorkerContext_name_Getter";
-
-}
-
-class _SharedWorkerContextEventsImpl extends _WorkerContextEventsImpl implements SharedWorkerContextEvents {
-  _SharedWorkerContextEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get connect => this['connect'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SharedWorkerImpl extends _AbstractWorkerImpl implements SharedWorker {
-
   MessagePort get port native "SharedWorker_port_Getter";
 
 }
@@ -35177,20 +28486,26 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName SourceBuffer
-abstract class SourceBuffer {
+/// @domName SharedWorkerContext
+class SharedWorkerContext extends WorkerContext {
+  SharedWorkerContext.internal(): super.internal();
 
-  /** @domName SourceBuffer.buffered */
-  TimeRanges get buffered;
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  SharedWorkerContextEvents get on =>
+    new SharedWorkerContextEvents(this);
 
-  /** @domName SourceBuffer.timestampOffset */
-  num timestampOffset;
 
-  /** @domName SourceBuffer.abort */
-  void abort();
+  /** @domName SharedWorkerContext.name */
+  String get name native "SharedWorkerContext_name_Getter";
 
-  /** @domName SourceBuffer.append */
-  void append(Uint8Array data);
+}
+
+class SharedWorkerContextEvents extends WorkerContextEvents {
+  SharedWorkerContextEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get connect => this['connect'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -35198,16 +28513,28 @@
 
 // WARNING: Do not edit - generated code.
 
-class _SourceBufferImpl extends NativeFieldWrapperClass1 implements SourceBuffer {
+/// @domName SourceBuffer
+class SourceBuffer extends NativeFieldWrapperClass1 {
+  SourceBuffer.internal();
 
+
+  /** @domName SourceBuffer.buffered */
   TimeRanges get buffered native "SourceBuffer_buffered_Getter";
 
+
+  /** @domName SourceBuffer.timestampOffset */
   num get timestampOffset native "SourceBuffer_timestampOffset_Getter";
 
+
+  /** @domName SourceBuffer.timestampOffset */
   void set timestampOffset(num value) native "SourceBuffer_timestampOffset_Setter";
 
+
+  /** @domName SourceBuffer.abort */
   void abort() native "SourceBuffer_abort_Callback";
 
+
+  /** @domName SourceBuffer.append */
   void append(Uint8Array data) native "SourceBuffer_append_Callback";
 
 }
@@ -35218,31 +28545,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SourceBufferList
-abstract class SourceBufferList implements EventTarget, List<SourceBuffer> {
+class SourceBufferList extends EventTarget implements List<SourceBuffer> {
+  SourceBufferList.internal(): super.internal();
+
 
   /** @domName SourceBufferList.length */
-  int get length;
-
-  /** @domName SourceBufferList.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName SourceBufferList.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName SourceBufferList.item */
-  SourceBuffer item(int index);
-
-  /** @domName SourceBufferList.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SourceBufferListImpl extends _EventTargetImpl implements SourceBufferList {
-
   int get length native "SourceBufferList_length_Getter";
 
   SourceBuffer operator[](int index) native "SourceBufferList_item_Callback";
@@ -35328,12 +28635,20 @@
 
   // -- end List<SourceBuffer> mixins.
 
+
+  /** @domName SourceBufferList.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_addEventListener_Callback";
 
+
+  /** @domName SourceBufferList.dispatchEvent */
   bool $dom_dispatchEvent(Event event) native "SourceBufferList_dispatchEvent_Callback";
 
+
+  /** @domName SourceBufferList.item */
   SourceBuffer item(int index) native "SourceBufferList_item_Callback";
 
+
+  /** @domName SourceBufferList.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_removeEventListener_Callback";
 
 }
@@ -35344,37 +28659,33 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLSourceElement
-abstract class SourceElement implements Element {
+class SourceElement extends _Element_Merged {
 
   factory SourceElement() => _Elements.createSourceElement();
+  SourceElement.internal(): super.internal();
+
 
   /** @domName HTMLSourceElement.media */
-  String media;
-
-  /** @domName HTMLSourceElement.src */
-  String src;
-
-  /** @domName HTMLSourceElement.type */
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SourceElementImpl extends _ElementImpl_Merged implements SourceElement {
-
   String get media native "HTMLSourceElement_media_Getter";
 
+
+  /** @domName HTMLSourceElement.media */
   void set media(String value) native "HTMLSourceElement_media_Setter";
 
+
+  /** @domName HTMLSourceElement.src */
   String get src native "HTMLSourceElement_src_Getter";
 
+
+  /** @domName HTMLSourceElement.src */
   void set src(String value) native "HTMLSourceElement_src_Setter";
 
+
+  /** @domName HTMLSourceElement.type */
   String get type native "HTMLSourceElement_type_Getter";
 
+
+  /** @domName HTMLSourceElement.type */
   void set type(String value) native "HTMLSourceElement_type_Setter";
 
 }
@@ -35385,17 +28696,10 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLSpanElement
-abstract class SpanElement implements Element {
+class SpanElement extends _Element_Merged {
 
   factory SpanElement() => _Elements.createSpanElement();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SpanElementImpl extends _ElementImpl_Merged implements SpanElement {
+  SpanElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35405,30 +28709,25 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SpeechGrammar
-abstract class SpeechGrammar {
+class SpeechGrammar extends NativeFieldWrapperClass1 {
 
   factory SpeechGrammar() => _SpeechGrammarFactoryProvider.createSpeechGrammar();
+  SpeechGrammar.internal();
+
 
   /** @domName SpeechGrammar.src */
-  String src;
-
-  /** @domName SpeechGrammar.weight */
-  num weight;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SpeechGrammarImpl extends NativeFieldWrapperClass1 implements SpeechGrammar {
-
   String get src native "SpeechGrammar_src_Getter";
 
+
+  /** @domName SpeechGrammar.src */
   void set src(String value) native "SpeechGrammar_src_Setter";
 
+
+  /** @domName SpeechGrammar.weight */
   num get weight native "SpeechGrammar_weight_Getter";
 
+
+  /** @domName SpeechGrammar.weight */
   void set weight(num value) native "SpeechGrammar_weight_Setter";
 
 }
@@ -35439,30 +28738,13 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SpeechGrammarList
-abstract class SpeechGrammarList implements List<SpeechGrammar> {
+class SpeechGrammarList extends NativeFieldWrapperClass1 implements List<SpeechGrammar> {
 
   factory SpeechGrammarList() => _SpeechGrammarListFactoryProvider.createSpeechGrammarList();
+  SpeechGrammarList.internal();
+
 
   /** @domName SpeechGrammarList.length */
-  int get length;
-
-  /** @domName SpeechGrammarList.addFromString */
-  void addFromString(String string, [num weight]);
-
-  /** @domName SpeechGrammarList.addFromUri */
-  void addFromUri(String src, [num weight]);
-
-  /** @domName SpeechGrammarList.item */
-  SpeechGrammar item(int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SpeechGrammarListImpl extends NativeFieldWrapperClass1 implements SpeechGrammarList {
-
   int get length native "SpeechGrammarList_length_Getter";
 
   SpeechGrammar operator[](int index) native "SpeechGrammarList_item_Callback";
@@ -35556,8 +28838,12 @@
     _addFromString_2(string);
   }
 
+
+  /** @domName SpeechGrammarList.addFromString_1 */
   void _addFromString_1(string, weight) native "SpeechGrammarList_addFromString_1_Callback";
 
+
+  /** @domName SpeechGrammarList.addFromString_2 */
   void _addFromString_2(string) native "SpeechGrammarList_addFromString_2_Callback";
 
   void addFromUri(/*DOMString*/ src, [/*float*/ weight]) {
@@ -35568,10 +28854,16 @@
     _addFromUri_2(src);
   }
 
+
+  /** @domName SpeechGrammarList.addFromUri_1 */
   void _addFromUri_1(src, weight) native "SpeechGrammarList_addFromUri_1_Callback";
 
+
+  /** @domName SpeechGrammarList.addFromUri_2 */
   void _addFromUri_2(src) native "SpeechGrammarList_addFromUri_2_Callback";
 
+
+  /** @domName SpeechGrammarList.item */
   SpeechGrammar item(int index) native "SpeechGrammarList_item_Callback";
 
 }
@@ -35582,19 +28874,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SpeechInputEvent
-abstract class SpeechInputEvent implements Event {
+class SpeechInputEvent extends Event {
+  SpeechInputEvent.internal(): super.internal();
+
 
   /** @domName SpeechInputEvent.results */
-  List<SpeechInputResult> get results;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SpeechInputEventImpl extends _EventImpl implements SpeechInputEvent {
-
   List<SpeechInputResult> get results native "SpeechInputEvent_results_Getter";
 
 }
@@ -35605,24 +28889,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName SpeechInputResult
-abstract class SpeechInputResult {
+class SpeechInputResult extends NativeFieldWrapperClass1 {
+  SpeechInputResult.internal();
+
 
   /** @domName SpeechInputResult.confidence */
-  num get confidence;
-
-  /** @domName SpeechInputResult.utterance */
-  String get utterance;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SpeechInputResultImpl extends NativeFieldWrapperClass1 implements SpeechInputResult {
-
   num get confidence native "SpeechInputResult_confidence_Getter";
 
+
+  /** @domName SpeechInputResult.utterance */
   String get utterance native "SpeechInputResult_utterance_Getter";
 
 }
@@ -35632,324 +28907,86 @@
 
 // WARNING: Do not edit - generated code.
 
-class _SpeechInputResultListImpl extends NativeFieldWrapperClass1 implements List<SpeechInputResult> {
-
-  int get length native "SpeechInputResultList_length_Getter";
-
-  SpeechInputResult operator[](int index) native "SpeechInputResultList_item_Callback";
-
-  void operator[]=(int index, SpeechInputResult value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SpeechInputResult> mixins.
-  // SpeechInputResult is the element type.
-
-  // From Iterable<SpeechInputResult>:
-
-  Iterator<SpeechInputResult> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SpeechInputResult>(this);
-  }
-
-  // From Collection<SpeechInputResult>:
-
-  void add(SpeechInputResult value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SpeechInputResult value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SpeechInputResult> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SpeechInputResult element) => _Collections.contains(this, element);
-
-  void forEach(void f(SpeechInputResult element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SpeechInputResult element)) => _Collections.map(this, [], f);
-
-  Collection<SpeechInputResult> filter(bool f(SpeechInputResult element)) =>
-     _Collections.filter(this, <SpeechInputResult>[], f);
-
-  bool every(bool f(SpeechInputResult element)) => _Collections.every(this, f);
-
-  bool some(bool f(SpeechInputResult element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SpeechInputResult>:
-
-  void sort([Comparator<SpeechInputResult> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SpeechInputResult element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SpeechInputResult element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SpeechInputResult get last => this[length - 1];
-
-  SpeechInputResult removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SpeechInputResult> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SpeechInputResult initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SpeechInputResult> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SpeechInputResult>[]);
-
-  // -- end List<SpeechInputResult> mixins.
-
-  SpeechInputResult item(int index) native "SpeechInputResultList_item_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName SpeechRecognition
-abstract class SpeechRecognition implements EventTarget {
+class SpeechRecognition extends EventTarget {
 
   factory SpeechRecognition() => _SpeechRecognitionFactoryProvider.createSpeechRecognition();
+  SpeechRecognition.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  SpeechRecognitionEvents get on;
+  SpeechRecognitionEvents get on =>
+    new SpeechRecognitionEvents(this);
+
 
   /** @domName SpeechRecognition.continuous */
-  bool continuous;
-
-  /** @domName SpeechRecognition.grammars */
-  SpeechGrammarList grammars;
-
-  /** @domName SpeechRecognition.interimResults */
-  bool interimResults;
-
-  /** @domName SpeechRecognition.lang */
-  String lang;
-
-  /** @domName SpeechRecognition.maxAlternatives */
-  int maxAlternatives;
-
-  /** @domName SpeechRecognition.abort */
-  void abort();
-
-  /** @domName SpeechRecognition.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName SpeechRecognition.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName SpeechRecognition.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName SpeechRecognition.start */
-  void start();
-
-  /** @domName SpeechRecognition.stop */
-  void stop();
-}
-
-abstract class SpeechRecognitionEvents implements Events {
-
-  EventListenerList get audioEnd;
-
-  EventListenerList get audioStart;
-
-  EventListenerList get end;
-
-  EventListenerList get error;
-
-  EventListenerList get noMatch;
-
-  EventListenerList get result;
-
-  EventListenerList get soundEnd;
-
-  EventListenerList get soundStart;
-
-  EventListenerList get speechEnd;
-
-  EventListenerList get speechStart;
-
-  EventListenerList get start;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SpeechRecognitionAlternative
-abstract class SpeechRecognitionAlternative {
-
-  /** @domName SpeechRecognitionAlternative.confidence */
-  num get confidence;
-
-  /** @domName SpeechRecognitionAlternative.transcript */
-  String get transcript;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SpeechRecognitionAlternativeImpl extends NativeFieldWrapperClass1 implements SpeechRecognitionAlternative {
-
-  num get confidence native "SpeechRecognitionAlternative_confidence_Getter";
-
-  String get transcript native "SpeechRecognitionAlternative_transcript_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SpeechRecognitionError
-abstract class SpeechRecognitionError implements Event {
-
-  static const int ABORTED = 2;
-
-  static const int AUDIO_CAPTURE = 3;
-
-  static const int BAD_GRAMMAR = 7;
-
-  static const int LANGUAGE_NOT_SUPPORTED = 8;
-
-  static const int NETWORK = 4;
-
-  static const int NOT_ALLOWED = 5;
-
-  static const int NO_SPEECH = 1;
-
-  static const int OTHER = 0;
-
-  static const int SERVICE_NOT_ALLOWED = 6;
-
-  /** @domName SpeechRecognitionError.code */
-  int get code;
-
-  /** @domName SpeechRecognitionError.message */
-  String get message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SpeechRecognitionErrorImpl extends _EventImpl implements SpeechRecognitionError {
-
-  int get code native "SpeechRecognitionError_code_Getter";
-
-  String get message native "SpeechRecognitionError_message_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName SpeechRecognitionEvent
-abstract class SpeechRecognitionEvent implements Event {
-
-  /** @domName SpeechRecognitionEvent.result */
-  SpeechRecognitionResult get result;
-
-  /** @domName SpeechRecognitionEvent.resultHistory */
-  List<SpeechRecognitionResult> get resultHistory;
-
-  /** @domName SpeechRecognitionEvent.resultIndex */
-  int get resultIndex;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SpeechRecognitionEventImpl extends _EventImpl implements SpeechRecognitionEvent {
-
-  SpeechRecognitionResult get result native "SpeechRecognitionEvent_result_Getter";
-
-  List<SpeechRecognitionResult> get resultHistory native "SpeechRecognitionEvent_resultHistory_Getter";
-
-  int get resultIndex native "SpeechRecognitionEvent_resultIndex_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _SpeechRecognitionImpl extends _EventTargetImpl implements SpeechRecognition {
-
-  _SpeechRecognitionEventsImpl get on =>
-    new _SpeechRecognitionEventsImpl(this);
-
   bool get continuous native "SpeechRecognition_continuous_Getter";
 
+
+  /** @domName SpeechRecognition.continuous */
   void set continuous(bool value) native "SpeechRecognition_continuous_Setter";
 
+
+  /** @domName SpeechRecognition.grammars */
   SpeechGrammarList get grammars native "SpeechRecognition_grammars_Getter";
 
+
+  /** @domName SpeechRecognition.grammars */
   void set grammars(SpeechGrammarList value) native "SpeechRecognition_grammars_Setter";
 
+
+  /** @domName SpeechRecognition.interimResults */
   bool get interimResults native "SpeechRecognition_interimResults_Getter";
 
+
+  /** @domName SpeechRecognition.interimResults */
   void set interimResults(bool value) native "SpeechRecognition_interimResults_Setter";
 
+
+  /** @domName SpeechRecognition.lang */
   String get lang native "SpeechRecognition_lang_Getter";
 
+
+  /** @domName SpeechRecognition.lang */
   void set lang(String value) native "SpeechRecognition_lang_Setter";
 
+
+  /** @domName SpeechRecognition.maxAlternatives */
   int get maxAlternatives native "SpeechRecognition_maxAlternatives_Getter";
 
+
+  /** @domName SpeechRecognition.maxAlternatives */
   void set maxAlternatives(int value) native "SpeechRecognition_maxAlternatives_Setter";
 
+
+  /** @domName SpeechRecognition.abort */
   void abort() native "SpeechRecognition_abort_Callback";
 
+
+  /** @domName SpeechRecognition.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_addEventListener_Callback";
 
+
+  /** @domName SpeechRecognition.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "SpeechRecognition_dispatchEvent_Callback";
 
+
+  /** @domName SpeechRecognition.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_removeEventListener_Callback";
 
+
+  /** @domName SpeechRecognition.start */
   void start() native "SpeechRecognition_start_Callback";
 
+
+  /** @domName SpeechRecognition.stop */
   void stop() native "SpeechRecognition_stop_Callback";
 
 }
 
-class _SpeechRecognitionEventsImpl extends _EventsImpl implements SpeechRecognitionEvents {
-  _SpeechRecognitionEventsImpl(_ptr) : super(_ptr);
+class SpeechRecognitionEvents extends Events {
+  SpeechRecognitionEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get audioEnd => this['audioend'];
 
@@ -35979,20 +29016,18 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName SpeechRecognitionResult
-abstract class SpeechRecognitionResult {
+/// @domName SpeechRecognitionAlternative
+class SpeechRecognitionAlternative extends NativeFieldWrapperClass1 {
+  SpeechRecognitionAlternative.internal();
 
-  /** @domName SpeechRecognitionResult.emma */
-  Document get emma;
 
-  /** @domName SpeechRecognitionResult.finalValue */
-  bool get finalValue;
+  /** @domName SpeechRecognitionAlternative.confidence */
+  num get confidence native "SpeechRecognitionAlternative_confidence_Getter";
 
-  /** @domName SpeechRecognitionResult.length */
-  int get length;
 
-  /** @domName SpeechRecognitionResult.item */
-  SpeechRecognitionAlternative item(int index);
+  /** @domName SpeechRecognitionAlternative.transcript */
+  String get transcript native "SpeechRecognitionAlternative_transcript_Getter";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -36000,14 +29035,84 @@
 
 // WARNING: Do not edit - generated code.
 
-class _SpeechRecognitionResultImpl extends NativeFieldWrapperClass1 implements SpeechRecognitionResult {
+/// @domName SpeechRecognitionError
+class SpeechRecognitionError extends Event {
+  SpeechRecognitionError.internal(): super.internal();
 
+  static const int ABORTED = 2;
+
+  static const int AUDIO_CAPTURE = 3;
+
+  static const int BAD_GRAMMAR = 7;
+
+  static const int LANGUAGE_NOT_SUPPORTED = 8;
+
+  static const int NETWORK = 4;
+
+  static const int NOT_ALLOWED = 5;
+
+  static const int NO_SPEECH = 1;
+
+  static const int OTHER = 0;
+
+  static const int SERVICE_NOT_ALLOWED = 6;
+
+
+  /** @domName SpeechRecognitionError.code */
+  int get code native "SpeechRecognitionError_code_Getter";
+
+
+  /** @domName SpeechRecognitionError.message */
+  String get message native "SpeechRecognitionError_message_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName SpeechRecognitionEvent
+class SpeechRecognitionEvent extends Event {
+  SpeechRecognitionEvent.internal(): super.internal();
+
+
+  /** @domName SpeechRecognitionEvent.result */
+  SpeechRecognitionResult get result native "SpeechRecognitionEvent_result_Getter";
+
+
+  /** @domName SpeechRecognitionEvent.resultHistory */
+  List<SpeechRecognitionResult> get resultHistory native "SpeechRecognitionEvent_resultHistory_Getter";
+
+
+  /** @domName SpeechRecognitionEvent.resultIndex */
+  int get resultIndex native "SpeechRecognitionEvent_resultIndex_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName SpeechRecognitionResult
+class SpeechRecognitionResult extends NativeFieldWrapperClass1 {
+  SpeechRecognitionResult.internal();
+
+
+  /** @domName SpeechRecognitionResult.emma */
   Document get emma native "SpeechRecognitionResult_emma_Getter";
 
+
+  /** @domName SpeechRecognitionResult.final */
   bool get finalValue native "SpeechRecognitionResult_final_Getter";
 
+
+  /** @domName SpeechRecognitionResult.length */
   int get length native "SpeechRecognitionResult_length_Getter";
 
+
+  /** @domName SpeechRecognitionResult.item */
   SpeechRecognitionAlternative item(int index) native "SpeechRecognitionResult_item_Callback";
 
 }
@@ -36015,178 +29120,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-class _SpeechRecognitionResultListImpl extends NativeFieldWrapperClass1 implements List<SpeechRecognitionResult> {
-
-  int get length native "SpeechRecognitionResultList_length_Getter";
-
-  SpeechRecognitionResult operator[](int index) native "SpeechRecognitionResultList_item_Callback";
-
-  void operator[]=(int index, SpeechRecognitionResult value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<SpeechRecognitionResult> mixins.
-  // SpeechRecognitionResult is the element type.
-
-  // From Iterable<SpeechRecognitionResult>:
-
-  Iterator<SpeechRecognitionResult> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<SpeechRecognitionResult>(this);
-  }
-
-  // From Collection<SpeechRecognitionResult>:
-
-  void add(SpeechRecognitionResult value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(SpeechRecognitionResult value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<SpeechRecognitionResult> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(SpeechRecognitionResult element) => _Collections.contains(this, element);
-
-  void forEach(void f(SpeechRecognitionResult element)) => _Collections.forEach(this, f);
-
-  Collection map(f(SpeechRecognitionResult element)) => _Collections.map(this, [], f);
-
-  Collection<SpeechRecognitionResult> filter(bool f(SpeechRecognitionResult element)) =>
-     _Collections.filter(this, <SpeechRecognitionResult>[], f);
-
-  bool every(bool f(SpeechRecognitionResult element)) => _Collections.every(this, f);
-
-  bool some(bool f(SpeechRecognitionResult element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<SpeechRecognitionResult>:
-
-  void sort([Comparator<SpeechRecognitionResult> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(SpeechRecognitionResult element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(SpeechRecognitionResult element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  SpeechRecognitionResult get last => this[length - 1];
-
-  SpeechRecognitionResult removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<SpeechRecognitionResult> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [SpeechRecognitionResult initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<SpeechRecognitionResult> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <SpeechRecognitionResult>[]);
-
-  // -- end List<SpeechRecognitionResult> mixins.
-
-  SpeechRecognitionResult item(int index) native "SpeechRecognitionResultList_item_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName Storage
-abstract class Storage implements Map<String, String> {
-
-  /** @domName Storage.length */
-  int get $dom_length;
-
-  /** @domName Storage.clear */
-  void $dom_clear();
-
-  /** @domName Storage.getItem */
-  String $dom_getItem(String key);
-
-  /** @domName Storage.key */
-  String $dom_key(int index);
-
-  /** @domName Storage.removeItem */
-  void $dom_removeItem(String key);
-
-  /** @domName Storage.setItem */
-  void $dom_setItem(String key, String data);
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName StorageEvent
-abstract class StorageEvent implements Event {
-
-  /** @domName StorageEvent.key */
-  String get key;
-
-  /** @domName StorageEvent.newValue */
-  String get newValue;
-
-  /** @domName StorageEvent.oldValue */
-  String get oldValue;
-
-  /** @domName StorageEvent.storageArea */
-  Storage get storageArea;
-
-  /** @domName StorageEvent.url */
-  String get url;
-
-  /** @domName StorageEvent.initStorageEvent */
-  void initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _StorageEventImpl extends _EventImpl implements StorageEvent {
-
-  String get key native "StorageEvent_key_Getter";
-
-  String get newValue native "StorageEvent_newValue_Getter";
-
-  String get oldValue native "StorageEvent_oldValue_Getter";
-
-  Storage get storageArea native "StorageEvent_storageArea_Getter";
-
-  String get url native "StorageEvent_url_Getter";
-
-  void initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) native "StorageEvent_initStorageEvent_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _StorageImpl extends NativeFieldWrapperClass1 implements Storage {
+class Storage extends NativeFieldWrapperClass1 implements Map<String, String>  {
 
   // TODO(nweiz): update this when maps support lazy iteration
   bool containsValue(String value) => values.some((e) => e == value);
@@ -36234,17 +29168,30 @@
   int get length => $dom_length;
 
   bool get isEmpty => $dom_key(0) == null;
+  Storage.internal();
 
+
+  /** @domName Storage.length */
   int get $dom_length native "Storage_length_Getter";
 
+
+  /** @domName Storage.clear */
   void $dom_clear() native "Storage_clear_Callback";
 
+
+  /** @domName Storage.getItem */
   String $dom_getItem(String key) native "Storage_getItem_Callback";
 
+
+  /** @domName Storage.key */
   String $dom_key(int index) native "Storage_key_Callback";
 
+
+  /** @domName Storage.removeItem */
   void $dom_removeItem(String key) native "Storage_removeItem_Callback";
 
+
+  /** @domName Storage.setItem */
   void $dom_setItem(String key, String data) native "Storage_setItem_Callback";
 
 }
@@ -36254,18 +29201,57 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName StorageEvent
+class StorageEvent extends Event {
+  StorageEvent.internal(): super.internal();
+
+
+  /** @domName StorageEvent.key */
+  String get key native "StorageEvent_key_Getter";
+
+
+  /** @domName StorageEvent.newValue */
+  String get newValue native "StorageEvent_newValue_Getter";
+
+
+  /** @domName StorageEvent.oldValue */
+  String get oldValue native "StorageEvent_oldValue_Getter";
+
+
+  /** @domName StorageEvent.storageArea */
+  Storage get storageArea native "StorageEvent_storageArea_Getter";
+
+
+  /** @domName StorageEvent.url */
+  String get url native "StorageEvent_url_Getter";
+
+
+  /** @domName StorageEvent.initStorageEvent */
+  void initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) native "StorageEvent_initStorageEvent_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
 /// @domName StorageInfo
-abstract class StorageInfo {
+class StorageInfo extends NativeFieldWrapperClass1 {
+  StorageInfo.internal();
 
   static const int PERSISTENT = 1;
 
   static const int TEMPORARY = 0;
 
+
   /** @domName StorageInfo.queryUsageAndQuota */
-  void queryUsageAndQuota(int storageType, [StorageInfoUsageCallback usageCallback, StorageInfoErrorCallback errorCallback]);
+  void queryUsageAndQuota(int storageType, [StorageInfoUsageCallback usageCallback, StorageInfoErrorCallback errorCallback]) native "StorageInfo_queryUsageAndQuota_Callback";
+
 
   /** @domName StorageInfo.requestQuota */
-  void requestQuota(int storageType, int newQuotaInBytes, [StorageInfoQuotaCallback quotaCallback, StorageInfoErrorCallback errorCallback]);
+  void requestQuota(int storageType, int newQuotaInBytes, [StorageInfoQuotaCallback quotaCallback, StorageInfoErrorCallback errorCallback]) native "StorageInfo_requestQuota_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -36281,19 +29267,6 @@
 
 // WARNING: Do not edit - generated code.
 
-class _StorageInfoImpl extends NativeFieldWrapperClass1 implements StorageInfo {
-
-  void queryUsageAndQuota(int storageType, [StorageInfoUsageCallback usageCallback, StorageInfoErrorCallback errorCallback]) native "StorageInfo_queryUsageAndQuota_Callback";
-
-  void requestQuota(int storageType, int newQuotaInBytes, [StorageInfoQuotaCallback quotaCallback, StorageInfoErrorCallback errorCallback]) native "StorageInfo_requestQuota_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 
 typedef void StorageInfoQuotaCallback(int grantedQuotaInBytes);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36319,49 +29292,45 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLStyleElement
-abstract class StyleElement implements Element {
+class StyleElement extends _Element_Merged {
 
   factory StyleElement() => _Elements.createStyleElement();
+  StyleElement.internal(): super.internal();
+
 
   /** @domName HTMLStyleElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLStyleElement.media */
-  String media;
-
-  /** @domName HTMLStyleElement.scoped */
-  bool scoped;
-
-  /** @domName HTMLStyleElement.sheet */
-  StyleSheet get sheet;
-
-  /** @domName HTMLStyleElement.type */
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _StyleElementImpl extends _ElementImpl_Merged implements StyleElement {
-
   bool get disabled native "HTMLStyleElement_disabled_Getter";
 
+
+  /** @domName HTMLStyleElement.disabled */
   void set disabled(bool value) native "HTMLStyleElement_disabled_Setter";
 
+
+  /** @domName HTMLStyleElement.media */
   String get media native "HTMLStyleElement_media_Getter";
 
+
+  /** @domName HTMLStyleElement.media */
   void set media(String value) native "HTMLStyleElement_media_Setter";
 
+
+  /** @domName HTMLStyleElement.scoped */
   bool get scoped native "HTMLStyleElement_scoped_Getter";
 
+
+  /** @domName HTMLStyleElement.scoped */
   void set scoped(bool value) native "HTMLStyleElement_scoped_Setter";
 
+
+  /** @domName HTMLStyleElement.sheet */
   StyleSheet get sheet native "HTMLStyleElement_sheet_Getter";
 
+
+  /** @domName HTMLStyleElement.type */
   String get type native "HTMLStyleElement_type_Getter";
 
+
+  /** @domName HTMLStyleElement.type */
   void set type(String value) native "HTMLStyleElement_type_Setter";
 
 }
@@ -36372,24 +29341,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName StyleMedia
-abstract class StyleMedia {
+class StyleMedia extends NativeFieldWrapperClass1 {
+  StyleMedia.internal();
+
 
   /** @domName StyleMedia.type */
-  String get type;
-
-  /** @domName StyleMedia.matchMedium */
-  bool matchMedium(String mediaquery);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _StyleMediaImpl extends NativeFieldWrapperClass1 implements StyleMedia {
-
   String get type native "StyleMedia_type_Getter";
 
+
+  /** @domName StyleMedia.matchMedium */
   bool matchMedium(String mediaquery) native "StyleMedia_matchMedium_Callback";
 
 }
@@ -36400,51 +29360,39 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName StyleSheet
-abstract class StyleSheet {
+class StyleSheet extends NativeFieldWrapperClass1 {
+  StyleSheet.internal();
+
 
   /** @domName StyleSheet.disabled */
-  bool disabled;
-
-  /** @domName StyleSheet.href */
-  String get href;
-
-  /** @domName StyleSheet.media */
-  MediaList get media;
-
-  /** @domName StyleSheet.ownerNode */
-  Node get ownerNode;
-
-  /** @domName StyleSheet.parentStyleSheet */
-  StyleSheet get parentStyleSheet;
-
-  /** @domName StyleSheet.title */
-  String get title;
-
-  /** @domName StyleSheet.type */
-  String get type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _StyleSheetImpl extends NativeFieldWrapperClass1 implements StyleSheet {
-
   bool get disabled native "StyleSheet_disabled_Getter";
 
+
+  /** @domName StyleSheet.disabled */
   void set disabled(bool value) native "StyleSheet_disabled_Setter";
 
+
+  /** @domName StyleSheet.href */
   String get href native "StyleSheet_href_Getter";
 
+
+  /** @domName StyleSheet.media */
   MediaList get media native "StyleSheet_media_Getter";
 
+
+  /** @domName StyleSheet.ownerNode */
   Node get ownerNode native "StyleSheet_ownerNode_Getter";
 
+
+  /** @domName StyleSheet.parentStyleSheet */
   StyleSheet get parentStyleSheet native "StyleSheet_parentStyleSheet_Getter";
 
+
+  /** @domName StyleSheet.title */
   String get title native "StyleSheet_title_Getter";
 
+
+  /** @domName StyleSheet.type */
   String get type native "StyleSheet_type_Getter";
 
 }
@@ -36454,120 +29402,18 @@
 
 // WARNING: Do not edit - generated code.
 
-class _StyleSheetListImpl extends NativeFieldWrapperClass1 implements List<StyleSheet> {
-
-  int get length native "StyleSheetList_length_Getter";
-
-  StyleSheet operator[](int index) native "StyleSheetList_item_Callback";
-
-  void operator[]=(int index, StyleSheet value) {
-    throw new UnsupportedError("Cannot assign element of immutable List.");
-  }
-  // -- start List<StyleSheet> mixins.
-  // StyleSheet is the element type.
-
-  // From Iterable<StyleSheet>:
-
-  Iterator<StyleSheet> iterator() {
-    // Note: NodeLists are not fixed size. And most probably length shouldn't
-    // be cached in both iterator _and_ forEach method. For now caching it
-    // for consistency.
-    return new _FixedSizeListIterator<StyleSheet>(this);
-  }
-
-  // From Collection<StyleSheet>:
-
-  void add(StyleSheet value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addLast(StyleSheet value) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  void addAll(Collection<StyleSheet> collection) {
-    throw new UnsupportedError("Cannot add to immutable List.");
-  }
-
-  bool contains(StyleSheet element) => _Collections.contains(this, element);
-
-  void forEach(void f(StyleSheet element)) => _Collections.forEach(this, f);
-
-  Collection map(f(StyleSheet element)) => _Collections.map(this, [], f);
-
-  Collection<StyleSheet> filter(bool f(StyleSheet element)) =>
-     _Collections.filter(this, <StyleSheet>[], f);
-
-  bool every(bool f(StyleSheet element)) => _Collections.every(this, f);
-
-  bool some(bool f(StyleSheet element)) => _Collections.some(this, f);
-
-  bool get isEmpty => this.length == 0;
-
-  // From List<StyleSheet>:
-
-  void sort([Comparator<StyleSheet> compare = Comparable.compare]) {
-    throw new UnsupportedError("Cannot sort immutable List.");
-  }
-
-  int indexOf(StyleSheet element, [int start = 0]) =>
-      _Lists.indexOf(this, element, start, this.length);
-
-  int lastIndexOf(StyleSheet element, [int start]) {
-    if (start == null) start = length - 1;
-    return _Lists.lastIndexOf(this, element, start);
-  }
-
-  StyleSheet get last => this[length - 1];
-
-  StyleSheet removeLast() {
-    throw new UnsupportedError("Cannot removeLast on immutable List.");
-  }
-
-  void setRange(int start, int rangeLength, List<StyleSheet> from, [int startFrom]) {
-    throw new UnsupportedError("Cannot setRange on immutable List.");
-  }
-
-  void removeRange(int start, int rangeLength) {
-    throw new UnsupportedError("Cannot removeRange on immutable List.");
-  }
-
-  void insertRange(int start, int rangeLength, [StyleSheet initialValue]) {
-    throw new UnsupportedError("Cannot insertRange on immutable List.");
-  }
-
-  List<StyleSheet> getRange(int start, int rangeLength) =>
-      _Lists.getRange(this, start, rangeLength, <StyleSheet>[]);
-
-  // -- end List<StyleSheet> mixins.
-
-  StyleSheet item(int index) native "StyleSheetList_item_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName HTMLTableCaptionElement
-abstract class TableCaptionElement implements Element {
+class TableCaptionElement extends _Element_Merged {
 
   factory TableCaptionElement() => _Elements.createTableCaptionElement();
+  TableCaptionElement.internal(): super.internal();
+
 
   /** @domName HTMLTableCaptionElement.align */
-  String align;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TableCaptionElementImpl extends _ElementImpl_Merged implements TableCaptionElement {
-
   String get align native "HTMLTableCaptionElement_align_Getter";
 
+
+  /** @domName HTMLTableCaptionElement.align */
   void set align(String value) native "HTMLTableCaptionElement_align_Setter";
 
 }
@@ -36578,119 +29424,125 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLTableCellElement
-abstract class TableCellElement implements Element {
+class TableCellElement extends _Element_Merged {
 
   factory TableCellElement() => _Elements.createTableCellElement();
+  TableCellElement.internal(): super.internal();
+
 
   /** @domName HTMLTableCellElement.abbr */
-  String abbr;
-
-  /** @domName HTMLTableCellElement.align */
-  String align;
-
-  /** @domName HTMLTableCellElement.axis */
-  String axis;
-
-  /** @domName HTMLTableCellElement.bgColor */
-  String bgColor;
-
-  /** @domName HTMLTableCellElement.cellIndex */
-  int get cellIndex;
-
-  /** @domName HTMLTableCellElement.ch */
-  String ch;
-
-  /** @domName HTMLTableCellElement.chOff */
-  String chOff;
-
-  /** @domName HTMLTableCellElement.colSpan */
-  int colSpan;
-
-  /** @domName HTMLTableCellElement.headers */
-  String headers;
-
-  /** @domName HTMLTableCellElement.height */
-  String height;
-
-  /** @domName HTMLTableCellElement.noWrap */
-  bool noWrap;
-
-  /** @domName HTMLTableCellElement.rowSpan */
-  int rowSpan;
-
-  /** @domName HTMLTableCellElement.scope */
-  String scope;
-
-  /** @domName HTMLTableCellElement.vAlign */
-  String vAlign;
-
-  /** @domName HTMLTableCellElement.width */
-  String width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TableCellElementImpl extends _ElementImpl_Merged implements TableCellElement {
-
   String get abbr native "HTMLTableCellElement_abbr_Getter";
 
+
+  /** @domName HTMLTableCellElement.abbr */
   void set abbr(String value) native "HTMLTableCellElement_abbr_Setter";
 
+
+  /** @domName HTMLTableCellElement.align */
   String get align native "HTMLTableCellElement_align_Getter";
 
+
+  /** @domName HTMLTableCellElement.align */
   void set align(String value) native "HTMLTableCellElement_align_Setter";
 
+
+  /** @domName HTMLTableCellElement.axis */
   String get axis native "HTMLTableCellElement_axis_Getter";
 
+
+  /** @domName HTMLTableCellElement.axis */
   void set axis(String value) native "HTMLTableCellElement_axis_Setter";
 
+
+  /** @domName HTMLTableCellElement.bgColor */
   String get bgColor native "HTMLTableCellElement_bgColor_Getter";
 
+
+  /** @domName HTMLTableCellElement.bgColor */
   void set bgColor(String value) native "HTMLTableCellElement_bgColor_Setter";
 
+
+  /** @domName HTMLTableCellElement.cellIndex */
   int get cellIndex native "HTMLTableCellElement_cellIndex_Getter";
 
+
+  /** @domName HTMLTableCellElement.ch */
   String get ch native "HTMLTableCellElement_ch_Getter";
 
+
+  /** @domName HTMLTableCellElement.ch */
   void set ch(String value) native "HTMLTableCellElement_ch_Setter";
 
+
+  /** @domName HTMLTableCellElement.chOff */
   String get chOff native "HTMLTableCellElement_chOff_Getter";
 
+
+  /** @domName HTMLTableCellElement.chOff */
   void set chOff(String value) native "HTMLTableCellElement_chOff_Setter";
 
+
+  /** @domName HTMLTableCellElement.colSpan */
   int get colSpan native "HTMLTableCellElement_colSpan_Getter";
 
+
+  /** @domName HTMLTableCellElement.colSpan */
   void set colSpan(int value) native "HTMLTableCellElement_colSpan_Setter";
 
+
+  /** @domName HTMLTableCellElement.headers */
   String get headers native "HTMLTableCellElement_headers_Getter";
 
+
+  /** @domName HTMLTableCellElement.headers */
   void set headers(String value) native "HTMLTableCellElement_headers_Setter";
 
+
+  /** @domName HTMLTableCellElement.height */
   String get height native "HTMLTableCellElement_height_Getter";
 
+
+  /** @domName HTMLTableCellElement.height */
   void set height(String value) native "HTMLTableCellElement_height_Setter";
 
+
+  /** @domName HTMLTableCellElement.noWrap */
   bool get noWrap native "HTMLTableCellElement_noWrap_Getter";
 
+
+  /** @domName HTMLTableCellElement.noWrap */
   void set noWrap(bool value) native "HTMLTableCellElement_noWrap_Setter";
 
+
+  /** @domName HTMLTableCellElement.rowSpan */
   int get rowSpan native "HTMLTableCellElement_rowSpan_Getter";
 
+
+  /** @domName HTMLTableCellElement.rowSpan */
   void set rowSpan(int value) native "HTMLTableCellElement_rowSpan_Setter";
 
+
+  /** @domName HTMLTableCellElement.scope */
   String get scope native "HTMLTableCellElement_scope_Getter";
 
+
+  /** @domName HTMLTableCellElement.scope */
   void set scope(String value) native "HTMLTableCellElement_scope_Setter";
 
+
+  /** @domName HTMLTableCellElement.vAlign */
   String get vAlign native "HTMLTableCellElement_vAlign_Getter";
 
+
+  /** @domName HTMLTableCellElement.vAlign */
   void set vAlign(String value) native "HTMLTableCellElement_vAlign_Setter";
 
+
+  /** @domName HTMLTableCellElement.width */
   String get width native "HTMLTableCellElement_width_Getter";
 
+
+  /** @domName HTMLTableCellElement.width */
   void set width(String value) native "HTMLTableCellElement_width_Setter";
 
 }
@@ -36701,58 +29553,57 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLTableColElement
-abstract class TableColElement implements Element {
+class TableColElement extends _Element_Merged {
 
   factory TableColElement() => _Elements.createTableColElement();
+  TableColElement.internal(): super.internal();
+
 
   /** @domName HTMLTableColElement.align */
-  String align;
-
-  /** @domName HTMLTableColElement.ch */
-  String ch;
-
-  /** @domName HTMLTableColElement.chOff */
-  String chOff;
-
-  /** @domName HTMLTableColElement.span */
-  int span;
-
-  /** @domName HTMLTableColElement.vAlign */
-  String vAlign;
-
-  /** @domName HTMLTableColElement.width */
-  String width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TableColElementImpl extends _ElementImpl_Merged implements TableColElement {
-
   String get align native "HTMLTableColElement_align_Getter";
 
+
+  /** @domName HTMLTableColElement.align */
   void set align(String value) native "HTMLTableColElement_align_Setter";
 
+
+  /** @domName HTMLTableColElement.ch */
   String get ch native "HTMLTableColElement_ch_Getter";
 
+
+  /** @domName HTMLTableColElement.ch */
   void set ch(String value) native "HTMLTableColElement_ch_Setter";
 
+
+  /** @domName HTMLTableColElement.chOff */
   String get chOff native "HTMLTableColElement_chOff_Getter";
 
+
+  /** @domName HTMLTableColElement.chOff */
   void set chOff(String value) native "HTMLTableColElement_chOff_Setter";
 
+
+  /** @domName HTMLTableColElement.span */
   int get span native "HTMLTableColElement_span_Getter";
 
+
+  /** @domName HTMLTableColElement.span */
   void set span(int value) native "HTMLTableColElement_span_Setter";
 
+
+  /** @domName HTMLTableColElement.vAlign */
   String get vAlign native "HTMLTableColElement_vAlign_Getter";
 
+
+  /** @domName HTMLTableColElement.vAlign */
   void set vAlign(String value) native "HTMLTableColElement_vAlign_Setter";
 
+
+  /** @domName HTMLTableColElement.width */
   String get width native "HTMLTableColElement_width_Getter";
 
+
+  /** @domName HTMLTableColElement.width */
   void set width(String value) native "HTMLTableColElement_width_Setter";
 
 }
@@ -36763,155 +29614,149 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLTableElement
-abstract class TableElement implements Element {
+class TableElement extends _Element_Merged {
 
   factory TableElement() => _Elements.createTableElement();
+  TableElement.internal(): super.internal();
+
 
   /** @domName HTMLTableElement.align */
-  String align;
-
-  /** @domName HTMLTableElement.bgColor */
-  String bgColor;
-
-  /** @domName HTMLTableElement.border */
-  String border;
-
-  /** @domName HTMLTableElement.caption */
-  TableCaptionElement caption;
-
-  /** @domName HTMLTableElement.cellPadding */
-  String cellPadding;
-
-  /** @domName HTMLTableElement.cellSpacing */
-  String cellSpacing;
-
-  /** @domName HTMLTableElement.frame */
-  String frame;
-
-  /** @domName HTMLTableElement.rows */
-  HTMLCollection get rows;
-
-  /** @domName HTMLTableElement.rules */
-  String rules;
-
-  /** @domName HTMLTableElement.summary */
-  String summary;
-
-  /** @domName HTMLTableElement.tBodies */
-  HTMLCollection get tBodies;
-
-  /** @domName HTMLTableElement.tFoot */
-  TableSectionElement tFoot;
-
-  /** @domName HTMLTableElement.tHead */
-  TableSectionElement tHead;
-
-  /** @domName HTMLTableElement.width */
-  String width;
-
-  /** @domName HTMLTableElement.createCaption */
-  Element createCaption();
-
-  /** @domName HTMLTableElement.createTBody */
-  Element createTBody();
-
-  /** @domName HTMLTableElement.createTFoot */
-  Element createTFoot();
-
-  /** @domName HTMLTableElement.createTHead */
-  Element createTHead();
-
-  /** @domName HTMLTableElement.deleteCaption */
-  void deleteCaption();
-
-  /** @domName HTMLTableElement.deleteRow */
-  void deleteRow(int index);
-
-  /** @domName HTMLTableElement.deleteTFoot */
-  void deleteTFoot();
-
-  /** @domName HTMLTableElement.deleteTHead */
-  void deleteTHead();
-
-  /** @domName HTMLTableElement.insertRow */
-  Element insertRow(int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TableElementImpl extends _ElementImpl_Merged implements TableElement {
-
   String get align native "HTMLTableElement_align_Getter";
 
+
+  /** @domName HTMLTableElement.align */
   void set align(String value) native "HTMLTableElement_align_Setter";
 
+
+  /** @domName HTMLTableElement.bgColor */
   String get bgColor native "HTMLTableElement_bgColor_Getter";
 
+
+  /** @domName HTMLTableElement.bgColor */
   void set bgColor(String value) native "HTMLTableElement_bgColor_Setter";
 
+
+  /** @domName HTMLTableElement.border */
   String get border native "HTMLTableElement_border_Getter";
 
+
+  /** @domName HTMLTableElement.border */
   void set border(String value) native "HTMLTableElement_border_Setter";
 
+
+  /** @domName HTMLTableElement.caption */
   TableCaptionElement get caption native "HTMLTableElement_caption_Getter";
 
+
+  /** @domName HTMLTableElement.caption */
   void set caption(TableCaptionElement value) native "HTMLTableElement_caption_Setter";
 
+
+  /** @domName HTMLTableElement.cellPadding */
   String get cellPadding native "HTMLTableElement_cellPadding_Getter";
 
+
+  /** @domName HTMLTableElement.cellPadding */
   void set cellPadding(String value) native "HTMLTableElement_cellPadding_Setter";
 
+
+  /** @domName HTMLTableElement.cellSpacing */
   String get cellSpacing native "HTMLTableElement_cellSpacing_Getter";
 
+
+  /** @domName HTMLTableElement.cellSpacing */
   void set cellSpacing(String value) native "HTMLTableElement_cellSpacing_Setter";
 
+
+  /** @domName HTMLTableElement.frame */
   String get frame native "HTMLTableElement_frame_Getter";
 
+
+  /** @domName HTMLTableElement.frame */
   void set frame(String value) native "HTMLTableElement_frame_Setter";
 
+
+  /** @domName HTMLTableElement.rows */
   HTMLCollection get rows native "HTMLTableElement_rows_Getter";
 
+
+  /** @domName HTMLTableElement.rules */
   String get rules native "HTMLTableElement_rules_Getter";
 
+
+  /** @domName HTMLTableElement.rules */
   void set rules(String value) native "HTMLTableElement_rules_Setter";
 
+
+  /** @domName HTMLTableElement.summary */
   String get summary native "HTMLTableElement_summary_Getter";
 
+
+  /** @domName HTMLTableElement.summary */
   void set summary(String value) native "HTMLTableElement_summary_Setter";
 
+
+  /** @domName HTMLTableElement.tBodies */
   HTMLCollection get tBodies native "HTMLTableElement_tBodies_Getter";
 
+
+  /** @domName HTMLTableElement.tFoot */
   TableSectionElement get tFoot native "HTMLTableElement_tFoot_Getter";
 
+
+  /** @domName HTMLTableElement.tFoot */
   void set tFoot(TableSectionElement value) native "HTMLTableElement_tFoot_Setter";
 
+
+  /** @domName HTMLTableElement.tHead */
   TableSectionElement get tHead native "HTMLTableElement_tHead_Getter";
 
+
+  /** @domName HTMLTableElement.tHead */
   void set tHead(TableSectionElement value) native "HTMLTableElement_tHead_Setter";
 
+
+  /** @domName HTMLTableElement.width */
   String get width native "HTMLTableElement_width_Getter";
 
+
+  /** @domName HTMLTableElement.width */
   void set width(String value) native "HTMLTableElement_width_Setter";
 
+
+  /** @domName HTMLTableElement.createCaption */
   Element createCaption() native "HTMLTableElement_createCaption_Callback";
 
+
+  /** @domName HTMLTableElement.createTBody */
   Element createTBody() native "HTMLTableElement_createTBody_Callback";
 
+
+  /** @domName HTMLTableElement.createTFoot */
   Element createTFoot() native "HTMLTableElement_createTFoot_Callback";
 
+
+  /** @domName HTMLTableElement.createTHead */
   Element createTHead() native "HTMLTableElement_createTHead_Callback";
 
+
+  /** @domName HTMLTableElement.deleteCaption */
   void deleteCaption() native "HTMLTableElement_deleteCaption_Callback";
 
+
+  /** @domName HTMLTableElement.deleteRow */
   void deleteRow(int index) native "HTMLTableElement_deleteRow_Callback";
 
+
+  /** @domName HTMLTableElement.deleteTFoot */
   void deleteTFoot() native "HTMLTableElement_deleteTFoot_Callback";
 
+
+  /** @domName HTMLTableElement.deleteTHead */
   void deleteTHead() native "HTMLTableElement_deleteTHead_Callback";
 
+
+  /** @domName HTMLTableElement.insertRow */
   Element insertRow(int index) native "HTMLTableElement_insertRow_Callback";
 
 }
@@ -36922,76 +29767,69 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLTableRowElement
-abstract class TableRowElement implements Element {
+class TableRowElement extends _Element_Merged {
 
   factory TableRowElement() => _Elements.createTableRowElement();
+  TableRowElement.internal(): super.internal();
+
 
   /** @domName HTMLTableRowElement.align */
-  String align;
-
-  /** @domName HTMLTableRowElement.bgColor */
-  String bgColor;
-
-  /** @domName HTMLTableRowElement.cells */
-  HTMLCollection get cells;
-
-  /** @domName HTMLTableRowElement.ch */
-  String ch;
-
-  /** @domName HTMLTableRowElement.chOff */
-  String chOff;
-
-  /** @domName HTMLTableRowElement.rowIndex */
-  int get rowIndex;
-
-  /** @domName HTMLTableRowElement.sectionRowIndex */
-  int get sectionRowIndex;
-
-  /** @domName HTMLTableRowElement.vAlign */
-  String vAlign;
-
-  /** @domName HTMLTableRowElement.deleteCell */
-  void deleteCell(int index);
-
-  /** @domName HTMLTableRowElement.insertCell */
-  Element insertCell(int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TableRowElementImpl extends _ElementImpl_Merged implements TableRowElement {
-
   String get align native "HTMLTableRowElement_align_Getter";
 
+
+  /** @domName HTMLTableRowElement.align */
   void set align(String value) native "HTMLTableRowElement_align_Setter";
 
+
+  /** @domName HTMLTableRowElement.bgColor */
   String get bgColor native "HTMLTableRowElement_bgColor_Getter";
 
+
+  /** @domName HTMLTableRowElement.bgColor */
   void set bgColor(String value) native "HTMLTableRowElement_bgColor_Setter";
 
+
+  /** @domName HTMLTableRowElement.cells */
   HTMLCollection get cells native "HTMLTableRowElement_cells_Getter";
 
+
+  /** @domName HTMLTableRowElement.ch */
   String get ch native "HTMLTableRowElement_ch_Getter";
 
+
+  /** @domName HTMLTableRowElement.ch */
   void set ch(String value) native "HTMLTableRowElement_ch_Setter";
 
+
+  /** @domName HTMLTableRowElement.chOff */
   String get chOff native "HTMLTableRowElement_chOff_Getter";
 
+
+  /** @domName HTMLTableRowElement.chOff */
   void set chOff(String value) native "HTMLTableRowElement_chOff_Setter";
 
+
+  /** @domName HTMLTableRowElement.rowIndex */
   int get rowIndex native "HTMLTableRowElement_rowIndex_Getter";
 
+
+  /** @domName HTMLTableRowElement.sectionRowIndex */
   int get sectionRowIndex native "HTMLTableRowElement_sectionRowIndex_Getter";
 
+
+  /** @domName HTMLTableRowElement.vAlign */
   String get vAlign native "HTMLTableRowElement_vAlign_Getter";
 
+
+  /** @domName HTMLTableRowElement.vAlign */
   void set vAlign(String value) native "HTMLTableRowElement_vAlign_Setter";
 
+
+  /** @domName HTMLTableRowElement.deleteCell */
   void deleteCell(int index) native "HTMLTableRowElement_deleteCell_Callback";
 
+
+  /** @domName HTMLTableRowElement.insertCell */
   Element insertCell(int index) native "HTMLTableRowElement_insertCell_Callback";
 
 }
@@ -37002,28 +29840,53 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLTableSectionElement
-abstract class TableSectionElement implements Element {
+class TableSectionElement extends _Element_Merged {
+  TableSectionElement.internal(): super.internal();
+
 
   /** @domName HTMLTableSectionElement.align */
-  String align;
+  String get align native "HTMLTableSectionElement_align_Getter";
+
+
+  /** @domName HTMLTableSectionElement.align */
+  void set align(String value) native "HTMLTableSectionElement_align_Setter";
+
 
   /** @domName HTMLTableSectionElement.ch */
-  String ch;
+  String get ch native "HTMLTableSectionElement_ch_Getter";
+
+
+  /** @domName HTMLTableSectionElement.ch */
+  void set ch(String value) native "HTMLTableSectionElement_ch_Setter";
+
 
   /** @domName HTMLTableSectionElement.chOff */
-  String chOff;
+  String get chOff native "HTMLTableSectionElement_chOff_Getter";
+
+
+  /** @domName HTMLTableSectionElement.chOff */
+  void set chOff(String value) native "HTMLTableSectionElement_chOff_Setter";
+
 
   /** @domName HTMLTableSectionElement.rows */
-  HTMLCollection get rows;
+  HTMLCollection get rows native "HTMLTableSectionElement_rows_Getter";
+
 
   /** @domName HTMLTableSectionElement.vAlign */
-  String vAlign;
+  String get vAlign native "HTMLTableSectionElement_vAlign_Getter";
+
+
+  /** @domName HTMLTableSectionElement.vAlign */
+  void set vAlign(String value) native "HTMLTableSectionElement_vAlign_Setter";
+
 
   /** @domName HTMLTableSectionElement.deleteRow */
-  void deleteRow(int index);
+  void deleteRow(int index) native "HTMLTableSectionElement_deleteRow_Callback";
+
 
   /** @domName HTMLTableSectionElement.insertRow */
-  Element insertRow(int index);
+  Element insertRow(int index) native "HTMLTableSectionElement_insertRow_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -37031,51 +29894,22 @@
 
 // WARNING: Do not edit - generated code.
 
-class _TableSectionElementImpl extends _ElementImpl_Merged implements TableSectionElement {
-
-  String get align native "HTMLTableSectionElement_align_Getter";
-
-  void set align(String value) native "HTMLTableSectionElement_align_Setter";
-
-  String get ch native "HTMLTableSectionElement_ch_Getter";
-
-  void set ch(String value) native "HTMLTableSectionElement_ch_Setter";
-
-  String get chOff native "HTMLTableSectionElement_chOff_Getter";
-
-  void set chOff(String value) native "HTMLTableSectionElement_chOff_Setter";
-
-  HTMLCollection get rows native "HTMLTableSectionElement_rows_Getter";
-
-  String get vAlign native "HTMLTableSectionElement_vAlign_Getter";
-
-  void set vAlign(String value) native "HTMLTableSectionElement_vAlign_Setter";
-
-  void deleteRow(int index) native "HTMLTableSectionElement_deleteRow_Callback";
-
-  Element insertRow(int index) native "HTMLTableSectionElement_insertRow_Callback";
-
-}
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName Text
-abstract class Text implements CharacterData {
-
+class Text extends CharacterData {
   factory Text(String data) => _TextFactoryProvider.createText(data);
+  Text.internal(): super.internal();
+
 
   /** @domName Text.wholeText */
-  String get wholeText;
+  String get wholeText native "Text_wholeText_Getter";
+
 
   /** @domName Text.replaceWholeText */
-  Text replaceWholeText(String content);
+  Text replaceWholeText(String content) native "Text_replaceWholeText_Callback";
+
 
   /** @domName Text.splitText */
-  Text splitText(int offset);
+  Text splitText(int offset) native "Text_splitText_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -37084,184 +29918,177 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLTextAreaElement
-abstract class TextAreaElement implements Element {
+class TextAreaElement extends _Element_Merged {
 
   factory TextAreaElement() => _Elements.createTextAreaElement();
+  TextAreaElement.internal(): super.internal();
+
 
   /** @domName HTMLTextAreaElement.autofocus */
-  bool autofocus;
-
-  /** @domName HTMLTextAreaElement.cols */
-  int cols;
-
-  /** @domName HTMLTextAreaElement.defaultValue */
-  String defaultValue;
-
-  /** @domName HTMLTextAreaElement.dirName */
-  String dirName;
-
-  /** @domName HTMLTextAreaElement.disabled */
-  bool disabled;
-
-  /** @domName HTMLTextAreaElement.form */
-  FormElement get form;
-
-  /** @domName HTMLTextAreaElement.labels */
-  List<Node> get labels;
-
-  /** @domName HTMLTextAreaElement.maxLength */
-  int maxLength;
-
-  /** @domName HTMLTextAreaElement.name */
-  String name;
-
-  /** @domName HTMLTextAreaElement.placeholder */
-  String placeholder;
-
-  /** @domName HTMLTextAreaElement.readOnly */
-  bool readOnly;
-
-  /** @domName HTMLTextAreaElement.required */
-  bool required;
-
-  /** @domName HTMLTextAreaElement.rows */
-  int rows;
-
-  /** @domName HTMLTextAreaElement.selectionDirection */
-  String selectionDirection;
-
-  /** @domName HTMLTextAreaElement.selectionEnd */
-  int selectionEnd;
-
-  /** @domName HTMLTextAreaElement.selectionStart */
-  int selectionStart;
-
-  /** @domName HTMLTextAreaElement.textLength */
-  int get textLength;
-
-  /** @domName HTMLTextAreaElement.type */
-  String get type;
-
-  /** @domName HTMLTextAreaElement.validationMessage */
-  String get validationMessage;
-
-  /** @domName HTMLTextAreaElement.validity */
-  ValidityState get validity;
-
-  /** @domName HTMLTextAreaElement.value */
-  String value;
-
-  /** @domName HTMLTextAreaElement.willValidate */
-  bool get willValidate;
-
-  /** @domName HTMLTextAreaElement.wrap */
-  String wrap;
-
-  /** @domName HTMLTextAreaElement.checkValidity */
-  bool checkValidity();
-
-  /** @domName HTMLTextAreaElement.select */
-  void select();
-
-  /** @domName HTMLTextAreaElement.setCustomValidity */
-  void setCustomValidity(String error);
-
-  /** @domName HTMLTextAreaElement.setRangeText */
-  void setRangeText(String replacement, [int start, int end, String selectionMode]);
-
-  /** @domName HTMLTextAreaElement.setSelectionRange */
-  void setSelectionRange(int start, int end, [String direction]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TextAreaElementImpl extends _ElementImpl_Merged implements TextAreaElement {
-
   bool get autofocus native "HTMLTextAreaElement_autofocus_Getter";
 
+
+  /** @domName HTMLTextAreaElement.autofocus */
   void set autofocus(bool value) native "HTMLTextAreaElement_autofocus_Setter";
 
+
+  /** @domName HTMLTextAreaElement.cols */
   int get cols native "HTMLTextAreaElement_cols_Getter";
 
+
+  /** @domName HTMLTextAreaElement.cols */
   void set cols(int value) native "HTMLTextAreaElement_cols_Setter";
 
+
+  /** @domName HTMLTextAreaElement.defaultValue */
   String get defaultValue native "HTMLTextAreaElement_defaultValue_Getter";
 
+
+  /** @domName HTMLTextAreaElement.defaultValue */
   void set defaultValue(String value) native "HTMLTextAreaElement_defaultValue_Setter";
 
+
+  /** @domName HTMLTextAreaElement.dirName */
   String get dirName native "HTMLTextAreaElement_dirName_Getter";
 
+
+  /** @domName HTMLTextAreaElement.dirName */
   void set dirName(String value) native "HTMLTextAreaElement_dirName_Setter";
 
+
+  /** @domName HTMLTextAreaElement.disabled */
   bool get disabled native "HTMLTextAreaElement_disabled_Getter";
 
+
+  /** @domName HTMLTextAreaElement.disabled */
   void set disabled(bool value) native "HTMLTextAreaElement_disabled_Setter";
 
+
+  /** @domName HTMLTextAreaElement.form */
   FormElement get form native "HTMLTextAreaElement_form_Getter";
 
+
+  /** @domName HTMLTextAreaElement.labels */
   List<Node> get labels native "HTMLTextAreaElement_labels_Getter";
 
+
+  /** @domName HTMLTextAreaElement.maxLength */
   int get maxLength native "HTMLTextAreaElement_maxLength_Getter";
 
+
+  /** @domName HTMLTextAreaElement.maxLength */
   void set maxLength(int value) native "HTMLTextAreaElement_maxLength_Setter";
 
+
+  /** @domName HTMLTextAreaElement.name */
   String get name native "HTMLTextAreaElement_name_Getter";
 
+
+  /** @domName HTMLTextAreaElement.name */
   void set name(String value) native "HTMLTextAreaElement_name_Setter";
 
+
+  /** @domName HTMLTextAreaElement.placeholder */
   String get placeholder native "HTMLTextAreaElement_placeholder_Getter";
 
+
+  /** @domName HTMLTextAreaElement.placeholder */
   void set placeholder(String value) native "HTMLTextAreaElement_placeholder_Setter";
 
+
+  /** @domName HTMLTextAreaElement.readOnly */
   bool get readOnly native "HTMLTextAreaElement_readOnly_Getter";
 
+
+  /** @domName HTMLTextAreaElement.readOnly */
   void set readOnly(bool value) native "HTMLTextAreaElement_readOnly_Setter";
 
+
+  /** @domName HTMLTextAreaElement.required */
   bool get required native "HTMLTextAreaElement_required_Getter";
 
+
+  /** @domName HTMLTextAreaElement.required */
   void set required(bool value) native "HTMLTextAreaElement_required_Setter";
 
+
+  /** @domName HTMLTextAreaElement.rows */
   int get rows native "HTMLTextAreaElement_rows_Getter";
 
+
+  /** @domName HTMLTextAreaElement.rows */
   void set rows(int value) native "HTMLTextAreaElement_rows_Setter";
 
+
+  /** @domName HTMLTextAreaElement.selectionDirection */
   String get selectionDirection native "HTMLTextAreaElement_selectionDirection_Getter";
 
+
+  /** @domName HTMLTextAreaElement.selectionDirection */
   void set selectionDirection(String value) native "HTMLTextAreaElement_selectionDirection_Setter";
 
+
+  /** @domName HTMLTextAreaElement.selectionEnd */
   int get selectionEnd native "HTMLTextAreaElement_selectionEnd_Getter";
 
+
+  /** @domName HTMLTextAreaElement.selectionEnd */
   void set selectionEnd(int value) native "HTMLTextAreaElement_selectionEnd_Setter";
 
+
+  /** @domName HTMLTextAreaElement.selectionStart */
   int get selectionStart native "HTMLTextAreaElement_selectionStart_Getter";
 
+
+  /** @domName HTMLTextAreaElement.selectionStart */
   void set selectionStart(int value) native "HTMLTextAreaElement_selectionStart_Setter";
 
+
+  /** @domName HTMLTextAreaElement.textLength */
   int get textLength native "HTMLTextAreaElement_textLength_Getter";
 
+
+  /** @domName HTMLTextAreaElement.type */
   String get type native "HTMLTextAreaElement_type_Getter";
 
+
+  /** @domName HTMLTextAreaElement.validationMessage */
   String get validationMessage native "HTMLTextAreaElement_validationMessage_Getter";
 
+
+  /** @domName HTMLTextAreaElement.validity */
   ValidityState get validity native "HTMLTextAreaElement_validity_Getter";
 
+
+  /** @domName HTMLTextAreaElement.value */
   String get value native "HTMLTextAreaElement_value_Getter";
 
+
+  /** @domName HTMLTextAreaElement.value */
   void set value(String value) native "HTMLTextAreaElement_value_Setter";
 
+
+  /** @domName HTMLTextAreaElement.willValidate */
   bool get willValidate native "HTMLTextAreaElement_willValidate_Getter";
 
+
+  /** @domName HTMLTextAreaElement.wrap */
   String get wrap native "HTMLTextAreaElement_wrap_Getter";
 
+
+  /** @domName HTMLTextAreaElement.wrap */
   void set wrap(String value) native "HTMLTextAreaElement_wrap_Setter";
 
+
+  /** @domName HTMLTextAreaElement.checkValidity */
   bool checkValidity() native "HTMLTextAreaElement_checkValidity_Callback";
 
+
+  /** @domName HTMLTextAreaElement.select */
   void select() native "HTMLTextAreaElement_select_Callback";
 
+
+  /** @domName HTMLTextAreaElement.setCustomValidity */
   void setCustomValidity(String error) native "HTMLTextAreaElement_setCustomValidity_Callback";
 
   void setRangeText(/*DOMString*/ replacement, [/*unsigned long*/ start, /*unsigned long*/ end, /*DOMString*/ selectionMode]) {
@@ -37276,8 +30103,12 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName HTMLTextAreaElement.setRangeText_1 */
   void _setRangeText_1(replacement) native "HTMLTextAreaElement_setRangeText_1_Callback";
 
+
+  /** @domName HTMLTextAreaElement.setRangeText_2 */
   void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLTextAreaElement_setRangeText_2_Callback";
 
   void setSelectionRange(/*long*/ start, /*long*/ end, [/*DOMString*/ direction]) {
@@ -37288,8 +30119,12 @@
     _setSelectionRange_2(start, end);
   }
 
+
+  /** @domName HTMLTextAreaElement.setSelectionRange_1 */
   void _setSelectionRange_1(start, end, direction) native "HTMLTextAreaElement_setSelectionRange_1_Callback";
 
+
+  /** @domName HTMLTextAreaElement.setSelectionRange_2 */
   void _setSelectionRange_2(start, end) native "HTMLTextAreaElement_setSelectionRange_2_Callback";
 
 }
@@ -37300,24 +30135,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName TextEvent
-abstract class TextEvent implements UIEvent {
+class TextEvent extends UIEvent {
+  TextEvent.internal(): super.internal();
+
 
   /** @domName TextEvent.data */
-  String get data;
-
-  /** @domName TextEvent.initTextEvent */
-  void initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TextEventImpl extends _UIEventImpl implements TextEvent {
-
   String get data native "TextEvent_data_Getter";
 
+
+  /** @domName TextEvent.initTextEvent */
   void initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg) native "TextEvent_initTextEvent_Callback";
 
 }
@@ -37327,35 +30153,12 @@
 
 // WARNING: Do not edit - generated code.
 
-class _TextImpl extends _CharacterDataImpl implements Text {
-
-  String get wholeText native "Text_wholeText_Getter";
-
-  Text replaceWholeText(String content) native "Text_replaceWholeText_Callback";
-
-  Text splitText(int offset) native "Text_splitText_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName TextMetrics
-abstract class TextMetrics {
+class TextMetrics extends NativeFieldWrapperClass1 {
+  TextMetrics.internal();
+
 
   /** @domName TextMetrics.width */
-  num get width;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TextMetricsImpl extends NativeFieldWrapperClass1 implements TextMetrics {
-
   num get width native "TextMetrics_width_Getter";
 
 }
@@ -37366,50 +30169,69 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName TextTrack
-abstract class TextTrack implements EventTarget {
+class TextTrack extends EventTarget {
+  TextTrack.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  TextTrackEvents get on;
+  TextTrackEvents get on =>
+    new TextTrackEvents(this);
+
 
   /** @domName TextTrack.activeCues */
-  TextTrackCueList get activeCues;
+  TextTrackCueList get activeCues native "TextTrack_activeCues_Getter";
+
 
   /** @domName TextTrack.cues */
-  TextTrackCueList get cues;
+  TextTrackCueList get cues native "TextTrack_cues_Getter";
+
 
   /** @domName TextTrack.kind */
-  String get kind;
+  String get kind native "TextTrack_kind_Getter";
+
 
   /** @domName TextTrack.label */
-  String get label;
+  String get label native "TextTrack_label_Getter";
+
 
   /** @domName TextTrack.language */
-  String get language;
+  String get language native "TextTrack_language_Getter";
+
 
   /** @domName TextTrack.mode */
-  String mode;
+  String get mode native "TextTrack_mode_Getter";
+
+
+  /** @domName TextTrack.mode */
+  void set mode(String value) native "TextTrack_mode_Setter";
+
 
   /** @domName TextTrack.addCue */
-  void addCue(TextTrackCue cue);
+  void addCue(TextTrackCue cue) native "TextTrack_addCue_Callback";
+
 
   /** @domName TextTrack.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_addEventListener_Callback";
+
 
   /** @domName TextTrack.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
+  bool $dom_dispatchEvent(Event evt) native "TextTrack_dispatchEvent_Callback";
+
 
   /** @domName TextTrack.removeCue */
-  void removeCue(TextTrackCue cue);
+  void removeCue(TextTrackCue cue) native "TextTrack_removeCue_Callback";
+
 
   /** @domName TextTrack.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_removeEventListener_Callback";
+
 }
 
-abstract class TextTrackEvents implements Events {
+class TextTrackEvents extends Events {
+  TextTrackEvents(EventTarget _ptr) : super(_ptr);
 
-  EventListenerList get cueChange;
+  EventListenerList get cueChange => this['cuechange'];
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -37418,139 +30240,129 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName TextTrackCue
-abstract class TextTrackCue implements EventTarget {
+class TextTrackCue extends EventTarget {
 
   factory TextTrackCue(num startTime, num endTime, String text) => _TextTrackCueFactoryProvider.createTextTrackCue(startTime, endTime, text);
+  TextTrackCue.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  TextTrackCueEvents get on;
+  TextTrackCueEvents get on =>
+    new TextTrackCueEvents(this);
+
 
   /** @domName TextTrackCue.align */
-  String align;
-
-  /** @domName TextTrackCue.endTime */
-  num endTime;
-
-  /** @domName TextTrackCue.id */
-  String id;
-
-  /** @domName TextTrackCue.line */
-  int line;
-
-  /** @domName TextTrackCue.pauseOnExit */
-  bool pauseOnExit;
-
-  /** @domName TextTrackCue.position */
-  int position;
-
-  /** @domName TextTrackCue.size */
-  int size;
-
-  /** @domName TextTrackCue.snapToLines */
-  bool snapToLines;
-
-  /** @domName TextTrackCue.startTime */
-  num startTime;
-
-  /** @domName TextTrackCue.text */
-  String text;
-
-  /** @domName TextTrackCue.track */
-  TextTrack get track;
-
-  /** @domName TextTrackCue.vertical */
-  String vertical;
-
-  /** @domName TextTrackCue.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName TextTrackCue.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName TextTrackCue.getCueAsHTML */
-  DocumentFragment getCueAsHTML();
-
-  /** @domName TextTrackCue.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class TextTrackCueEvents implements Events {
-
-  EventListenerList get enter;
-
-  EventListenerList get exit;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TextTrackCueImpl extends _EventTargetImpl implements TextTrackCue {
-
-  _TextTrackCueEventsImpl get on =>
-    new _TextTrackCueEventsImpl(this);
-
   String get align native "TextTrackCue_align_Getter";
 
+
+  /** @domName TextTrackCue.align */
   void set align(String value) native "TextTrackCue_align_Setter";
 
+
+  /** @domName TextTrackCue.endTime */
   num get endTime native "TextTrackCue_endTime_Getter";
 
+
+  /** @domName TextTrackCue.endTime */
   void set endTime(num value) native "TextTrackCue_endTime_Setter";
 
+
+  /** @domName TextTrackCue.id */
   String get id native "TextTrackCue_id_Getter";
 
+
+  /** @domName TextTrackCue.id */
   void set id(String value) native "TextTrackCue_id_Setter";
 
+
+  /** @domName TextTrackCue.line */
   int get line native "TextTrackCue_line_Getter";
 
+
+  /** @domName TextTrackCue.line */
   void set line(int value) native "TextTrackCue_line_Setter";
 
+
+  /** @domName TextTrackCue.pauseOnExit */
   bool get pauseOnExit native "TextTrackCue_pauseOnExit_Getter";
 
+
+  /** @domName TextTrackCue.pauseOnExit */
   void set pauseOnExit(bool value) native "TextTrackCue_pauseOnExit_Setter";
 
+
+  /** @domName TextTrackCue.position */
   int get position native "TextTrackCue_position_Getter";
 
+
+  /** @domName TextTrackCue.position */
   void set position(int value) native "TextTrackCue_position_Setter";
 
+
+  /** @domName TextTrackCue.size */
   int get size native "TextTrackCue_size_Getter";
 
+
+  /** @domName TextTrackCue.size */
   void set size(int value) native "TextTrackCue_size_Setter";
 
+
+  /** @domName TextTrackCue.snapToLines */
   bool get snapToLines native "TextTrackCue_snapToLines_Getter";
 
+
+  /** @domName TextTrackCue.snapToLines */
   void set snapToLines(bool value) native "TextTrackCue_snapToLines_Setter";
 
+
+  /** @domName TextTrackCue.startTime */
   num get startTime native "TextTrackCue_startTime_Getter";
 
+
+  /** @domName TextTrackCue.startTime */
   void set startTime(num value) native "TextTrackCue_startTime_Setter";
 
+
+  /** @domName TextTrackCue.text */
   String get text native "TextTrackCue_text_Getter";
 
+
+  /** @domName TextTrackCue.text */
   void set text(String value) native "TextTrackCue_text_Setter";
 
+
+  /** @domName TextTrackCue.track */
   TextTrack get track native "TextTrackCue_track_Getter";
 
+
+  /** @domName TextTrackCue.vertical */
   String get vertical native "TextTrackCue_vertical_Getter";
 
+
+  /** @domName TextTrackCue.vertical */
   void set vertical(String value) native "TextTrackCue_vertical_Setter";
 
+
+  /** @domName TextTrackCue.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_addEventListener_Callback";
 
+
+  /** @domName TextTrackCue.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "TextTrackCue_dispatchEvent_Callback";
 
+
+  /** @domName TextTrackCue.getCueAsHTML */
   DocumentFragment getCueAsHTML() native "TextTrackCue_getCueAsHTML_Callback";
 
+
+  /** @domName TextTrackCue.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_removeEventListener_Callback";
 
 }
 
-class _TextTrackCueEventsImpl extends _EventsImpl implements TextTrackCueEvents {
-  _TextTrackCueEventsImpl(_ptr) : super(_ptr);
+class TextTrackCueEvents extends Events {
+  TextTrackCueEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get enter => this['enter'];
 
@@ -37563,25 +30375,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName TextTrackCueList
-abstract class TextTrackCueList implements List<TextTrackCue> {
+class TextTrackCueList extends NativeFieldWrapperClass1 implements List<TextTrackCue> {
+  TextTrackCueList.internal();
+
 
   /** @domName TextTrackCueList.length */
-  int get length;
-
-  /** @domName TextTrackCueList.getCueById */
-  TextTrackCue getCueById(String id);
-
-  /** @domName TextTrackCueList.item */
-  TextTrackCue item(int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TextTrackCueListImpl extends NativeFieldWrapperClass1 implements TextTrackCueList {
-
   int get length native "TextTrackCueList_length_Getter";
 
   TextTrackCue operator[](int index) native "TextTrackCueList_item_Callback";
@@ -37667,8 +30465,12 @@
 
   // -- end List<TextTrackCue> mixins.
 
+
+  /** @domName TextTrackCueList.getCueById */
   TextTrackCue getCueById(String id) native "TextTrackCueList_getCueById_Callback";
 
+
+  /** @domName TextTrackCueList.item */
   TextTrackCue item(int index) native "TextTrackCueList_item_Callback";
 
 }
@@ -37678,87 +30480,18 @@
 
 // WARNING: Do not edit - generated code.
 
-class _TextTrackImpl extends _EventTargetImpl implements TextTrack {
-
-  _TextTrackEventsImpl get on =>
-    new _TextTrackEventsImpl(this);
-
-  TextTrackCueList get activeCues native "TextTrack_activeCues_Getter";
-
-  TextTrackCueList get cues native "TextTrack_cues_Getter";
-
-  String get kind native "TextTrack_kind_Getter";
-
-  String get label native "TextTrack_label_Getter";
-
-  String get language native "TextTrack_language_Getter";
-
-  String get mode native "TextTrack_mode_Getter";
-
-  void set mode(String value) native "TextTrack_mode_Setter";
-
-  void addCue(TextTrackCue cue) native "TextTrack_addCue_Callback";
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_addEventListener_Callback";
-
-  bool $dom_dispatchEvent(Event evt) native "TextTrack_dispatchEvent_Callback";
-
-  void removeCue(TextTrackCue cue) native "TextTrack_removeCue_Callback";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_removeEventListener_Callback";
-
-}
-
-class _TextTrackEventsImpl extends _EventsImpl implements TextTrackEvents {
-  _TextTrackEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get cueChange => this['cuechange'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
 /// @domName TextTrackList
-abstract class TextTrackList implements EventTarget, List<TextTrack> {
+class TextTrackList extends EventTarget implements List<TextTrack> {
+  TextTrackList.internal(): super.internal();
 
   /**
    * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
    */
-  TextTrackListEvents get on;
+  TextTrackListEvents get on =>
+    new TextTrackListEvents(this);
+
 
   /** @domName TextTrackList.length */
-  int get length;
-
-  /** @domName TextTrackList.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName TextTrackList.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName TextTrackList.item */
-  TextTrack item(int index);
-
-  /** @domName TextTrackList.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-
-abstract class TextTrackListEvents implements Events {
-
-  EventListenerList get addTrack;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TextTrackListImpl extends _EventTargetImpl implements TextTrackList {
-
-  _TextTrackListEventsImpl get on =>
-    new _TextTrackListEventsImpl(this);
-
   int get length native "TextTrackList_length_Getter";
 
   TextTrack operator[](int index) native "TextTrackList_item_Callback";
@@ -37844,18 +30577,26 @@
 
   // -- end List<TextTrack> mixins.
 
+
+  /** @domName TextTrackList.addEventListener */
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_addEventListener_Callback";
 
+
+  /** @domName TextTrackList.dispatchEvent */
   bool $dom_dispatchEvent(Event evt) native "TextTrackList_dispatchEvent_Callback";
 
+
+  /** @domName TextTrackList.item */
   TextTrack item(int index) native "TextTrackList_item_Callback";
 
+
+  /** @domName TextTrackList.removeEventListener */
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_removeEventListener_Callback";
 
 }
 
-class _TextTrackListEventsImpl extends _EventsImpl implements TextTrackListEvents {
-  _TextTrackListEventsImpl(_ptr) : super(_ptr);
+class TextTrackListEvents extends Events {
+  TextTrackListEvents(EventTarget _ptr) : super(_ptr);
 
   EventListenerList get addTrack => this['addtrack'];
 }
@@ -37866,29 +30607,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName TimeRanges
-abstract class TimeRanges {
+class TimeRanges extends NativeFieldWrapperClass1 {
+  TimeRanges.internal();
+
 
   /** @domName TimeRanges.length */
-  int get length;
-
-  /** @domName TimeRanges.end */
-  num end(int index);
-
-  /** @domName TimeRanges.start */
-  num start(int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TimeRangesImpl extends NativeFieldWrapperClass1 implements TimeRanges {
-
   int get length native "TimeRanges_length_Getter";
 
+
+  /** @domName TimeRanges.end */
   num end(int index) native "TimeRanges_end_Callback";
 
+
+  /** @domName TimeRanges.start */
   num start(int index) native "TimeRanges_start_Callback";
 
 }
@@ -37907,17 +30638,10 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLTitleElement
-abstract class TitleElement implements Element {
+class TitleElement extends _Element_Merged {
 
   factory TitleElement() => _Elements.createTitleElement();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TitleElementImpl extends _ElementImpl_Merged implements TitleElement {
+  TitleElement.internal(): super.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37927,132 +30651,55 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Touch
-abstract class Touch {
+class Touch extends NativeFieldWrapperClass1 {
+  Touch.internal();
+
 
   /** @domName Touch.clientX */
-  int get clientX;
-
-  /** @domName Touch.clientY */
-  int get clientY;
-
-  /** @domName Touch.identifier */
-  int get identifier;
-
-  /** @domName Touch.pageX */
-  int get pageX;
-
-  /** @domName Touch.pageY */
-  int get pageY;
-
-  /** @domName Touch.screenX */
-  int get screenX;
-
-  /** @domName Touch.screenY */
-  int get screenY;
-
-  /** @domName Touch.target */
-  EventTarget get target;
-
-  /** @domName Touch.webkitForce */
-  num get webkitForce;
-
-  /** @domName Touch.webkitRadiusX */
-  int get webkitRadiusX;
-
-  /** @domName Touch.webkitRadiusY */
-  int get webkitRadiusY;
-
-  /** @domName Touch.webkitRotationAngle */
-  num get webkitRotationAngle;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName TouchEvent
-abstract class TouchEvent implements UIEvent {
-
-  /** @domName TouchEvent.altKey */
-  bool get altKey;
-
-  /** @domName TouchEvent.changedTouches */
-  TouchList get changedTouches;
-
-  /** @domName TouchEvent.ctrlKey */
-  bool get ctrlKey;
-
-  /** @domName TouchEvent.metaKey */
-  bool get metaKey;
-
-  /** @domName TouchEvent.shiftKey */
-  bool get shiftKey;
-
-  /** @domName TouchEvent.targetTouches */
-  TouchList get targetTouches;
-
-  /** @domName TouchEvent.touches */
-  TouchList get touches;
-
-  /** @domName TouchEvent.initTouchEvent */
-  void initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TouchEventImpl extends _UIEventImpl implements TouchEvent {
-
-  bool get altKey native "TouchEvent_altKey_Getter";
-
-  TouchList get changedTouches native "TouchEvent_changedTouches_Getter";
-
-  bool get ctrlKey native "TouchEvent_ctrlKey_Getter";
-
-  bool get metaKey native "TouchEvent_metaKey_Getter";
-
-  bool get shiftKey native "TouchEvent_shiftKey_Getter";
-
-  TouchList get targetTouches native "TouchEvent_targetTouches_Getter";
-
-  TouchList get touches native "TouchEvent_touches_Getter";
-
-  void initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "TouchEvent_initTouchEvent_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TouchImpl extends NativeFieldWrapperClass1 implements Touch {
-
   int get clientX native "Touch_clientX_Getter";
 
+
+  /** @domName Touch.clientY */
   int get clientY native "Touch_clientY_Getter";
 
+
+  /** @domName Touch.identifier */
   int get identifier native "Touch_identifier_Getter";
 
+
+  /** @domName Touch.pageX */
   int get pageX native "Touch_pageX_Getter";
 
+
+  /** @domName Touch.pageY */
   int get pageY native "Touch_pageY_Getter";
 
+
+  /** @domName Touch.screenX */
   int get screenX native "Touch_screenX_Getter";
 
+
+  /** @domName Touch.screenY */
   int get screenY native "Touch_screenY_Getter";
 
+
+  /** @domName Touch.target */
   EventTarget get target native "Touch_target_Getter";
 
+
+  /** @domName Touch.webkitForce */
   num get webkitForce native "Touch_webkitForce_Getter";
 
+
+  /** @domName Touch.webkitRadiusX */
   int get webkitRadiusX native "Touch_webkitRadiusX_Getter";
 
+
+  /** @domName Touch.webkitRadiusY */
   int get webkitRadiusY native "Touch_webkitRadiusY_Getter";
 
+
+  /** @domName Touch.webkitRotationAngle */
   num get webkitRotationAngle native "Touch_webkitRotationAngle_Getter";
 
 }
@@ -38062,14 +30709,42 @@
 
 // WARNING: Do not edit - generated code.
 
-/// @domName TouchList
-abstract class TouchList implements List<Touch> {
+/// @domName TouchEvent
+class TouchEvent extends UIEvent {
+  TouchEvent.internal(): super.internal();
 
-  /** @domName TouchList.length */
-  int get length;
 
-  /** @domName TouchList.item */
-  Touch item(int index);
+  /** @domName TouchEvent.altKey */
+  bool get altKey native "TouchEvent_altKey_Getter";
+
+
+  /** @domName TouchEvent.changedTouches */
+  TouchList get changedTouches native "TouchEvent_changedTouches_Getter";
+
+
+  /** @domName TouchEvent.ctrlKey */
+  bool get ctrlKey native "TouchEvent_ctrlKey_Getter";
+
+
+  /** @domName TouchEvent.metaKey */
+  bool get metaKey native "TouchEvent_metaKey_Getter";
+
+
+  /** @domName TouchEvent.shiftKey */
+  bool get shiftKey native "TouchEvent_shiftKey_Getter";
+
+
+  /** @domName TouchEvent.targetTouches */
+  TouchList get targetTouches native "TouchEvent_targetTouches_Getter";
+
+
+  /** @domName TouchEvent.touches */
+  TouchList get touches native "TouchEvent_touches_Getter";
+
+
+  /** @domName TouchEvent.initTouchEvent */
+  void initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "TouchEvent_initTouchEvent_Callback";
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -38077,8 +30752,12 @@
 
 // WARNING: Do not edit - generated code.
 
-class _TouchListImpl extends NativeFieldWrapperClass1 implements TouchList {
+/// @domName TouchList
+class TouchList extends NativeFieldWrapperClass1 implements List<Touch> {
+  TouchList.internal();
 
+
+  /** @domName TouchList.length */
   int get length native "TouchList_length_Getter";
 
   Touch operator[](int index) native "TouchList_item_Callback";
@@ -38164,6 +30843,8 @@
 
   // -- end List<Touch> mixins.
 
+
+  /** @domName TouchList.item */
   Touch item(int index) native "TouchList_item_Callback";
 
 }
@@ -38174,9 +30855,10 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLTrackElement
-abstract class TrackElement implements Element {
+class TrackElement extends _Element_Merged {
 
   factory TrackElement() => _Elements.createTrackElement();
+  TrackElement.internal(): super.internal();
 
   static const int ERROR = 3;
 
@@ -38186,57 +30868,52 @@
 
   static const int NONE = 0;
 
-  /** @domName HTMLTrackElement.defaultValue */
-  bool defaultValue;
 
-  /** @domName HTMLTrackElement.kind */
-  String kind;
-
-  /** @domName HTMLTrackElement.label */
-  String label;
-
-  /** @domName HTMLTrackElement.readyState */
-  int get readyState;
-
-  /** @domName HTMLTrackElement.src */
-  String src;
-
-  /** @domName HTMLTrackElement.srclang */
-  String srclang;
-
-  /** @domName HTMLTrackElement.track */
-  TextTrack get track;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TrackElementImpl extends _ElementImpl_Merged implements TrackElement {
-
+  /** @domName HTMLTrackElement.default */
   bool get defaultValue native "HTMLTrackElement_default_Getter";
 
+
+  /** @domName HTMLTrackElement.default */
   void set defaultValue(bool value) native "HTMLTrackElement_default_Setter";
 
+
+  /** @domName HTMLTrackElement.kind */
   String get kind native "HTMLTrackElement_kind_Getter";
 
+
+  /** @domName HTMLTrackElement.kind */
   void set kind(String value) native "HTMLTrackElement_kind_Setter";
 
+
+  /** @domName HTMLTrackElement.label */
   String get label native "HTMLTrackElement_label_Getter";
 
+
+  /** @domName HTMLTrackElement.label */
   void set label(String value) native "HTMLTrackElement_label_Setter";
 
+
+  /** @domName HTMLTrackElement.readyState */
   int get readyState native "HTMLTrackElement_readyState_Getter";
 
+
+  /** @domName HTMLTrackElement.src */
   String get src native "HTMLTrackElement_src_Getter";
 
+
+  /** @domName HTMLTrackElement.src */
   void set src(String value) native "HTMLTrackElement_src_Setter";
 
+
+  /** @domName HTMLTrackElement.srclang */
   String get srclang native "HTMLTrackElement_srclang_Getter";
 
+
+  /** @domName HTMLTrackElement.srclang */
   void set srclang(String value) native "HTMLTrackElement_srclang_Setter";
 
+
+  /** @domName HTMLTrackElement.track */
   TextTrack get track native "HTMLTrackElement_track_Getter";
 
 }
@@ -38247,19 +30924,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName TrackEvent
-abstract class TrackEvent implements Event {
+class TrackEvent extends Event {
+  TrackEvent.internal(): super.internal();
+
 
   /** @domName TrackEvent.track */
-  Object get track;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TrackEventImpl extends _EventImpl implements TrackEvent {
-
   Object get track native "TrackEvent_track_Getter";
 
 }
@@ -38270,24 +30939,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebKitTransitionEvent
-abstract class TransitionEvent implements Event {
+class TransitionEvent extends Event {
+  TransitionEvent.internal(): super.internal();
+
 
   /** @domName WebKitTransitionEvent.elapsedTime */
-  num get elapsedTime;
-
-  /** @domName WebKitTransitionEvent.propertyName */
-  String get propertyName;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TransitionEventImpl extends _EventImpl implements TransitionEvent {
-
   num get elapsedTime native "WebKitTransitionEvent_elapsedTime_Getter";
 
+
+  /** @domName WebKitTransitionEvent.propertyName */
   String get propertyName native "WebKitTransitionEvent_propertyName_Getter";
 
 }
@@ -38298,76 +30958,59 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName TreeWalker
-abstract class TreeWalker {
+class TreeWalker extends NativeFieldWrapperClass1 {
+  TreeWalker.internal();
+
 
   /** @domName TreeWalker.currentNode */
-  Node currentNode;
-
-  /** @domName TreeWalker.expandEntityReferences */
-  bool get expandEntityReferences;
-
-  /** @domName TreeWalker.filter */
-  NodeFilter get filter;
-
-  /** @domName TreeWalker.root */
-  Node get root;
-
-  /** @domName TreeWalker.whatToShow */
-  int get whatToShow;
-
-  /** @domName TreeWalker.firstChild */
-  Node firstChild();
-
-  /** @domName TreeWalker.lastChild */
-  Node lastChild();
-
-  /** @domName TreeWalker.nextNode */
-  Node nextNode();
-
-  /** @domName TreeWalker.nextSibling */
-  Node nextSibling();
-
-  /** @domName TreeWalker.parentNode */
-  Node parentNode();
-
-  /** @domName TreeWalker.previousNode */
-  Node previousNode();
-
-  /** @domName TreeWalker.previousSibling */
-  Node previousSibling();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _TreeWalkerImpl extends NativeFieldWrapperClass1 implements TreeWalker {
-
   Node get currentNode native "TreeWalker_currentNode_Getter";
 
+
+  /** @domName TreeWalker.currentNode */
   void set currentNode(Node value) native "TreeWalker_currentNode_Setter";
 
+
+  /** @domName TreeWalker.expandEntityReferences */
   bool get expandEntityReferences native "TreeWalker_expandEntityReferences_Getter";
 
+
+  /** @domName TreeWalker.filter */
   NodeFilter get filter native "TreeWalker_filter_Getter";
 
+
+  /** @domName TreeWalker.root */
   Node get root native "TreeWalker_root_Getter";
 
+
+  /** @domName TreeWalker.whatToShow */
   int get whatToShow native "TreeWalker_whatToShow_Getter";
 
+
+  /** @domName TreeWalker.firstChild */
   Node firstChild() native "TreeWalker_firstChild_Callback";
 
+
+  /** @domName TreeWalker.lastChild */
   Node lastChild() native "TreeWalker_lastChild_Callback";
 
+
+  /** @domName TreeWalker.nextNode */
   Node nextNode() native "TreeWalker_nextNode_Callback";
 
+
+  /** @domName TreeWalker.nextSibling */
   Node nextSibling() native "TreeWalker_nextSibling_Callback";
 
+
+  /** @domName TreeWalker.parentNode */
   Node parentNode() native "TreeWalker_parentNode_Callback";
 
+
+  /** @domName TreeWalker.previousNode */
   Node previousNode() native "TreeWalker_previousNode_Callback";
 
+
+  /** @domName TreeWalker.previousSibling */
   Node previousSibling() native "TreeWalker_previousSibling_Callback";
 
 }
@@ -38378,64 +31021,47 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName UIEvent
-abstract class UIEvent implements Event {
+class UIEvent extends Event {
+  UIEvent.internal(): super.internal();
+
 
   /** @domName UIEvent.charCode */
-  int get charCode;
-
-  /** @domName UIEvent.detail */
-  int get detail;
-
-  /** @domName UIEvent.keyCode */
-  int get keyCode;
-
-  /** @domName UIEvent.layerX */
-  int get layerX;
-
-  /** @domName UIEvent.layerY */
-  int get layerY;
-
-  /** @domName UIEvent.pageX */
-  int get pageX;
-
-  /** @domName UIEvent.pageY */
-  int get pageY;
-
-  /** @domName UIEvent.view */
-  Window get view;
-
-  /** @domName UIEvent.which */
-  int get which;
-
-  /** @domName UIEvent.initUIEvent */
-  void initUIEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _UIEventImpl extends _EventImpl implements UIEvent {
-
   int get charCode native "UIEvent_charCode_Getter";
 
+
+  /** @domName UIEvent.detail */
   int get detail native "UIEvent_detail_Getter";
 
+
+  /** @domName UIEvent.keyCode */
   int get keyCode native "UIEvent_keyCode_Getter";
 
+
+  /** @domName UIEvent.layerX */
   int get layerX native "UIEvent_layerX_Getter";
 
+
+  /** @domName UIEvent.layerY */
   int get layerY native "UIEvent_layerY_Getter";
 
+
+  /** @domName UIEvent.pageX */
   int get pageX native "UIEvent_pageX_Getter";
 
+
+  /** @domName UIEvent.pageY */
   int get pageY native "UIEvent_pageY_Getter";
 
+
+  /** @domName UIEvent.view */
   Window get view native "UIEvent_view_Getter";
 
+
+  /** @domName UIEvent.which */
   int get which native "UIEvent_which_Getter";
 
+
+  /** @domName UIEvent.initUIEvent */
   void initUIEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail) native "UIEvent_initUIEvent_Callback";
 
 }
@@ -38446,30 +31072,25 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLUListElement
-abstract class UListElement implements Element {
+class UListElement extends _Element_Merged {
 
   factory UListElement() => _Elements.createUListElement();
+  UListElement.internal(): super.internal();
+
 
   /** @domName HTMLUListElement.compact */
-  bool compact;
-
-  /** @domName HTMLUListElement.type */
-  String type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _UListElementImpl extends _ElementImpl_Merged implements UListElement {
-
   bool get compact native "HTMLUListElement_compact_Getter";
 
+
+  /** @domName HTMLUListElement.compact */
   void set compact(bool value) native "HTMLUListElement_compact_Setter";
 
+
+  /** @domName HTMLUListElement.type */
   String get type native "HTMLUListElement_type_Getter";
 
+
+  /** @domName HTMLUListElement.type */
   void set type(String value) native "HTMLUListElement_type_Setter";
 
 }
@@ -38480,7 +31101,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Uint16Array
-abstract class Uint16Array implements ArrayBufferView, List<int> {
+class Uint16Array extends ArrayBufferView implements List<int> {
 
   factory Uint16Array(int length) =>
     _TypedArrayFactoryProvider.createUint16Array(length);
@@ -38490,30 +31111,20 @@
 
   factory Uint16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createUint16Array_fromBuffer(buffer, byteOffset, length);
+  Uint16Array.internal(): super.internal();
 
   static const int BYTES_PER_ELEMENT = 2;
 
+
   /** @domName Uint16Array.length */
-  int get length;
-
-  /** @domName Uint16Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Uint16Array.subarray */
-  Uint16Array subarray(int start, [int end]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _Uint16ArrayImpl extends _ArrayBufferViewImpl implements Uint16Array {
-
   int get length native "Uint16Array_length_Getter";
 
+
+  /** @domName Uint16Array.numericIndexGetter */
   int operator[](int index) native "Uint16Array_numericIndexGetter_Callback";
 
+
+  /** @domName Uint16Array.numericIndexSetter */
   void operator[]=(int index, int value) native "Uint16Array_numericIndexSetter_Callback";
   // -- start List<int> mixins.
   // int is the element type.
@@ -38593,6 +31204,8 @@
 
   // -- end List<int> mixins.
 
+
+  /** @domName Uint16Array.setElements */
   void setElements(Object array, [int offset]) native "Uint16Array_setElements_Callback";
 
   Uint16Array subarray(/*long*/ start, [/*long*/ end]) {
@@ -38602,8 +31215,12 @@
     return _subarray_2(start);
   }
 
+
+  /** @domName Uint16Array.subarray_1 */
   Uint16Array _subarray_1(start, end) native "Uint16Array_subarray_1_Callback";
 
+
+  /** @domName Uint16Array.subarray_2 */
   Uint16Array _subarray_2(start) native "Uint16Array_subarray_2_Callback";
 
 }
@@ -38614,7 +31231,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Uint32Array
-abstract class Uint32Array implements ArrayBufferView, List<int> {
+class Uint32Array extends ArrayBufferView implements List<int> {
 
   factory Uint32Array(int length) =>
     _TypedArrayFactoryProvider.createUint32Array(length);
@@ -38624,30 +31241,20 @@
 
   factory Uint32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createUint32Array_fromBuffer(buffer, byteOffset, length);
+  Uint32Array.internal(): super.internal();
 
   static const int BYTES_PER_ELEMENT = 4;
 
+
   /** @domName Uint32Array.length */
-  int get length;
-
-  /** @domName Uint32Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Uint32Array.subarray */
-  Uint32Array subarray(int start, [int end]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _Uint32ArrayImpl extends _ArrayBufferViewImpl implements Uint32Array {
-
   int get length native "Uint32Array_length_Getter";
 
+
+  /** @domName Uint32Array.numericIndexGetter */
   int operator[](int index) native "Uint32Array_numericIndexGetter_Callback";
 
+
+  /** @domName Uint32Array.numericIndexSetter */
   void operator[]=(int index, int value) native "Uint32Array_numericIndexSetter_Callback";
   // -- start List<int> mixins.
   // int is the element type.
@@ -38727,6 +31334,8 @@
 
   // -- end List<int> mixins.
 
+
+  /** @domName Uint32Array.setElements */
   void setElements(Object array, [int offset]) native "Uint32Array_setElements_Callback";
 
   Uint32Array subarray(/*long*/ start, [/*long*/ end]) {
@@ -38736,8 +31345,12 @@
     return _subarray_2(start);
   }
 
+
+  /** @domName Uint32Array.subarray_1 */
   Uint32Array _subarray_1(start, end) native "Uint32Array_subarray_1_Callback";
 
+
+  /** @domName Uint32Array.subarray_2 */
   Uint32Array _subarray_2(start) native "Uint32Array_subarray_2_Callback";
 
 }
@@ -38748,7 +31361,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Uint8Array
-abstract class Uint8Array implements ArrayBufferView, List<int> {
+class Uint8Array extends ArrayBufferView implements List<int> {
 
   factory Uint8Array(int length) =>
     _TypedArrayFactoryProvider.createUint8Array(length);
@@ -38758,30 +31371,20 @@
 
   factory Uint8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createUint8Array_fromBuffer(buffer, byteOffset, length);
+  Uint8Array.internal(): super.internal();
 
   static const int BYTES_PER_ELEMENT = 1;
 
+
   /** @domName Uint8Array.length */
-  int get length;
-
-  /** @domName Uint8Array.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Uint8Array.subarray */
-  Uint8Array subarray(int start, [int end]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _Uint8ArrayImpl extends _ArrayBufferViewImpl implements Uint8Array {
-
   int get length native "Uint8Array_length_Getter";
 
+
+  /** @domName Uint8Array.numericIndexGetter */
   int operator[](int index) native "Uint8Array_numericIndexGetter_Callback";
 
+
+  /** @domName Uint8Array.numericIndexSetter */
   void operator[]=(int index, int value) native "Uint8Array_numericIndexSetter_Callback";
   // -- start List<int> mixins.
   // int is the element type.
@@ -38861,6 +31464,8 @@
 
   // -- end List<int> mixins.
 
+
+  /** @domName Uint8Array.setElements */
   void setElements(Object array, [int offset]) native "Uint8Array_setElements_Callback";
 
   Uint8Array subarray(/*long*/ start, [/*long*/ end]) {
@@ -38870,8 +31475,12 @@
     return _subarray_2(start);
   }
 
+
+  /** @domName Uint8Array.subarray_1 */
   Uint8Array _subarray_1(start, end) native "Uint8Array_subarray_1_Callback";
 
+
+  /** @domName Uint8Array.subarray_2 */
   Uint8Array _subarray_2(start) native "Uint8Array_subarray_2_Callback";
 
 }
@@ -38882,7 +31491,7 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName Uint8ClampedArray
-abstract class Uint8ClampedArray implements Uint8Array {
+class Uint8ClampedArray extends Uint8Array {
 
   factory Uint8ClampedArray(int length) =>
     _TypedArrayFactoryProvider.createUint8ClampedArray(length);
@@ -38892,30 +31501,22 @@
 
   factory Uint8ClampedArray.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
     _TypedArrayFactoryProvider.createUint8ClampedArray_fromBuffer(buffer, byteOffset, length);
+  Uint8ClampedArray.internal(): super.internal();
+
 
   /** @domName Uint8ClampedArray.length */
-  int get length;
-
-  /** @domName Uint8ClampedArray.setElements */
-  void setElements(Object array, [int offset]);
-
-  /** @domName Uint8ClampedArray.subarray */
-  Uint8ClampedArray subarray(int start, [int end]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _Uint8ClampedArrayImpl extends _Uint8ArrayImpl implements Uint8ClampedArray {
-
   int get length native "Uint8ClampedArray_length_Getter";
 
+
+  /** @domName Uint8ClampedArray.numericIndexGetter */
   int operator[](int index) native "Uint8ClampedArray_numericIndexGetter_Callback";
 
+
+  /** @domName Uint8ClampedArray.numericIndexSetter */
   void operator[]=(int index, int value) native "Uint8ClampedArray_numericIndexSetter_Callback";
 
+
+  /** @domName Uint8ClampedArray.setElements */
   void setElements(Object array, [int offset]) native "Uint8ClampedArray_setElements_Callback";
 
   Uint8ClampedArray subarray(/*long*/ start, [/*long*/ end]) {
@@ -38925,8 +31526,12 @@
     return _subarray_2(start);
   }
 
+
+  /** @domName Uint8ClampedArray.subarray_1 */
   Uint8ClampedArray _subarray_1(start, end) native "Uint8ClampedArray_subarray_1_Callback";
 
+
+  /** @domName Uint8ClampedArray.subarray_2 */
   Uint8ClampedArray _subarray_2(start) native "Uint8ClampedArray_subarray_2_Callback";
 
 }
@@ -38937,7 +31542,9 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLUnknownElement
-abstract class UnknownElement implements Element {
+class UnknownElement extends _Element_Merged {
+  UnknownElement.internal(): super.internal();
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -38945,7 +31552,38 @@
 
 // WARNING: Do not edit - generated code.
 
-class _UnknownElementImpl extends _ElementImpl_Merged implements UnknownElement {
+/// @domName URL
+class Url extends NativeFieldWrapperClass1 {
+  Url.internal();
+
+  static String createObjectUrl(blob_OR_source_OR_stream) {
+    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
+      return _createObjectURL_1(blob_OR_source_OR_stream);
+    }
+    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
+      return _createObjectURL_2(blob_OR_source_OR_stream);
+    }
+    if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
+      return _createObjectURL_3(blob_OR_source_OR_stream);
+    }
+    throw "Incorrect number or type of arguments";
+  }
+
+
+  /** @domName DOMURL.createObjectURL_1 */
+  static String _createObjectURL_1(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_1_Callback";
+
+
+  /** @domName DOMURL.createObjectURL_2 */
+  static String _createObjectURL_2(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_2_Callback";
+
+
+  /** @domName DOMURL.createObjectURL_3 */
+  static String _createObjectURL_3(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_3_Callback";
+
+
+  /** @domName DOMURL.revokeObjectURL */
+  static void revokeObjectUrl(String url) native "DOMURL_revokeObjectURL_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -38955,59 +31593,43 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName ValidityState
-abstract class ValidityState {
+class ValidityState extends NativeFieldWrapperClass1 {
+  ValidityState.internal();
+
 
   /** @domName ValidityState.customError */
-  bool get customError;
-
-  /** @domName ValidityState.patternMismatch */
-  bool get patternMismatch;
-
-  /** @domName ValidityState.rangeOverflow */
-  bool get rangeOverflow;
-
-  /** @domName ValidityState.rangeUnderflow */
-  bool get rangeUnderflow;
-
-  /** @domName ValidityState.stepMismatch */
-  bool get stepMismatch;
-
-  /** @domName ValidityState.tooLong */
-  bool get tooLong;
-
-  /** @domName ValidityState.typeMismatch */
-  bool get typeMismatch;
-
-  /** @domName ValidityState.valid */
-  bool get valid;
-
-  /** @domName ValidityState.valueMissing */
-  bool get valueMissing;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _ValidityStateImpl extends NativeFieldWrapperClass1 implements ValidityState {
-
   bool get customError native "ValidityState_customError_Getter";
 
+
+  /** @domName ValidityState.patternMismatch */
   bool get patternMismatch native "ValidityState_patternMismatch_Getter";
 
+
+  /** @domName ValidityState.rangeOverflow */
   bool get rangeOverflow native "ValidityState_rangeOverflow_Getter";
 
+
+  /** @domName ValidityState.rangeUnderflow */
   bool get rangeUnderflow native "ValidityState_rangeUnderflow_Getter";
 
+
+  /** @domName ValidityState.stepMismatch */
   bool get stepMismatch native "ValidityState_stepMismatch_Getter";
 
+
+  /** @domName ValidityState.tooLong */
   bool get tooLong native "ValidityState_tooLong_Getter";
 
+
+  /** @domName ValidityState.typeMismatch */
   bool get typeMismatch native "ValidityState_typeMismatch_Getter";
 
+
+  /** @domName ValidityState.valid */
   bool get valid native "ValidityState_valid_Getter";
 
+
+  /** @domName ValidityState.valueMissing */
   bool get valueMissing native "ValidityState_valueMissing_Getter";
 
 }
@@ -39018,87 +31640,73 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName HTMLVideoElement
-abstract class VideoElement implements MediaElement {
+class VideoElement extends MediaElement {
 
   factory VideoElement() => _Elements.createVideoElement();
+  VideoElement.internal(): super.internal();
+
 
   /** @domName HTMLVideoElement.height */
-  int height;
-
-  /** @domName HTMLVideoElement.poster */
-  String poster;
-
-  /** @domName HTMLVideoElement.videoHeight */
-  int get videoHeight;
-
-  /** @domName HTMLVideoElement.videoWidth */
-  int get videoWidth;
-
-  /** @domName HTMLVideoElement.webkitDecodedFrameCount */
-  int get webkitDecodedFrameCount;
-
-  /** @domName HTMLVideoElement.webkitDisplayingFullscreen */
-  bool get webkitDisplayingFullscreen;
-
-  /** @domName HTMLVideoElement.webkitDroppedFrameCount */
-  int get webkitDroppedFrameCount;
-
-  /** @domName HTMLVideoElement.webkitSupportsFullscreen */
-  bool get webkitSupportsFullscreen;
-
-  /** @domName HTMLVideoElement.width */
-  int width;
-
-  /** @domName HTMLVideoElement.webkitEnterFullScreen */
-  void webkitEnterFullScreen();
-
-  /** @domName HTMLVideoElement.webkitEnterFullscreen */
-  void webkitEnterFullscreen();
-
-  /** @domName HTMLVideoElement.webkitExitFullScreen */
-  void webkitExitFullScreen();
-
-  /** @domName HTMLVideoElement.webkitExitFullscreen */
-  void webkitExitFullscreen();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _VideoElementImpl extends _MediaElementImpl implements VideoElement {
-
   int get height native "HTMLVideoElement_height_Getter";
 
+
+  /** @domName HTMLVideoElement.height */
   void set height(int value) native "HTMLVideoElement_height_Setter";
 
+
+  /** @domName HTMLVideoElement.poster */
   String get poster native "HTMLVideoElement_poster_Getter";
 
+
+  /** @domName HTMLVideoElement.poster */
   void set poster(String value) native "HTMLVideoElement_poster_Setter";
 
+
+  /** @domName HTMLVideoElement.videoHeight */
   int get videoHeight native "HTMLVideoElement_videoHeight_Getter";
 
+
+  /** @domName HTMLVideoElement.videoWidth */
   int get videoWidth native "HTMLVideoElement_videoWidth_Getter";
 
+
+  /** @domName HTMLVideoElement.webkitDecodedFrameCount */
   int get webkitDecodedFrameCount native "HTMLVideoElement_webkitDecodedFrameCount_Getter";
 
+
+  /** @domName HTMLVideoElement.webkitDisplayingFullscreen */
   bool get webkitDisplayingFullscreen native "HTMLVideoElement_webkitDisplayingFullscreen_Getter";
 
+
+  /** @domName HTMLVideoElement.webkitDroppedFrameCount */
   int get webkitDroppedFrameCount native "HTMLVideoElement_webkitDroppedFrameCount_Getter";
 
+
+  /** @domName HTMLVideoElement.webkitSupportsFullscreen */
   bool get webkitSupportsFullscreen native "HTMLVideoElement_webkitSupportsFullscreen_Getter";
 
+
+  /** @domName HTMLVideoElement.width */
   int get width native "HTMLVideoElement_width_Getter";
 
+
+  /** @domName HTMLVideoElement.width */
   void set width(int value) native "HTMLVideoElement_width_Setter";
 
+
+  /** @domName HTMLVideoElement.webkitEnterFullScreen */
   void webkitEnterFullScreen() native "HTMLVideoElement_webkitEnterFullScreen_Callback";
 
+
+  /** @domName HTMLVideoElement.webkitEnterFullscreen */
   void webkitEnterFullscreen() native "HTMLVideoElement_webkitEnterFullscreen_Callback";
 
+
+  /** @domName HTMLVideoElement.webkitExitFullScreen */
   void webkitExitFullScreen() native "HTMLVideoElement_webkitExitFullScreen_Callback";
 
+
+  /** @domName HTMLVideoElement.webkitExitFullscreen */
   void webkitExitFullscreen() native "HTMLVideoElement_webkitExitFullscreen_Callback";
 
 }
@@ -39117,21 +31725,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WaveShaperNode
-abstract class WaveShaperNode implements AudioNode {
+class WaveShaperNode extends AudioNode {
+  WaveShaperNode.internal(): super.internal();
+
 
   /** @domName WaveShaperNode.curve */
-  Float32Array curve;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WaveShaperNodeImpl extends _AudioNodeImpl implements WaveShaperNode {
-
   Float32Array get curve native "WaveShaperNode_curve_Getter";
 
+
+  /** @domName WaveShaperNode.curve */
   void set curve(Float32Array value) native "WaveShaperNode_curve_Setter";
 
 }
@@ -39142,15 +31744,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WaveTable
-abstract class WaveTable {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WaveTableImpl extends NativeFieldWrapperClass1 implements WaveTable {
+class WaveTable extends NativeFieldWrapperClass1 {
+  WaveTable.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39160,29 +31755,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLActiveInfo
-abstract class WebGLActiveInfo {
+class WebGLActiveInfo extends NativeFieldWrapperClass1 {
+  WebGLActiveInfo.internal();
+
 
   /** @domName WebGLActiveInfo.name */
-  String get name;
-
-  /** @domName WebGLActiveInfo.size */
-  int get size;
-
-  /** @domName WebGLActiveInfo.type */
-  int get type;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLActiveInfoImpl extends NativeFieldWrapperClass1 implements WebGLActiveInfo {
-
   String get name native "WebGLActiveInfo_name_Getter";
 
+
+  /** @domName WebGLActiveInfo.size */
   int get size native "WebGLActiveInfo_size_Getter";
 
+
+  /** @domName WebGLActiveInfo.type */
   int get type native "WebGLActiveInfo_type_Getter";
 
 }
@@ -39193,15 +31778,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLBuffer
-abstract class WebGLBuffer {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLBufferImpl extends NativeFieldWrapperClass1 implements WebGLBuffer {
+class WebGLBuffer extends NativeFieldWrapperClass1 {
+  WebGLBuffer.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39211,7 +31789,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLCompressedTextureS3TC
-abstract class WebGLCompressedTextureS3TC {
+class WebGLCompressedTextureS3TC extends NativeFieldWrapperClass1 {
+  WebGLCompressedTextureS3TC.internal();
 
   static const int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;
 
@@ -39220,14 +31799,6 @@
   static const int COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;
 
   static const int COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLCompressedTextureS3TCImpl extends NativeFieldWrapperClass1 implements WebGLCompressedTextureS3TC {
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39237,56 +31808,55 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLContextAttributes
-abstract class WebGLContextAttributes {
+class WebGLContextAttributes extends NativeFieldWrapperClass1 {
+  WebGLContextAttributes.internal();
+
 
   /** @domName WebGLContextAttributes.alpha */
-  bool alpha;
-
-  /** @domName WebGLContextAttributes.antialias */
-  bool antialias;
-
-  /** @domName WebGLContextAttributes.depth */
-  bool depth;
-
-  /** @domName WebGLContextAttributes.premultipliedAlpha */
-  bool premultipliedAlpha;
-
-  /** @domName WebGLContextAttributes.preserveDrawingBuffer */
-  bool preserveDrawingBuffer;
-
-  /** @domName WebGLContextAttributes.stencil */
-  bool stencil;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLContextAttributesImpl extends NativeFieldWrapperClass1 implements WebGLContextAttributes {
-
   bool get alpha native "WebGLContextAttributes_alpha_Getter";
 
+
+  /** @domName WebGLContextAttributes.alpha */
   void set alpha(bool value) native "WebGLContextAttributes_alpha_Setter";
 
+
+  /** @domName WebGLContextAttributes.antialias */
   bool get antialias native "WebGLContextAttributes_antialias_Getter";
 
+
+  /** @domName WebGLContextAttributes.antialias */
   void set antialias(bool value) native "WebGLContextAttributes_antialias_Setter";
 
+
+  /** @domName WebGLContextAttributes.depth */
   bool get depth native "WebGLContextAttributes_depth_Getter";
 
+
+  /** @domName WebGLContextAttributes.depth */
   void set depth(bool value) native "WebGLContextAttributes_depth_Setter";
 
+
+  /** @domName WebGLContextAttributes.premultipliedAlpha */
   bool get premultipliedAlpha native "WebGLContextAttributes_premultipliedAlpha_Getter";
 
+
+  /** @domName WebGLContextAttributes.premultipliedAlpha */
   void set premultipliedAlpha(bool value) native "WebGLContextAttributes_premultipliedAlpha_Setter";
 
+
+  /** @domName WebGLContextAttributes.preserveDrawingBuffer */
   bool get preserveDrawingBuffer native "WebGLContextAttributes_preserveDrawingBuffer_Getter";
 
+
+  /** @domName WebGLContextAttributes.preserveDrawingBuffer */
   void set preserveDrawingBuffer(bool value) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";
 
+
+  /** @domName WebGLContextAttributes.stencil */
   bool get stencil native "WebGLContextAttributes_stencil_Getter";
 
+
+  /** @domName WebGLContextAttributes.stencil */
   void set stencil(bool value) native "WebGLContextAttributes_stencil_Setter";
 
 }
@@ -39297,19 +31867,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLContextEvent
-abstract class WebGLContextEvent implements Event {
+class WebGLContextEvent extends Event {
+  WebGLContextEvent.internal(): super.internal();
+
 
   /** @domName WebGLContextEvent.statusMessage */
-  String get statusMessage;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLContextEventImpl extends _EventImpl implements WebGLContextEvent {
-
   String get statusMessage native "WebGLContextEvent_statusMessage_Getter";
 
 }
@@ -39320,19 +31882,12 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLDebugRendererInfo
-abstract class WebGLDebugRendererInfo {
+class WebGLDebugRendererInfo extends NativeFieldWrapperClass1 {
+  WebGLDebugRendererInfo.internal();
 
   static const int UNMASKED_RENDERER_WEBGL = 0x9246;
 
   static const int UNMASKED_VENDOR_WEBGL = 0x9245;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLDebugRendererInfoImpl extends NativeFieldWrapperClass1 implements WebGLDebugRendererInfo {
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39342,19 +31897,11 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLDebugShaders
-abstract class WebGLDebugShaders {
+class WebGLDebugShaders extends NativeFieldWrapperClass1 {
+  WebGLDebugShaders.internal();
+
 
   /** @domName WebGLDebugShaders.getTranslatedShaderSource */
-  String getTranslatedShaderSource(WebGLShader shader);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLDebugShadersImpl extends NativeFieldWrapperClass1 implements WebGLDebugShaders {
-
   String getTranslatedShaderSource(WebGLShader shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";
 
 }
@@ -39365,17 +31912,10 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLDepthTexture
-abstract class WebGLDepthTexture {
+class WebGLDepthTexture extends NativeFieldWrapperClass1 {
+  WebGLDepthTexture.internal();
 
   static const int UNSIGNED_INT_24_8_WEBGL = 0x84FA;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLDepthTextureImpl extends NativeFieldWrapperClass1 implements WebGLDepthTexture {
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39385,15 +31925,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLFramebuffer
-abstract class WebGLFramebuffer {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLFramebufferImpl extends NativeFieldWrapperClass1 implements WebGLFramebuffer {
+class WebGLFramebuffer extends NativeFieldWrapperClass1 {
+  WebGLFramebuffer.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39403,24 +31936,15 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLLoseContext
-abstract class WebGLLoseContext {
+class WebGLLoseContext extends NativeFieldWrapperClass1 {
+  WebGLLoseContext.internal();
+
 
   /** @domName WebGLLoseContext.loseContext */
-  void loseContext();
-
-  /** @domName WebGLLoseContext.restoreContext */
-  void restoreContext();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLLoseContextImpl extends NativeFieldWrapperClass1 implements WebGLLoseContext {
-
   void loseContext() native "WebGLLoseContext_loseContext_Callback";
 
+
+  /** @domName WebGLLoseContext.restoreContext */
   void restoreContext() native "WebGLLoseContext_restoreContext_Callback";
 
 }
@@ -39431,15 +31955,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLProgram
-abstract class WebGLProgram {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLProgramImpl extends NativeFieldWrapperClass1 implements WebGLProgram {
+class WebGLProgram extends NativeFieldWrapperClass1 {
+  WebGLProgram.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39449,15 +31966,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLRenderbuffer
-abstract class WebGLRenderbuffer {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLRenderbufferImpl extends NativeFieldWrapperClass1 implements WebGLRenderbuffer {
+class WebGLRenderbuffer extends NativeFieldWrapperClass1 {
+  WebGLRenderbuffer.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39467,7 +31977,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLRenderingContext
-abstract class WebGLRenderingContext implements CanvasRenderingContext {
+class WebGLRenderingContext extends CanvasRenderingContext {
+  WebGLRenderingContext.internal(): super.internal();
 
   static const int ACTIVE_ATTRIBUTES = 0x8B89;
 
@@ -40059,457 +32570,60 @@
 
   static const int ZERO = 0;
 
+
   /** @domName WebGLRenderingContext.drawingBufferHeight */
-  int get drawingBufferHeight;
-
-  /** @domName WebGLRenderingContext.drawingBufferWidth */
-  int get drawingBufferWidth;
-
-  /** @domName WebGLRenderingContext.activeTexture */
-  void activeTexture(int texture);
-
-  /** @domName WebGLRenderingContext.attachShader */
-  void attachShader(WebGLProgram program, WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.bindAttribLocation */
-  void bindAttribLocation(WebGLProgram program, int index, String name);
-
-  /** @domName WebGLRenderingContext.bindBuffer */
-  void bindBuffer(int target, WebGLBuffer buffer);
-
-  /** @domName WebGLRenderingContext.bindFramebuffer */
-  void bindFramebuffer(int target, WebGLFramebuffer framebuffer);
-
-  /** @domName WebGLRenderingContext.bindRenderbuffer */
-  void bindRenderbuffer(int target, WebGLRenderbuffer renderbuffer);
-
-  /** @domName WebGLRenderingContext.bindTexture */
-  void bindTexture(int target, WebGLTexture texture);
-
-  /** @domName WebGLRenderingContext.blendColor */
-  void blendColor(num red, num green, num blue, num alpha);
-
-  /** @domName WebGLRenderingContext.blendEquation */
-  void blendEquation(int mode);
-
-  /** @domName WebGLRenderingContext.blendEquationSeparate */
-  void blendEquationSeparate(int modeRGB, int modeAlpha);
-
-  /** @domName WebGLRenderingContext.blendFunc */
-  void blendFunc(int sfactor, int dfactor);
-
-  /** @domName WebGLRenderingContext.blendFuncSeparate */
-  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha);
-
-  /** @domName WebGLRenderingContext.bufferData */
-  void bufferData(int target, data_OR_size, int usage);
-
-  /** @domName WebGLRenderingContext.bufferSubData */
-  void bufferSubData(int target, int offset, data);
-
-  /** @domName WebGLRenderingContext.checkFramebufferStatus */
-  int checkFramebufferStatus(int target);
-
-  /** @domName WebGLRenderingContext.clear */
-  void clear(int mask);
-
-  /** @domName WebGLRenderingContext.clearColor */
-  void clearColor(num red, num green, num blue, num alpha);
-
-  /** @domName WebGLRenderingContext.clearDepth */
-  void clearDepth(num depth);
-
-  /** @domName WebGLRenderingContext.clearStencil */
-  void clearStencil(int s);
-
-  /** @domName WebGLRenderingContext.colorMask */
-  void colorMask(bool red, bool green, bool blue, bool alpha);
-
-  /** @domName WebGLRenderingContext.compileShader */
-  void compileShader(WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.compressedTexImage2D */
-  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ArrayBufferView data);
-
-  /** @domName WebGLRenderingContext.compressedTexSubImage2D */
-  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ArrayBufferView data);
-
-  /** @domName WebGLRenderingContext.copyTexImage2D */
-  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border);
-
-  /** @domName WebGLRenderingContext.copyTexSubImage2D */
-  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height);
-
-  /** @domName WebGLRenderingContext.createBuffer */
-  WebGLBuffer createBuffer();
-
-  /** @domName WebGLRenderingContext.createFramebuffer */
-  WebGLFramebuffer createFramebuffer();
-
-  /** @domName WebGLRenderingContext.createProgram */
-  WebGLProgram createProgram();
-
-  /** @domName WebGLRenderingContext.createRenderbuffer */
-  WebGLRenderbuffer createRenderbuffer();
-
-  /** @domName WebGLRenderingContext.createShader */
-  WebGLShader createShader(int type);
-
-  /** @domName WebGLRenderingContext.createTexture */
-  WebGLTexture createTexture();
-
-  /** @domName WebGLRenderingContext.cullFace */
-  void cullFace(int mode);
-
-  /** @domName WebGLRenderingContext.deleteBuffer */
-  void deleteBuffer(WebGLBuffer buffer);
-
-  /** @domName WebGLRenderingContext.deleteFramebuffer */
-  void deleteFramebuffer(WebGLFramebuffer framebuffer);
-
-  /** @domName WebGLRenderingContext.deleteProgram */
-  void deleteProgram(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.deleteRenderbuffer */
-  void deleteRenderbuffer(WebGLRenderbuffer renderbuffer);
-
-  /** @domName WebGLRenderingContext.deleteShader */
-  void deleteShader(WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.deleteTexture */
-  void deleteTexture(WebGLTexture texture);
-
-  /** @domName WebGLRenderingContext.depthFunc */
-  void depthFunc(int func);
-
-  /** @domName WebGLRenderingContext.depthMask */
-  void depthMask(bool flag);
-
-  /** @domName WebGLRenderingContext.depthRange */
-  void depthRange(num zNear, num zFar);
-
-  /** @domName WebGLRenderingContext.detachShader */
-  void detachShader(WebGLProgram program, WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.disable */
-  void disable(int cap);
-
-  /** @domName WebGLRenderingContext.disableVertexAttribArray */
-  void disableVertexAttribArray(int index);
-
-  /** @domName WebGLRenderingContext.drawArrays */
-  void drawArrays(int mode, int first, int count);
-
-  /** @domName WebGLRenderingContext.drawElements */
-  void drawElements(int mode, int count, int type, int offset);
-
-  /** @domName WebGLRenderingContext.enable */
-  void enable(int cap);
-
-  /** @domName WebGLRenderingContext.enableVertexAttribArray */
-  void enableVertexAttribArray(int index);
-
-  /** @domName WebGLRenderingContext.finish */
-  void finish();
-
-  /** @domName WebGLRenderingContext.flush */
-  void flush();
-
-  /** @domName WebGLRenderingContext.framebufferRenderbuffer */
-  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, WebGLRenderbuffer renderbuffer);
-
-  /** @domName WebGLRenderingContext.framebufferTexture2D */
-  void framebufferTexture2D(int target, int attachment, int textarget, WebGLTexture texture, int level);
-
-  /** @domName WebGLRenderingContext.frontFace */
-  void frontFace(int mode);
-
-  /** @domName WebGLRenderingContext.generateMipmap */
-  void generateMipmap(int target);
-
-  /** @domName WebGLRenderingContext.getActiveAttrib */
-  WebGLActiveInfo getActiveAttrib(WebGLProgram program, int index);
-
-  /** @domName WebGLRenderingContext.getActiveUniform */
-  WebGLActiveInfo getActiveUniform(WebGLProgram program, int index);
-
-  /** @domName WebGLRenderingContext.getAttachedShaders */
-  void getAttachedShaders(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.getAttribLocation */
-  int getAttribLocation(WebGLProgram program, String name);
-
-  /** @domName WebGLRenderingContext.getBufferParameter */
-  Object getBufferParameter(int target, int pname);
-
-  /** @domName WebGLRenderingContext.getContextAttributes */
-  WebGLContextAttributes getContextAttributes();
-
-  /** @domName WebGLRenderingContext.getError */
-  int getError();
-
-  /** @domName WebGLRenderingContext.getExtension */
-  Object getExtension(String name);
-
-  /** @domName WebGLRenderingContext.getFramebufferAttachmentParameter */
-  Object getFramebufferAttachmentParameter(int target, int attachment, int pname);
-
-  /** @domName WebGLRenderingContext.getParameter */
-  Object getParameter(int pname);
-
-  /** @domName WebGLRenderingContext.getProgramInfoLog */
-  String getProgramInfoLog(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.getProgramParameter */
-  Object getProgramParameter(WebGLProgram program, int pname);
-
-  /** @domName WebGLRenderingContext.getRenderbufferParameter */
-  Object getRenderbufferParameter(int target, int pname);
-
-  /** @domName WebGLRenderingContext.getShaderInfoLog */
-  String getShaderInfoLog(WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.getShaderParameter */
-  Object getShaderParameter(WebGLShader shader, int pname);
-
-  /** @domName WebGLRenderingContext.getShaderPrecisionFormat */
-  WebGLShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype);
-
-  /** @domName WebGLRenderingContext.getShaderSource */
-  String getShaderSource(WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.getSupportedExtensions */
-  List<String> getSupportedExtensions();
-
-  /** @domName WebGLRenderingContext.getTexParameter */
-  Object getTexParameter(int target, int pname);
-
-  /** @domName WebGLRenderingContext.getUniform */
-  Object getUniform(WebGLProgram program, WebGLUniformLocation location);
-
-  /** @domName WebGLRenderingContext.getUniformLocation */
-  WebGLUniformLocation getUniformLocation(WebGLProgram program, String name);
-
-  /** @domName WebGLRenderingContext.getVertexAttrib */
-  Object getVertexAttrib(int index, int pname);
-
-  /** @domName WebGLRenderingContext.getVertexAttribOffset */
-  int getVertexAttribOffset(int index, int pname);
-
-  /** @domName WebGLRenderingContext.hint */
-  void hint(int target, int mode);
-
-  /** @domName WebGLRenderingContext.isBuffer */
-  bool isBuffer(WebGLBuffer buffer);
-
-  /** @domName WebGLRenderingContext.isContextLost */
-  bool isContextLost();
-
-  /** @domName WebGLRenderingContext.isEnabled */
-  bool isEnabled(int cap);
-
-  /** @domName WebGLRenderingContext.isFramebuffer */
-  bool isFramebuffer(WebGLFramebuffer framebuffer);
-
-  /** @domName WebGLRenderingContext.isProgram */
-  bool isProgram(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.isRenderbuffer */
-  bool isRenderbuffer(WebGLRenderbuffer renderbuffer);
-
-  /** @domName WebGLRenderingContext.isShader */
-  bool isShader(WebGLShader shader);
-
-  /** @domName WebGLRenderingContext.isTexture */
-  bool isTexture(WebGLTexture texture);
-
-  /** @domName WebGLRenderingContext.lineWidth */
-  void lineWidth(num width);
-
-  /** @domName WebGLRenderingContext.linkProgram */
-  void linkProgram(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.pixelStorei */
-  void pixelStorei(int pname, int param);
-
-  /** @domName WebGLRenderingContext.polygonOffset */
-  void polygonOffset(num factor, num units);
-
-  /** @domName WebGLRenderingContext.readPixels */
-  void readPixels(int x, int y, int width, int height, int format, int type, ArrayBufferView pixels);
-
-  /** @domName WebGLRenderingContext.releaseShaderCompiler */
-  void releaseShaderCompiler();
-
-  /** @domName WebGLRenderingContext.renderbufferStorage */
-  void renderbufferStorage(int target, int internalformat, int width, int height);
-
-  /** @domName WebGLRenderingContext.sampleCoverage */
-  void sampleCoverage(num value, bool invert);
-
-  /** @domName WebGLRenderingContext.scissor */
-  void scissor(int x, int y, int width, int height);
-
-  /** @domName WebGLRenderingContext.shaderSource */
-  void shaderSource(WebGLShader shader, String string);
-
-  /** @domName WebGLRenderingContext.stencilFunc */
-  void stencilFunc(int func, int ref, int mask);
-
-  /** @domName WebGLRenderingContext.stencilFuncSeparate */
-  void stencilFuncSeparate(int face, int func, int ref, int mask);
-
-  /** @domName WebGLRenderingContext.stencilMask */
-  void stencilMask(int mask);
-
-  /** @domName WebGLRenderingContext.stencilMaskSeparate */
-  void stencilMaskSeparate(int face, int mask);
-
-  /** @domName WebGLRenderingContext.stencilOp */
-  void stencilOp(int fail, int zfail, int zpass);
-
-  /** @domName WebGLRenderingContext.stencilOpSeparate */
-  void stencilOpSeparate(int face, int fail, int zfail, int zpass);
-
-  /** @domName WebGLRenderingContext.texImage2D */
-  void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, ArrayBufferView pixels]);
-
-  /** @domName WebGLRenderingContext.texParameterf */
-  void texParameterf(int target, int pname, num param);
-
-  /** @domName WebGLRenderingContext.texParameteri */
-  void texParameteri(int target, int pname, int param);
-
-  /** @domName WebGLRenderingContext.texSubImage2D */
-  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, ArrayBufferView pixels]);
-
-  /** @domName WebGLRenderingContext.uniform1f */
-  void uniform1f(WebGLUniformLocation location, num x);
-
-  /** @domName WebGLRenderingContext.uniform1fv */
-  void uniform1fv(WebGLUniformLocation location, Float32Array v);
-
-  /** @domName WebGLRenderingContext.uniform1i */
-  void uniform1i(WebGLUniformLocation location, int x);
-
-  /** @domName WebGLRenderingContext.uniform1iv */
-  void uniform1iv(WebGLUniformLocation location, Int32Array v);
-
-  /** @domName WebGLRenderingContext.uniform2f */
-  void uniform2f(WebGLUniformLocation location, num x, num y);
-
-  /** @domName WebGLRenderingContext.uniform2fv */
-  void uniform2fv(WebGLUniformLocation location, Float32Array v);
-
-  /** @domName WebGLRenderingContext.uniform2i */
-  void uniform2i(WebGLUniformLocation location, int x, int y);
-
-  /** @domName WebGLRenderingContext.uniform2iv */
-  void uniform2iv(WebGLUniformLocation location, Int32Array v);
-
-  /** @domName WebGLRenderingContext.uniform3f */
-  void uniform3f(WebGLUniformLocation location, num x, num y, num z);
-
-  /** @domName WebGLRenderingContext.uniform3fv */
-  void uniform3fv(WebGLUniformLocation location, Float32Array v);
-
-  /** @domName WebGLRenderingContext.uniform3i */
-  void uniform3i(WebGLUniformLocation location, int x, int y, int z);
-
-  /** @domName WebGLRenderingContext.uniform3iv */
-  void uniform3iv(WebGLUniformLocation location, Int32Array v);
-
-  /** @domName WebGLRenderingContext.uniform4f */
-  void uniform4f(WebGLUniformLocation location, num x, num y, num z, num w);
-
-  /** @domName WebGLRenderingContext.uniform4fv */
-  void uniform4fv(WebGLUniformLocation location, Float32Array v);
-
-  /** @domName WebGLRenderingContext.uniform4i */
-  void uniform4i(WebGLUniformLocation location, int x, int y, int z, int w);
-
-  /** @domName WebGLRenderingContext.uniform4iv */
-  void uniform4iv(WebGLUniformLocation location, Int32Array v);
-
-  /** @domName WebGLRenderingContext.uniformMatrix2fv */
-  void uniformMatrix2fv(WebGLUniformLocation location, bool transpose, Float32Array array);
-
-  /** @domName WebGLRenderingContext.uniformMatrix3fv */
-  void uniformMatrix3fv(WebGLUniformLocation location, bool transpose, Float32Array array);
-
-  /** @domName WebGLRenderingContext.uniformMatrix4fv */
-  void uniformMatrix4fv(WebGLUniformLocation location, bool transpose, Float32Array array);
-
-  /** @domName WebGLRenderingContext.useProgram */
-  void useProgram(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.validateProgram */
-  void validateProgram(WebGLProgram program);
-
-  /** @domName WebGLRenderingContext.vertexAttrib1f */
-  void vertexAttrib1f(int indx, num x);
-
-  /** @domName WebGLRenderingContext.vertexAttrib1fv */
-  void vertexAttrib1fv(int indx, Float32Array values);
-
-  /** @domName WebGLRenderingContext.vertexAttrib2f */
-  void vertexAttrib2f(int indx, num x, num y);
-
-  /** @domName WebGLRenderingContext.vertexAttrib2fv */
-  void vertexAttrib2fv(int indx, Float32Array values);
-
-  /** @domName WebGLRenderingContext.vertexAttrib3f */
-  void vertexAttrib3f(int indx, num x, num y, num z);
-
-  /** @domName WebGLRenderingContext.vertexAttrib3fv */
-  void vertexAttrib3fv(int indx, Float32Array values);
-
-  /** @domName WebGLRenderingContext.vertexAttrib4f */
-  void vertexAttrib4f(int indx, num x, num y, num z, num w);
-
-  /** @domName WebGLRenderingContext.vertexAttrib4fv */
-  void vertexAttrib4fv(int indx, Float32Array values);
-
-  /** @domName WebGLRenderingContext.vertexAttribPointer */
-  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset);
-
-  /** @domName WebGLRenderingContext.viewport */
-  void viewport(int x, int y, int width, int height);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLRenderingContextImpl extends _CanvasRenderingContextImpl implements WebGLRenderingContext {
-
   int get drawingBufferHeight native "WebGLRenderingContext_drawingBufferHeight_Getter";
 
+
+  /** @domName WebGLRenderingContext.drawingBufferWidth */
   int get drawingBufferWidth native "WebGLRenderingContext_drawingBufferWidth_Getter";
 
+
+  /** @domName WebGLRenderingContext.activeTexture */
   void activeTexture(int texture) native "WebGLRenderingContext_activeTexture_Callback";
 
+
+  /** @domName WebGLRenderingContext.attachShader */
   void attachShader(WebGLProgram program, WebGLShader shader) native "WebGLRenderingContext_attachShader_Callback";
 
+
+  /** @domName WebGLRenderingContext.bindAttribLocation */
   void bindAttribLocation(WebGLProgram program, int index, String name) native "WebGLRenderingContext_bindAttribLocation_Callback";
 
+
+  /** @domName WebGLRenderingContext.bindBuffer */
   void bindBuffer(int target, WebGLBuffer buffer) native "WebGLRenderingContext_bindBuffer_Callback";
 
+
+  /** @domName WebGLRenderingContext.bindFramebuffer */
   void bindFramebuffer(int target, WebGLFramebuffer framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback";
 
+
+  /** @domName WebGLRenderingContext.bindRenderbuffer */
   void bindRenderbuffer(int target, WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback";
 
+
+  /** @domName WebGLRenderingContext.bindTexture */
   void bindTexture(int target, WebGLTexture texture) native "WebGLRenderingContext_bindTexture_Callback";
 
+
+  /** @domName WebGLRenderingContext.blendColor */
   void blendColor(num red, num green, num blue, num alpha) native "WebGLRenderingContext_blendColor_Callback";
 
+
+  /** @domName WebGLRenderingContext.blendEquation */
   void blendEquation(int mode) native "WebGLRenderingContext_blendEquation_Callback";
 
+
+  /** @domName WebGLRenderingContext.blendEquationSeparate */
   void blendEquationSeparate(int modeRGB, int modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback";
 
+
+  /** @domName WebGLRenderingContext.blendFunc */
   void blendFunc(int sfactor, int dfactor) native "WebGLRenderingContext_blendFunc_Callback";
 
+
+  /** @domName WebGLRenderingContext.blendFuncSeparate */
   void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback";
 
   void bufferData(/*unsigned long*/ target, data_OR_size, /*unsigned long*/ usage) {
@@ -40528,10 +32642,16 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName WebGLRenderingContext.bufferData_1 */
   void _bufferData_1(target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_1_Callback";
 
+
+  /** @domName WebGLRenderingContext.bufferData_2 */
   void _bufferData_2(target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_2_Callback";
 
+
+  /** @domName WebGLRenderingContext.bufferData_3 */
   void _bufferData_3(target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_3_Callback";
 
   void bufferSubData(/*unsigned long*/ target, /*long long*/ offset, data) {
@@ -40546,184 +32666,364 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName WebGLRenderingContext.bufferSubData_1 */
   void _bufferSubData_1(target, offset, data) native "WebGLRenderingContext_bufferSubData_1_Callback";
 
+
+  /** @domName WebGLRenderingContext.bufferSubData_2 */
   void _bufferSubData_2(target, offset, data) native "WebGLRenderingContext_bufferSubData_2_Callback";
 
+
+  /** @domName WebGLRenderingContext.checkFramebufferStatus */
   int checkFramebufferStatus(int target) native "WebGLRenderingContext_checkFramebufferStatus_Callback";
 
+
+  /** @domName WebGLRenderingContext.clear */
   void clear(int mask) native "WebGLRenderingContext_clear_Callback";
 
+
+  /** @domName WebGLRenderingContext.clearColor */
   void clearColor(num red, num green, num blue, num alpha) native "WebGLRenderingContext_clearColor_Callback";
 
+
+  /** @domName WebGLRenderingContext.clearDepth */
   void clearDepth(num depth) native "WebGLRenderingContext_clearDepth_Callback";
 
+
+  /** @domName WebGLRenderingContext.clearStencil */
   void clearStencil(int s) native "WebGLRenderingContext_clearStencil_Callback";
 
+
+  /** @domName WebGLRenderingContext.colorMask */
   void colorMask(bool red, bool green, bool blue, bool alpha) native "WebGLRenderingContext_colorMask_Callback";
 
+
+  /** @domName WebGLRenderingContext.compileShader */
   void compileShader(WebGLShader shader) native "WebGLRenderingContext_compileShader_Callback";
 
+
+  /** @domName WebGLRenderingContext.compressedTexImage2D */
   void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ArrayBufferView data) native "WebGLRenderingContext_compressedTexImage2D_Callback";
 
+
+  /** @domName WebGLRenderingContext.compressedTexSubImage2D */
   void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ArrayBufferView data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";
 
+
+  /** @domName WebGLRenderingContext.copyTexImage2D */
   void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) native "WebGLRenderingContext_copyTexImage2D_Callback";
 
+
+  /** @domName WebGLRenderingContext.copyTexSubImage2D */
   void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) native "WebGLRenderingContext_copyTexSubImage2D_Callback";
 
+
+  /** @domName WebGLRenderingContext.createBuffer */
   WebGLBuffer createBuffer() native "WebGLRenderingContext_createBuffer_Callback";
 
+
+  /** @domName WebGLRenderingContext.createFramebuffer */
   WebGLFramebuffer createFramebuffer() native "WebGLRenderingContext_createFramebuffer_Callback";
 
+
+  /** @domName WebGLRenderingContext.createProgram */
   WebGLProgram createProgram() native "WebGLRenderingContext_createProgram_Callback";
 
+
+  /** @domName WebGLRenderingContext.createRenderbuffer */
   WebGLRenderbuffer createRenderbuffer() native "WebGLRenderingContext_createRenderbuffer_Callback";
 
+
+  /** @domName WebGLRenderingContext.createShader */
   WebGLShader createShader(int type) native "WebGLRenderingContext_createShader_Callback";
 
+
+  /** @domName WebGLRenderingContext.createTexture */
   WebGLTexture createTexture() native "WebGLRenderingContext_createTexture_Callback";
 
+
+  /** @domName WebGLRenderingContext.cullFace */
   void cullFace(int mode) native "WebGLRenderingContext_cullFace_Callback";
 
+
+  /** @domName WebGLRenderingContext.deleteBuffer */
   void deleteBuffer(WebGLBuffer buffer) native "WebGLRenderingContext_deleteBuffer_Callback";
 
+
+  /** @domName WebGLRenderingContext.deleteFramebuffer */
   void deleteFramebuffer(WebGLFramebuffer framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback";
 
+
+  /** @domName WebGLRenderingContext.deleteProgram */
   void deleteProgram(WebGLProgram program) native "WebGLRenderingContext_deleteProgram_Callback";
 
+
+  /** @domName WebGLRenderingContext.deleteRenderbuffer */
   void deleteRenderbuffer(WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback";
 
+
+  /** @domName WebGLRenderingContext.deleteShader */
   void deleteShader(WebGLShader shader) native "WebGLRenderingContext_deleteShader_Callback";
 
+
+  /** @domName WebGLRenderingContext.deleteTexture */
   void deleteTexture(WebGLTexture texture) native "WebGLRenderingContext_deleteTexture_Callback";
 
+
+  /** @domName WebGLRenderingContext.depthFunc */
   void depthFunc(int func) native "WebGLRenderingContext_depthFunc_Callback";
 
+
+  /** @domName WebGLRenderingContext.depthMask */
   void depthMask(bool flag) native "WebGLRenderingContext_depthMask_Callback";
 
+
+  /** @domName WebGLRenderingContext.depthRange */
   void depthRange(num zNear, num zFar) native "WebGLRenderingContext_depthRange_Callback";
 
+
+  /** @domName WebGLRenderingContext.detachShader */
   void detachShader(WebGLProgram program, WebGLShader shader) native "WebGLRenderingContext_detachShader_Callback";
 
+
+  /** @domName WebGLRenderingContext.disable */
   void disable(int cap) native "WebGLRenderingContext_disable_Callback";
 
+
+  /** @domName WebGLRenderingContext.disableVertexAttribArray */
   void disableVertexAttribArray(int index) native "WebGLRenderingContext_disableVertexAttribArray_Callback";
 
+
+  /** @domName WebGLRenderingContext.drawArrays */
   void drawArrays(int mode, int first, int count) native "WebGLRenderingContext_drawArrays_Callback";
 
+
+  /** @domName WebGLRenderingContext.drawElements */
   void drawElements(int mode, int count, int type, int offset) native "WebGLRenderingContext_drawElements_Callback";
 
+
+  /** @domName WebGLRenderingContext.enable */
   void enable(int cap) native "WebGLRenderingContext_enable_Callback";
 
+
+  /** @domName WebGLRenderingContext.enableVertexAttribArray */
   void enableVertexAttribArray(int index) native "WebGLRenderingContext_enableVertexAttribArray_Callback";
 
+
+  /** @domName WebGLRenderingContext.finish */
   void finish() native "WebGLRenderingContext_finish_Callback";
 
+
+  /** @domName WebGLRenderingContext.flush */
   void flush() native "WebGLRenderingContext_flush_Callback";
 
+
+  /** @domName WebGLRenderingContext.framebufferRenderbuffer */
   void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";
 
+
+  /** @domName WebGLRenderingContext.framebufferTexture2D */
   void framebufferTexture2D(int target, int attachment, int textarget, WebGLTexture texture, int level) native "WebGLRenderingContext_framebufferTexture2D_Callback";
 
+
+  /** @domName WebGLRenderingContext.frontFace */
   void frontFace(int mode) native "WebGLRenderingContext_frontFace_Callback";
 
+
+  /** @domName WebGLRenderingContext.generateMipmap */
   void generateMipmap(int target) native "WebGLRenderingContext_generateMipmap_Callback";
 
+
+  /** @domName WebGLRenderingContext.getActiveAttrib */
   WebGLActiveInfo getActiveAttrib(WebGLProgram program, int index) native "WebGLRenderingContext_getActiveAttrib_Callback";
 
+
+  /** @domName WebGLRenderingContext.getActiveUniform */
   WebGLActiveInfo getActiveUniform(WebGLProgram program, int index) native "WebGLRenderingContext_getActiveUniform_Callback";
 
+
+  /** @domName WebGLRenderingContext.getAttachedShaders */
   void getAttachedShaders(WebGLProgram program) native "WebGLRenderingContext_getAttachedShaders_Callback";
 
+
+  /** @domName WebGLRenderingContext.getAttribLocation */
   int getAttribLocation(WebGLProgram program, String name) native "WebGLRenderingContext_getAttribLocation_Callback";
 
+
+  /** @domName WebGLRenderingContext.getBufferParameter */
   Object getBufferParameter(int target, int pname) native "WebGLRenderingContext_getBufferParameter_Callback";
 
+
+  /** @domName WebGLRenderingContext.getContextAttributes */
   WebGLContextAttributes getContextAttributes() native "WebGLRenderingContext_getContextAttributes_Callback";
 
+
+  /** @domName WebGLRenderingContext.getError */
   int getError() native "WebGLRenderingContext_getError_Callback";
 
+
+  /** @domName WebGLRenderingContext.getExtension */
   Object getExtension(String name) native "WebGLRenderingContext_getExtension_Callback";
 
+
+  /** @domName WebGLRenderingContext.getFramebufferAttachmentParameter */
   Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
 
+
+  /** @domName WebGLRenderingContext.getParameter */
   Object getParameter(int pname) native "WebGLRenderingContext_getParameter_Callback";
 
+
+  /** @domName WebGLRenderingContext.getProgramInfoLog */
   String getProgramInfoLog(WebGLProgram program) native "WebGLRenderingContext_getProgramInfoLog_Callback";
 
+
+  /** @domName WebGLRenderingContext.getProgramParameter */
   Object getProgramParameter(WebGLProgram program, int pname) native "WebGLRenderingContext_getProgramParameter_Callback";
 
+
+  /** @domName WebGLRenderingContext.getRenderbufferParameter */
   Object getRenderbufferParameter(int target, int pname) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
 
+
+  /** @domName WebGLRenderingContext.getShaderInfoLog */
   String getShaderInfoLog(WebGLShader shader) native "WebGLRenderingContext_getShaderInfoLog_Callback";
 
+
+  /** @domName WebGLRenderingContext.getShaderParameter */
   Object getShaderParameter(WebGLShader shader, int pname) native "WebGLRenderingContext_getShaderParameter_Callback";
 
+
+  /** @domName WebGLRenderingContext.getShaderPrecisionFormat */
   WebGLShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";
 
+
+  /** @domName WebGLRenderingContext.getShaderSource */
   String getShaderSource(WebGLShader shader) native "WebGLRenderingContext_getShaderSource_Callback";
 
+
+  /** @domName WebGLRenderingContext.getSupportedExtensions */
   List<String> getSupportedExtensions() native "WebGLRenderingContext_getSupportedExtensions_Callback";
 
+
+  /** @domName WebGLRenderingContext.getTexParameter */
   Object getTexParameter(int target, int pname) native "WebGLRenderingContext_getTexParameter_Callback";
 
+
+  /** @domName WebGLRenderingContext.getUniform */
   Object getUniform(WebGLProgram program, WebGLUniformLocation location) native "WebGLRenderingContext_getUniform_Callback";
 
+
+  /** @domName WebGLRenderingContext.getUniformLocation */
   WebGLUniformLocation getUniformLocation(WebGLProgram program, String name) native "WebGLRenderingContext_getUniformLocation_Callback";
 
+
+  /** @domName WebGLRenderingContext.getVertexAttrib */
   Object getVertexAttrib(int index, int pname) native "WebGLRenderingContext_getVertexAttrib_Callback";
 
+
+  /** @domName WebGLRenderingContext.getVertexAttribOffset */
   int getVertexAttribOffset(int index, int pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback";
 
+
+  /** @domName WebGLRenderingContext.hint */
   void hint(int target, int mode) native "WebGLRenderingContext_hint_Callback";
 
+
+  /** @domName WebGLRenderingContext.isBuffer */
   bool isBuffer(WebGLBuffer buffer) native "WebGLRenderingContext_isBuffer_Callback";
 
+
+  /** @domName WebGLRenderingContext.isContextLost */
   bool isContextLost() native "WebGLRenderingContext_isContextLost_Callback";
 
+
+  /** @domName WebGLRenderingContext.isEnabled */
   bool isEnabled(int cap) native "WebGLRenderingContext_isEnabled_Callback";
 
+
+  /** @domName WebGLRenderingContext.isFramebuffer */
   bool isFramebuffer(WebGLFramebuffer framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback";
 
+
+  /** @domName WebGLRenderingContext.isProgram */
   bool isProgram(WebGLProgram program) native "WebGLRenderingContext_isProgram_Callback";
 
+
+  /** @domName WebGLRenderingContext.isRenderbuffer */
   bool isRenderbuffer(WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback";
 
+
+  /** @domName WebGLRenderingContext.isShader */
   bool isShader(WebGLShader shader) native "WebGLRenderingContext_isShader_Callback";
 
+
+  /** @domName WebGLRenderingContext.isTexture */
   bool isTexture(WebGLTexture texture) native "WebGLRenderingContext_isTexture_Callback";
 
+
+  /** @domName WebGLRenderingContext.lineWidth */
   void lineWidth(num width) native "WebGLRenderingContext_lineWidth_Callback";
 
+
+  /** @domName WebGLRenderingContext.linkProgram */
   void linkProgram(WebGLProgram program) native "WebGLRenderingContext_linkProgram_Callback";
 
+
+  /** @domName WebGLRenderingContext.pixelStorei */
   void pixelStorei(int pname, int param) native "WebGLRenderingContext_pixelStorei_Callback";
 
+
+  /** @domName WebGLRenderingContext.polygonOffset */
   void polygonOffset(num factor, num units) native "WebGLRenderingContext_polygonOffset_Callback";
 
+
+  /** @domName WebGLRenderingContext.readPixels */
   void readPixels(int x, int y, int width, int height, int format, int type, ArrayBufferView pixels) native "WebGLRenderingContext_readPixels_Callback";
 
+
+  /** @domName WebGLRenderingContext.releaseShaderCompiler */
   void releaseShaderCompiler() native "WebGLRenderingContext_releaseShaderCompiler_Callback";
 
+
+  /** @domName WebGLRenderingContext.renderbufferStorage */
   void renderbufferStorage(int target, int internalformat, int width, int height) native "WebGLRenderingContext_renderbufferStorage_Callback";
 
+
+  /** @domName WebGLRenderingContext.sampleCoverage */
   void sampleCoverage(num value, bool invert) native "WebGLRenderingContext_sampleCoverage_Callback";
 
+
+  /** @domName WebGLRenderingContext.scissor */
   void scissor(int x, int y, int width, int height) native "WebGLRenderingContext_scissor_Callback";
 
+
+  /** @domName WebGLRenderingContext.shaderSource */
   void shaderSource(WebGLShader shader, String string) native "WebGLRenderingContext_shaderSource_Callback";
 
+
+  /** @domName WebGLRenderingContext.stencilFunc */
   void stencilFunc(int func, int ref, int mask) native "WebGLRenderingContext_stencilFunc_Callback";
 
+
+  /** @domName WebGLRenderingContext.stencilFuncSeparate */
   void stencilFuncSeparate(int face, int func, int ref, int mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback";
 
+
+  /** @domName WebGLRenderingContext.stencilMask */
   void stencilMask(int mask) native "WebGLRenderingContext_stencilMask_Callback";
 
+
+  /** @domName WebGLRenderingContext.stencilMaskSeparate */
   void stencilMaskSeparate(int face, int mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback";
 
+
+  /** @domName WebGLRenderingContext.stencilOp */
   void stencilOp(int fail, int zfail, int zpass) native "WebGLRenderingContext_stencilOp_Callback";
 
+
+  /** @domName WebGLRenderingContext.stencilOpSeparate */
   void stencilOpSeparate(int face, int fail, int zfail, int zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback";
 
   void texImage2D(/*unsigned long*/ target, /*long*/ level, /*unsigned long*/ internalformat, /*long*/ format_OR_width, /*long*/ height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [/*unsigned long*/ format, /*unsigned long*/ type, /*ArrayBufferView*/ pixels]) {
@@ -40750,18 +33050,32 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName WebGLRenderingContext.texImage2D_1 */
   void _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext_texImage2D_1_Callback";
 
+
+  /** @domName WebGLRenderingContext.texImage2D_2 */
   void _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_2_Callback";
 
+
+  /** @domName WebGLRenderingContext.texImage2D_3 */
   void _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_3_Callback";
 
+
+  /** @domName WebGLRenderingContext.texImage2D_4 */
   void _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_4_Callback";
 
+
+  /** @domName WebGLRenderingContext.texImage2D_5 */
   void _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_5_Callback";
 
+
+  /** @domName WebGLRenderingContext.texParameterf */
   void texParameterf(int target, int pname, num param) native "WebGLRenderingContext_texParameterf_Callback";
 
+
+  /** @domName WebGLRenderingContext.texParameteri */
   void texParameteri(int target, int pname, int param) native "WebGLRenderingContext_texParameteri_Callback";
 
   void texSubImage2D(/*unsigned long*/ target, /*long*/ level, /*long*/ xoffset, /*long*/ yoffset, /*long*/ format_OR_width, /*long*/ height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [/*unsigned long*/ type, /*ArrayBufferView*/ pixels]) {
@@ -40788,76 +33102,148 @@
     throw "Incorrect number or type of arguments";
   }
 
+
+  /** @domName WebGLRenderingContext.texSubImage2D_1 */
   void _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext_texSubImage2D_1_Callback";
 
+
+  /** @domName WebGLRenderingContext.texSubImage2D_2 */
   void _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_2_Callback";
 
+
+  /** @domName WebGLRenderingContext.texSubImage2D_3 */
   void _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_3_Callback";
 
+
+  /** @domName WebGLRenderingContext.texSubImage2D_4 */
   void _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_4_Callback";
 
+
+  /** @domName WebGLRenderingContext.texSubImage2D_5 */
   void _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_5_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform1f */
   void uniform1f(WebGLUniformLocation location, num x) native "WebGLRenderingContext_uniform1f_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform1fv */
   void uniform1fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform1fv_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform1i */
   void uniform1i(WebGLUniformLocation location, int x) native "WebGLRenderingContext_uniform1i_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform1iv */
   void uniform1iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform1iv_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform2f */
   void uniform2f(WebGLUniformLocation location, num x, num y) native "WebGLRenderingContext_uniform2f_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform2fv */
   void uniform2fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform2fv_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform2i */
   void uniform2i(WebGLUniformLocation location, int x, int y) native "WebGLRenderingContext_uniform2i_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform2iv */
   void uniform2iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform2iv_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform3f */
   void uniform3f(WebGLUniformLocation location, num x, num y, num z) native "WebGLRenderingContext_uniform3f_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform3fv */
   void uniform3fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform3fv_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform3i */
   void uniform3i(WebGLUniformLocation location, int x, int y, int z) native "WebGLRenderingContext_uniform3i_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform3iv */
   void uniform3iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform3iv_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform4f */
   void uniform4f(WebGLUniformLocation location, num x, num y, num z, num w) native "WebGLRenderingContext_uniform4f_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform4fv */
   void uniform4fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform4fv_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform4i */
   void uniform4i(WebGLUniformLocation location, int x, int y, int z, int w) native "WebGLRenderingContext_uniform4i_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniform4iv */
   void uniform4iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform4iv_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniformMatrix2fv */
   void uniformMatrix2fv(WebGLUniformLocation location, bool transpose, Float32Array array) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniformMatrix3fv */
   void uniformMatrix3fv(WebGLUniformLocation location, bool transpose, Float32Array array) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
 
+
+  /** @domName WebGLRenderingContext.uniformMatrix4fv */
   void uniformMatrix4fv(WebGLUniformLocation location, bool transpose, Float32Array array) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
 
+
+  /** @domName WebGLRenderingContext.useProgram */
   void useProgram(WebGLProgram program) native "WebGLRenderingContext_useProgram_Callback";
 
+
+  /** @domName WebGLRenderingContext.validateProgram */
   void validateProgram(WebGLProgram program) native "WebGLRenderingContext_validateProgram_Callback";
 
+
+  /** @domName WebGLRenderingContext.vertexAttrib1f */
   void vertexAttrib1f(int indx, num x) native "WebGLRenderingContext_vertexAttrib1f_Callback";
 
+
+  /** @domName WebGLRenderingContext.vertexAttrib1fv */
   void vertexAttrib1fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
 
+
+  /** @domName WebGLRenderingContext.vertexAttrib2f */
   void vertexAttrib2f(int indx, num x, num y) native "WebGLRenderingContext_vertexAttrib2f_Callback";
 
+
+  /** @domName WebGLRenderingContext.vertexAttrib2fv */
   void vertexAttrib2fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
 
+
+  /** @domName WebGLRenderingContext.vertexAttrib3f */
   void vertexAttrib3f(int indx, num x, num y, num z) native "WebGLRenderingContext_vertexAttrib3f_Callback";
 
+
+  /** @domName WebGLRenderingContext.vertexAttrib3fv */
   void vertexAttrib3fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
 
+
+  /** @domName WebGLRenderingContext.vertexAttrib4f */
   void vertexAttrib4f(int indx, num x, num y, num z, num w) native "WebGLRenderingContext_vertexAttrib4f_Callback";
 
+
+  /** @domName WebGLRenderingContext.vertexAttrib4fv */
   void vertexAttrib4fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
 
+
+  /** @domName WebGLRenderingContext.vertexAttribPointer */
   void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) native "WebGLRenderingContext_vertexAttribPointer_Callback";
 
+
+  /** @domName WebGLRenderingContext.viewport */
   void viewport(int x, int y, int width, int height) native "WebGLRenderingContext_viewport_Callback";
 
 }
@@ -40868,15 +33254,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLShader
-abstract class WebGLShader {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLShaderImpl extends NativeFieldWrapperClass1 implements WebGLShader {
+class WebGLShader extends NativeFieldWrapperClass1 {
+  WebGLShader.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40886,29 +33265,19 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLShaderPrecisionFormat
-abstract class WebGLShaderPrecisionFormat {
+class WebGLShaderPrecisionFormat extends NativeFieldWrapperClass1 {
+  WebGLShaderPrecisionFormat.internal();
+
 
   /** @domName WebGLShaderPrecisionFormat.precision */
-  int get precision;
-
-  /** @domName WebGLShaderPrecisionFormat.rangeMax */
-  int get rangeMax;
-
-  /** @domName WebGLShaderPrecisionFormat.rangeMin */
-  int get rangeMin;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLShaderPrecisionFormatImpl extends NativeFieldWrapperClass1 implements WebGLShaderPrecisionFormat {
-
   int get precision native "WebGLShaderPrecisionFormat_precision_Getter";
 
+
+  /** @domName WebGLShaderPrecisionFormat.rangeMax */
   int get rangeMax native "WebGLShaderPrecisionFormat_rangeMax_Getter";
 
+
+  /** @domName WebGLShaderPrecisionFormat.rangeMin */
   int get rangeMin native "WebGLShaderPrecisionFormat_rangeMin_Getter";
 
 }
@@ -40919,15 +33288,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLTexture
-abstract class WebGLTexture {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLTextureImpl extends NativeFieldWrapperClass1 implements WebGLTexture {
+class WebGLTexture extends NativeFieldWrapperClass1 {
+  WebGLTexture.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40937,15 +33299,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLUniformLocation
-abstract class WebGLUniformLocation {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLUniformLocationImpl extends NativeFieldWrapperClass1 implements WebGLUniformLocation {
+class WebGLUniformLocation extends NativeFieldWrapperClass1 {
+  WebGLUniformLocation.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40955,15 +33310,8 @@
 // WARNING: Do not edit - generated code.
 
 /// @domName WebGLVertexArrayObjectOES
-abstract class WebGLVertexArrayObjectOES {
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebGLVertexArrayObjectOESImpl extends NativeFieldWrapperClass1 implements WebGLVertexArrayObjectOES {
+class WebGLVertexArrayObjectOES extends NativeFieldWrapperClass1 {
+  WebGLVertexArrayObjectOES.internal();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40972,8 +33320,2680 @@
 
 // WARNING: Do not edit - generated code.
 
-class _WebKitAnimationListImpl extends NativeFieldWrapperClass1 implements List<Animation> {
+/// @domName WebKitCSSFilterValue
+class WebKitCSSFilterValue extends _CSSValueList {
+  WebKitCSSFilterValue.internal(): super.internal();
 
+  static const int CSS_FILTER_BLUR = 10;
+
+  static const int CSS_FILTER_BRIGHTNESS = 8;
+
+  static const int CSS_FILTER_CONTRAST = 9;
+
+  static const int CSS_FILTER_CUSTOM = 12;
+
+  static const int CSS_FILTER_DROP_SHADOW = 11;
+
+  static const int CSS_FILTER_GRAYSCALE = 2;
+
+  static const int CSS_FILTER_HUE_ROTATE = 5;
+
+  static const int CSS_FILTER_INVERT = 6;
+
+  static const int CSS_FILTER_OPACITY = 7;
+
+  static const int CSS_FILTER_REFERENCE = 1;
+
+  static const int CSS_FILTER_SATURATE = 4;
+
+  static const int CSS_FILTER_SEPIA = 3;
+
+
+  /** @domName WebKitCSSFilterValue.operationType */
+  int get operationType native "WebKitCSSFilterValue_operationType_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName WebKitNamedFlow
+class WebKitNamedFlow extends EventTarget {
+  WebKitNamedFlow.internal(): super.internal();
+
+
+  /** @domName WebKitNamedFlow.firstEmptyRegionIndex */
+  int get firstEmptyRegionIndex native "WebKitNamedFlow_firstEmptyRegionIndex_Getter";
+
+
+  /** @domName WebKitNamedFlow.name */
+  String get name native "WebKitNamedFlow_name_Getter";
+
+
+  /** @domName WebKitNamedFlow.overset */
+  bool get overset native "WebKitNamedFlow_overset_Getter";
+
+
+  /** @domName WebKitNamedFlow.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_addEventListener_Callback";
+
+
+  /** @domName WebKitNamedFlow.dispatchEvent */
+  bool $dom_dispatchEvent(Event event) native "WebKitNamedFlow_dispatchEvent_Callback";
+
+
+  /** @domName WebKitNamedFlow.getContent */
+  List<Node> getContent() native "WebKitNamedFlow_getContent_Callback";
+
+
+  /** @domName WebKitNamedFlow.getRegions */
+  List<Node> getRegions() native "WebKitNamedFlow_getRegions_Callback";
+
+
+  /** @domName WebKitNamedFlow.getRegionsByContent */
+  List<Node> getRegionsByContent(Node contentNode) native "WebKitNamedFlow_getRegionsByContent_Callback";
+
+
+  /** @domName WebKitNamedFlow.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_removeEventListener_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+class WebSocket extends EventTarget {
+  factory WebSocket(String url) => _WebSocketFactoryProvider.createWebSocket(url);
+  WebSocket.internal(): super.internal();
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  WebSocketEvents get on =>
+    new WebSocketEvents(this);
+
+  static const int CLOSED = 3;
+
+  static const int CLOSING = 2;
+
+  static const int CONNECTING = 0;
+
+  static const int OPEN = 1;
+
+
+  /** @domName WebSocket.URL */
+  String get URL native "WebSocket_URL_Getter";
+
+
+  /** @domName WebSocket.binaryType */
+  String get binaryType native "WebSocket_binaryType_Getter";
+
+
+  /** @domName WebSocket.binaryType */
+  void set binaryType(String value) native "WebSocket_binaryType_Setter";
+
+
+  /** @domName WebSocket.bufferedAmount */
+  int get bufferedAmount native "WebSocket_bufferedAmount_Getter";
+
+
+  /** @domName WebSocket.extensions */
+  String get extensions native "WebSocket_extensions_Getter";
+
+
+  /** @domName WebSocket.protocol */
+  String get protocol native "WebSocket_protocol_Getter";
+
+
+  /** @domName WebSocket.readyState */
+  int get readyState native "WebSocket_readyState_Getter";
+
+
+  /** @domName WebSocket.url */
+  String get url native "WebSocket_url_Getter";
+
+
+  /** @domName WebSocket.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_addEventListener_Callback";
+
+  void close([/*unsigned short*/ code, /*DOMString*/ reason]) {
+    if (?reason) {
+      _close_1(code, reason);
+      return;
+    }
+    if (?code) {
+      _close_2(code);
+      return;
+    }
+    _close_3();
+  }
+
+
+  /** @domName WebSocket.close_1 */
+  void _close_1(code, reason) native "WebSocket_close_1_Callback";
+
+
+  /** @domName WebSocket.close_2 */
+  void _close_2(code) native "WebSocket_close_2_Callback";
+
+
+  /** @domName WebSocket.close_3 */
+  void _close_3() native "WebSocket_close_3_Callback";
+
+
+  /** @domName WebSocket.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "WebSocket_dispatchEvent_Callback";
+
+
+  /** @domName WebSocket.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_removeEventListener_Callback";
+
+
+  /** @domName WebSocket.send */
+  void send(data) native "WebSocket_send_Callback";
+
+}
+
+class WebSocketEvents extends Events {
+  WebSocketEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get close => this['close'];
+
+  EventListenerList get error => this['error'];
+
+  EventListenerList get message => this['message'];
+
+  EventListenerList get open => this['open'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class WheelEvent extends MouseEvent {
+  WheelEvent.internal(): super.internal();
+
+
+  /** @domName WheelEvent.webkitDirectionInvertedFromDevice */
+  bool get webkitDirectionInvertedFromDevice native "WheelEvent_webkitDirectionInvertedFromDevice_Getter";
+
+
+  /** @domName WheelEvent.wheelDeltaX */
+  int get $dom_wheelDeltaX native "WheelEvent_wheelDeltaX_Getter";
+
+
+  /** @domName WheelEvent.wheelDeltaY */
+  int get $dom_wheelDeltaY native "WheelEvent_wheelDeltaY_Getter";
+
+
+  /** @domName WheelEvent.initWebKitWheelEvent */
+  void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "WheelEvent_initWebKitWheelEvent_Callback";
+
+
+  /** @domName WheelEvent.deltaX */
+  num get deltaX => $dom_wheelDeltaX;
+  /** @domName WheelEvent.deltaY */
+  num get deltaY => $dom_wheelDeltaY;
+  /** @domName WheelEvent.deltaMode */
+  int get deltaMode => 0;
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName Worker
+class Worker extends AbstractWorker {
+
+  factory Worker(String scriptUrl) => _WorkerFactoryProvider.createWorker(scriptUrl);
+  Worker.internal(): super.internal();
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  WorkerEvents get on =>
+    new WorkerEvents(this);
+
+
+  /** @domName Worker.postMessage */
+  void postMessage(/*SerializedScriptValue*/ message, [List messagePorts]) native "Worker_postMessage_Callback";
+
+
+  /** @domName Worker.terminate */
+  void terminate() native "Worker_terminate_Callback";
+
+}
+
+class WorkerEvents extends AbstractWorkerEvents {
+  WorkerEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get message => this['message'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName WorkerContext
+class WorkerContext extends EventTarget {
+  WorkerContext.internal(): super.internal();
+
+  /**
+   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
+   */
+  WorkerContextEvents get on =>
+    new WorkerContextEvents(this);
+
+  static const int PERSISTENT = 1;
+
+  static const int TEMPORARY = 0;
+
+
+  /** @domName WorkerContext.indexedDB */
+  IDBFactory get indexedDB native "WorkerContext_indexedDB_Getter";
+
+
+  /** @domName WorkerContext.location */
+  WorkerLocation get location native "WorkerContext_location_Getter";
+
+
+  /** @domName WorkerContext.navigator */
+  WorkerNavigator get navigator native "WorkerContext_navigator_Getter";
+
+
+  /** @domName WorkerContext.self */
+  WorkerContext get self native "WorkerContext_self_Getter";
+
+
+  /** @domName WorkerContext.webkitIndexedDB */
+  IDBFactory get webkitIndexedDB native "WorkerContext_webkitIndexedDB_Getter";
+
+
+  /** @domName WorkerContext.webkitNotifications */
+  NotificationCenter get webkitNotifications native "WorkerContext_webkitNotifications_Getter";
+
+
+  /** @domName WorkerContext.addEventListener */
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_addEventListener_Callback";
+
+
+  /** @domName WorkerContext.clearInterval */
+  void clearInterval(int handle) native "WorkerContext_clearInterval_Callback";
+
+
+  /** @domName WorkerContext.clearTimeout */
+  void clearTimeout(int handle) native "WorkerContext_clearTimeout_Callback";
+
+
+  /** @domName WorkerContext.close */
+  void close() native "WorkerContext_close_Callback";
+
+
+  /** @domName WorkerContext.dispatchEvent */
+  bool $dom_dispatchEvent(Event evt) native "WorkerContext_dispatchEvent_Callback";
+
+
+  /** @domName WorkerContext.importScripts */
+  void importScripts() native "WorkerContext_importScripts_Callback";
+
+
+  /** @domName WorkerContext.openDatabase */
+  Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabase_Callback";
+
+
+  /** @domName WorkerContext.openDatabaseSync */
+  DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabaseSync_Callback";
+
+
+  /** @domName WorkerContext.removeEventListener */
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_removeEventListener_Callback";
+
+
+  /** @domName WorkerContext.setInterval */
+  int setInterval(TimeoutHandler handler, int timeout) native "WorkerContext_setInterval_Callback";
+
+
+  /** @domName WorkerContext.setTimeout */
+  int setTimeout(TimeoutHandler handler, int timeout) native "WorkerContext_setTimeout_Callback";
+
+
+  /** @domName WorkerContext.webkitRequestFileSystem */
+  void webkitRequestFileSystem(int type, int size, [FileSystemCallback successCallback, ErrorCallback errorCallback]) native "WorkerContext_webkitRequestFileSystem_Callback";
+
+
+  /** @domName WorkerContext.webkitRequestFileSystemSync */
+  DOMFileSystemSync webkitRequestFileSystemSync(int type, int size) native "WorkerContext_webkitRequestFileSystemSync_Callback";
+
+
+  /** @domName WorkerContext.webkitResolveLocalFileSystemSyncURL */
+  EntrySync webkitResolveLocalFileSystemSyncURL(String url) native "WorkerContext_webkitResolveLocalFileSystemSyncURL_Callback";
+
+
+  /** @domName WorkerContext.webkitResolveLocalFileSystemURL */
+  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native "WorkerContext_webkitResolveLocalFileSystemURL_Callback";
+
+}
+
+class WorkerContextEvents extends Events {
+  WorkerContextEvents(EventTarget _ptr) : super(_ptr);
+
+  EventListenerList get error => this['error'];
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName WorkerLocation
+class WorkerLocation extends NativeFieldWrapperClass1 {
+  WorkerLocation.internal();
+
+
+  /** @domName WorkerLocation.hash */
+  String get hash native "WorkerLocation_hash_Getter";
+
+
+  /** @domName WorkerLocation.host */
+  String get host native "WorkerLocation_host_Getter";
+
+
+  /** @domName WorkerLocation.hostname */
+  String get hostname native "WorkerLocation_hostname_Getter";
+
+
+  /** @domName WorkerLocation.href */
+  String get href native "WorkerLocation_href_Getter";
+
+
+  /** @domName WorkerLocation.pathname */
+  String get pathname native "WorkerLocation_pathname_Getter";
+
+
+  /** @domName WorkerLocation.port */
+  String get port native "WorkerLocation_port_Getter";
+
+
+  /** @domName WorkerLocation.protocol */
+  String get protocol native "WorkerLocation_protocol_Getter";
+
+
+  /** @domName WorkerLocation.search */
+  String get search native "WorkerLocation_search_Getter";
+
+
+  /** @domName WorkerLocation.toString */
+  String toString() native "WorkerLocation_toString_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName WorkerNavigator
+class WorkerNavigator extends NativeFieldWrapperClass1 {
+  WorkerNavigator.internal();
+
+
+  /** @domName WorkerNavigator.appName */
+  String get appName native "WorkerNavigator_appName_Getter";
+
+
+  /** @domName WorkerNavigator.appVersion */
+  String get appVersion native "WorkerNavigator_appVersion_Getter";
+
+
+  /** @domName WorkerNavigator.onLine */
+  bool get onLine native "WorkerNavigator_onLine_Getter";
+
+
+  /** @domName WorkerNavigator.platform */
+  String get platform native "WorkerNavigator_platform_Getter";
+
+
+  /** @domName WorkerNavigator.userAgent */
+  String get userAgent native "WorkerNavigator_userAgent_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName XMLSerializer
+class XMLSerializer extends NativeFieldWrapperClass1 {
+
+  factory XMLSerializer() => _XMLSerializerFactoryProvider.createXMLSerializer();
+  XMLSerializer.internal();
+
+
+  /** @domName XMLSerializer.serializeToString */
+  String serializeToString(Node node) native "XMLSerializer_serializeToString_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName XPathEvaluator
+class XPathEvaluator extends NativeFieldWrapperClass1 {
+
+  factory XPathEvaluator() => _XPathEvaluatorFactoryProvider.createXPathEvaluator();
+  XPathEvaluator.internal();
+
+
+  /** @domName XPathEvaluator.createExpression */
+  XPathExpression createExpression(String expression, XPathNSResolver resolver) native "XPathEvaluator_createExpression_Callback";
+
+
+  /** @domName XPathEvaluator.createNSResolver */
+  XPathNSResolver createNSResolver(Node nodeResolver) native "XPathEvaluator_createNSResolver_Callback";
+
+
+  /** @domName XPathEvaluator.evaluate */
+  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) native "XPathEvaluator_evaluate_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName XPathException
+class XPathException extends NativeFieldWrapperClass1 {
+  XPathException.internal();
+
+  static const int INVALID_EXPRESSION_ERR = 51;
+
+  static const int TYPE_ERR = 52;
+
+
+  /** @domName XPathException.code */
+  int get code native "XPathException_code_Getter";
+
+
+  /** @domName XPathException.message */
+  String get message native "XPathException_message_Getter";
+
+
+  /** @domName XPathException.name */
+  String get name native "XPathException_name_Getter";
+
+
+  /** @domName XPathException.toString */
+  String toString() native "XPathException_toString_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName XPathExpression
+class XPathExpression extends NativeFieldWrapperClass1 {
+  XPathExpression.internal();
+
+
+  /** @domName XPathExpression.evaluate */
+  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) native "XPathExpression_evaluate_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName XPathNSResolver
+class XPathNSResolver extends NativeFieldWrapperClass1 {
+  XPathNSResolver.internal();
+
+
+  /** @domName XPathNSResolver.lookupNamespaceURI */
+  String lookupNamespaceURI(String prefix) native "XPathNSResolver_lookupNamespaceURI_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName XPathResult
+class XPathResult extends NativeFieldWrapperClass1 {
+  XPathResult.internal();
+
+  static const int ANY_TYPE = 0;
+
+  static const int ANY_UNORDERED_NODE_TYPE = 8;
+
+  static const int BOOLEAN_TYPE = 3;
+
+  static const int FIRST_ORDERED_NODE_TYPE = 9;
+
+  static const int NUMBER_TYPE = 1;
+
+  static const int ORDERED_NODE_ITERATOR_TYPE = 5;
+
+  static const int ORDERED_NODE_SNAPSHOT_TYPE = 7;
+
+  static const int STRING_TYPE = 2;
+
+  static const int UNORDERED_NODE_ITERATOR_TYPE = 4;
+
+  static const int UNORDERED_NODE_SNAPSHOT_TYPE = 6;
+
+
+  /** @domName XPathResult.booleanValue */
+  bool get booleanValue native "XPathResult_booleanValue_Getter";
+
+
+  /** @domName XPathResult.invalidIteratorState */
+  bool get invalidIteratorState native "XPathResult_invalidIteratorState_Getter";
+
+
+  /** @domName XPathResult.numberValue */
+  num get numberValue native "XPathResult_numberValue_Getter";
+
+
+  /** @domName XPathResult.resultType */
+  int get resultType native "XPathResult_resultType_Getter";
+
+
+  /** @domName XPathResult.singleNodeValue */
+  Node get singleNodeValue native "XPathResult_singleNodeValue_Getter";
+
+
+  /** @domName XPathResult.snapshotLength */
+  int get snapshotLength native "XPathResult_snapshotLength_Getter";
+
+
+  /** @domName XPathResult.stringValue */
+  String get stringValue native "XPathResult_stringValue_Getter";
+
+
+  /** @domName XPathResult.iterateNext */
+  Node iterateNext() native "XPathResult_iterateNext_Callback";
+
+
+  /** @domName XPathResult.snapshotItem */
+  Node snapshotItem(int index) native "XPathResult_snapshotItem_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName XSLTProcessor
+class XSLTProcessor extends NativeFieldWrapperClass1 {
+
+  factory XSLTProcessor() => _XSLTProcessorFactoryProvider.createXSLTProcessor();
+  XSLTProcessor.internal();
+
+
+  /** @domName XSLTProcessor.clearParameters */
+  void clearParameters() native "XSLTProcessor_clearParameters_Callback";
+
+
+  /** @domName XSLTProcessor.getParameter */
+  String getParameter(String namespaceURI, String localName) native "XSLTProcessor_getParameter_Callback";
+
+
+  /** @domName XSLTProcessor.importStylesheet */
+  void importStylesheet(Node stylesheet) native "XSLTProcessor_importStylesheet_Callback";
+
+
+  /** @domName XSLTProcessor.removeParameter */
+  void removeParameter(String namespaceURI, String localName) native "XSLTProcessor_removeParameter_Callback";
+
+
+  /** @domName XSLTProcessor.reset */
+  void reset() native "XSLTProcessor_reset_Callback";
+
+
+  /** @domName XSLTProcessor.setParameter */
+  void setParameter(String namespaceURI, String localName, String value) native "XSLTProcessor_setParameter_Callback";
+
+
+  /** @domName XSLTProcessor.transformToDocument */
+  Document transformToDocument(Node source) native "XSLTProcessor_transformToDocument_Callback";
+
+
+  /** @domName XSLTProcessor.transformToFragment */
+  DocumentFragment transformToFragment(Node source, Document docVal) native "XSLTProcessor_transformToFragment_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _ArrayBufferFactoryProvider {
+  static ArrayBuffer createArrayBuffer(int length) native "ArrayBuffer_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _AudioElementFactoryProvider {
+  static AudioElement createAudioElement([String src]) native "HTMLAudioElement_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _BlobFactoryProvider {
+  static Blob createBlob(List blobParts, [String type, String endings]) native "Blob_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _CSSMatrixFactoryProvider {
+  static CSSMatrix createCSSMatrix([String cssValue]) native "WebKitCSSMatrix_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName CSSRuleList
+class _CSSRuleList extends NativeFieldWrapperClass1 implements List<CSSRule> {
+  _CSSRuleList.internal();
+
+
+  /** @domName CSSRuleList.length */
+  int get length native "CSSRuleList_length_Getter";
+
+  CSSRule operator[](int index) native "CSSRuleList_item_Callback";
+
+  void operator[]=(int index, CSSRule value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<CSSRule> mixins.
+  // CSSRule is the element type.
+
+  // From Iterable<CSSRule>:
+
+  Iterator<CSSRule> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<CSSRule>(this);
+  }
+
+  // From Collection<CSSRule>:
+
+  void add(CSSRule value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(CSSRule value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<CSSRule> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(CSSRule element) => _Collections.contains(this, element);
+
+  void forEach(void f(CSSRule element)) => _Collections.forEach(this, f);
+
+  Collection map(f(CSSRule element)) => _Collections.map(this, [], f);
+
+  Collection<CSSRule> filter(bool f(CSSRule element)) =>
+     _Collections.filter(this, <CSSRule>[], f);
+
+  bool every(bool f(CSSRule element)) => _Collections.every(this, f);
+
+  bool some(bool f(CSSRule element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<CSSRule>:
+
+  void sort([Comparator<CSSRule> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(CSSRule element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(CSSRule element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  CSSRule get last => this[length - 1];
+
+  CSSRule removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<CSSRule> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [CSSRule initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<CSSRule> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <CSSRule>[]);
+
+  // -- end List<CSSRule> mixins.
+
+
+  /** @domName CSSRuleList.item */
+  CSSRule item(int index) native "CSSRuleList_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName CSSValueList
+class _CSSValueList extends CSSValue implements List<CSSValue> {
+  _CSSValueList.internal(): super.internal();
+
+
+  /** @domName CSSValueList.length */
+  int get length native "CSSValueList_length_Getter";
+
+  CSSValue operator[](int index) native "CSSValueList_item_Callback";
+
+  void operator[]=(int index, CSSValue value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<CSSValue> mixins.
+  // CSSValue is the element type.
+
+  // From Iterable<CSSValue>:
+
+  Iterator<CSSValue> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<CSSValue>(this);
+  }
+
+  // From Collection<CSSValue>:
+
+  void add(CSSValue value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(CSSValue value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<CSSValue> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(CSSValue element) => _Collections.contains(this, element);
+
+  void forEach(void f(CSSValue element)) => _Collections.forEach(this, f);
+
+  Collection map(f(CSSValue element)) => _Collections.map(this, [], f);
+
+  Collection<CSSValue> filter(bool f(CSSValue element)) =>
+     _Collections.filter(this, <CSSValue>[], f);
+
+  bool every(bool f(CSSValue element)) => _Collections.every(this, f);
+
+  bool some(bool f(CSSValue element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<CSSValue>:
+
+  void sort([Comparator<CSSValue> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(CSSValue element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(CSSValue element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  CSSValue get last => this[length - 1];
+
+  CSSValue removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<CSSValue> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [CSSValue initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<CSSValue> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <CSSValue>[]);
+
+  // -- end List<CSSValue> mixins.
+
+
+  /** @domName CSSValueList.item */
+  CSSValue item(int index) native "CSSValueList_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName ClientRectList
+class _ClientRectList extends NativeFieldWrapperClass1 implements List<ClientRect> {
+  _ClientRectList.internal();
+
+
+  /** @domName ClientRectList.length */
+  int get length native "ClientRectList_length_Getter";
+
+  ClientRect operator[](int index) native "ClientRectList_item_Callback";
+
+  void operator[]=(int index, ClientRect value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<ClientRect> mixins.
+  // ClientRect is the element type.
+
+  // From Iterable<ClientRect>:
+
+  Iterator<ClientRect> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<ClientRect>(this);
+  }
+
+  // From Collection<ClientRect>:
+
+  void add(ClientRect value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(ClientRect value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<ClientRect> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(ClientRect element) => _Collections.contains(this, element);
+
+  void forEach(void f(ClientRect element)) => _Collections.forEach(this, f);
+
+  Collection map(f(ClientRect element)) => _Collections.map(this, [], f);
+
+  Collection<ClientRect> filter(bool f(ClientRect element)) =>
+     _Collections.filter(this, <ClientRect>[], f);
+
+  bool every(bool f(ClientRect element)) => _Collections.every(this, f);
+
+  bool some(bool f(ClientRect element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<ClientRect>:
+
+  void sort([Comparator<ClientRect> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(ClientRect element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(ClientRect element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  ClientRect get last => this[length - 1];
+
+  ClientRect removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<ClientRect> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [ClientRect initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<ClientRect> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <ClientRect>[]);
+
+  // -- end List<ClientRect> mixins.
+
+
+  /** @domName ClientRectList.item */
+  ClientRect item(int index) native "ClientRectList_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _DOMParserFactoryProvider {
+  static DOMParser createDOMParser() native "DOMParser_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName DOMStringList
+class _DOMStringList extends NativeFieldWrapperClass1 implements List<String> {
+  _DOMStringList.internal();
+
+
+  /** @domName DOMStringList.length */
+  int get length native "DOMStringList_length_Getter";
+
+  String operator[](int index) native "DOMStringList_item_Callback";
+
+  void operator[]=(int index, String value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<String> mixins.
+  // String is the element type.
+
+  // From Iterable<String>:
+
+  Iterator<String> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<String>(this);
+  }
+
+  // From Collection<String>:
+
+  void add(String value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(String value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<String> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  // contains() defined by IDL.
+
+  void forEach(void f(String element)) => _Collections.forEach(this, f);
+
+  Collection map(f(String element)) => _Collections.map(this, [], f);
+
+  Collection<String> filter(bool f(String element)) =>
+     _Collections.filter(this, <String>[], f);
+
+  bool every(bool f(String element)) => _Collections.every(this, f);
+
+  bool some(bool f(String element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<String>:
+
+  void sort([Comparator<String> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(String element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(String element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  String get last => this[length - 1];
+
+  String removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [String initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<String> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <String>[]);
+
+  // -- end List<String> mixins.
+
+
+  /** @domName DOMStringList.contains */
+  bool contains(String string) native "DOMStringList_contains_Callback";
+
+
+  /** @domName DOMStringList.item */
+  String item(int index) native "DOMStringList_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _DataViewFactoryProvider {
+  static DataView createDataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) native "DataView_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName HTMLDocument
+class _Document_Merged extends Document {
+  _Document_Merged.internal(): super.internal();
+
+
+  /** @domName HTMLDocument.activeElement */
+  Element get activeElement native "HTMLDocument_activeElement_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName HTMLElement
+class _Element_Merged extends Element {
+  _Element_Merged.internal(): super.internal();
+
+
+  /** @domName HTMLElement.children */
+  HTMLCollection get $dom_children native "HTMLElement_children_Getter";
+
+
+  /** @domName HTMLElement.contentEditable */
+  String get contentEditable native "HTMLElement_contentEditable_Getter";
+
+
+  /** @domName HTMLElement.contentEditable */
+  void set contentEditable(String value) native "HTMLElement_contentEditable_Setter";
+
+
+  /** @domName HTMLElement.dir */
+  String get dir native "HTMLElement_dir_Getter";
+
+
+  /** @domName HTMLElement.dir */
+  void set dir(String value) native "HTMLElement_dir_Setter";
+
+
+  /** @domName HTMLElement.draggable */
+  bool get draggable native "HTMLElement_draggable_Getter";
+
+
+  /** @domName HTMLElement.draggable */
+  void set draggable(bool value) native "HTMLElement_draggable_Setter";
+
+
+  /** @domName HTMLElement.hidden */
+  bool get hidden native "HTMLElement_hidden_Getter";
+
+
+  /** @domName HTMLElement.hidden */
+  void set hidden(bool value) native "HTMLElement_hidden_Setter";
+
+
+  /** @domName HTMLElement.id */
+  String get id native "HTMLElement_id_Getter";
+
+
+  /** @domName HTMLElement.id */
+  void set id(String value) native "HTMLElement_id_Setter";
+
+
+  /** @domName HTMLElement.innerHTML */
+  String get innerHTML native "HTMLElement_innerHTML_Getter";
+
+
+  /** @domName HTMLElement.innerHTML */
+  void set innerHTML(String value) native "HTMLElement_innerHTML_Setter";
+
+
+  /** @domName HTMLElement.isContentEditable */
+  bool get isContentEditable native "HTMLElement_isContentEditable_Getter";
+
+
+  /** @domName HTMLElement.lang */
+  String get lang native "HTMLElement_lang_Getter";
+
+
+  /** @domName HTMLElement.lang */
+  void set lang(String value) native "HTMLElement_lang_Setter";
+
+
+  /** @domName HTMLElement.outerHTML */
+  String get outerHTML native "HTMLElement_outerHTML_Getter";
+
+
+  /** @domName HTMLElement.spellcheck */
+  bool get spellcheck native "HTMLElement_spellcheck_Getter";
+
+
+  /** @domName HTMLElement.spellcheck */
+  void set spellcheck(bool value) native "HTMLElement_spellcheck_Setter";
+
+
+  /** @domName HTMLElement.tabIndex */
+  int get tabIndex native "HTMLElement_tabIndex_Getter";
+
+
+  /** @domName HTMLElement.tabIndex */
+  void set tabIndex(int value) native "HTMLElement_tabIndex_Setter";
+
+
+  /** @domName HTMLElement.title */
+  String get title native "HTMLElement_title_Getter";
+
+
+  /** @domName HTMLElement.title */
+  void set title(String value) native "HTMLElement_title_Setter";
+
+
+  /** @domName HTMLElement.translate */
+  bool get translate native "HTMLElement_translate_Getter";
+
+
+  /** @domName HTMLElement.translate */
+  void set translate(bool value) native "HTMLElement_translate_Setter";
+
+
+  /** @domName HTMLElement.webkitdropzone */
+  String get webkitdropzone native "HTMLElement_webkitdropzone_Getter";
+
+
+  /** @domName HTMLElement.webkitdropzone */
+  void set webkitdropzone(String value) native "HTMLElement_webkitdropzone_Setter";
+
+
+  /** @domName HTMLElement.click */
+  void click() native "HTMLElement_click_Callback";
+
+
+  /** @domName HTMLElement.insertAdjacentElement */
+  Element insertAdjacentElement(String where, Element element) native "HTMLElement_insertAdjacentElement_Callback";
+
+
+  /** @domName HTMLElement.insertAdjacentHTML */
+  void insertAdjacentHTML(String where, String html) native "HTMLElement_insertAdjacentHTML_Callback";
+
+
+  /** @domName HTMLElement.insertAdjacentText */
+  void insertAdjacentText(String where, String text) native "HTMLElement_insertAdjacentText_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+class _Elements {
+
+
+  static AnchorElement createAnchorElement([String href]) {
+    AnchorElement _e = document.$dom_createElement("a");
+    if (href != null) _e.href = href;
+    return _e;
+  }
+
+  static AreaElement createAreaElement() {
+    AreaElement _e = document.$dom_createElement("area");
+    return _e;
+  }
+
+  static BRElement createBRElement() {
+    BRElement _e = document.$dom_createElement("br");
+    return _e;
+  }
+
+  static BaseElement createBaseElement() {
+    BaseElement _e = document.$dom_createElement("base");
+    return _e;
+  }
+
+  static BodyElement createBodyElement() {
+    BodyElement _e = document.$dom_createElement("body");
+    return _e;
+  }
+
+  static ButtonElement createButtonElement() {
+    ButtonElement _e = document.$dom_createElement("button");
+    return _e;
+  }
+
+  static CanvasElement createCanvasElement([int width, int height]) {
+    CanvasElement _e = document.$dom_createElement("canvas");
+    if (width != null) _e.width = width;
+    if (height != null) _e.height = height;
+    return _e;
+  }
+
+  static ContentElement createContentElement() {
+    ContentElement _e = document.$dom_createElement("content");
+    return _e;
+  }
+
+  static DListElement createDListElement() {
+    DListElement _e = document.$dom_createElement("dl");
+    return _e;
+  }
+
+  static DataListElement createDataListElement() {
+    DataListElement _e = document.$dom_createElement("datalist");
+    return _e;
+  }
+
+  static DetailsElement createDetailsElement() {
+    DetailsElement _e = document.$dom_createElement("details");
+    return _e;
+  }
+
+  static DivElement createDivElement() {
+    DivElement _e = document.$dom_createElement("div");
+    return _e;
+  }
+
+  static EmbedElement createEmbedElement() {
+    EmbedElement _e = document.$dom_createElement("embed");
+    return _e;
+  }
+
+  static FieldSetElement createFieldSetElement() {
+    FieldSetElement _e = document.$dom_createElement("fieldset");
+    return _e;
+  }
+
+  static FormElement createFormElement() {
+    FormElement _e = document.$dom_createElement("form");
+    return _e;
+  }
+
+  static HRElement createHRElement() {
+    HRElement _e = document.$dom_createElement("hr");
+    return _e;
+  }
+
+  static HeadElement createHeadElement() {
+    HeadElement _e = document.$dom_createElement("head");
+    return _e;
+  }
+
+  static HeadingElement createHeadingElement_h1() {
+    HeadingElement _e = document.$dom_createElement("h1");
+    return _e;
+  }
+
+  static HeadingElement createHeadingElement_h2() {
+    HeadingElement _e = document.$dom_createElement("h2");
+    return _e;
+  }
+
+  static HeadingElement createHeadingElement_h3() {
+    HeadingElement _e = document.$dom_createElement("h3");
+    return _e;
+  }
+
+  static HeadingElement createHeadingElement_h4() {
+    HeadingElement _e = document.$dom_createElement("h4");
+    return _e;
+  }
+
+  static HeadingElement createHeadingElement_h5() {
+    HeadingElement _e = document.$dom_createElement("h5");
+    return _e;
+  }
+
+  static HeadingElement createHeadingElement_h6() {
+    HeadingElement _e = document.$dom_createElement("h6");
+    return _e;
+  }
+
+  static HtmlElement createHtmlElement() {
+    HtmlElement _e = document.$dom_createElement("html");
+    return _e;
+  }
+
+  static IFrameElement createIFrameElement() {
+    IFrameElement _e = document.$dom_createElement("iframe");
+    return _e;
+  }
+
+  static ImageElement createImageElement([String src, int width, int height]) {
+    ImageElement _e = document.$dom_createElement("img");
+    if (src != null) _e.src = src;
+    if (width != null) _e.width = width;
+    if (height != null) _e.height = height;
+    return _e;
+  }
+
+  static InputElement createInputElement([String type]) {
+    InputElement _e = document.$dom_createElement("input");
+    if (type != null) _e.type = type;
+    return _e;
+  }
+
+  static KeygenElement createKeygenElement() {
+    KeygenElement _e = document.$dom_createElement("keygen");
+    return _e;
+  }
+
+  static LIElement createLIElement() {
+    LIElement _e = document.$dom_createElement("li");
+    return _e;
+  }
+
+  static LabelElement createLabelElement() {
+    LabelElement _e = document.$dom_createElement("label");
+    return _e;
+  }
+
+  static LegendElement createLegendElement() {
+    LegendElement _e = document.$dom_createElement("legend");
+    return _e;
+  }
+
+  static LinkElement createLinkElement() {
+    LinkElement _e = document.$dom_createElement("link");
+    return _e;
+  }
+
+  static MapElement createMapElement() {
+    MapElement _e = document.$dom_createElement("map");
+    return _e;
+  }
+
+  static MenuElement createMenuElement() {
+    MenuElement _e = document.$dom_createElement("menu");
+    return _e;
+  }
+
+  static MeterElement createMeterElement() {
+    MeterElement _e = document.$dom_createElement("meter");
+    return _e;
+  }
+
+  static OListElement createOListElement() {
+    OListElement _e = document.$dom_createElement("ol");
+    return _e;
+  }
+
+  static ObjectElement createObjectElement() {
+    ObjectElement _e = document.$dom_createElement("object");
+    return _e;
+  }
+
+  static OptGroupElement createOptGroupElement() {
+    OptGroupElement _e = document.$dom_createElement("optgroup");
+    return _e;
+  }
+
+  static OutputElement createOutputElement() {
+    OutputElement _e = document.$dom_createElement("output");
+    return _e;
+  }
+
+  static ParagraphElement createParagraphElement() {
+    ParagraphElement _e = document.$dom_createElement("p");
+    return _e;
+  }
+
+  static ParamElement createParamElement() {
+    ParamElement _e = document.$dom_createElement("param");
+    return _e;
+  }
+
+  static PreElement createPreElement() {
+    PreElement _e = document.$dom_createElement("pre");
+    return _e;
+  }
+
+  static ProgressElement createProgressElement() {
+    ProgressElement _e = document.$dom_createElement("progress");
+    return _e;
+  }
+
+  static ScriptElement createScriptElement() {
+    ScriptElement _e = document.$dom_createElement("script");
+    return _e;
+  }
+
+  static SelectElement createSelectElement() {
+    SelectElement _e = document.$dom_createElement("select");
+    return _e;
+  }
+
+  static SourceElement createSourceElement() {
+    SourceElement _e = document.$dom_createElement("source");
+    return _e;
+  }
+
+  static SpanElement createSpanElement() {
+    SpanElement _e = document.$dom_createElement("span");
+    return _e;
+  }
+
+  static StyleElement createStyleElement() {
+    StyleElement _e = document.$dom_createElement("style");
+    return _e;
+  }
+
+  static TableCaptionElement createTableCaptionElement() {
+    TableCaptionElement _e = document.$dom_createElement("caption");
+    return _e;
+  }
+
+  static TableCellElement createTableCellElement() {
+    TableCellElement _e = document.$dom_createElement("td");
+    return _e;
+  }
+
+  static TableColElement createTableColElement() {
+    TableColElement _e = document.$dom_createElement("col");
+    return _e;
+  }
+
+  static TableElement createTableElement() {
+    TableElement _e = document.$dom_createElement("table");
+    return _e;
+  }
+
+  static TableRowElement createTableRowElement() {
+    TableRowElement _e = document.$dom_createElement("tr");
+    return _e;
+  }
+
+  static TextAreaElement createTextAreaElement() {
+    TextAreaElement _e = document.$dom_createElement("textarea");
+    return _e;
+  }
+
+  static TitleElement createTitleElement() {
+    TitleElement _e = document.$dom_createElement("title");
+    return _e;
+  }
+
+  static TrackElement createTrackElement() {
+    TrackElement _e = document.$dom_createElement("track");
+    return _e;
+  }
+
+  static UListElement createUListElement() {
+    UListElement _e = document.$dom_createElement("ul");
+    return _e;
+  }
+
+  static VideoElement createVideoElement() {
+    VideoElement _e = document.$dom_createElement("video");
+    return _e;
+  }
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName EntryArray
+class _EntryArray extends NativeFieldWrapperClass1 implements List<Entry> {
+  _EntryArray.internal();
+
+
+  /** @domName EntryArray.length */
+  int get length native "EntryArray_length_Getter";
+
+  Entry operator[](int index) native "EntryArray_item_Callback";
+
+  void operator[]=(int index, Entry value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<Entry> mixins.
+  // Entry is the element type.
+
+  // From Iterable<Entry>:
+
+  Iterator<Entry> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<Entry>(this);
+  }
+
+  // From Collection<Entry>:
+
+  void add(Entry value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(Entry value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<Entry> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(Entry element) => _Collections.contains(this, element);
+
+  void forEach(void f(Entry element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Entry element)) => _Collections.map(this, [], f);
+
+  Collection<Entry> filter(bool f(Entry element)) =>
+     _Collections.filter(this, <Entry>[], f);
+
+  bool every(bool f(Entry element)) => _Collections.every(this, f);
+
+  bool some(bool f(Entry element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Entry>:
+
+  void sort([Comparator<Entry> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Entry element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Entry element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  Entry get last => this[length - 1];
+
+  Entry removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<Entry> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [Entry initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<Entry> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Entry>[]);
+
+  // -- end List<Entry> mixins.
+
+
+  /** @domName EntryArray.item */
+  Entry item(int index) native "EntryArray_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName EntryArraySync
+class _EntryArraySync extends NativeFieldWrapperClass1 implements List<EntrySync> {
+  _EntryArraySync.internal();
+
+
+  /** @domName EntryArraySync.length */
+  int get length native "EntryArraySync_length_Getter";
+
+  EntrySync operator[](int index) native "EntryArraySync_item_Callback";
+
+  void operator[]=(int index, EntrySync value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<EntrySync> mixins.
+  // EntrySync is the element type.
+
+  // From Iterable<EntrySync>:
+
+  Iterator<EntrySync> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<EntrySync>(this);
+  }
+
+  // From Collection<EntrySync>:
+
+  void add(EntrySync value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(EntrySync value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<EntrySync> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(EntrySync element) => _Collections.contains(this, element);
+
+  void forEach(void f(EntrySync element)) => _Collections.forEach(this, f);
+
+  Collection map(f(EntrySync element)) => _Collections.map(this, [], f);
+
+  Collection<EntrySync> filter(bool f(EntrySync element)) =>
+     _Collections.filter(this, <EntrySync>[], f);
+
+  bool every(bool f(EntrySync element)) => _Collections.every(this, f);
+
+  bool some(bool f(EntrySync element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<EntrySync>:
+
+  void sort([Comparator<EntrySync> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(EntrySync element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(EntrySync element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  EntrySync get last => this[length - 1];
+
+  EntrySync removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<EntrySync> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [EntrySync initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<EntrySync> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <EntrySync>[]);
+
+  // -- end List<EntrySync> mixins.
+
+
+  /** @domName EntryArraySync.item */
+  EntrySync item(int index) native "EntryArraySync_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _EventSourceFactoryProvider {
+  static EventSource createEventSource(String scriptUrl) native "EventSource_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName FileList
+class _FileList extends NativeFieldWrapperClass1 implements List<File> {
+  _FileList.internal();
+
+
+  /** @domName FileList.length */
+  int get length native "FileList_length_Getter";
+
+  File operator[](int index) native "FileList_item_Callback";
+
+  void operator[]=(int index, File value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<File> mixins.
+  // File is the element type.
+
+  // From Iterable<File>:
+
+  Iterator<File> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<File>(this);
+  }
+
+  // From Collection<File>:
+
+  void add(File value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(File value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<File> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(File element) => _Collections.contains(this, element);
+
+  void forEach(void f(File element)) => _Collections.forEach(this, f);
+
+  Collection map(f(File element)) => _Collections.map(this, [], f);
+
+  Collection<File> filter(bool f(File element)) =>
+     _Collections.filter(this, <File>[], f);
+
+  bool every(bool f(File element)) => _Collections.every(this, f);
+
+  bool some(bool f(File element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<File>:
+
+  void sort([Comparator<File> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(File element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(File element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  File get last => this[length - 1];
+
+  File removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<File> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [File initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<File> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <File>[]);
+
+  // -- end List<File> mixins.
+
+
+  /** @domName FileList.item */
+  File item(int index) native "FileList_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _FileReaderFactoryProvider {
+  static FileReader createFileReader() native "FileReader_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _FileReaderSyncFactoryProvider {
+  static FileReaderSync createFileReaderSync() native "FileReaderSync_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _FormDataFactoryProvider {
+  static FormData createFormData([FormElement form]) native "DOMFormData_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName GamepadList
+class _GamepadList extends NativeFieldWrapperClass1 implements List<Gamepad> {
+  _GamepadList.internal();
+
+
+  /** @domName GamepadList.length */
+  int get length native "GamepadList_length_Getter";
+
+  Gamepad operator[](int index) native "GamepadList_item_Callback";
+
+  void operator[]=(int index, Gamepad value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<Gamepad> mixins.
+  // Gamepad is the element type.
+
+  // From Iterable<Gamepad>:
+
+  Iterator<Gamepad> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<Gamepad>(this);
+  }
+
+  // From Collection<Gamepad>:
+
+  void add(Gamepad value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(Gamepad value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<Gamepad> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(Gamepad element) => _Collections.contains(this, element);
+
+  void forEach(void f(Gamepad element)) => _Collections.forEach(this, f);
+
+  Collection map(f(Gamepad element)) => _Collections.map(this, [], f);
+
+  Collection<Gamepad> filter(bool f(Gamepad element)) =>
+     _Collections.filter(this, <Gamepad>[], f);
+
+  bool every(bool f(Gamepad element)) => _Collections.every(this, f);
+
+  bool some(bool f(Gamepad element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<Gamepad>:
+
+  void sort([Comparator<Gamepad> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(Gamepad element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(Gamepad element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  Gamepad get last => this[length - 1];
+
+  Gamepad removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<Gamepad> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [Gamepad initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<Gamepad> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <Gamepad>[]);
+
+  // -- end List<Gamepad> mixins.
+
+
+  /** @domName GamepadList.item */
+  Gamepad item(int index) native "GamepadList_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _HttpRequestFactoryProvider {
+  static HttpRequest createHttpRequest() => _createHttpRequest();
+  static HttpRequest _createHttpRequest() native "XMLHttpRequest_constructor_Callback";
+
+  static HttpRequest createHttpRequest_get(String url,
+                                     onSuccess(HttpRequest request)) =>
+      _HttpRequestUtils.get(url, onSuccess, false);
+
+  static HttpRequest createHttpRequest_getWithCredentials(String url,
+                                     onSuccess(HttpRequest request)) =>
+      _HttpRequestUtils.get(url, onSuccess, true);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _IceCandidateFactoryProvider {
+  static IceCandidate createIceCandidate(String label, String candidateLine) native "IceCandidate_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _MediaControllerFactoryProvider {
+  static MediaController createMediaController() native "MediaController_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _MediaSourceFactoryProvider {
+  static MediaSource createMediaSource() native "MediaSource_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _MediaStreamFactoryProvider {
+  static MediaStream createMediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) native "MediaStream_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName MediaStreamList
+class _MediaStreamList extends NativeFieldWrapperClass1 implements List<MediaStream> {
+  _MediaStreamList.internal();
+
+
+  /** @domName MediaStreamList.length */
+  int get length native "MediaStreamList_length_Getter";
+
+  MediaStream operator[](int index) native "MediaStreamList_item_Callback";
+
+  void operator[]=(int index, MediaStream value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<MediaStream> mixins.
+  // MediaStream is the element type.
+
+  // From Iterable<MediaStream>:
+
+  Iterator<MediaStream> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<MediaStream>(this);
+  }
+
+  // From Collection<MediaStream>:
+
+  void add(MediaStream value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(MediaStream value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<MediaStream> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(MediaStream element) => _Collections.contains(this, element);
+
+  void forEach(void f(MediaStream element)) => _Collections.forEach(this, f);
+
+  Collection map(f(MediaStream element)) => _Collections.map(this, [], f);
+
+  Collection<MediaStream> filter(bool f(MediaStream element)) =>
+     _Collections.filter(this, <MediaStream>[], f);
+
+  bool every(bool f(MediaStream element)) => _Collections.every(this, f);
+
+  bool some(bool f(MediaStream element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<MediaStream>:
+
+  void sort([Comparator<MediaStream> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(MediaStream element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(MediaStream element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  MediaStream get last => this[length - 1];
+
+  MediaStream removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<MediaStream> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [MediaStream initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<MediaStream> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <MediaStream>[]);
+
+  // -- end List<MediaStream> mixins.
+
+
+  /** @domName MediaStreamList.item */
+  MediaStream item(int index) native "MediaStreamList_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _MessageChannelFactoryProvider {
+  static MessageChannel createMessageChannel() native "MessageChannel_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _MutationObserverFactoryProvider {
+  static MutationObserver createMutationObserver(MutationCallback callback) native "MutationObserver_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _NotificationFactoryProvider {
+  static Notification createNotification(String title, [Map options]) native "Notification_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _OptionElementFactoryProvider {
+  static OptionElement createOptionElement([String data, String value, bool defaultSelected, bool selected]) native "HTMLOptionElement_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _PeerConnection00FactoryProvider {
+  static PeerConnection00 createPeerConnection00(String serverConfiguration, IceCallback iceCallback) native "PeerConnection00_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _RTCIceCandidateFactoryProvider {
+  static RTCIceCandidate createRTCIceCandidate(Map dictionary) native "RTCIceCandidate_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _RTCPeerConnectionFactoryProvider {
+  static RTCPeerConnection createRTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) native "RTCPeerConnection_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _RTCSessionDescriptionFactoryProvider {
+  static RTCSessionDescription createRTCSessionDescription(Map dictionary) native "RTCSessionDescription_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName SVGElementInstanceList
+class _SVGElementInstanceList extends NativeFieldWrapperClass1 implements List<SVGElementInstance> {
+  _SVGElementInstanceList.internal();
+
+
+  /** @domName SVGElementInstanceList.length */
+  int get length native "SVGElementInstanceList_length_Getter";
+
+  SVGElementInstance operator[](int index) native "SVGElementInstanceList_item_Callback";
+
+  void operator[]=(int index, SVGElementInstance value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SVGElementInstance> mixins.
+  // SVGElementInstance is the element type.
+
+  // From Iterable<SVGElementInstance>:
+
+  Iterator<SVGElementInstance> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SVGElementInstance>(this);
+  }
+
+  // From Collection<SVGElementInstance>:
+
+  void add(SVGElementInstance value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SVGElementInstance value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SVGElementInstance> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SVGElementInstance element) => _Collections.contains(this, element);
+
+  void forEach(void f(SVGElementInstance element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SVGElementInstance element)) => _Collections.map(this, [], f);
+
+  Collection<SVGElementInstance> filter(bool f(SVGElementInstance element)) =>
+     _Collections.filter(this, <SVGElementInstance>[], f);
+
+  bool every(bool f(SVGElementInstance element)) => _Collections.every(this, f);
+
+  bool some(bool f(SVGElementInstance element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SVGElementInstance>:
+
+  void sort([Comparator<SVGElementInstance> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SVGElementInstance element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SVGElementInstance element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SVGElementInstance get last => this[length - 1];
+
+  SVGElementInstance removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SVGElementInstance> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SVGElementInstance initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SVGElementInstance> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SVGElementInstance>[]);
+
+  // -- end List<SVGElementInstance> mixins.
+
+
+  /** @domName SVGElementInstanceList.item */
+  SVGElementInstance item(int index) native "SVGElementInstanceList_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _SessionDescriptionFactoryProvider {
+  static SessionDescription createSessionDescription(String sdp) native "SessionDescription_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _ShadowRootFactoryProvider {
+  static ShadowRoot createShadowRoot(Element host) native "ShadowRoot_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _SharedWorkerFactoryProvider {
+  static SharedWorker createSharedWorker(String scriptURL, [String name]) native "SharedWorker_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _SpeechGrammarFactoryProvider {
+  static SpeechGrammar createSpeechGrammar() native "SpeechGrammar_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _SpeechGrammarListFactoryProvider {
+  static SpeechGrammarList createSpeechGrammarList() native "SpeechGrammarList_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName SpeechInputResultList
+class _SpeechInputResultList extends NativeFieldWrapperClass1 implements List<SpeechInputResult> {
+  _SpeechInputResultList.internal();
+
+
+  /** @domName SpeechInputResultList.length */
+  int get length native "SpeechInputResultList_length_Getter";
+
+  SpeechInputResult operator[](int index) native "SpeechInputResultList_item_Callback";
+
+  void operator[]=(int index, SpeechInputResult value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SpeechInputResult> mixins.
+  // SpeechInputResult is the element type.
+
+  // From Iterable<SpeechInputResult>:
+
+  Iterator<SpeechInputResult> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SpeechInputResult>(this);
+  }
+
+  // From Collection<SpeechInputResult>:
+
+  void add(SpeechInputResult value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SpeechInputResult value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SpeechInputResult> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SpeechInputResult element) => _Collections.contains(this, element);
+
+  void forEach(void f(SpeechInputResult element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SpeechInputResult element)) => _Collections.map(this, [], f);
+
+  Collection<SpeechInputResult> filter(bool f(SpeechInputResult element)) =>
+     _Collections.filter(this, <SpeechInputResult>[], f);
+
+  bool every(bool f(SpeechInputResult element)) => _Collections.every(this, f);
+
+  bool some(bool f(SpeechInputResult element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SpeechInputResult>:
+
+  void sort([Comparator<SpeechInputResult> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SpeechInputResult element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SpeechInputResult element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SpeechInputResult get last => this[length - 1];
+
+  SpeechInputResult removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SpeechInputResult> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SpeechInputResult initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SpeechInputResult> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SpeechInputResult>[]);
+
+  // -- end List<SpeechInputResult> mixins.
+
+
+  /** @domName SpeechInputResultList.item */
+  SpeechInputResult item(int index) native "SpeechInputResultList_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _SpeechRecognitionFactoryProvider {
+  static SpeechRecognition createSpeechRecognition() native "SpeechRecognition_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName SpeechRecognitionResultList
+class _SpeechRecognitionResultList extends NativeFieldWrapperClass1 implements List<SpeechRecognitionResult> {
+  _SpeechRecognitionResultList.internal();
+
+
+  /** @domName SpeechRecognitionResultList.length */
+  int get length native "SpeechRecognitionResultList_length_Getter";
+
+  SpeechRecognitionResult operator[](int index) native "SpeechRecognitionResultList_item_Callback";
+
+  void operator[]=(int index, SpeechRecognitionResult value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<SpeechRecognitionResult> mixins.
+  // SpeechRecognitionResult is the element type.
+
+  // From Iterable<SpeechRecognitionResult>:
+
+  Iterator<SpeechRecognitionResult> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<SpeechRecognitionResult>(this);
+  }
+
+  // From Collection<SpeechRecognitionResult>:
+
+  void add(SpeechRecognitionResult value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(SpeechRecognitionResult value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<SpeechRecognitionResult> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(SpeechRecognitionResult element) => _Collections.contains(this, element);
+
+  void forEach(void f(SpeechRecognitionResult element)) => _Collections.forEach(this, f);
+
+  Collection map(f(SpeechRecognitionResult element)) => _Collections.map(this, [], f);
+
+  Collection<SpeechRecognitionResult> filter(bool f(SpeechRecognitionResult element)) =>
+     _Collections.filter(this, <SpeechRecognitionResult>[], f);
+
+  bool every(bool f(SpeechRecognitionResult element)) => _Collections.every(this, f);
+
+  bool some(bool f(SpeechRecognitionResult element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<SpeechRecognitionResult>:
+
+  void sort([Comparator<SpeechRecognitionResult> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(SpeechRecognitionResult element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(SpeechRecognitionResult element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  SpeechRecognitionResult get last => this[length - 1];
+
+  SpeechRecognitionResult removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<SpeechRecognitionResult> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [SpeechRecognitionResult initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<SpeechRecognitionResult> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <SpeechRecognitionResult>[]);
+
+  // -- end List<SpeechRecognitionResult> mixins.
+
+
+  /** @domName SpeechRecognitionResultList.item */
+  SpeechRecognitionResult item(int index) native "SpeechRecognitionResultList_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName StyleSheetList
+class _StyleSheetList extends NativeFieldWrapperClass1 implements List<StyleSheet> {
+  _StyleSheetList.internal();
+
+
+  /** @domName StyleSheetList.length */
+  int get length native "StyleSheetList_length_Getter";
+
+  StyleSheet operator[](int index) native "StyleSheetList_item_Callback";
+
+  void operator[]=(int index, StyleSheet value) {
+    throw new UnsupportedError("Cannot assign element of immutable List.");
+  }
+  // -- start List<StyleSheet> mixins.
+  // StyleSheet is the element type.
+
+  // From Iterable<StyleSheet>:
+
+  Iterator<StyleSheet> iterator() {
+    // Note: NodeLists are not fixed size. And most probably length shouldn't
+    // be cached in both iterator _and_ forEach method. For now caching it
+    // for consistency.
+    return new _FixedSizeListIterator<StyleSheet>(this);
+  }
+
+  // From Collection<StyleSheet>:
+
+  void add(StyleSheet value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addLast(StyleSheet value) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  void addAll(Collection<StyleSheet> collection) {
+    throw new UnsupportedError("Cannot add to immutable List.");
+  }
+
+  bool contains(StyleSheet element) => _Collections.contains(this, element);
+
+  void forEach(void f(StyleSheet element)) => _Collections.forEach(this, f);
+
+  Collection map(f(StyleSheet element)) => _Collections.map(this, [], f);
+
+  Collection<StyleSheet> filter(bool f(StyleSheet element)) =>
+     _Collections.filter(this, <StyleSheet>[], f);
+
+  bool every(bool f(StyleSheet element)) => _Collections.every(this, f);
+
+  bool some(bool f(StyleSheet element)) => _Collections.some(this, f);
+
+  bool get isEmpty => this.length == 0;
+
+  // From List<StyleSheet>:
+
+  void sort([Comparator<StyleSheet> compare = Comparable.compare]) {
+    throw new UnsupportedError("Cannot sort immutable List.");
+  }
+
+  int indexOf(StyleSheet element, [int start = 0]) =>
+      _Lists.indexOf(this, element, start, this.length);
+
+  int lastIndexOf(StyleSheet element, [int start]) {
+    if (start == null) start = length - 1;
+    return _Lists.lastIndexOf(this, element, start);
+  }
+
+  StyleSheet get last => this[length - 1];
+
+  StyleSheet removeLast() {
+    throw new UnsupportedError("Cannot removeLast on immutable List.");
+  }
+
+  void setRange(int start, int rangeLength, List<StyleSheet> from, [int startFrom]) {
+    throw new UnsupportedError("Cannot setRange on immutable List.");
+  }
+
+  void removeRange(int start, int rangeLength) {
+    throw new UnsupportedError("Cannot removeRange on immutable List.");
+  }
+
+  void insertRange(int start, int rangeLength, [StyleSheet initialValue]) {
+    throw new UnsupportedError("Cannot insertRange on immutable List.");
+  }
+
+  List<StyleSheet> getRange(int start, int rangeLength) =>
+      _Lists.getRange(this, start, rangeLength, <StyleSheet>[]);
+
+  // -- end List<StyleSheet> mixins.
+
+
+  /** @domName StyleSheetList.item */
+  StyleSheet item(int index) native "StyleSheetList_item_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class _TextTrackCueFactoryProvider {
+  static TextTrackCue createTextTrackCue(num startTime, num endTime, String text) native "TextTrackCue_constructor_Callback";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+/// @domName WebKitAnimationList
+class _WebKitAnimationList extends NativeFieldWrapperClass1 implements List<Animation> {
+  _WebKitAnimationList.internal();
+
+
+  /** @domName WebKitAnimationList.length */
   int get length native "WebKitAnimationList_length_Getter";
 
   Animation operator[](int index) native "WebKitAnimationList_item_Callback";
@@ -41059,6 +36079,8 @@
 
   // -- end List<Animation> mixins.
 
+
+  /** @domName WebKitAnimationList.item */
   Animation item(int index) native "WebKitAnimationList_item_Callback";
 
 }
@@ -41066,1427 +36088,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
-/// @domName WebKitCSSFilterValue
-abstract class WebKitCSSFilterValue implements List<CSSValue> {
-
-  static const int CSS_FILTER_BLUR = 10;
-
-  static const int CSS_FILTER_BRIGHTNESS = 8;
-
-  static const int CSS_FILTER_CONTRAST = 9;
-
-  static const int CSS_FILTER_CUSTOM = 12;
-
-  static const int CSS_FILTER_DROP_SHADOW = 11;
-
-  static const int CSS_FILTER_GRAYSCALE = 2;
-
-  static const int CSS_FILTER_HUE_ROTATE = 5;
-
-  static const int CSS_FILTER_INVERT = 6;
-
-  static const int CSS_FILTER_OPACITY = 7;
-
-  static const int CSS_FILTER_REFERENCE = 1;
-
-  static const int CSS_FILTER_SATURATE = 4;
-
-  static const int CSS_FILTER_SEPIA = 3;
-
-  /** @domName WebKitCSSFilterValue.operationType */
-  int get operationType;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebKitCSSFilterValueImpl extends _CSSValueListImpl implements WebKitCSSFilterValue {
-
-  int get operationType native "WebKitCSSFilterValue_operationType_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WebKitNamedFlow
-abstract class WebKitNamedFlow implements EventTarget {
-
-  /** @domName WebKitNamedFlow.firstEmptyRegionIndex */
-  int get firstEmptyRegionIndex;
-
-  /** @domName WebKitNamedFlow.name */
-  String get name;
-
-  /** @domName WebKitNamedFlow.overset */
-  bool get overset;
-
-  /** @domName WebKitNamedFlow.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName WebKitNamedFlow.dispatchEvent */
-  bool $dom_dispatchEvent(Event event);
-
-  /** @domName WebKitNamedFlow.getContent */
-  List<Node> getContent();
-
-  /** @domName WebKitNamedFlow.getRegions */
-  List<Node> getRegions();
-
-  /** @domName WebKitNamedFlow.getRegionsByContent */
-  List<Node> getRegionsByContent(Node contentNode);
-
-  /** @domName WebKitNamedFlow.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebKitNamedFlowImpl extends _EventTargetImpl implements WebKitNamedFlow {
-
-  int get firstEmptyRegionIndex native "WebKitNamedFlow_firstEmptyRegionIndex_Getter";
-
-  String get name native "WebKitNamedFlow_name_Getter";
-
-  bool get overset native "WebKitNamedFlow_overset_Getter";
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_addEventListener_Callback";
-
-  bool $dom_dispatchEvent(Event event) native "WebKitNamedFlow_dispatchEvent_Callback";
-
-  List<Node> getContent() native "WebKitNamedFlow_getContent_Callback";
-
-  List<Node> getRegions() native "WebKitNamedFlow_getRegions_Callback";
-
-  List<Node> getRegionsByContent(Node contentNode) native "WebKitNamedFlow_getRegionsByContent_Callback";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_removeEventListener_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-/// @domName WebSocket
-abstract class WebSocket implements EventTarget {
-
-  factory WebSocket(String url) => _WebSocketFactoryProvider.createWebSocket(url);
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  WebSocketEvents get on;
-
-  static const int CLOSED = 3;
-
-  static const int CLOSING = 2;
-
-  static const int CONNECTING = 0;
-
-  static const int OPEN = 1;
-
-  /** @domName WebSocket.URL */
-  String get URL;
-
-  /** @domName WebSocket.binaryType */
-  String binaryType;
-
-  /** @domName WebSocket.bufferedAmount */
-  int get bufferedAmount;
-
-  /** @domName WebSocket.extensions */
-  String get extensions;
-
-  /** @domName WebSocket.protocol */
-  String get protocol;
-
-  /** @domName WebSocket.readyState */
-  int get readyState;
-
-  /** @domName WebSocket.url */
-  String get url;
-
-  /** @domName WebSocket.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName WebSocket.close */
-  void close([int code, String reason]);
-
-  /** @domName WebSocket.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName WebSocket.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName WebSocket.send */
-  void send(data);
-}
-
-abstract class WebSocketEvents implements Events {
-
-  EventListenerList get close;
-
-  EventListenerList get error;
-
-  EventListenerList get message;
-
-  EventListenerList get open;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WebSocketImpl extends _EventTargetImpl implements WebSocket {
-
-  _WebSocketEventsImpl get on =>
-    new _WebSocketEventsImpl(this);
-
-  String get URL native "WebSocket_URL_Getter";
-
-  String get binaryType native "WebSocket_binaryType_Getter";
-
-  void set binaryType(String value) native "WebSocket_binaryType_Setter";
-
-  int get bufferedAmount native "WebSocket_bufferedAmount_Getter";
-
-  String get extensions native "WebSocket_extensions_Getter";
-
-  String get protocol native "WebSocket_protocol_Getter";
-
-  int get readyState native "WebSocket_readyState_Getter";
-
-  String get url native "WebSocket_url_Getter";
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_addEventListener_Callback";
-
-  void close([/*unsigned short*/ code, /*DOMString*/ reason]) {
-    if (?reason) {
-      _close_1(code, reason);
-      return;
-    }
-    if (?code) {
-      _close_2(code);
-      return;
-    }
-    _close_3();
-  }
-
-  void _close_1(code, reason) native "WebSocket_close_1_Callback";
-
-  void _close_2(code) native "WebSocket_close_2_Callback";
-
-  void _close_3() native "WebSocket_close_3_Callback";
-
-  bool $dom_dispatchEvent(Event evt) native "WebSocket_dispatchEvent_Callback";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_removeEventListener_Callback";
-
-  void send(data) native "WebSocket_send_Callback";
-
-}
-
-class _WebSocketEventsImpl extends _EventsImpl implements WebSocketEvents {
-  _WebSocketEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get close => this['close'];
-
-  EventListenerList get error => this['error'];
-
-  EventListenerList get message => this['message'];
-
-  EventListenerList get open => this['open'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-/// @domName WheelEvent
-abstract class WheelEvent implements MouseEvent {
-
-  /** @domName WheelEvent.webkitDirectionInvertedFromDevice */
-  bool get webkitDirectionInvertedFromDevice;
-
-  /** @domName WheelEvent.wheelDeltaX */
-  int get $dom_wheelDeltaX;
-
-  /** @domName WheelEvent.wheelDeltaY */
-  int get $dom_wheelDeltaY;
-
-  /** @domName WheelEvent.initWebKitWheelEvent */
-  void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey);
-
-
-  /** @domName WheelEvent.deltaX */
-  abstract num get deltaX;
-
-  /** @domName WheelEvent.deltaY */
-  abstract num get deltaY;
-
-  /** @domName WheelEvent.deltaMode */
-  abstract int get deltaMode;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _WheelEventImpl extends _MouseEventImpl implements WheelEvent {
-
-  bool get webkitDirectionInvertedFromDevice native "WheelEvent_webkitDirectionInvertedFromDevice_Getter";
-
-  int get $dom_wheelDeltaX native "WheelEvent_wheelDeltaX_Getter";
-
-  int get $dom_wheelDeltaY native "WheelEvent_wheelDeltaY_Getter";
-
-  void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "WheelEvent_initWebKitWheelEvent_Callback";
-
-
-  num get deltaX => $dom_wheelDeltaX;
-  num get deltaY => $dom_wheelDeltaY;
-  int get deltaMode => 0;
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName Worker
-abstract class Worker implements AbstractWorker {
-
-  factory Worker(String scriptUrl) => _WorkerFactoryProvider.createWorker(scriptUrl);
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  WorkerEvents get on;
-
-  /** @domName Worker.postMessage */
-  void postMessage(/*SerializedScriptValue*/ message, [List messagePorts]);
-
-  /** @domName Worker.terminate */
-  void terminate();
-}
-
-abstract class WorkerEvents implements AbstractWorkerEvents {
-
-  EventListenerList get message;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WorkerContext
-abstract class WorkerContext implements EventTarget {
-
-  /**
-   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
-   */
-  WorkerContextEvents get on;
-
-  static const int PERSISTENT = 1;
-
-  static const int TEMPORARY = 0;
-
-  /** @domName WorkerContext.indexedDB */
-  IDBFactory get indexedDB;
-
-  /** @domName WorkerContext.location */
-  WorkerLocation get location;
-
-  /** @domName WorkerContext.navigator */
-  WorkerNavigator get navigator;
-
-  /** @domName WorkerContext.self */
-  WorkerContext get self;
-
-  /** @domName WorkerContext.webkitIndexedDB */
-  IDBFactory get webkitIndexedDB;
-
-  /** @domName WorkerContext.webkitNotifications */
-  NotificationCenter get webkitNotifications;
-
-  /** @domName WorkerContext.addEventListener */
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName WorkerContext.clearInterval */
-  void clearInterval(int handle);
-
-  /** @domName WorkerContext.clearTimeout */
-  void clearTimeout(int handle);
-
-  /** @domName WorkerContext.close */
-  void close();
-
-  /** @domName WorkerContext.dispatchEvent */
-  bool $dom_dispatchEvent(Event evt);
-
-  /** @domName WorkerContext.importScripts */
-  void importScripts();
-
-  /** @domName WorkerContext.openDatabase */
-  Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]);
-
-  /** @domName WorkerContext.openDatabaseSync */
-  DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]);
-
-  /** @domName WorkerContext.removeEventListener */
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]);
-
-  /** @domName WorkerContext.setInterval */
-  int setInterval(TimeoutHandler handler, int timeout);
-
-  /** @domName WorkerContext.setTimeout */
-  int setTimeout(TimeoutHandler handler, int timeout);
-
-  /** @domName WorkerContext.webkitRequestFileSystem */
-  void webkitRequestFileSystem(int type, int size, [FileSystemCallback successCallback, ErrorCallback errorCallback]);
-
-  /** @domName WorkerContext.webkitRequestFileSystemSync */
-  DOMFileSystemSync webkitRequestFileSystemSync(int type, int size);
-
-  /** @domName WorkerContext.webkitResolveLocalFileSystemSyncURL */
-  EntrySync webkitResolveLocalFileSystemSyncURL(String url);
-
-  /** @domName WorkerContext.webkitResolveLocalFileSystemURL */
-  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]);
-}
-
-abstract class WorkerContextEvents implements Events {
-
-  EventListenerList get error;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WorkerContextImpl extends _EventTargetImpl implements WorkerContext {
-
-  _WorkerContextEventsImpl get on =>
-    new _WorkerContextEventsImpl(this);
-
-  IDBFactory get indexedDB native "WorkerContext_indexedDB_Getter";
-
-  WorkerLocation get location native "WorkerContext_location_Getter";
-
-  WorkerNavigator get navigator native "WorkerContext_navigator_Getter";
-
-  WorkerContext get self native "WorkerContext_self_Getter";
-
-  IDBFactory get webkitIndexedDB native "WorkerContext_webkitIndexedDB_Getter";
-
-  NotificationCenter get webkitNotifications native "WorkerContext_webkitNotifications_Getter";
-
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_addEventListener_Callback";
-
-  void clearInterval(int handle) native "WorkerContext_clearInterval_Callback";
-
-  void clearTimeout(int handle) native "WorkerContext_clearTimeout_Callback";
-
-  void close() native "WorkerContext_close_Callback";
-
-  bool $dom_dispatchEvent(Event evt) native "WorkerContext_dispatchEvent_Callback";
-
-  void importScripts() native "WorkerContext_importScripts_Callback";
-
-  Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabase_Callback";
-
-  DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabaseSync_Callback";
-
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_removeEventListener_Callback";
-
-  int setInterval(TimeoutHandler handler, int timeout) native "WorkerContext_setInterval_Callback";
-
-  int setTimeout(TimeoutHandler handler, int timeout) native "WorkerContext_setTimeout_Callback";
-
-  void webkitRequestFileSystem(int type, int size, [FileSystemCallback successCallback, ErrorCallback errorCallback]) native "WorkerContext_webkitRequestFileSystem_Callback";
-
-  DOMFileSystemSync webkitRequestFileSystemSync(int type, int size) native "WorkerContext_webkitRequestFileSystemSync_Callback";
-
-  EntrySync webkitResolveLocalFileSystemSyncURL(String url) native "WorkerContext_webkitResolveLocalFileSystemSyncURL_Callback";
-
-  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native "WorkerContext_webkitResolveLocalFileSystemURL_Callback";
-
-}
-
-class _WorkerContextEventsImpl extends _EventsImpl implements WorkerContextEvents {
-  _WorkerContextEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get error => this['error'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WorkerImpl extends _AbstractWorkerImpl implements Worker {
-
-  _WorkerEventsImpl get on =>
-    new _WorkerEventsImpl(this);
-
-  void postMessage(/*SerializedScriptValue*/ message, [List messagePorts]) native "Worker_postMessage_Callback";
-
-  void terminate() native "Worker_terminate_Callback";
-
-}
-
-class _WorkerEventsImpl extends _AbstractWorkerEventsImpl implements WorkerEvents {
-  _WorkerEventsImpl(_ptr) : super(_ptr);
-
-  EventListenerList get message => this['message'];
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WorkerLocation
-abstract class WorkerLocation {
-
-  /** @domName WorkerLocation.hash */
-  String get hash;
-
-  /** @domName WorkerLocation.host */
-  String get host;
-
-  /** @domName WorkerLocation.hostname */
-  String get hostname;
-
-  /** @domName WorkerLocation.href */
-  String get href;
-
-  /** @domName WorkerLocation.pathname */
-  String get pathname;
-
-  /** @domName WorkerLocation.port */
-  String get port;
-
-  /** @domName WorkerLocation.protocol */
-  String get protocol;
-
-  /** @domName WorkerLocation.search */
-  String get search;
-
-  /** @domName WorkerLocation.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WorkerLocationImpl extends NativeFieldWrapperClass1 implements WorkerLocation {
-
-  String get hash native "WorkerLocation_hash_Getter";
-
-  String get host native "WorkerLocation_host_Getter";
-
-  String get hostname native "WorkerLocation_hostname_Getter";
-
-  String get href native "WorkerLocation_href_Getter";
-
-  String get pathname native "WorkerLocation_pathname_Getter";
-
-  String get port native "WorkerLocation_port_Getter";
-
-  String get protocol native "WorkerLocation_protocol_Getter";
-
-  String get search native "WorkerLocation_search_Getter";
-
-  String toString() native "WorkerLocation_toString_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName WorkerNavigator
-abstract class WorkerNavigator {
-
-  /** @domName WorkerNavigator.appName */
-  String get appName;
-
-  /** @domName WorkerNavigator.appVersion */
-  String get appVersion;
-
-  /** @domName WorkerNavigator.onLine */
-  bool get onLine;
-
-  /** @domName WorkerNavigator.platform */
-  String get platform;
-
-  /** @domName WorkerNavigator.userAgent */
-  String get userAgent;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _WorkerNavigatorImpl extends NativeFieldWrapperClass1 implements WorkerNavigator {
-
-  String get appName native "WorkerNavigator_appName_Getter";
-
-  String get appVersion native "WorkerNavigator_appVersion_Getter";
-
-  bool get onLine native "WorkerNavigator_onLine_Getter";
-
-  String get platform native "WorkerNavigator_platform_Getter";
-
-  String get userAgent native "WorkerNavigator_userAgent_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XMLSerializer
-abstract class XMLSerializer {
-
-  factory XMLSerializer() => _XMLSerializerFactoryProvider.createXMLSerializer();
-
-  /** @domName XMLSerializer.serializeToString */
-  String serializeToString(Node node);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _XMLSerializerImpl extends NativeFieldWrapperClass1 implements XMLSerializer {
-
-  String serializeToString(Node node) native "XMLSerializer_serializeToString_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XPathEvaluator
-abstract class XPathEvaluator {
-
-  factory XPathEvaluator() => _XPathEvaluatorFactoryProvider.createXPathEvaluator();
-
-  /** @domName XPathEvaluator.createExpression */
-  XPathExpression createExpression(String expression, XPathNSResolver resolver);
-
-  /** @domName XPathEvaluator.createNSResolver */
-  XPathNSResolver createNSResolver(Node nodeResolver);
-
-  /** @domName XPathEvaluator.evaluate */
-  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _XPathEvaluatorImpl extends NativeFieldWrapperClass1 implements XPathEvaluator {
-
-  XPathExpression createExpression(String expression, XPathNSResolver resolver) native "XPathEvaluator_createExpression_Callback";
-
-  XPathNSResolver createNSResolver(Node nodeResolver) native "XPathEvaluator_createNSResolver_Callback";
-
-  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) native "XPathEvaluator_evaluate_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XPathException
-abstract class XPathException {
-
-  static const int INVALID_EXPRESSION_ERR = 51;
-
-  static const int TYPE_ERR = 52;
-
-  /** @domName XPathException.code */
-  int get code;
-
-  /** @domName XPathException.message */
-  String get message;
-
-  /** @domName XPathException.name */
-  String get name;
-
-  /** @domName XPathException.toString */
-  String toString();
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _XPathExceptionImpl extends NativeFieldWrapperClass1 implements XPathException {
-
-  int get code native "XPathException_code_Getter";
-
-  String get message native "XPathException_message_Getter";
-
-  String get name native "XPathException_name_Getter";
-
-  String toString() native "XPathException_toString_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XPathExpression
-abstract class XPathExpression {
-
-  /** @domName XPathExpression.evaluate */
-  XPathResult evaluate(Node contextNode, int type, XPathResult inResult);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _XPathExpressionImpl extends NativeFieldWrapperClass1 implements XPathExpression {
-
-  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) native "XPathExpression_evaluate_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XPathNSResolver
-abstract class XPathNSResolver {
-
-  /** @domName XPathNSResolver.lookupNamespaceURI */
-  String lookupNamespaceURI(String prefix);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _XPathNSResolverImpl extends NativeFieldWrapperClass1 implements XPathNSResolver {
-
-  String lookupNamespaceURI(String prefix) native "XPathNSResolver_lookupNamespaceURI_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XPathResult
-abstract class XPathResult {
-
-  static const int ANY_TYPE = 0;
-
-  static const int ANY_UNORDERED_NODE_TYPE = 8;
-
-  static const int BOOLEAN_TYPE = 3;
-
-  static const int FIRST_ORDERED_NODE_TYPE = 9;
-
-  static const int NUMBER_TYPE = 1;
-
-  static const int ORDERED_NODE_ITERATOR_TYPE = 5;
-
-  static const int ORDERED_NODE_SNAPSHOT_TYPE = 7;
-
-  static const int STRING_TYPE = 2;
-
-  static const int UNORDERED_NODE_ITERATOR_TYPE = 4;
-
-  static const int UNORDERED_NODE_SNAPSHOT_TYPE = 6;
-
-  /** @domName XPathResult.booleanValue */
-  bool get booleanValue;
-
-  /** @domName XPathResult.invalidIteratorState */
-  bool get invalidIteratorState;
-
-  /** @domName XPathResult.numberValue */
-  num get numberValue;
-
-  /** @domName XPathResult.resultType */
-  int get resultType;
-
-  /** @domName XPathResult.singleNodeValue */
-  Node get singleNodeValue;
-
-  /** @domName XPathResult.snapshotLength */
-  int get snapshotLength;
-
-  /** @domName XPathResult.stringValue */
-  String get stringValue;
-
-  /** @domName XPathResult.iterateNext */
-  Node iterateNext();
-
-  /** @domName XPathResult.snapshotItem */
-  Node snapshotItem(int index);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _XPathResultImpl extends NativeFieldWrapperClass1 implements XPathResult {
-
-  bool get booleanValue native "XPathResult_booleanValue_Getter";
-
-  bool get invalidIteratorState native "XPathResult_invalidIteratorState_Getter";
-
-  num get numberValue native "XPathResult_numberValue_Getter";
-
-  int get resultType native "XPathResult_resultType_Getter";
-
-  Node get singleNodeValue native "XPathResult_singleNodeValue_Getter";
-
-  int get snapshotLength native "XPathResult_snapshotLength_Getter";
-
-  String get stringValue native "XPathResult_stringValue_Getter";
-
-  Node iterateNext() native "XPathResult_iterateNext_Callback";
-
-  Node snapshotItem(int index) native "XPathResult_snapshotItem_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-/// @domName XSLTProcessor
-abstract class XSLTProcessor {
-
-  factory XSLTProcessor() => _XSLTProcessorFactoryProvider.createXSLTProcessor();
-
-  /** @domName XSLTProcessor.clearParameters */
-  void clearParameters();
-
-  /** @domName XSLTProcessor.getParameter */
-  String getParameter(String namespaceURI, String localName);
-
-  /** @domName XSLTProcessor.importStylesheet */
-  void importStylesheet(Node stylesheet);
-
-  /** @domName XSLTProcessor.removeParameter */
-  void removeParameter(String namespaceURI, String localName);
-
-  /** @domName XSLTProcessor.reset */
-  void reset();
-
-  /** @domName XSLTProcessor.setParameter */
-  void setParameter(String namespaceURI, String localName, String value);
-
-  /** @domName XSLTProcessor.transformToDocument */
-  Document transformToDocument(Node source);
-
-  /** @domName XSLTProcessor.transformToFragment */
-  DocumentFragment transformToFragment(Node source, Document docVal);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-class _XSLTProcessorImpl extends NativeFieldWrapperClass1 implements XSLTProcessor {
-
-  void clearParameters() native "XSLTProcessor_clearParameters_Callback";
-
-  String getParameter(String namespaceURI, String localName) native "XSLTProcessor_getParameter_Callback";
-
-  void importStylesheet(Node stylesheet) native "XSLTProcessor_importStylesheet_Callback";
-
-  void removeParameter(String namespaceURI, String localName) native "XSLTProcessor_removeParameter_Callback";
-
-  void reset() native "XSLTProcessor_reset_Callback";
-
-  void setParameter(String namespaceURI, String localName, String value) native "XSLTProcessor_setParameter_Callback";
-
-  Document transformToDocument(Node source) native "XSLTProcessor_transformToDocument_Callback";
-
-  DocumentFragment transformToFragment(Node source, Document docVal) native "XSLTProcessor_transformToFragment_Callback";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _ArrayBufferFactoryProvider {
-  static ArrayBuffer createArrayBuffer(int length) native "ArrayBuffer_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _AudioElementFactoryProvider {
-  static AudioElement createAudioElement([String src]) native "HTMLAudioElement_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _BlobFactoryProvider {
-  static Blob createBlob(List blobParts, [String type, String endings]) native "Blob_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _CSSMatrixFactoryProvider {
-  static CSSMatrix createCSSMatrix([String cssValue]) native "WebKitCSSMatrix_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _DOMParserFactoryProvider {
-  static DOMParser createDOMParser() native "DOMParser_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _DOMURLFactoryProvider {
-  static DOMURL createDOMURL() native "DOMURL_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _DataViewFactoryProvider {
-  static DataView createDataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) native "DataView_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-class _Elements {
-
-
-  static AnchorElement createAnchorElement([String href]) {
-    _AnchorElementImpl _e = _document.$dom_createElement("a");
-    if (href != null) _e.href = href;
-    return _e;
-  }
-
-  static AreaElement createAreaElement() {
-    _AreaElementImpl _e = _document.$dom_createElement("area");
-    return _e;
-  }
-
-  static BRElement createBRElement() {
-    _BRElementImpl _e = _document.$dom_createElement("br");
-    return _e;
-  }
-
-  static BaseElement createBaseElement() {
-    _BaseElementImpl _e = _document.$dom_createElement("base");
-    return _e;
-  }
-
-  static BodyElement createBodyElement() {
-    _BodyElementImpl _e = _document.$dom_createElement("body");
-    return _e;
-  }
-
-  static ButtonElement createButtonElement() {
-    _ButtonElementImpl _e = _document.$dom_createElement("button");
-    return _e;
-  }
-
-  static CanvasElement createCanvasElement([int width, int height]) {
-    _CanvasElementImpl _e = _document.$dom_createElement("canvas");
-    if (width != null) _e.width = width;
-    if (height != null) _e.height = height;
-    return _e;
-  }
-
-  static ContentElement createContentElement() {
-    _ContentElementImpl _e = _document.$dom_createElement("content");
-    return _e;
-  }
-
-  static DListElement createDListElement() {
-    _DListElementImpl _e = _document.$dom_createElement("dl");
-    return _e;
-  }
-
-  static DataListElement createDataListElement() {
-    _DataListElementImpl _e = _document.$dom_createElement("datalist");
-    return _e;
-  }
-
-  static DetailsElement createDetailsElement() {
-    _DetailsElementImpl _e = _document.$dom_createElement("details");
-    return _e;
-  }
-
-  static DivElement createDivElement() {
-    _DivElementImpl _e = _document.$dom_createElement("div");
-    return _e;
-  }
-
-  static EmbedElement createEmbedElement() {
-    _EmbedElementImpl _e = _document.$dom_createElement("embed");
-    return _e;
-  }
-
-  static FieldSetElement createFieldSetElement() {
-    _FieldSetElementImpl _e = _document.$dom_createElement("fieldset");
-    return _e;
-  }
-
-  static FormElement createFormElement() {
-    _FormElementImpl _e = _document.$dom_createElement("form");
-    return _e;
-  }
-
-  static HRElement createHRElement() {
-    _HRElementImpl _e = _document.$dom_createElement("hr");
-    return _e;
-  }
-
-  static HeadElement createHeadElement() {
-    _HeadElementImpl _e = _document.$dom_createElement("head");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h1() {
-    _HeadingElementImpl _e = _document.$dom_createElement("h1");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h2() {
-    _HeadingElementImpl _e = _document.$dom_createElement("h2");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h3() {
-    _HeadingElementImpl _e = _document.$dom_createElement("h3");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h4() {
-    _HeadingElementImpl _e = _document.$dom_createElement("h4");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h5() {
-    _HeadingElementImpl _e = _document.$dom_createElement("h5");
-    return _e;
-  }
-
-  static HeadingElement createHeadingElement_h6() {
-    _HeadingElementImpl _e = _document.$dom_createElement("h6");
-    return _e;
-  }
-
-  static HtmlElement createHtmlElement() {
-    _HtmlElementImpl _e = _document.$dom_createElement("html");
-    return _e;
-  }
-
-  static IFrameElement createIFrameElement() {
-    _IFrameElementImpl _e = _document.$dom_createElement("iframe");
-    return _e;
-  }
-
-  static ImageElement createImageElement([String src, int width, int height]) {
-    _ImageElementImpl _e = _document.$dom_createElement("img");
-    if (src != null) _e.src = src;
-    if (width != null) _e.width = width;
-    if (height != null) _e.height = height;
-    return _e;
-  }
-
-  static InputElement createInputElement([String type]) {
-    _InputElementImpl _e = _document.$dom_createElement("input");
-    if (type != null) _e.type = type;
-    return _e;
-  }
-
-  static KeygenElement createKeygenElement() {
-    _KeygenElementImpl _e = _document.$dom_createElement("keygen");
-    return _e;
-  }
-
-  static LIElement createLIElement() {
-    _LIElementImpl _e = _document.$dom_createElement("li");
-    return _e;
-  }
-
-  static LabelElement createLabelElement() {
-    _LabelElementImpl _e = _document.$dom_createElement("label");
-    return _e;
-  }
-
-  static LegendElement createLegendElement() {
-    _LegendElementImpl _e = _document.$dom_createElement("legend");
-    return _e;
-  }
-
-  static LinkElement createLinkElement() {
-    _LinkElementImpl _e = _document.$dom_createElement("link");
-    return _e;
-  }
-
-  static MapElement createMapElement() {
-    _MapElementImpl _e = _document.$dom_createElement("map");
-    return _e;
-  }
-
-  static MenuElement createMenuElement() {
-    _MenuElementImpl _e = _document.$dom_createElement("menu");
-    return _e;
-  }
-
-  static MeterElement createMeterElement() {
-    _MeterElementImpl _e = _document.$dom_createElement("meter");
-    return _e;
-  }
-
-  static OListElement createOListElement() {
-    _OListElementImpl _e = _document.$dom_createElement("ol");
-    return _e;
-  }
-
-  static ObjectElement createObjectElement() {
-    _ObjectElementImpl _e = _document.$dom_createElement("object");
-    return _e;
-  }
-
-  static OptGroupElement createOptGroupElement() {
-    _OptGroupElementImpl _e = _document.$dom_createElement("optgroup");
-    return _e;
-  }
-
-  static OutputElement createOutputElement() {
-    _OutputElementImpl _e = _document.$dom_createElement("output");
-    return _e;
-  }
-
-  static ParagraphElement createParagraphElement() {
-    _ParagraphElementImpl _e = _document.$dom_createElement("p");
-    return _e;
-  }
-
-  static ParamElement createParamElement() {
-    _ParamElementImpl _e = _document.$dom_createElement("param");
-    return _e;
-  }
-
-  static PreElement createPreElement() {
-    _PreElementImpl _e = _document.$dom_createElement("pre");
-    return _e;
-  }
-
-  static ProgressElement createProgressElement() {
-    _ProgressElementImpl _e = _document.$dom_createElement("progress");
-    return _e;
-  }
-
-  static ScriptElement createScriptElement() {
-    _ScriptElementImpl _e = _document.$dom_createElement("script");
-    return _e;
-  }
-
-  static SelectElement createSelectElement() {
-    _SelectElementImpl _e = _document.$dom_createElement("select");
-    return _e;
-  }
-
-  static SourceElement createSourceElement() {
-    _SourceElementImpl _e = _document.$dom_createElement("source");
-    return _e;
-  }
-
-  static SpanElement createSpanElement() {
-    _SpanElementImpl _e = _document.$dom_createElement("span");
-    return _e;
-  }
-
-  static StyleElement createStyleElement() {
-    _StyleElementImpl _e = _document.$dom_createElement("style");
-    return _e;
-  }
-
-  static TableCaptionElement createTableCaptionElement() {
-    _TableCaptionElementImpl _e = _document.$dom_createElement("caption");
-    return _e;
-  }
-
-  static TableCellElement createTableCellElement() {
-    _TableCellElementImpl _e = _document.$dom_createElement("td");
-    return _e;
-  }
-
-  static TableColElement createTableColElement() {
-    _TableColElementImpl _e = _document.$dom_createElement("col");
-    return _e;
-  }
-
-  static TableElement createTableElement() {
-    _TableElementImpl _e = _document.$dom_createElement("table");
-    return _e;
-  }
-
-  static TableRowElement createTableRowElement() {
-    _TableRowElementImpl _e = _document.$dom_createElement("tr");
-    return _e;
-  }
-
-  static TextAreaElement createTextAreaElement() {
-    _TextAreaElementImpl _e = _document.$dom_createElement("textarea");
-    return _e;
-  }
-
-  static TitleElement createTitleElement() {
-    _TitleElementImpl _e = _document.$dom_createElement("title");
-    return _e;
-  }
-
-  static TrackElement createTrackElement() {
-    _TrackElementImpl _e = _document.$dom_createElement("track");
-    return _e;
-  }
-
-  static UListElement createUListElement() {
-    _UListElementImpl _e = _document.$dom_createElement("ul");
-    return _e;
-  }
-
-  static VideoElement createVideoElement() {
-    _VideoElementImpl _e = _document.$dom_createElement("video");
-    return _e;
-  }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _EventSourceFactoryProvider {
-  static EventSource createEventSource(String scriptUrl) native "EventSource_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _FileReaderFactoryProvider {
-  static FileReader createFileReader() native "FileReader_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _FileReaderSyncFactoryProvider {
-  static FileReaderSync createFileReaderSync() native "FileReaderSync_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _FormDataFactoryProvider {
-  static FormData createFormData([FormElement form]) native "DOMFormData_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _HttpRequestFactoryProvider {
-  static HttpRequest createHttpRequest() => _createHttpRequest();
-  static HttpRequest _createHttpRequest() native "XMLHttpRequest_constructor_Callback";
-
-  static HttpRequest createHttpRequest_get(String url,
-                                     onSuccess(HttpRequest request)) =>
-      _HttpRequestUtils.get(url, onSuccess, false);
-
-  static HttpRequest createHttpRequest_getWithCredentials(String url,
-                                     onSuccess(HttpRequest request)) =>
-      _HttpRequestUtils.get(url, onSuccess, true);
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _IceCandidateFactoryProvider {
-  static IceCandidate createIceCandidate(String label, String candidateLine) native "IceCandidate_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _MediaControllerFactoryProvider {
-  static MediaController createMediaController() native "MediaController_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _MediaSourceFactoryProvider {
-  static MediaSource createMediaSource() native "MediaSource_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _MediaStreamFactoryProvider {
-  static MediaStream createMediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) native "MediaStream_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _MessageChannelFactoryProvider {
-  static MessageChannel createMessageChannel() native "MessageChannel_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _MutationObserverFactoryProvider {
-  static MutationObserver createMutationObserver(MutationCallback callback) native "MutationObserver_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _NotificationFactoryProvider {
-  static Notification createNotification(String title, [Map options]) native "Notification_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _OptionElementFactoryProvider {
-  static OptionElement createOptionElement([String data, String value, bool defaultSelected, bool selected]) native "HTMLOptionElement_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _PeerConnection00FactoryProvider {
-  static PeerConnection00 createPeerConnection00(String serverConfiguration, IceCallback iceCallback) native "PeerConnection00_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _RTCIceCandidateFactoryProvider {
-  static RTCIceCandidate createRTCIceCandidate(Map dictionary) native "RTCIceCandidate_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _RTCPeerConnectionFactoryProvider {
-  static RTCPeerConnection createRTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) native "RTCPeerConnection_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _RTCSessionDescriptionFactoryProvider {
-  static RTCSessionDescription createRTCSessionDescription(Map dictionary) native "RTCSessionDescription_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _SessionDescriptionFactoryProvider {
-  static SessionDescription createSessionDescription(String sdp) native "SessionDescription_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _ShadowRootFactoryProvider {
-  static ShadowRoot createShadowRoot(Element host) native "ShadowRoot_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _SharedWorkerFactoryProvider {
-  static SharedWorker createSharedWorker(String scriptURL, [String name]) native "SharedWorker_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _SpeechGrammarFactoryProvider {
-  static SpeechGrammar createSpeechGrammar() native "SpeechGrammar_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _SpeechGrammarListFactoryProvider {
-  static SpeechGrammarList createSpeechGrammarList() native "SpeechGrammarList_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _SpeechRecognitionFactoryProvider {
-  static SpeechRecognition createSpeechRecognition() native "SpeechRecognition_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class _TextTrackCueFactoryProvider {
-  static TextTrackCue createTextTrackCue(num startTime, num endTime, String text) native "TextTrackCue_constructor_Callback";
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
 class _WorkerFactoryProvider {
   static Worker createWorker(String scriptUrl) native "Worker_constructor_Callback";
 }
@@ -42546,6 +36147,202 @@
 // BSD-style license that can be found in the LICENSE file.
 
 typedef void EventListener(Event event);
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Defines the keycode values for keys that are returned by 
+ * KeyboardEvent.keyCode.
+ * 
+ * Important note: There is substantial divergence in how different browsers
+ * handle keycodes and their variants in different locales/keyboard layouts. We
+ * provide these constants to help make code processing keys more readable.
+ */
+abstract class KeyCode {
+  // These constant names were borrowed from Closure's Keycode enumeration
+  // class.
+  // http://closure-library.googlecode.com/svn/docs/closure_goog_events_keycodes.js.source.html  
+  static final int WIN_KEY_FF_LINUX = 0;
+  static final int MAC_ENTER = 3;
+  static final int BACKSPACE = 8;
+  static final int TAB = 9;
+  /** NUM_CENTER is also NUMLOCK for FF and Safari on Mac. */
+  static final int NUM_CENTER = 12;
+  static final int ENTER = 13;
+  static final int SHIFT = 16;
+  static final int CTRL = 17;
+  static final int ALT = 18;
+  static final int PAUSE = 19;
+  static final int CAPS_LOCK = 20;
+  static final int ESC = 27;
+  static final int SPACE = 32;
+  static final int PAGE_UP = 33;
+  static final int PAGE_DOWN = 34;
+  static final int END = 35;
+  static final int HOME = 36;
+  static final int LEFT = 37;
+  static final int UP = 38;
+  static final int RIGHT = 39;
+  static final int DOWN = 40;
+  static final int NUM_NORTH_EAST = 33;
+  static final int NUM_SOUTH_EAST = 34;
+  static final int NUM_SOUTH_WEST = 35;
+  static final int NUM_NORTH_WEST = 36;
+  static final int NUM_WEST = 37;
+  static final int NUM_NORTH = 38;
+  static final int NUM_EAST = 39;
+  static final int NUM_SOUTH = 40;
+  static final int PRINT_SCREEN = 44;
+  static final int INSERT = 45;
+  static final int NUM_INSERT = 45;
+  static final int DELETE = 46;
+  static final int NUM_DELETE = 46;
+  static final int ZERO = 48;
+  static final int ONE = 49;
+  static final int TWO = 50;
+  static final int THREE = 51;
+  static final int FOUR = 52;
+  static final int FIVE = 53;
+  static final int SIX = 54;
+  static final int SEVEN = 55;
+  static final int EIGHT = 56;
+  static final int NINE = 57;
+  static final int FF_SEMICOLON = 59;
+  static final int FF_EQUALS = 61;
+  /**
+   * CAUTION: The question mark is for US-keyboard layouts. It varies
+   * for other locales and keyboard layouts.
+   */
+  static final int QUESTION_MARK = 63;
+  static final int A = 65;
+  static final int B = 66;
+  static final int C = 67;
+  static final int D = 68;
+  static final int E = 69;
+  static final int F = 70;
+  static final int G = 71;
+  static final int H = 72;
+  static final int I = 73;
+  static final int J = 74;
+  static final int K = 75;
+  static final int L = 76;
+  static final int M = 77;
+  static final int N = 78;
+  static final int O = 79;
+  static final int P = 80;
+  static final int Q = 81;
+  static final int R = 82;
+  static final int S = 83;
+  static final int T = 84;
+  static final int U = 85;
+  static final int V = 86;
+  static final int W = 87;
+  static final int X = 88;
+  static final int Y = 89;
+  static final int Z = 90;
+  static final int META = 91;
+  static final int WIN_KEY_LEFT = 91;
+  static final int WIN_KEY_RIGHT = 92;
+  static final int CONTEXT_MENU = 93;
+  static final int NUM_ZERO = 96;
+  static final int NUM_ONE = 97;
+  static final int NUM_TWO = 98;
+  static final int NUM_THREE = 99;
+  static final int NUM_FOUR = 100;
+  static final int NUM_FIVE = 101;
+  static final int NUM_SIX = 102;
+  static final int NUM_SEVEN = 103;
+  static final int NUM_EIGHT = 104;
+  static final int NUM_NINE = 105;
+  static final int NUM_MULTIPLY = 106;
+  static final int NUM_PLUS = 107;
+  static final int NUM_MINUS = 109;
+  static final int NUM_PERIOD = 110;
+  static final int NUM_DIVISION = 111;
+  static final int F1 = 112;
+  static final int F2 = 113;
+  static final int F3 = 114;
+  static final int F4 = 115;
+  static final int F5 = 116;
+  static final int F6 = 117;
+  static final int F7 = 118;
+  static final int F8 = 119;
+  static final int F9 = 120;
+  static final int F10 = 121;
+  static final int F11 = 122;
+  static final int F12 = 123;
+  static final int NUMLOCK = 144;
+  static final int SCROLL_LOCK = 145;
+
+  // OS-specific media keys like volume controls and browser controls.
+  static final int FIRST_MEDIA_KEY = 166;
+  static final int LAST_MEDIA_KEY = 183;
+
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int SEMICOLON = 186;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int DASH = 189;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int EQUALS = 187;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int COMMA = 188;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int PERIOD = 190;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int SLASH = 191;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int APOSTROPHE = 192;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int TILDE = 192;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int SINGLE_QUOTE = 222;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int OPEN_SQUARE_BRACKET = 219;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int BACKSLASH = 220;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int CLOSE_SQUARE_BRACKET = 221;
+  static final int WIN_KEY = 224;
+  static final int MAC_FF_META = 224;
+  static final int WIN_IME = 229;
+}
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
@@ -42591,7 +36388,7 @@
    */
   static const int JOYSTICK = 5;
 }
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -43230,7 +37027,7 @@
 class _CustomEventFactoryProvider {
   static CustomEvent createCustomEvent(String type, [bool canBubble = true,
       bool cancelable = true, Object detail = null]) {
-    final _CustomEventImpl e = _document.$dom_createEvent("CustomEvent");
+    final CustomEvent e = document.$dom_createEvent("CustomEvent");
     e.$dom_initCustomEvent(type, canBubble, cancelable, detail);
     return e;
   }
@@ -43239,7 +37036,7 @@
 class _EventFactoryProvider {
   static Event createEvent(String type, [bool canBubble = true,
       bool cancelable = true]) {
-    final _EventImpl e = _document.$dom_createEvent("Event");
+    final Event e = document.$dom_createEvent("Event");
     e.$dom_initEvent(type, canBubble, cancelable);
     return e;
   }
@@ -43251,7 +37048,7 @@
       [bool canBubble = true, bool cancelable = true, bool ctrlKey = false,
       bool altKey = false, bool shiftKey = false, bool metaKey = false,
       EventTarget relatedTarget = null]) {
-    final e = _document.$dom_createEvent("MouseEvent");
+    final e = document.$dom_createEvent("MouseEvent");
     e.$dom_initMouseEvent(type, canBubble, cancelable, view, detail,
         screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
         button, relatedTarget);
@@ -43309,7 +37106,7 @@
 class _SVGElementFactoryProvider {
   static SVGElement createSVGElement_tag(String tag) {
     final Element temp =
-      _document.$dom_createElementNS("http://www.w3.org/2000/svg", tag);
+      document.$dom_createElementNS("http://www.w3.org/2000/svg", tag);
     return temp;
   }
 
@@ -43354,20 +37151,20 @@
 class _IDBKeyRangeFactoryProvider {
 
   static IDBKeyRange createIDBKeyRange_only(/*IDBKey*/ value) =>
-      _IDBKeyRangeImpl.only_(value);
+      IDBKeyRange.only_(value);
 
   static IDBKeyRange createIDBKeyRange_lowerBound(
       /*IDBKey*/ bound, [bool open = false]) =>
-      _IDBKeyRangeImpl.lowerBound_(bound, open);
+      IDBKeyRange.lowerBound_(bound, open);
 
   static IDBKeyRange createIDBKeyRange_upperBound(
       /*IDBKey*/ bound, [bool open = false]) =>
-      _IDBKeyRangeImpl.upperBound_(bound, open);
+      IDBKeyRange.upperBound_(bound, open);
 
   static IDBKeyRange createIDBKeyRange_bound(
       /*IDBKey*/ lower, /*IDBKey*/ upper,
       [bool lowerOpen = false, bool upperOpen = false]) =>
-      _IDBKeyRangeImpl.bound_(lower, upper, lowerOpen, upperOpen);
+      IDBKeyRange.bound_(lower, upper, lowerOpen, upperOpen);
 }
 
 class _TypedArrayFactoryProvider {
@@ -43449,7 +37246,7 @@
 }
 
 class _TextFactoryProvider {
-  static Text createText(String data) => _document.$dom_createTextNode(data);
+  static Text createText(String data) => document.$dom_createTextNode(data);
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -44285,7 +38082,7 @@
 
   static Map createMap() => {};
 
-  static makeNotImplementedException(String fileName, int lineNo) {
+  static makeUnimplementedError(String fileName, int lineNo) {
     return new UnsupportedError('[info: $fileName:$lineNo]');
   }
 
@@ -44297,14 +38094,14 @@
 }
 
 class _NPObject extends NativeFieldWrapperClass1 {
-  _NPObject();
+  _NPObject.internal();
   static _NPObject retrieve(String key) native "NPObject_retrieve";
   property(String propertyName) native "NPObject_property";
   invoke(String methodName, [List args = null]) native "NPObject_invoke";
 }
 
-class _DOMWindowCrossFrameImpl extends NativeFieldWrapperClass1 implements Window {
-  _DOMWindowCrossFrameImpl();
+class _DOMWindowCrossFrame extends NativeFieldWrapperClass1 implements Window {
+  _DOMWindowCrossFrame.internal();
 
   // Fields.
   History get history() native "DOMWindow_history_cross_frame_Getter";
@@ -44325,8 +38122,8 @@
   String get typeName => "DOMWindow";
 }
 
-class _HistoryCrossFrameImpl extends NativeFieldWrapperClass1 implements History {
-  _HistoryCrossFrameImpl();
+class _HistoryCrossFrame extends NativeFieldWrapperClass1 implements History {
+  _HistoryCrossFrame.internal();
 
   // Methods.
   void back() native "History_back_Callback";
@@ -44337,8 +38134,8 @@
   String get typeName => "History";
 }
 
-class _LocationCrossFrameImpl extends NativeFieldWrapperClass1 implements Location {
-  _LocationCrossFrameImpl();
+class _LocationCrossFrame extends NativeFieldWrapperClass1 implements Location {
+  _LocationCrossFrame.internal();
 
   // Fields.
   void set href(String) native "Location_href_Setter";
@@ -44347,8 +38144,8 @@
   String get typeName => "Location";
 }
 
-class _DOMStringMapImpl extends NativeFieldWrapperClass1 implements Map<String, String> {
-  _DOMStringMapImpl();
+class _DOMStringMap extends NativeFieldWrapperClass1 implements Map<String, String> {
+  _DOMStringMap.internal();
 
   bool containsValue(String value) => Maps.containsValue(this, value);
   bool containsKey(String key) native "DOMStringMap_containsKey_Callback";
diff --git a/lib/html/dartium/nativewrappers.dart b/sdk/lib/html/dartium/nativewrappers.dart
similarity index 100%
rename from lib/html/dartium/nativewrappers.dart
rename to sdk/lib/html/dartium/nativewrappers.dart
diff --git a/lib/html/doc/html.dartdoc b/sdk/lib/html/doc/html.dartdoc
similarity index 100%
rename from lib/html/doc/html.dartdoc
rename to sdk/lib/html/doc/html.dartdoc
diff --git a/lib/html/doc/interface/AbstractWorker.dartdoc b/sdk/lib/html/doc/interface/AbstractWorker.dartdoc
similarity index 100%
rename from lib/html/doc/interface/AbstractWorker.dartdoc
rename to sdk/lib/html/doc/interface/AbstractWorker.dartdoc
diff --git a/lib/html/doc/interface/Element.dartdoc b/sdk/lib/html/doc/interface/Element.dartdoc
similarity index 100%
rename from lib/html/doc/interface/Element.dartdoc
rename to sdk/lib/html/doc/interface/Element.dartdoc
diff --git a/lib/html/doc/interface/Event.dartdoc b/sdk/lib/html/doc/interface/Event.dartdoc
similarity index 100%
rename from lib/html/doc/interface/Event.dartdoc
rename to sdk/lib/html/doc/interface/Event.dartdoc
diff --git a/lib/html/doc/interface/EventTarget.dartdoc b/sdk/lib/html/doc/interface/EventTarget.dartdoc
similarity index 100%
rename from lib/html/doc/interface/EventTarget.dartdoc
rename to sdk/lib/html/doc/interface/EventTarget.dartdoc
diff --git a/lib/html/doc/interface/HttpRequest.dartdoc b/sdk/lib/html/doc/interface/HttpRequest.dartdoc
similarity index 100%
rename from lib/html/doc/interface/HttpRequest.dartdoc
rename to sdk/lib/html/doc/interface/HttpRequest.dartdoc
diff --git a/lib/html/doc/interface/MouseEvent.dartdoc b/sdk/lib/html/doc/interface/MouseEvent.dartdoc
similarity index 100%
rename from lib/html/doc/interface/MouseEvent.dartdoc
rename to sdk/lib/html/doc/interface/MouseEvent.dartdoc
diff --git a/lib/html/doc/interface/Node.dartdoc b/sdk/lib/html/doc/interface/Node.dartdoc
similarity index 100%
rename from lib/html/doc/interface/Node.dartdoc
rename to sdk/lib/html/doc/interface/Node.dartdoc
diff --git a/lib/html/doc/interface/Storage.dartdoc b/sdk/lib/html/doc/interface/Storage.dartdoc
similarity index 100%
rename from lib/html/doc/interface/Storage.dartdoc
rename to sdk/lib/html/doc/interface/Storage.dartdoc
diff --git a/lib/html/doc/interface/UIEvent.dartdoc b/sdk/lib/html/doc/interface/UIEvent.dartdoc
similarity index 100%
rename from lib/html/doc/interface/UIEvent.dartdoc
rename to sdk/lib/html/doc/interface/UIEvent.dartdoc
diff --git a/lib/html/doc/interface/WebSocket.dartdoc b/sdk/lib/html/doc/interface/WebSocket.dartdoc
similarity index 100%
rename from lib/html/doc/interface/WebSocket.dartdoc
rename to sdk/lib/html/doc/interface/WebSocket.dartdoc
diff --git a/lib/html/idl/dart/dart.idl b/sdk/lib/html/idl/dart/dart.idl
similarity index 100%
rename from lib/html/idl/dart/dart.idl
rename to sdk/lib/html/idl/dart/dart.idl
diff --git a/lib/html/scripts/all_tests.py b/sdk/lib/html/scripts/all_tests.py
similarity index 100%
rename from lib/html/scripts/all_tests.py
rename to sdk/lib/html/scripts/all_tests.py
diff --git a/lib/html/scripts/css_code_generator.py b/sdk/lib/html/scripts/css_code_generator.py
similarity index 100%
rename from lib/html/scripts/css_code_generator.py
rename to sdk/lib/html/scripts/css_code_generator.py
diff --git a/lib/html/scripts/dartdomgenerator.py b/sdk/lib/html/scripts/dartdomgenerator.py
similarity index 98%
rename from lib/html/scripts/dartdomgenerator.py
rename to sdk/lib/html/scripts/dartdomgenerator.py
index 8ce05b8..68b4a25 100755
--- a/lib/html/scripts/dartdomgenerator.py
+++ b/sdk/lib/html/scripts/dartdomgenerator.py
@@ -134,7 +134,8 @@
 def GenerateSingleFile(library_path, output_dir):
   library_dir = os.path.dirname(library_path)
   library_filename = os.path.basename(library_path)
-  copy_dart_script = os.path.relpath('../../../tools/copy_dart.py', library_dir)
+  copy_dart_script = os.path.relpath('../../../../tools/copy_dart.py',
+      library_dir)
   output_dir = os.path.relpath(output_dir, library_dir)
   command = ' '.join(['cd', library_dir, ';',
                       copy_dart_script, output_dir, library_filename])
diff --git a/lib/html/scripts/dartgenerator.py b/sdk/lib/html/scripts/dartgenerator.py
similarity index 100%
rename from lib/html/scripts/dartgenerator.py
rename to sdk/lib/html/scripts/dartgenerator.py
diff --git a/lib/html/scripts/dartgenerator_test.py b/sdk/lib/html/scripts/dartgenerator_test.py
similarity index 100%
rename from lib/html/scripts/dartgenerator_test.py
rename to sdk/lib/html/scripts/dartgenerator_test.py
diff --git a/lib/html/scripts/database.py b/sdk/lib/html/scripts/database.py
similarity index 100%
rename from lib/html/scripts/database.py
rename to sdk/lib/html/scripts/database.py
diff --git a/lib/html/scripts/database_test.py b/sdk/lib/html/scripts/database_test.py
similarity index 100%
rename from lib/html/scripts/database_test.py
rename to sdk/lib/html/scripts/database_test.py
diff --git a/lib/html/scripts/databasebuilder.py b/sdk/lib/html/scripts/databasebuilder.py
similarity index 100%
rename from lib/html/scripts/databasebuilder.py
rename to sdk/lib/html/scripts/databasebuilder.py
diff --git a/lib/html/scripts/databasebuilder_test.py b/sdk/lib/html/scripts/databasebuilder_test.py
similarity index 100%
rename from lib/html/scripts/databasebuilder_test.py
rename to sdk/lib/html/scripts/databasebuilder_test.py
diff --git a/lib/html/scripts/emitter.py b/sdk/lib/html/scripts/emitter.py
similarity index 100%
rename from lib/html/scripts/emitter.py
rename to sdk/lib/html/scripts/emitter.py
diff --git a/lib/html/scripts/emitter_test.py b/sdk/lib/html/scripts/emitter_test.py
similarity index 100%
rename from lib/html/scripts/emitter_test.py
rename to sdk/lib/html/scripts/emitter_test.py
diff --git a/lib/html/scripts/fremontcutbuilder.py b/sdk/lib/html/scripts/fremontcutbuilder.py
similarity index 98%
rename from lib/html/scripts/fremontcutbuilder.py
rename to sdk/lib/html/scripts/fremontcutbuilder.py
index e114208..19181a0 100755
--- a/lib/html/scripts/fremontcutbuilder.py
+++ b/sdk/lib/html/scripts/fremontcutbuilder.py
@@ -185,7 +185,7 @@
 
   idl_files = []
 
-  webcore_dir = os.path.join(current_dir, '..', '..', '..',
+  webcore_dir = os.path.join(current_dir, '..', '..', '..', '..',
                              'third_party', 'WebCore')
   if not os.path.exists(webcore_dir):
     raise RuntimeError('directory not found: %s' % webcore_dir)
diff --git a/lib/html/scripts/generator.py b/sdk/lib/html/scripts/generator.py
similarity index 98%
rename from lib/html/scripts/generator.py
rename to sdk/lib/html/scripts/generator.py
index a7332a9..610e058 100644
--- a/lib/html/scripts/generator.py
+++ b/sdk/lib/html/scripts/generator.py
@@ -445,9 +445,6 @@
   # Dynamically type this field for now.
   return 'dynamic'
 
-def ImplementationClassNameForInterfaceName(interface_name):
-  return '_%sImpl' % interface_name
-
 # ------------------------------------------------------------------------------
 
 class Conversion(object):
@@ -521,6 +518,9 @@
       Conversion('_convertNativeToDart_SerializedScriptValue',
                  'dynamic', 'dynamic'),
 
+    'DOMObject get PopStateEvent.state':
+      Conversion('_convertNativeToDart_SerializedScriptValue',
+                 'dynamic', 'dynamic'),
 
     # IDBAny is problematic.  Some uses are just a union of other IDB types,
     # which need no conversion..  Others include data values which require
@@ -686,14 +686,14 @@
     if self.idl_type() == 'NodeList':
       return 'List<Node>'
     if self.list_item_type():
-      return ImplementationClassNameForInterfaceName(self.idl_type())
+      return self.idl_type()
     # TODO(podivilov): only primitive and collection types should override
     # dart_type.
     if self._data.dart_type != None:
       return self.dart_type()
     if IsPureInterface(self.idl_type()):
       return self.idl_type()
-    return ImplementationClassNameForInterfaceName(self.interface_name())
+    return self.interface_name()
 
   def interface_name(self):
     if self.list_item_type() and not self.has_generated_interface():
@@ -702,11 +702,15 @@
 
   def implementation_name(self):
     if self.list_item_type():
-      return ImplementationClassNameForInterfaceName(self.idl_type())
-    implementation_name = ImplementationClassNameForInterfaceName(
-        self.interface_name())
+      implementation_name = self.idl_type()
+    else:
+      implementation_name = self.interface_name()
     if self.merged_into():
-      implementation_name = '%s_Merged' % implementation_name
+      implementation_name = '_%s_Merged' % implementation_name
+
+    if not self.has_generated_interface():
+      implementation_name = '_%s' % implementation_name
+
     return implementation_name
 
   def has_generated_interface(self):
diff --git a/lib/html/scripts/go.sh b/sdk/lib/html/scripts/go.sh
similarity index 100%
rename from lib/html/scripts/go.sh
rename to sdk/lib/html/scripts/go.sh
diff --git a/sdk/lib/html/scripts/htmldartgenerator.py b/sdk/lib/html/scripts/htmldartgenerator.py
new file mode 100644
index 0000000..a199963
--- /dev/null
+++ b/sdk/lib/html/scripts/htmldartgenerator.py
@@ -0,0 +1,88 @@
+#!/usr/bin/python
+# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+"""This module provides shared functionality for the system to generate
+dart:html APIs from the IDL database."""
+
+from generator import DartDomNameOfAttribute
+
+class HtmlDartGenerator(object):
+  def __init__(self, interface, options):
+    self._interface = interface
+
+  def EmitAttributeDocumentation(self, attribute):
+    dom_name = DartDomNameOfAttribute(attribute)
+    self._members_emitter.Emit('\n  /** @domName $DOMINTERFACE.$DOMNAME */',
+        DOMINTERFACE=attribute.doc_js_interface_name,
+        DOMNAME=dom_name)
+
+  def EmitOperationDocumentation(self, operation):
+    self._members_emitter.Emit('\n  /** @domName $DOMINTERFACE.$DOMNAME */',
+        DOMINTERFACE=operation.overloads[0].doc_js_interface_name,
+        DOMNAME=operation.name)
+
+  def AdditionalImplementedInterfaces(self):
+    # TODO: Include all implemented interfaces, including other Lists.
+    implements = []
+    if self._interface_type_info.is_typed_array():
+      element_type = self._interface_type_info.list_item_type()
+      implements.append('List<%s>' % self._DartType(element_type))
+    if self._interface_type_info.list_item_type():
+      item_type_info = self._type_registry.TypeInfo(
+          self._interface_type_info.list_item_type())
+      implements.append('List<%s>' % item_type_info.dart_type())
+    return implements
+
+  def AddConstructors(self, constructors, factory_provider, class_name,
+      base_class):
+    for constructor_info in constructors:
+      self._AddConstructor(constructor_info, factory_provider)
+
+    typed_array_type = None
+    for interface in self._database.Hierarchy(self._interface):
+      type_info = self._type_registry.TypeInfo(interface.id)
+      if type_info.is_typed_array():
+        typed_array_type = type_info.list_item_type()
+        break
+    if typed_array_type:
+      self._members_emitter.Emit(
+          '\n'
+          '  factory $CTOR(int length) =>\n'
+          '    $FACTORY.create$(CTOR)(length);\n'
+          '\n'
+          '  factory $CTOR.fromList(List<$TYPE> list) =>\n'
+          '    $FACTORY.create$(CTOR)_fromList(list);\n'
+          '\n'
+          '  factory $CTOR.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => \n'
+          '    $FACTORY.create$(CTOR)_fromBuffer(buffer, byteOffset, length);\n',
+        CTOR=self._interface.id,
+        TYPE=self._DartType(typed_array_type),
+        FACTORY=factory_provider)
+
+  def _AddConstructor(self, constructor_info, factory_provider):
+      constructor_info.GenerateFactoryInvocation(
+          self._DartType, self._members_emitter, factory_provider)
+
+  def DeclareAttribute(self, attribute, type_name, html_name, read_only):
+    # Declares an attribute but does not include the code to invoke it.
+    self.EmitAttributeDocumentation(attribute)
+    if read_only:
+      template = '\n  $TYPE get $NAME;\n'
+    else:
+      template = '\n  $TYPE $NAME;\n'
+
+    self._members_emitter.Emit(template,
+        NAME=html_name,
+        TYPE=type_name)
+
+  def DeclareOperation(self, operation, type_name, html_name):
+    # Declares an operation but does not include the code to invoke it.
+    self.EmitOperationDocumentation(operation)
+    self._members_emitter.Emit(
+             '\n'
+             '  $TYPE $NAME($PARAMS);\n',
+             TYPE=type_name,
+             NAME=html_name,
+             PARAMS=operation.ParametersDeclaration(self._DartType))
diff --git a/lib/html/scripts/htmleventgenerator.py b/sdk/lib/html/scripts/htmleventgenerator.py
similarity index 92%
rename from lib/html/scripts/htmleventgenerator.py
rename to sdk/lib/html/scripts/htmleventgenerator.py
index cfc40fe..6584502 100644
--- a/lib/html/scripts/htmleventgenerator.py
+++ b/sdk/lib/html/scripts/htmleventgenerator.py
@@ -202,30 +202,24 @@
       return None
 
     self._event_classes.add(interface.id)
-    events_interface = html_interface_name + 'Events'
+    events_class_name = html_interface_name + 'Events'
     parent_events_interface = self._GetParentEventsInterface(interface)
 
     if not events:
       return parent_events_interface
 
-    interface_events_members = events_interface_emitter.Emit(
-        '\nabstract class $INTERFACE implements $PARENT {\n$!MEMBERS}\n',
-        INTERFACE=events_interface,
-        PARENT=parent_events_interface)
-
-    template_file = 'impl_%s.darttemplate' % events_interface
+    template_file = 'impl_%s.darttemplate' % events_class_name
     template = (self._template_loader.TryLoad(template_file) or
         '\n'
-        'class $CLASSNAME extends $SUPER implements $INTERFACE {\n'
-        '  $CLASSNAME(_ptr) : super(_ptr);\n'
+        'class $CLASSNAME extends $SUPER {\n'
+        '  $CLASSNAME(EventTarget _ptr) : super(_ptr);\n'
         '$!MEMBERS}\n')
 
     # TODO(jacobr): specify the type of _ptr as EventTarget
     implementation_events_members = events_implementation_emitter.Emit(
         template,
-        CLASSNAME='_%sImpl' % events_interface,
-        INTERFACE=events_interface,
-        SUPER='_%sImpl' % parent_events_interface)
+        CLASSNAME=events_class_name,
+        SUPER='%s' % parent_events_interface)
 
     dom_event_names = set()
     for event in events:
@@ -240,8 +234,6 @@
         continue
 
       html_name = _html_event_names[dom_name]
-      interface_events_members.Emit('\n  EventListenerList get $NAME;\n',
-          NAME=html_name)
       full_event_name = '%sEvents.%s' % (html_interface_name, html_name)
       if not full_event_name in custom_events:
         implementation_events_members.Emit(
@@ -250,7 +242,7 @@
             NAME=html_name,
             DOM_NAME=dom_name)
 
-    return events_interface
+    return events_class_name
 
   # TODO(jacobr): this isn't quite right....
   def _GetParentEventsInterface(self, interface):
diff --git a/lib/html/scripts/htmlrenamer.py b/sdk/lib/html/scripts/htmlrenamer.py
similarity index 98%
rename from lib/html/scripts/htmlrenamer.py
rename to sdk/lib/html/scripts/htmlrenamer.py
index 79f187d..b3552ae 100644
--- a/lib/html/scripts/htmlrenamer.py
+++ b/sdk/lib/html/scripts/htmlrenamer.py
@@ -6,6 +6,7 @@
 html_interface_renames = {
     'DOMCoreException': 'DOMException',
     'DOMFormData': 'FormData',
+    'DOMURL': 'Url',
     'DOMWindow': 'LocalWindow',
     'History': 'LocalHistory',
     'Location': 'LocalLocation',
@@ -99,6 +100,8 @@
     'SVGElement.className': '$dom_svgClassName',
     'SVGAnimatedString.className': '$dom_svgClassName',
     'SVGStylable.className': '$dom_svgClassName',
+    'Url.createObjectURL': 'createObjectUrl',
+    'Url.revokeObjectURL': 'revokeObjectUrl',
 }
 
 # Members and classes from the dom that should be removed completely from
diff --git a/lib/html/scripts/idlnode.py b/sdk/lib/html/scripts/idlnode.py
similarity index 100%
rename from lib/html/scripts/idlnode.py
rename to sdk/lib/html/scripts/idlnode.py
diff --git a/lib/html/scripts/idlnode_test.py b/sdk/lib/html/scripts/idlnode_test.py
similarity index 100%
rename from lib/html/scripts/idlnode_test.py
rename to sdk/lib/html/scripts/idlnode_test.py
diff --git a/lib/html/scripts/idlparser.dart b/sdk/lib/html/scripts/idlparser.dart
similarity index 100%
rename from lib/html/scripts/idlparser.dart
rename to sdk/lib/html/scripts/idlparser.dart
diff --git a/lib/html/scripts/idlparser.py b/sdk/lib/html/scripts/idlparser.py
similarity index 100%
rename from lib/html/scripts/idlparser.py
rename to sdk/lib/html/scripts/idlparser.py
diff --git a/lib/html/scripts/idlparser_test.dart b/sdk/lib/html/scripts/idlparser_test.dart
similarity index 100%
rename from lib/html/scripts/idlparser_test.dart
rename to sdk/lib/html/scripts/idlparser_test.dart
diff --git a/lib/html/scripts/idlparser_test.py b/sdk/lib/html/scripts/idlparser_test.py
similarity index 100%
rename from lib/html/scripts/idlparser_test.py
rename to sdk/lib/html/scripts/idlparser_test.py
diff --git a/lib/html/scripts/idlrenderer.dart b/sdk/lib/html/scripts/idlrenderer.dart
similarity index 100%
rename from lib/html/scripts/idlrenderer.dart
rename to sdk/lib/html/scripts/idlrenderer.dart
diff --git a/lib/html/scripts/idlrenderer.py b/sdk/lib/html/scripts/idlrenderer.py
similarity index 100%
rename from lib/html/scripts/idlrenderer.py
rename to sdk/lib/html/scripts/idlrenderer.py
diff --git a/lib/html/scripts/idlrenderer_test.py b/sdk/lib/html/scripts/idlrenderer_test.py
similarity index 100%
rename from lib/html/scripts/idlrenderer_test.py
rename to sdk/lib/html/scripts/idlrenderer_test.py
diff --git a/lib/html/scripts/idlsync.py b/sdk/lib/html/scripts/idlsync.py
similarity index 100%
rename from lib/html/scripts/idlsync.py
rename to sdk/lib/html/scripts/idlsync.py
diff --git a/lib/html/scripts/logging.conf b/sdk/lib/html/scripts/logging.conf
similarity index 100%
rename from lib/html/scripts/logging.conf
rename to sdk/lib/html/scripts/logging.conf
diff --git a/lib/html/scripts/multiemitter.py b/sdk/lib/html/scripts/multiemitter.py
similarity index 100%
rename from lib/html/scripts/multiemitter.py
rename to sdk/lib/html/scripts/multiemitter.py
diff --git a/lib/html/scripts/multiemitter_test.py b/sdk/lib/html/scripts/multiemitter_test.py
similarity index 100%
rename from lib/html/scripts/multiemitter_test.py
rename to sdk/lib/html/scripts/multiemitter_test.py
diff --git a/lib/html/scripts/pegparser.py b/sdk/lib/html/scripts/pegparser.py
similarity index 100%
rename from lib/html/scripts/pegparser.py
rename to sdk/lib/html/scripts/pegparser.py
diff --git a/lib/html/scripts/pegparser_test.py b/sdk/lib/html/scripts/pegparser_test.py
similarity index 100%
rename from lib/html/scripts/pegparser_test.py
rename to sdk/lib/html/scripts/pegparser_test.py
diff --git a/lib/html/scripts/systemhtml.py b/sdk/lib/html/scripts/systemhtml.py
similarity index 89%
rename from lib/html/scripts/systemhtml.py
rename to sdk/lib/html/scripts/systemhtml.py
index 44553c4..1fb093010 100644
--- a/lib/html/scripts/systemhtml.py
+++ b/sdk/lib/html/scripts/systemhtml.py
@@ -9,11 +9,15 @@
 import emitter
 import os
 from generator import *
+from htmldartgenerator import *
 
 _js_custom_members = set([
     'AudioBufferSourceNode.start',
     'AudioBufferSourceNode.stop',
+    'AudioContext.createGain',
+    'AudioContext.createScriptProcessor',
     'CSSStyleDeclaration.setProperty',
+    'CanvasElement.getContext',
     'Element.insertAdjacentElement',
     'Element.insertAdjacentHTML',
     'Element.insertAdjacentText',
@@ -33,11 +37,17 @@
     'LocalWindow.requestAnimationFrame',
     'LocalWindow.webkitCancelAnimationFrame',
     'LocalWindow.webkitRequestAnimationFrame',
+    'Url.createObjectURL',
+    'Url.revokeObjectURL',
     'WheelEvent.wheelDeltaX',
     'WheelEvent.wheelDeltaY',
     ])
 
 
+# Classes that offer only static methods, and therefore we should suppress
+# constructor creation.
+_static_classes = set(['Url'])
+
 # Types that are accessible cross-frame in a limited fashion.
 # In these cases, the base type (e.g., Window) provides restricted access
 # while the subtype (e.g., LocalWindow) provides full access to the
@@ -180,7 +190,7 @@
     inits = emitter.Emit(
         '\n'
         '  static $RETURN_TYPE $CONSTRUCTOR($PARAMS) {\n'
-        '    $CLASS _e = _document.$dom_createElement("$TAG");\n'
+        '    $CLASS _e = document.$dom_createElement("$TAG");\n'
         '$!INITS'
         '    return _e;\n'
         '  }\n',
@@ -231,11 +241,8 @@
   def GenerateInterface(self):
     interface_name = self._interface_type_info.interface_name()
 
-    if (self._interface_type_info.has_generated_interface() and
-        not self._interface_type_info.merged_into()):
-      interface_emitter = self._library_emitter.FileEmitter(interface_name)
-    else:
-      interface_emitter = emitter.Emitter()
+    # TODO: this is just tossing the interface, need to skip it completely.
+    interface_emitter = emitter.Emitter()
 
     template_file = 'interface_%s.darttemplate' % interface_name
     interface_template = (self._template_loader.TryLoad(template_file) or
@@ -265,7 +272,10 @@
       factory_provider = interface_factories[interface_name]
 
     constructors = []
-    constructor_info = AnalyzeConstructor(self._interface)
+    if interface_name in _static_classes:
+      constructor_info = None
+    else:
+      constructor_info = AnalyzeConstructor(self._interface)
     if constructor_info:
       constructors.append(constructor_info)
       factory_provider = '_' + interface_name + 'FactoryProvider'
@@ -297,30 +307,45 @@
      self._members_emitter,
      self._top_level_emitter) = interface_emitter.Emit(
          interface_template + '$!TOP_LEVEL',
-         ID=interface_name,
+         ID='_I%s' % interface_name,
          EXTENDS=implements_str)
 
-    self._type_comment_emitter.Emit("/// @domName $DOMNAME",
-        DOMNAME=self._interface.doc_js_name)
-
     implementation_emitter = self._ImplementationEmitter()
 
-    base_class = self._backend.RootClassName()
+    base_type_info = None
     if self._interface.parents:
       supertype = self._interface.parents[0].type.id
       if not IsDartCollectionType(supertype) and not IsPureInterface(supertype):
-        type_info = self._type_registry.TypeInfo(supertype)
-        if type_info.merged_into() and self._backend.ImplementsMergedMembers():
-          type_info = self._type_registry.TypeInfo(type_info.merged_into())
-        base_class = type_info.implementation_name()
+        base_type_info = self._type_registry.TypeInfo(supertype)
+        if base_type_info.merged_into() \
+            and self._backend.ImplementsMergedMembers():
+          base_type_info = self._type_registry.TypeInfo(
+              base_type_info.merged_into())
 
-    implemented_interfaces = [interface_name] +\
-                             self._backend.AdditionalImplementedInterfaces()
+    if base_type_info:
+      base_class = base_type_info.implementation_name()
+    else:
+      base_class = self._backend.RootClassName()
+
+    implements = self._backend.AdditionalImplementedInterfaces()
+    for parent in self._interface.parents:
+      parent_type_info = self._type_registry.TypeInfo(parent.type.id)
+      if parent_type_info != base_type_info:
+        implements.append(parent_type_info.interface_name())
+
+    if interface_name in _secure_base_types:
+      implements.append(_secure_base_types[interface_name])
+
+    implements_str = ''
+    if implements:
+      implements_str = ' implements ' + ', '.join(set(implements))
+
     self._implementation_members_emitter = implementation_emitter.Emit(
         self._backend.ImplementationTemplate(),
         CLASSNAME=self._interface_type_info.implementation_name(),
         EXTENDS=' extends %s' % base_class if base_class else '',
-        IMPLEMENTS=' implements ' + ', '.join(implemented_interfaces),
+        IMPLEMENTS=implements_str,
+        DOMNAME=self._interface.doc_js_name,
         NATIVESPEC=self._backend.NativeSpec())
     self._backend.StartInterface(self._implementation_members_emitter)
 
@@ -328,13 +353,17 @@
       constructor_info.GenerateFactoryInvocation(
           self._DartType, self._members_emitter, factory_provider)
 
-    element_type = None
+    self._backend.AddConstructors(constructors, factory_provider,
+        self._interface_type_info.implementation_name(),
+        base_class)
+
+    typed_array_type = None
     for interface in self._database.Hierarchy(self._interface):
       type_info = self._type_registry.TypeInfo(interface.id)
       if type_info.is_typed_array():
-        element_type = type_info.list_item_type()
+        typed_array_type = type_info.list_item_type()
         break
-    if element_type:
+    if typed_array_type:
       self._members_emitter.Emit(
           '\n'
           '  factory $CTOR(int length) =>\n'
@@ -346,7 +375,7 @@
           '  factory $CTOR.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => \n'
           '    $FACTORY.create$(CTOR)_fromBuffer(buffer, byteOffset, length);\n',
         CTOR=self._interface.id,
-        TYPE=self._DartType(element_type),
+        TYPE=self._DartType(typed_array_type),
         FACTORY=factory_provider)
 
     events_interface = self._event_generator.ProcessInterface(
@@ -354,7 +383,7 @@
         self._backend.CustomJSMembers(),
         interface_emitter, implementation_emitter)
     if events_interface:
-      self._EmitEventGetter(events_interface, '_%sImpl' % events_interface)
+      self._EmitEventGetter(events_interface, events_interface)
 
     old_backend = self._backend
     if not self._backend.ImplementsMergedMembers():
@@ -365,16 +394,19 @@
     self._backend = old_backend
 
     self.AddMembers(self._interface)
+    if merged_interface and not self._backend.ImplementsMergedMembers():
+      self.AddMembers(self._database.GetInterface(merged_interface), True)
+
     self.AddSecondaryMembers(self._interface)
     self._backend.FinishInterface()
 
-  def AddMembers(self, interface):
+  def AddMembers(self, interface, declare_only=False):
     for const in sorted(interface.constants, ConstantOutputOrder):
       self.AddConstant(const)
 
     for attr in sorted(interface.attributes, ConstantOutputOrder):
       if attr.type.id != 'EventListener':
-        self.AddAttribute(attr)
+        self.AddAttribute(attr, False, declare_only)
 
     # The implementation should define an indexer if the interface directly
     # extends List.
@@ -402,7 +434,7 @@
     for id in sorted(operationsById.keys()):
       operations = operationsById[id]
       info = AnalyzeOperation(interface, operations)
-      self.AddOperation(info)
+      self.AddOperation(info, False, declare_only)
 
   def AddSecondaryMembers(self, interface):
     # With multiple inheritance, attributes and operations of non-first
@@ -437,7 +469,7 @@
   def AmendIndexer(self, element_type):
     self._backend.AmendIndexer(element_type)
 
-  def AddAttribute(self, attribute, is_secondary=False):
+  def AddAttribute(self, attribute, is_secondary=False, declare_only=False):
     dom_name = DartDomNameOfAttribute(attribute)
     html_name = self._renamer.RenameMember(
       self._interface.id, attribute, dom_name, 'get:')
@@ -466,13 +498,17 @@
                                  NAME=html_name,
                                  TYPE=SecureOutputType(self, attribute.type.id))
 
-    self._backend.AddAttribute(attribute, html_name, read_only)
+    if declare_only:
+      self._backend.DeclareAttribute(attribute,
+          SecureOutputType(self, attribute.type.id), html_name, read_only)
+    else:
+      self._backend.AddAttribute(attribute, html_name, read_only)
 
   def AddSecondaryAttribute(self, interface, attribute):
     self._backend.SecondaryContext(interface)
     self.AddAttribute(attribute, True)
 
-  def AddOperation(self, info, skip_declaration=False):
+  def AddOperation(self, info, skip_declaration=False, declare_only=False):
     """
     Arguments:
       operations - contains the overloads, one or more operations with the same
@@ -510,11 +546,15 @@
              TYPE=SecureOutputType(self, info.type_name),
              NAME=html_name,
              PARAMS=info.ParametersDeclaration(self._DartType))
-    self._backend.AddOperation(info, html_name)
+    if declare_only:
+      self._backend.DeclareOperation(info,
+          SecureOutputType(self, info.type_name), html_name)
+    else:
+      self._backend.AddOperation(info, html_name)
 
   def AddSecondaryOperation(self, interface, info):
     self._backend.SecondaryContext(interface)
-    self.AddOperation(info, True)
+    self.AddOperation(info)
 
   def AddConstant(self, constant):
     type = TypeOrNothing(self._DartType(constant.type.id), constant.type.id)
@@ -523,15 +563,15 @@
                                TYPE=type,
                                VALUE=constant.value)
 
+    self._backend.AddConstant(constant)
+
   def _ImplementationEmitter(self):
-    if IsPureInterface(self._interface.id):
-      return emitter.Emitter()
     basename = self._interface_type_info.implementation_name()
     if (self._interface_type_info.merged_into() and
         self._backend.ImplementsMergedMembers()):
       # Merged members are implemented in target interface implementation.
       return emitter.Emitter()
-    return self._library_emitter.FileEmitter(basename.lstrip('_'))
+    return self._library_emitter.FileEmitter(basename)
 
   def _EmitEventGetter(self, events_interface, events_class):
     self._members_emitter.Emit(
@@ -543,6 +583,10 @@
         TYPE=events_interface)
 
     self._implementation_members_emitter.Emit(
+        '\n  /**'
+        '\n   * @domName EventTarget.addEventListener, '
+        'EventTarget.removeEventListener, EventTarget.dispatchEvent'
+        '\n   */'
         '\n  $TYPE get on =>\n    new $TYPE(this);\n',
         TYPE=events_class)
 
@@ -593,16 +637,18 @@
 
 # ------------------------------------------------------------------------------
 
-class Dart2JSBackend(object):
+class Dart2JSBackend(HtmlDartGenerator):
   """Generates a dart2js class for the dart:html library from a DOM IDL
   interface.
   """
 
   def __init__(self, interface, options):
-    self._interface = interface
+    super(Dart2JSBackend, self).__init__(interface, options)
+
     self._database = options.database
     self._template_loader = options.templates
     self._type_registry = options.type_registry
+    self._renamer = options.renamer
     self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
     self._current_secondary_parent = None
 
@@ -616,11 +662,7 @@
     return None
 
   def AdditionalImplementedInterfaces(self):
-    # TODO: Include all implemented interfaces, including other Lists.
-    implements = []
-    if self._interface_type_info.is_typed_array():
-      element_type = self._interface_type_info.list_item_type()
-      implements.append('List<%s>' % self._DartType(element_type))
+    implements = super(Dart2JSBackend, self).AdditionalImplementedInterfaces()
     if self._interface_type_info.list_item_type():
       implements.append('JavaScriptIndexingBehavior')
     return implements
@@ -630,6 +672,9 @@
     return ' native "%s"' % native_spec
 
   def ImplementationTemplate(self):
+    if IsPureInterface(self._interface.id):
+      return self._template_loader.Load('pure_interface.darttemplate')
+
     template_file = ('impl_%s.darttemplate' %
                      self._interface_type_info.interface_name())
     return (self._template_loader.TryLoad(template_file) or
@@ -722,6 +767,10 @@
     if self._HasCustomImplementation(attribute.id):
       return
 
+    if IsPureInterface(self._interface.id):
+      self._AddInterfaceAttribute(attribute)
+      return
+
     if attribute.id != html_name:
       self._AddAttributeUsingProperties(attribute, html_name, read_only)
       return
@@ -760,6 +809,7 @@
 
     output_type = self._NarrowOutputType(attribute.type.id)
     input_type = self._NarrowInputType(attribute.type.id)
+    self.EmitAttributeDocumentation(attribute)
     if not read_only:
       self._members_emitter.Emit(
           '\n  $TYPE $NAME;'
@@ -778,7 +828,16 @@
     if not read_only:
       self._AddRenamingSetter(attribute, html_name)
 
+  def _AddInterfaceAttribute(self, attribute):
+    self._members_emitter.Emit(
+        '\n  $TYPE $NAME;'
+        '\n',
+        NAME=DartDomNameOfAttribute(attribute),
+        TYPE=self._NarrowOutputType(attribute.type.id))
+
   def _AddRenamingGetter(self, attr, html_name):
+    self.EmitAttributeDocumentation(attr)
+
     conversion = self._OutputConversion(attr.type.id, attr.id)
     if conversion:
       return self._AddConvertingGetter(attr, html_name, conversion)
@@ -792,6 +851,8 @@
         TYPE=return_type)
 
   def _AddRenamingSetter(self, attr, html_name):
+    self.EmitAttributeDocumentation(attr)
+
     conversion = self._InputConversion(attr.type.id, attr.id)
     if conversion:
       return self._AddConvertingSetter(attr, html_name, conversion)
@@ -845,8 +906,12 @@
     if self._HasCustomImplementation(info.name):
       return
 
-    # Any conversions needed?
-    if any(self._OperationRequiresConversions(op) for op in info.overloads):
+    self.EmitOperationDocumentation(info)
+
+    if IsPureInterface(self._interface.id):
+      self._AddInterfaceOperation(info, html_name)
+    elif any(self._OperationRequiresConversions(op) for op in info.overloads):
+      # Any conversions needed?
       self._AddOperationWithConversions(info, html_name)
     else:
       self._AddDirectNativeOperation(info, html_name)
@@ -1015,6 +1080,20 @@
           argument_count = position
       GenerateCall(operation, argument_count, [])
 
+  def _AddInterfaceOperation(self, info, html_name):
+    self._members_emitter.Emit(
+        '\n'
+        '  $TYPE $NAME($PARAMS);\n',
+        TYPE=self._NarrowOutputType(info.type_name),
+        NAME=info.name,
+        PARAMS=info.ParametersDeclaration(self._NarrowInputType))
+
+  def AddConstant(self, constant):
+    type = TypeOrNothing(self._DartType(constant.type.id), constant.type.id)
+    self._members_emitter.Emit('\n  static const $TYPE$NAME = $VALUE;\n',
+        NAME=constant.id,
+        TYPE=type,
+        VALUE=constant.value)
 
   def _IsOptional(self, operation, argument):
     return IsOptional(argument)
@@ -1052,8 +1131,7 @@
     return self._NarrowToImplementationType(type_name)
 
   def _NarrowOutputType(self, type_name):
-    secure_name = SecureOutputType(self, type_name, True)
-    return self._NarrowToImplementationType(secure_name)
+    return SecureOutputType(self, type_name)
 
   def _FindShadowedAttribute(self, attr):
     """Returns (attribute, superinterface) or (None, None)."""
diff --git a/lib/html/scripts/systemnative.py b/sdk/lib/html/scripts/systemnative.py
similarity index 96%
rename from lib/html/scripts/systemnative.py
rename to sdk/lib/html/scripts/systemnative.py
index 55477de..7155f29 100644
--- a/lib/html/scripts/systemnative.py
+++ b/sdk/lib/html/scripts/systemnative.py
@@ -10,11 +10,14 @@
 import os
 from generator import *
 from systemhtml import SecureOutputType
+from htmldartgenerator import *
 
-class DartiumBackend(object):
+class DartiumBackend(HtmlDartGenerator):
   """Generates Dart implementation for one DOM IDL interface."""
 
   def __init__(self, interface, cpp_library_emitter, options):
+    super(DartiumBackend, self).__init__(interface, options)
+
     self._interface = interface
     self._cpp_library_emitter = cpp_library_emitter
     self._database = options.database
@@ -104,9 +107,6 @@
   def RootClassName(self):
     return 'NativeFieldWrapperClass1'
 
-  def AdditionalImplementedInterfaces(self):
-    return []
-
   def NativeSpec(self):
     return ''
 
@@ -209,6 +209,20 @@
         ARGUMENTS=constructor_info.ParametersAsArgumentList(),
         NATIVE_NAME=native_binding)
 
+  def AddConstructors(self, constructors, factory_provider, class_name,
+      base_class):
+    super(DartiumBackend, self).AddConstructors(constructors, factory_provider,
+        class_name, base_class)
+
+    super_constructor = ''
+    if base_class and base_class != 'NativeFieldWrapperClass1':
+      super_constructor = ': super.internal()'
+
+    self._members_emitter.Emit(
+        '  $CLASSNAME.internal()$SUPERCONSTRUCTOR;\n',
+        CLASSNAME=class_name,
+        SUPERCONSTRUCTOR=super_constructor)
+
   def FinishInterface(self):
     self._GenerateCPPHeader()
 
@@ -462,6 +476,13 @@
     else:
       self._GenerateDispatcher(info.operations, dart_declaration, [info.name for info in info.param_infos])
 
+  def AddConstant(self, constant):
+    type = TypeOrNothing(self._DartType(constant.type.id), constant.type.id)
+    self._members_emitter.Emit('\n  static const $TYPE$NAME = $VALUE;\n',
+        NAME=constant.id,
+        TYPE=type,
+        VALUE=constant.value)
+
   def _GenerateDispatcher(self, operations, dart_declaration, argument_names):
 
     body = self._members_emitter.Emit(
@@ -757,8 +778,12 @@
     native_binding = '%s_%s_%s' % (self._interface.id, idl_name, native_suffix)
     self._members_emitter.Emit(
         '\n'
-        '  $DART_DECLARATION native "$NATIVE_BINDING";\n',
-        DART_DECLARATION=dart_declaration, NATIVE_BINDING=native_binding)
+        '\n  /** @domName $DOMINTERFACE.$DOMNAME */'
+        '\n  $DART_DECLARATION native "$NATIVE_BINDING";\n',
+        DOMINTERFACE=self._interface.id,
+        DOMNAME=idl_name,
+        DART_DECLARATION=dart_declaration,
+        NATIVE_BINDING=native_binding)
 
     cpp_callback_name = '%s%s' % (idl_name, native_suffix)
     self._cpp_resolver_emitter.Emit(
diff --git a/lib/html/scripts/templateloader.py b/sdk/lib/html/scripts/templateloader.py
similarity index 100%
rename from lib/html/scripts/templateloader.py
rename to sdk/lib/html/scripts/templateloader.py
diff --git a/lib/html/scripts/templateloader_test.py b/sdk/lib/html/scripts/templateloader_test.py
similarity index 100%
rename from lib/html/scripts/templateloader_test.py
rename to sdk/lib/html/scripts/templateloader_test.py
diff --git a/lib/html/src/CrossFrameTypes.dart b/sdk/lib/html/src/CrossFrameTypes.dart
similarity index 100%
rename from lib/html/src/CrossFrameTypes.dart
rename to sdk/lib/html/src/CrossFrameTypes.dart
diff --git a/lib/html/src/Device.dart b/sdk/lib/html/src/Device.dart
similarity index 100%
rename from lib/html/src/Device.dart
rename to sdk/lib/html/src/Device.dart
diff --git a/lib/html/src/EventListener.dart b/sdk/lib/html/src/EventListener.dart
similarity index 100%
rename from lib/html/src/EventListener.dart
rename to sdk/lib/html/src/EventListener.dart
diff --git a/lib/html/src/Isolates.dart b/sdk/lib/html/src/Isolates.dart
similarity index 100%
rename from lib/html/src/Isolates.dart
rename to sdk/lib/html/src/Isolates.dart
diff --git a/sdk/lib/html/src/KeyCode.dart b/sdk/lib/html/src/KeyCode.dart
new file mode 100644
index 0000000..54771b7
--- /dev/null
+++ b/sdk/lib/html/src/KeyCode.dart
@@ -0,0 +1,196 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Defines the keycode values for keys that are returned by 
+ * KeyboardEvent.keyCode.
+ * 
+ * Important note: There is substantial divergence in how different browsers
+ * handle keycodes and their variants in different locales/keyboard layouts. We
+ * provide these constants to help make code processing keys more readable.
+ */
+abstract class KeyCode {
+  // These constant names were borrowed from Closure's Keycode enumeration
+  // class.
+  // http://closure-library.googlecode.com/svn/docs/closure_goog_events_keycodes.js.source.html  
+  static final int WIN_KEY_FF_LINUX = 0;
+  static final int MAC_ENTER = 3;
+  static final int BACKSPACE = 8;
+  static final int TAB = 9;
+  /** NUM_CENTER is also NUMLOCK for FF and Safari on Mac. */
+  static final int NUM_CENTER = 12;
+  static final int ENTER = 13;
+  static final int SHIFT = 16;
+  static final int CTRL = 17;
+  static final int ALT = 18;
+  static final int PAUSE = 19;
+  static final int CAPS_LOCK = 20;
+  static final int ESC = 27;
+  static final int SPACE = 32;
+  static final int PAGE_UP = 33;
+  static final int PAGE_DOWN = 34;
+  static final int END = 35;
+  static final int HOME = 36;
+  static final int LEFT = 37;
+  static final int UP = 38;
+  static final int RIGHT = 39;
+  static final int DOWN = 40;
+  static final int NUM_NORTH_EAST = 33;
+  static final int NUM_SOUTH_EAST = 34;
+  static final int NUM_SOUTH_WEST = 35;
+  static final int NUM_NORTH_WEST = 36;
+  static final int NUM_WEST = 37;
+  static final int NUM_NORTH = 38;
+  static final int NUM_EAST = 39;
+  static final int NUM_SOUTH = 40;
+  static final int PRINT_SCREEN = 44;
+  static final int INSERT = 45;
+  static final int NUM_INSERT = 45;
+  static final int DELETE = 46;
+  static final int NUM_DELETE = 46;
+  static final int ZERO = 48;
+  static final int ONE = 49;
+  static final int TWO = 50;
+  static final int THREE = 51;
+  static final int FOUR = 52;
+  static final int FIVE = 53;
+  static final int SIX = 54;
+  static final int SEVEN = 55;
+  static final int EIGHT = 56;
+  static final int NINE = 57;
+  static final int FF_SEMICOLON = 59;
+  static final int FF_EQUALS = 61;
+  /**
+   * CAUTION: The question mark is for US-keyboard layouts. It varies
+   * for other locales and keyboard layouts.
+   */
+  static final int QUESTION_MARK = 63;
+  static final int A = 65;
+  static final int B = 66;
+  static final int C = 67;
+  static final int D = 68;
+  static final int E = 69;
+  static final int F = 70;
+  static final int G = 71;
+  static final int H = 72;
+  static final int I = 73;
+  static final int J = 74;
+  static final int K = 75;
+  static final int L = 76;
+  static final int M = 77;
+  static final int N = 78;
+  static final int O = 79;
+  static final int P = 80;
+  static final int Q = 81;
+  static final int R = 82;
+  static final int S = 83;
+  static final int T = 84;
+  static final int U = 85;
+  static final int V = 86;
+  static final int W = 87;
+  static final int X = 88;
+  static final int Y = 89;
+  static final int Z = 90;
+  static final int META = 91;
+  static final int WIN_KEY_LEFT = 91;
+  static final int WIN_KEY_RIGHT = 92;
+  static final int CONTEXT_MENU = 93;
+  static final int NUM_ZERO = 96;
+  static final int NUM_ONE = 97;
+  static final int NUM_TWO = 98;
+  static final int NUM_THREE = 99;
+  static final int NUM_FOUR = 100;
+  static final int NUM_FIVE = 101;
+  static final int NUM_SIX = 102;
+  static final int NUM_SEVEN = 103;
+  static final int NUM_EIGHT = 104;
+  static final int NUM_NINE = 105;
+  static final int NUM_MULTIPLY = 106;
+  static final int NUM_PLUS = 107;
+  static final int NUM_MINUS = 109;
+  static final int NUM_PERIOD = 110;
+  static final int NUM_DIVISION = 111;
+  static final int F1 = 112;
+  static final int F2 = 113;
+  static final int F3 = 114;
+  static final int F4 = 115;
+  static final int F5 = 116;
+  static final int F6 = 117;
+  static final int F7 = 118;
+  static final int F8 = 119;
+  static final int F9 = 120;
+  static final int F10 = 121;
+  static final int F11 = 122;
+  static final int F12 = 123;
+  static final int NUMLOCK = 144;
+  static final int SCROLL_LOCK = 145;
+
+  // OS-specific media keys like volume controls and browser controls.
+  static final int FIRST_MEDIA_KEY = 166;
+  static final int LAST_MEDIA_KEY = 183;
+
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int SEMICOLON = 186;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int DASH = 189;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int EQUALS = 187;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int COMMA = 188;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int PERIOD = 190;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int SLASH = 191;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int APOSTROPHE = 192;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int TILDE = 192;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int SINGLE_QUOTE = 222;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int OPEN_SQUARE_BRACKET = 219;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int BACKSLASH = 220;
+  /**
+   * CAUTION: This constant requires localization for other locales and keyboard
+   * layouts.
+   */
+  static final int CLOSE_SQUARE_BRACKET = 221;
+  static final int WIN_KEY = 224;
+  static final int MAC_FF_META = 224;
+  static final int WIN_IME = 229;
+}
diff --git a/lib/html/src/KeyLocation.dart b/sdk/lib/html/src/KeyLocation.dart
similarity index 100%
rename from lib/html/src/KeyLocation.dart
rename to sdk/lib/html/src/KeyLocation.dart
diff --git a/lib/html/src/KeyName.dart b/sdk/lib/html/src/KeyName.dart
similarity index 99%
rename from lib/html/src/KeyName.dart
rename to sdk/lib/html/src/KeyName.dart
index 5834582..ee96ceb 100644
--- a/lib/html/src/KeyName.dart
+++ b/sdk/lib/html/src/KeyName.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/lib/html/src/Measurement.dart b/sdk/lib/html/src/Measurement.dart
similarity index 100%
rename from lib/html/src/Measurement.dart
rename to sdk/lib/html/src/Measurement.dart
diff --git a/lib/html/src/ReadyState.dart b/sdk/lib/html/src/ReadyState.dart
similarity index 100%
rename from lib/html/src/ReadyState.dart
rename to sdk/lib/html/src/ReadyState.dart
diff --git a/lib/html/src/Serialization.dart b/sdk/lib/html/src/Serialization.dart
similarity index 100%
rename from lib/html/src/Serialization.dart
rename to sdk/lib/html/src/Serialization.dart
diff --git a/lib/html/src/Timer.dart b/sdk/lib/html/src/Timer.dart
similarity index 100%
rename from lib/html/src/Timer.dart
rename to sdk/lib/html/src/Timer.dart
diff --git a/lib/html/src/_Collections.dart b/sdk/lib/html/src/_Collections.dart
similarity index 100%
rename from lib/html/src/_Collections.dart
rename to sdk/lib/html/src/_Collections.dart
diff --git a/lib/html/src/_HttpRequestUtils.dart b/sdk/lib/html/src/_HttpRequestUtils.dart
similarity index 100%
rename from lib/html/src/_HttpRequestUtils.dart
rename to sdk/lib/html/src/_HttpRequestUtils.dart
diff --git a/lib/html/src/_ListIterators.dart b/sdk/lib/html/src/_ListIterators.dart
similarity index 100%
rename from lib/html/src/_ListIterators.dart
rename to sdk/lib/html/src/_ListIterators.dart
diff --git a/lib/html/src/_Lists.dart b/sdk/lib/html/src/_Lists.dart
similarity index 100%
rename from lib/html/src/_Lists.dart
rename to sdk/lib/html/src/_Lists.dart
diff --git a/lib/html/src/_Testing.dart b/sdk/lib/html/src/_Testing.dart
similarity index 100%
rename from lib/html/src/_Testing.dart
rename to sdk/lib/html/src/_Testing.dart
diff --git a/lib/html/src/dart2js_Conversions.dart b/sdk/lib/html/src/dart2js_Conversions.dart
similarity index 89%
rename from lib/html/src/dart2js_Conversions.dart
rename to sdk/lib/html/src/dart2js_Conversions.dart
index 5ce8806..b5daaf3 100644
--- a/lib/html/src/dart2js_Conversions.dart
+++ b/sdk/lib/html/src/dart2js_Conversions.dart
@@ -27,7 +27,7 @@
 // window as a parameter.
 
 Window _convertNativeToDart_Window(win) {
-  return _DOMWindowCrossFrameImpl._createSafe(win);
+  return _DOMWindowCrossFrame._createSafe(win);
 }
 
 EventTarget _convertNativeToDart_EventTarget(e) {
@@ -35,13 +35,13 @@
   // from a different frame - without a patched prototype - so we cannot
   // rely on Dart type checking.
   if (JS('bool', r'"setInterval" in #', e))
-    return _DOMWindowCrossFrameImpl._createSafe(e);
+    return _DOMWindowCrossFrame._createSafe(e);
   else
     return e;
 }
 
 EventTarget _convertDartToNative_EventTarget(e) {
-  if (e is _DOMWindowCrossFrameImpl) {
+  if (e is _DOMWindowCrossFrame) {
     return e._window;
   } else {
     return e;
@@ -75,9 +75,11 @@
 // We can get rid of this conversion if _TypedImageData implements the fields
 // with native names.
 _convertDartToNative_ImageData(ImageData imageData) {
-  if (imageData is _ImageDataImpl) return imageData;
-  return JS('Object', '{data: #, height: #, width: #}',
-            imageData.data, imageData.height, imageData.width);
+  if (imageData is _TypedImageData) {
+    return JS('Object', '{data: #, height: #, width: #}',
+        imageData.data, imageData.height, imageData.width);
+  }
+  return imageData;
 }
 
 
@@ -136,7 +138,7 @@
     return false;  // number, string.
   }
   if (containsDate(nativeKey)) {
-    throw const NotImplementedException('IDBKey containing Date');
+    throw new UnimplementedError('IDBKey containing Date');
   }
   // TODO: Cache conversion somewhere?
   return nativeKey;
@@ -217,11 +219,11 @@
     if (e is String) return e;
     if (e is Date) {
       // TODO(sra).
-      throw const NotImplementedException('structured clone of Date');
+      throw new UnimplementedError('structured clone of Date');
     }
     if (e is RegExp) {
       // TODO(sra).
-      throw const NotImplementedException('structured clone of RegExp');
+      throw new UnimplementedError('structured clone of RegExp');
     }
 
     // The browser's internal structured cloning algorithm will copy certain
@@ -231,33 +233,15 @@
     // TODO(sra): The JavaScript objects suitable for direct cloning by the
     // structured clone algorithm could be tagged with an private interface.
 
-    if (e is _FileImpl) return e;
-    if (e is File) {
-      throw const NotImplementedException('structured clone of File');
-    }
-
-    if (e is _BlobImpl) return e;
-    if (e is Blob) {
-      throw const NotImplementedException('structured clone of Blob');
-    }
-
-    if (e is _FileListImpl) return e;
+    if (e is File) return e;
+    if (e is Blob) return e;
+    if (e is _FileList) return e;
 
     // TODO(sra): Firefox: How to convert _TypedImageData on the other end?
-    if (e is _ImageDataImpl) return e;
-    if (e is ImageData) {
-      throw const NotImplementedException('structured clone of ImageData');
-    }
+    if (e is ImageData) return e;
+    if (e is ArrayBuffer) return e;
 
-    if (e is _ArrayBufferImpl) return e;
-    if (e is ArrayBuffer) {
-      throw const NotImplementedException('structured clone of ArrayBuffer');
-    }
-
-    if (e is _ArrayBufferViewImpl) return e;
-    if (e is ArrayBufferView) {
-      throw const NotImplementedException('structured clone of ArrayBufferView');
-    }
+    if (e is ArrayBufferView) return e;
 
     if (e is Map) {
       var slot = findSlot(e);
@@ -328,7 +312,7 @@
       return copy;
     }
 
-    throw const NotImplementedException('structured clone of other type');
+    throw new UnimplementedError('structured clone of other type');
   }
 
   var copy = walk(value);
@@ -381,12 +365,12 @@
 
     if (_isJavaScriptDate(e)) {
       // TODO(sra).
-      throw const NotImplementedException('structured clone of Date');
+      throw new UnimplementedError('structured clone of Date');
     }
 
     if (_isJavaScriptRegExp(e)) {
       // TODO(sra).
-      throw const NotImplementedException('structured clone of RegExp');
+      throw new UnimplementedError('structured clone of RegExp');
     }
 
     if (_isJavaScriptSimpleObject(e)) {
diff --git a/lib/html/src/dart2js_DOMImplementation.dart b/sdk/lib/html/src/dart2js_DOMImplementation.dart
similarity index 82%
rename from lib/html/src/dart2js_DOMImplementation.dart
rename to sdk/lib/html/src/dart2js_DOMImplementation.dart
index ca3896f..aca0758 100644
--- a/lib/html/src/dart2js_DOMImplementation.dart
+++ b/sdk/lib/html/src/dart2js_DOMImplementation.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // TODO(vsm): Unify with Dartium version.
-class _DOMWindowCrossFrameImpl implements Window {
+class _DOMWindowCrossFrame implements Window {
   // Private window.  Note, this is a window in another frame, so it
   // cannot be typed as "Window" as its prototype is not patched
   // properly.  Its fields and methods can only be accessed via JavaScript.
@@ -11,9 +11,9 @@
 
   // Fields.
   History get history =>
-    _HistoryCrossFrameImpl._createSafe(JS('History', '#.history', _window));
+    _HistoryCrossFrame._createSafe(JS('History', '#.history', _window));
   Location get location =>
-    _LocationCrossFrameImpl._createSafe(JS('Location', '#.location', _window));
+    _LocationCrossFrame._createSafe(JS('Location', '#.location', _window));
 
   // TODO(vsm): Add frames to navigate subframes.  See 2312.
 
@@ -41,19 +41,19 @@
   }
 
   // Implementation support.
-  _DOMWindowCrossFrameImpl(this._window);
+  _DOMWindowCrossFrame(this._window);
 
   static Window _createSafe(w) {
     if (identical(w, window)) {
       return w;
     } else {
       // TODO(vsm): Cache or implement equality.
-      return new _DOMWindowCrossFrameImpl(w);
+      return new _DOMWindowCrossFrame(w);
     }
   }
 }
 
-class _LocationCrossFrameImpl implements Location {
+class _LocationCrossFrame implements Location {
   // Private location.  Note, this is a location object in another frame, so it
   // cannot be typed as "Location" as its prototype is not patched
   // properly.  Its fields and methods can only be accessed via JavaScript.
@@ -65,19 +65,19 @@
   }
 
   // Implementation support.
-  _LocationCrossFrameImpl(this._location);
+  _LocationCrossFrame(this._location);
 
   static Location _createSafe(location) {
     if (identical(location, window.location)) {
       return location;
     } else {
       // TODO(vsm): Cache or implement equality.
-      return new _LocationCrossFrameImpl(location);
+      return new _LocationCrossFrame(location);
     }
   }
 }
 
-class _HistoryCrossFrameImpl implements History {
+class _HistoryCrossFrame implements History {
   // Private history.  Note, this is a history object in another frame, so it
   // cannot be typed as "History" as its prototype is not patched
   // properly.  Its fields and methods can only be accessed via JavaScript.
@@ -90,14 +90,14 @@
   void go(int distance) => JS('void', '#.go(#)', _history, distance);
 
   // Implementation support.
-  _HistoryCrossFrameImpl(this._history);
+  _HistoryCrossFrame(this._history);
 
   static History _createSafe(h) {
     if (identical(h, window.history)) {
       return h;
     } else {
       // TODO(vsm): Cache or implement equality.
-      return new _HistoryCrossFrameImpl(h);
+      return new _HistoryCrossFrame(h);
     }
   }
 }
diff --git a/lib/html/src/dart2js_FactoryProviders.dart b/sdk/lib/html/src/dart2js_FactoryProviders.dart
similarity index 100%
rename from lib/html/src/dart2js_FactoryProviders.dart
rename to sdk/lib/html/src/dart2js_FactoryProviders.dart
diff --git a/lib/html/src/dart2js_IDBKeyRangeFactoryProvider.dart b/sdk/lib/html/src/dart2js_IDBKeyRangeFactoryProvider.dart
similarity index 73%
rename from lib/html/src/dart2js_IDBKeyRangeFactoryProvider.dart
rename to sdk/lib/html/src/dart2js_IDBKeyRangeFactoryProvider.dart
index 71e9e38..d962f6d 100644
--- a/lib/html/src/dart2js_IDBKeyRangeFactoryProvider.dart
+++ b/sdk/lib/html/src/dart2js_IDBKeyRangeFactoryProvider.dart
@@ -34,16 +34,16 @@
 
   static _translateKey(idbkey) => idbkey;  // TODO: fixme.
 
-  static _IDBKeyRangeImpl _only(cls, value) =>
-       JS('_IDBKeyRangeImpl', '#.only(#)', cls, value);
+  static IDBKeyRange _only(cls, value) =>
+       JS('IDBKeyRange', '#.only(#)', cls, value);
 
-  static _IDBKeyRangeImpl _lowerBound(cls, bound, open) =>
-       JS('_IDBKeyRangeImpl', '#.lowerBound(#, #)', cls, bound, open);
+  static IDBKeyRange _lowerBound(cls, bound, open) =>
+       JS('IDBKeyRange', '#.lowerBound(#, #)', cls, bound, open);
 
-  static _IDBKeyRangeImpl _upperBound(cls, bound, open) =>
-       JS('_IDBKeyRangeImpl', '#.upperBound(#, #)', cls, bound, open);
+  static IDBKeyRange _upperBound(cls, bound, open) =>
+       JS('IDBKeyRange', '#.upperBound(#, #)', cls, bound, open);
 
-  static _IDBKeyRangeImpl _bound(cls, lower, upper, lowerOpen, upperOpen) =>
-       JS('_IDBKeyRangeImpl', '#.bound(#, #, #, #)',
+  static IDBKeyRange _bound(cls, lower, upper, lowerOpen, upperOpen) =>
+       JS('IDBKeyRange', '#.bound(#, #, #, #)',
           cls, lower, upper, lowerOpen, upperOpen);
 }
diff --git a/lib/html/src/dart2js_LocationWrapper.dart b/sdk/lib/html/src/dart2js_LocationWrapper.dart
similarity index 100%
rename from lib/html/src/dart2js_LocationWrapper.dart
rename to sdk/lib/html/src/dart2js_LocationWrapper.dart
diff --git a/lib/html/src/dart2js_MutationObserverSupported.dart b/sdk/lib/html/src/dart2js_MutationObserverSupported.dart
similarity index 100%
rename from lib/html/src/dart2js_MutationObserverSupported.dart
rename to sdk/lib/html/src/dart2js_MutationObserverSupported.dart
diff --git a/lib/html/src/dart2js_TypedArrayFactoryProvider.dart b/sdk/lib/html/src/dart2js_TypedArrayFactoryProvider.dart
similarity index 100%
rename from lib/html/src/dart2js_TypedArrayFactoryProvider.dart
rename to sdk/lib/html/src/dart2js_TypedArrayFactoryProvider.dart
diff --git a/lib/html/src/dartium_FactoryProviders.dart b/sdk/lib/html/src/dartium_FactoryProviders.dart
similarity index 94%
rename from lib/html/src/dartium_FactoryProviders.dart
rename to sdk/lib/html/src/dartium_FactoryProviders.dart
index f31947a..0678689 100644
--- a/lib/html/src/dartium_FactoryProviders.dart
+++ b/sdk/lib/html/src/dartium_FactoryProviders.dart
@@ -13,20 +13,20 @@
 class _IDBKeyRangeFactoryProvider {
 
   static IDBKeyRange createIDBKeyRange_only(/*IDBKey*/ value) =>
-      _IDBKeyRangeImpl.only_(value);
+      IDBKeyRange.only_(value);
 
   static IDBKeyRange createIDBKeyRange_lowerBound(
       /*IDBKey*/ bound, [bool open = false]) =>
-      _IDBKeyRangeImpl.lowerBound_(bound, open);
+      IDBKeyRange.lowerBound_(bound, open);
 
   static IDBKeyRange createIDBKeyRange_upperBound(
       /*IDBKey*/ bound, [bool open = false]) =>
-      _IDBKeyRangeImpl.upperBound_(bound, open);
+      IDBKeyRange.upperBound_(bound, open);
 
   static IDBKeyRange createIDBKeyRange_bound(
       /*IDBKey*/ lower, /*IDBKey*/ upper,
       [bool lowerOpen = false, bool upperOpen = false]) =>
-      _IDBKeyRangeImpl.bound_(lower, upper, lowerOpen, upperOpen);
+      IDBKeyRange.bound_(lower, upper, lowerOpen, upperOpen);
 }
 
 class _TypedArrayFactoryProvider {
@@ -108,5 +108,5 @@
 }
 
 class _TextFactoryProvider {
-  static Text createText(String data) => _document.$dom_createTextNode(data);
+  static Text createText(String data) => document.$dom_createTextNode(data);
 }
diff --git a/lib/html/src/dartium_MutationObserverSupported.dart b/sdk/lib/html/src/dartium_MutationObserverSupported.dart
similarity index 100%
rename from lib/html/src/dartium_MutationObserverSupported.dart
rename to sdk/lib/html/src/dartium_MutationObserverSupported.dart
diff --git a/lib/html/src/native_DOMImplementation.dart b/sdk/lib/html/src/native_DOMImplementation.dart
similarity index 86%
rename from lib/html/src/native_DOMImplementation.dart
rename to sdk/lib/html/src/native_DOMImplementation.dart
index d45e7e4..206ec0f 100644
--- a/lib/html/src/native_DOMImplementation.dart
+++ b/sdk/lib/html/src/native_DOMImplementation.dart
@@ -27,7 +27,7 @@
 
   static Map createMap() => {};
 
-  static makeNotImplementedException(String fileName, int lineNo) {
+  static makeUnimplementedError(String fileName, int lineNo) {
     return new UnsupportedError('[info: $fileName:$lineNo]');
   }
 
@@ -39,14 +39,14 @@
 }
 
 class _NPObject extends NativeFieldWrapperClass1 {
-  _NPObject();
+  _NPObject.internal();
   static _NPObject retrieve(String key) native "NPObject_retrieve";
   property(String propertyName) native "NPObject_property";
   invoke(String methodName, [List args = null]) native "NPObject_invoke";
 }
 
-class _DOMWindowCrossFrameImpl extends NativeFieldWrapperClass1 implements Window {
-  _DOMWindowCrossFrameImpl();
+class _DOMWindowCrossFrame extends NativeFieldWrapperClass1 implements Window {
+  _DOMWindowCrossFrame.internal();
 
   // Fields.
   History get history() native "DOMWindow_history_cross_frame_Getter";
@@ -67,8 +67,8 @@
   String get typeName => "DOMWindow";
 }
 
-class _HistoryCrossFrameImpl extends NativeFieldWrapperClass1 implements History {
-  _HistoryCrossFrameImpl();
+class _HistoryCrossFrame extends NativeFieldWrapperClass1 implements History {
+  _HistoryCrossFrame.internal();
 
   // Methods.
   void back() native "History_back_Callback";
@@ -79,8 +79,8 @@
   String get typeName => "History";
 }
 
-class _LocationCrossFrameImpl extends NativeFieldWrapperClass1 implements Location {
-  _LocationCrossFrameImpl();
+class _LocationCrossFrame extends NativeFieldWrapperClass1 implements Location {
+  _LocationCrossFrame.internal();
 
   // Fields.
   void set href(String) native "Location_href_Setter";
@@ -89,8 +89,8 @@
   String get typeName => "Location";
 }
 
-class _DOMStringMapImpl extends NativeFieldWrapperClass1 implements Map<String, String> {
-  _DOMStringMapImpl();
+class _DOMStringMap extends NativeFieldWrapperClass1 implements Map<String, String> {
+  _DOMStringMap.internal();
 
   bool containsValue(String value) => Maps.containsValue(this, value);
   bool containsKey(String key) native "DOMStringMap_containsKey_Callback";
diff --git a/lib/html/src/native_DOMPublic.dart b/sdk/lib/html/src/native_DOMPublic.dart
similarity index 100%
rename from lib/html/src/native_DOMPublic.dart
rename to sdk/lib/html/src/native_DOMPublic.dart
diff --git a/lib/html/src/shared_FactoryProviders.dart b/sdk/lib/html/src/shared_FactoryProviders.dart
similarity index 92%
rename from lib/html/src/shared_FactoryProviders.dart
rename to sdk/lib/html/src/shared_FactoryProviders.dart
index 6ae9b9ff..045b43c 100644
--- a/lib/html/src/shared_FactoryProviders.dart
+++ b/sdk/lib/html/src/shared_FactoryProviders.dart
@@ -5,7 +5,7 @@
 class _CustomEventFactoryProvider {
   static CustomEvent createCustomEvent(String type, [bool canBubble = true,
       bool cancelable = true, Object detail = null]) {
-    final _CustomEventImpl e = _document.$dom_createEvent("CustomEvent");
+    final CustomEvent e = document.$dom_createEvent("CustomEvent");
     e.$dom_initCustomEvent(type, canBubble, cancelable, detail);
     return e;
   }
@@ -14,7 +14,7 @@
 class _EventFactoryProvider {
   static Event createEvent(String type, [bool canBubble = true,
       bool cancelable = true]) {
-    final _EventImpl e = _document.$dom_createEvent("Event");
+    final Event e = document.$dom_createEvent("Event");
     e.$dom_initEvent(type, canBubble, cancelable);
     return e;
   }
@@ -26,7 +26,7 @@
       [bool canBubble = true, bool cancelable = true, bool ctrlKey = false,
       bool altKey = false, bool shiftKey = false, bool metaKey = false,
       EventTarget relatedTarget = null]) {
-    final e = _document.$dom_createEvent("MouseEvent");
+    final e = document.$dom_createEvent("MouseEvent");
     e.$dom_initMouseEvent(type, canBubble, cancelable, view, detail,
         screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
         button, relatedTarget);
@@ -84,7 +84,7 @@
 class _SVGElementFactoryProvider {
   static SVGElement createSVGElement_tag(String tag) {
     final Element temp =
-      _document.$dom_createElementNS("http://www.w3.org/2000/svg", tag);
+      document.$dom_createElementNS("http://www.w3.org/2000/svg", tag);
     return temp;
   }
 
diff --git a/lib/html/templates/callback.darttemplate b/sdk/lib/html/templates/callback.darttemplate
similarity index 100%
rename from lib/html/templates/callback.darttemplate
rename to sdk/lib/html/templates/callback.darttemplate
diff --git a/lib/html/templates/dart2js_impl.darttemplate b/sdk/lib/html/templates/dart2js_impl.darttemplate
similarity index 73%
rename from lib/html/templates/dart2js_impl.darttemplate
rename to sdk/lib/html/templates/dart2js_impl.darttemplate
index f7a2d29..adf1cf1 100644
--- a/lib/html/templates/dart2js_impl.darttemplate
+++ b/sdk/lib/html/templates/dart2js_impl.darttemplate
@@ -1,3 +1,4 @@
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS}
diff --git a/lib/html/templates/html/dart2js/factoryprovider.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider.darttemplate
similarity index 100%
rename from lib/html/templates/html/dart2js/factoryprovider.darttemplate
rename to sdk/lib/html/templates/html/dart2js/factoryprovider.darttemplate
diff --git a/lib/html/templates/html/dart2js/factoryprovider_AudioElement.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_AudioElement.darttemplate
similarity index 100%
rename from lib/html/templates/html/dart2js/factoryprovider_AudioElement.darttemplate
rename to sdk/lib/html/templates/html/dart2js/factoryprovider_AudioElement.darttemplate
diff --git a/lib/html/templates/html/dart2js/factoryprovider_Blob.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_Blob.darttemplate
similarity index 100%
rename from lib/html/templates/html/dart2js/factoryprovider_Blob.darttemplate
rename to sdk/lib/html/templates/html/dart2js/factoryprovider_Blob.darttemplate
diff --git a/lib/html/templates/html/dart2js/factoryprovider_CSSMatrix.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_CSSMatrix.darttemplate
similarity index 100%
rename from lib/html/templates/html/dart2js/factoryprovider_CSSMatrix.darttemplate
rename to sdk/lib/html/templates/html/dart2js/factoryprovider_CSSMatrix.darttemplate
diff --git a/lib/html/templates/html/dart2js/factoryprovider_DataView.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_DataView.darttemplate
similarity index 100%
rename from lib/html/templates/html/dart2js/factoryprovider_DataView.darttemplate
rename to sdk/lib/html/templates/html/dart2js/factoryprovider_DataView.darttemplate
diff --git a/lib/html/templates/html/dart2js/factoryprovider_FormData.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_FormData.darttemplate
similarity index 100%
rename from lib/html/templates/html/dart2js/factoryprovider_FormData.darttemplate
rename to sdk/lib/html/templates/html/dart2js/factoryprovider_FormData.darttemplate
diff --git a/lib/html/templates/html/dart2js/factoryprovider_HttpRequest.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_HttpRequest.darttemplate
similarity index 92%
rename from lib/html/templates/html/dart2js/factoryprovider_HttpRequest.darttemplate
rename to sdk/lib/html/templates/html/dart2js/factoryprovider_HttpRequest.darttemplate
index 1d35b61..aae0b21 100644
--- a/lib/html/templates/html/dart2js/factoryprovider_HttpRequest.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/factoryprovider_HttpRequest.darttemplate
@@ -4,7 +4,7 @@
 
 class $FACTORYPROVIDER {
   static HttpRequest createHttpRequest() =>
-      JS('HttpRequest', 'new XMLHttpRequest();');
+      JS('HttpRequest', 'new XMLHttpRequest()');
 
   static HttpRequest createHttpRequest_get(String url,
       onSuccess(HttpRequest request)) =>
diff --git a/lib/html/templates/html/dart2js/factoryprovider_MutationObserver.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_MutationObserver.darttemplate
similarity index 100%
rename from lib/html/templates/html/dart2js/factoryprovider_MutationObserver.darttemplate
rename to sdk/lib/html/templates/html/dart2js/factoryprovider_MutationObserver.darttemplate
diff --git a/lib/html/templates/html/dart2js/factoryprovider_OptionElement.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_OptionElement.darttemplate
similarity index 100%
rename from lib/html/templates/html/dart2js/factoryprovider_OptionElement.darttemplate
rename to sdk/lib/html/templates/html/dart2js/factoryprovider_OptionElement.darttemplate
diff --git a/lib/html/templates/html/dart2js/factoryprovider_ShadowRoot.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_ShadowRoot.darttemplate
similarity index 100%
rename from lib/html/templates/html/dart2js/factoryprovider_ShadowRoot.darttemplate
rename to sdk/lib/html/templates/html/dart2js/factoryprovider_ShadowRoot.darttemplate
diff --git a/lib/html/templates/html/dart2js/factoryprovider_SharedWorker.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_SharedWorker.darttemplate
similarity index 100%
rename from lib/html/templates/html/dart2js/factoryprovider_SharedWorker.darttemplate
rename to sdk/lib/html/templates/html/dart2js/factoryprovider_SharedWorker.darttemplate
diff --git a/lib/html/templates/html/dart2js/factoryprovider_TextTrackCue.darttemplate b/sdk/lib/html/templates/html/dart2js/factoryprovider_TextTrackCue.darttemplate
similarity index 100%
rename from lib/html/templates/html/dart2js/factoryprovider_TextTrackCue.darttemplate
rename to sdk/lib/html/templates/html/dart2js/factoryprovider_TextTrackCue.darttemplate
diff --git a/lib/html/templates/html/dart2js/html_dart2js.darttemplate b/sdk/lib/html/templates/html/dart2js/html_dart2js.darttemplate
similarity index 85%
rename from lib/html/templates/html/dart2js/html_dart2js.darttemplate
rename to sdk/lib/html/templates/html/dart2js/html_dart2js.darttemplate
index fe44af3..cfd1e67 100644
--- a/lib/html/templates/html/dart2js/html_dart2js.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/html_dart2js.darttemplate
@@ -14,6 +14,7 @@
 
 part '$AUXILIARY_DIR/CrossFrameTypes.dart';
 part '$AUXILIARY_DIR/EventListener.dart';
+part '$AUXILIARY_DIR/KeyCode.dart';
 part '$AUXILIARY_DIR/KeyLocation.dart';
 part '$AUXILIARY_DIR/KeyName.dart';
 part '$AUXILIARY_DIR/ReadyState.dart';
@@ -38,18 +39,15 @@
 
 
 LocalWindow get window => JS('LocalWindow', 'window');
-_LocalWindowImpl get _window => JS('_LocalWindowImpl', 'window');
 
 Document get document => JS('Document', 'document');
 
-_DocumentImpl get _document => JS('_DocumentImpl', 'document');
-
-Element query(String selector) => _document.query(selector);
-List<Element> queryAll(String selector) => _document.queryAll(selector);
+Element query(String selector) => document.query(selector);
+List<Element> queryAll(String selector) => document.queryAll(selector);
 
 // Workaround for tags like <cite> that lack their own Element subclass --
 // Dart issue 1990.
-class _HTMLElementImpl extends _ElementImpl native "*HTMLElement" {
+class HTMLElement extends Element native "*HTMLElement" {
 }
 
 // Support for Send/ReceivePortSync.
diff --git a/lib/html/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate
similarity index 100%
rename from lib/html/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate
rename to sdk/lib/html/templates/html/dart2js/impl_AudioBufferSourceNode.darttemplate
diff --git a/lib/html/templates/html/dart2js/impl_Console.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_Console.darttemplate
similarity index 94%
rename from lib/html/templates/html/dart2js/impl_Console.darttemplate
rename to sdk/lib/html/templates/html/dart2js/impl_Console.darttemplate
index 137f62a..751c4ce 100644
--- a/lib/html/templates/html/dart2js/impl_Console.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_Console.darttemplate
@@ -4,7 +4,6 @@
 
 class $CLASSNAME
     // Console is sometimes a singleton bag-of-properties without a prototype.
-    implements Console
     native "=(typeof console == 'undefined' ? {} : console)" {
 $!MEMBERS
 }
diff --git a/lib/html/templates/html/dart2js/impl_ElementEvents.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_ElementEvents.darttemplate
similarity index 87%
rename from lib/html/templates/html/dart2js/impl_ElementEvents.darttemplate
rename to sdk/lib/html/templates/html/dart2js/impl_ElementEvents.darttemplate
index 41de3d7..1f33377 100644
--- a/lib/html/templates/html/dart2js/impl_ElementEvents.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_ElementEvents.darttemplate
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-class $CLASSNAME extends $SUPER implements $INTERFACE {
-  $CLASSNAME(_ptr) : super(_ptr);
+class $CLASSNAME extends $SUPER {
+  $CLASSNAME(EventTarget _ptr) : super(_ptr);
 $!MEMBERS
   EventListenerList get mouseWheel {
     if (JS('bool', '#.onwheel !== undefined', _ptr)) {
diff --git a/lib/html/templates/html/dart2js/impl_IDBDatabase.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_IDBDatabase.darttemplate
similarity index 79%
rename from lib/html/templates/html/dart2js/impl_IDBDatabase.darttemplate
rename to sdk/lib/html/templates/html/dart2js/impl_IDBDatabase.darttemplate
index 1817667..0082f70 100644
--- a/lib/html/templates/html/dart2js/impl_IDBDatabase.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_IDBDatabase.darttemplate
@@ -4,7 +4,7 @@
 
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
-  _IDBTransactionImpl transaction(storeName_OR_storeNames, String mode) {
+  IDBTransaction transaction(storeName_OR_storeNames, String mode) {
     if (mode != 'readonly' && mode != 'readwrite') {
       throw new ArgumentError(mode);
     }
@@ -29,24 +29,24 @@
     return txn;
   }
 
-  static _IDBTransactionImpl _transaction_string_mode($CLASSNAME db, stores, mode) {
+  static IDBTransaction _transaction_string_mode($CLASSNAME db, stores, mode) {
     return db._transaction(stores, mode);
   }
 
-  static _IDBTransactionImpl _transaction_numeric_mode($CLASSNAME db, stores, mode) {
+  static IDBTransaction _transaction_numeric_mode($CLASSNAME db, stores, mode) {
     int intMode;
     if (mode == 'readonly') intMode = IDBTransaction.READ_ONLY;
     if (mode == 'readwrite') intMode = IDBTransaction.READ_WRITE;
     return db._transaction(stores, intMode);
   }
 
-  _IDBTransactionImpl _transaction(stores, mode) native 'transaction';
+  IDBTransaction _transaction(stores, mode) native 'transaction';
 
   static bool _hasNumericMode(txn) =>
       JS('bool', 'typeof(#.mode) === "number"', txn);
 
 $!MEMBERS}
 
-// TODO(sra): This should be a static member of _IDBTransactionImpl but dart2js
+// TODO(sra): This should be a static member of IDBTransaction but dart2js
 // can't handle that.  Move it back after dart2js is completely done.
 var _transaction_fn;  // Assigned one of the static methods.
diff --git a/lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate
similarity index 78%
rename from lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate
rename to sdk/lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate
index bbc27e1..117e0b7 100644
--- a/lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_LocalWindow.darttemplate
@@ -4,7 +4,7 @@
 
 class $CLASSNAME$EXTENDS$IMPLEMENTS native "@*DOMWindow" {
 
-  _DocumentImpl get document => JS('_DocumentImpl', '#.document', this);
+  Document get document => JS('Document', '#.document', this);
 
   Window _open2(url, name) => JS('Window', '#.open(#,#)', this, url, name);
 
@@ -13,28 +13,18 @@
 
   Window open(String url, String name, [String options]) {
     if (options == null) {
-      return _DOMWindowCrossFrameImpl._createSafe(_open2(url, name));
+      return _DOMWindowCrossFrame._createSafe(_open2(url, name));
     } else {
-      return _DOMWindowCrossFrameImpl._createSafe(_open3(url, name, options));
+      return _DOMWindowCrossFrame._createSafe(_open3(url, name, options));
     }
   }
 
   // API level getter and setter for Location.
   // TODO: The cross domain safe wrapper can be inserted here or folded into
   // _LocationWrapper.
-  LocalLocation get location => _get_location();
-
-  // TODO: consider forcing users to do: window.location.assign('string').
-  /**
-   * Sets the window's location, which causes the browser to navigate to the new
-   * location. [value] may be a Location object or a string.
-   */
-  void set location(value) => _set_location(value);
-
-  // Firefox work-around for Location.  The Firefox location object cannot be
-  // made to behave like a Dart object so must be wrapped.
-
-  LocalLocation _get_location() {
+  LocalLocation get location() {
+    // Firefox work-around for Location.  The Firefox location object cannot be
+    // made to behave like a Dart object so must be wrapped.
     var result = _location;
     if (_isDartLocation(result)) return result;  // e.g. on Chrome.
     if (null == _location_wrapper) {
@@ -43,7 +33,12 @@
     return _location_wrapper;
   }
 
-  void _set_location(value) {
+  // TODO: consider forcing users to do: window.location.assign('string').
+  /**
+   * Sets the window's location, which causes the browser to navigate to the new
+   * location. [value] may be a Location object or a string.
+   */
+  void set location(value) {
     if (value is _LocationWrapper) {
       _location = value._ptr;
     } else {
@@ -72,7 +67,11 @@
     }
   }
 
-
+  /**
+   * Executes a [callback] after the next batch of browser layout measurements
+   * has completed or would have completed if any browser layout measurements
+   * had been scheduled.
+   */
   void requestLayoutFrame(TimeoutHandler callback) {
     _addMeasurementFrameCallback(callback);
   }
@@ -120,33 +119,29 @@
        this);
   }
 
-
-  _IDBFactoryImpl get indexedDB => _get_indexedDB();
-
-  _IDBFactoryImpl _get_indexedDB() =>
-      JS('_IDBFactoryImpl',
+  IDBFactory get indexedDB() =>
+      JS('IDBFactory',
          '#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
          this, this, this);
 
-  // TODO(kasperl): Document these.
-  lookupPort(String name) {
+  /**
+   * Lookup a port by its [name].  Return null if no port is
+   * registered under [name].
+   */
+  SendPortSync lookupPort(String name) {
     var port = JSON.parse(localStorage['dart-port:$name']);
     return _deserialize(port);
   }
 
-  registerPort(String name, var port) {
+  /**
+   * Register a [port] on this window under the given [name].  This
+   * port may be retrieved by any isolate (or JavaScript script)
+   * running in this window.
+   */
+  void registerPort(String name, var port) {
     var serialized = _serialize(port);
     localStorage['dart-port:$name'] = JSON.stringify(serialized);
   }
 
-  String createObjectUrl(object) =>
-      JS('String',
-         '(window.URL || window.webkitURL).createObjectURL(#)', object);
-
-  void revokeObjectUrl(String objectUrl) {
-    JS('void',
-       '(window.URL || window.webkitURL).revokeObjectURL(#)', objectUrl);
-  }
-
 $!MEMBERS
 }
diff --git a/lib/html/templates/html/dart2js/impl_MouseEvent.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_MouseEvent.darttemplate
similarity index 66%
rename from lib/html/templates/html/dart2js/impl_MouseEvent.darttemplate
rename to sdk/lib/html/templates/html/dart2js/impl_MouseEvent.darttemplate
index 62aaa4e..cda9bda 100644
--- a/lib/html/templates/html/dart2js/impl_MouseEvent.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_MouseEvent.darttemplate
@@ -3,6 +3,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+  factory $CLASSNAME(String type, Window view, int detail, int screenX,
+      int screenY, int clientX, int clientY, int button, [bool canBubble = true,
+      bool cancelable = true, bool ctrlKey = false, bool altKey = false,
+      bool shiftKey = false, bool metaKey = false,
+      EventTarget relatedTarget = null]) =>
+      _$(CLASSNAME)FactoryProvider.create$CLASSNAME(
+          type, view, detail, screenX, screenY,
+          clientX, clientY, button, canBubble, cancelable,
+          ctrlKey, altKey, shiftKey, metaKey,
+          relatedTarget);
 $!MEMBERS
 
   int get offsetX {
diff --git a/lib/html/templates/html/dart2js/impl_SelectElement.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_SelectElement.darttemplate
similarity index 100%
rename from lib/html/templates/html/dart2js/impl_SelectElement.darttemplate
rename to sdk/lib/html/templates/html/dart2js/impl_SelectElement.darttemplate
diff --git a/lib/html/templates/html/dart2js/impl_TableElement.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_TableElement.darttemplate
similarity index 84%
rename from lib/html/templates/html/dart2js/impl_TableElement.darttemplate
rename to sdk/lib/html/templates/html/dart2js/impl_TableElement.darttemplate
index 5a9a49b..aa8e769 100644
--- a/lib/html/templates/html/dart2js/impl_TableElement.darttemplate
+++ b/sdk/lib/html/templates/html/dart2js/impl_TableElement.darttemplate
@@ -5,7 +5,7 @@
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 
-  _ElementImpl createTBody() {
+  Element createTBody() {
     if (JS('bool', '!!#.createTBody', this)) {
       return this._createTBody();
     }
@@ -14,5 +14,5 @@
     return tbody;
   }
 
-  _ElementImpl _createTBody() native 'createTBody';
+  Element _createTBody() native 'createTBody';
 }
diff --git a/sdk/lib/html/templates/html/dart2js/impl_Url.darttemplate b/sdk/lib/html/templates/html/dart2js/impl_Url.darttemplate
new file mode 100644
index 0000000..66a735c
--- /dev/null
+++ b/sdk/lib/html/templates/html/dart2js/impl_Url.darttemplate
@@ -0,0 +1,16 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+
+  static String createObjectUrl(blob_OR_source_OR_stream) =>
+      JS('String',
+         '(window.URL || window.webkitURL).createObjectURL(#)',
+         blob_OR_source_OR_stream);
+
+  static void revokeObjectUrl(String objectUrl) =>
+      JS('void',
+         '(window.URL || window.webkitURL).revokeObjectURL(#)', objectUrl);
+$!MEMBERS
+}
diff --git a/lib/html/templates/html/dartium/cpp_callback_header.template b/sdk/lib/html/templates/html/dartium/cpp_callback_header.template
similarity index 100%
rename from lib/html/templates/html/dartium/cpp_callback_header.template
rename to sdk/lib/html/templates/html/dartium/cpp_callback_header.template
diff --git a/lib/html/templates/html/dartium/cpp_callback_implementation.template b/sdk/lib/html/templates/html/dartium/cpp_callback_implementation.template
similarity index 100%
rename from lib/html/templates/html/dartium/cpp_callback_implementation.template
rename to sdk/lib/html/templates/html/dartium/cpp_callback_implementation.template
diff --git a/lib/html/templates/html/dartium/cpp_derived_sources.template b/sdk/lib/html/templates/html/dartium/cpp_derived_sources.template
similarity index 100%
rename from lib/html/templates/html/dartium/cpp_derived_sources.template
rename to sdk/lib/html/templates/html/dartium/cpp_derived_sources.template
diff --git a/lib/html/templates/html/dartium/cpp_header.template b/sdk/lib/html/templates/html/dartium/cpp_header.template
similarity index 100%
rename from lib/html/templates/html/dartium/cpp_header.template
rename to sdk/lib/html/templates/html/dartium/cpp_header.template
diff --git a/lib/html/templates/html/dartium/cpp_implementation.template b/sdk/lib/html/templates/html/dartium/cpp_implementation.template
similarity index 100%
rename from lib/html/templates/html/dartium/cpp_implementation.template
rename to sdk/lib/html/templates/html/dartium/cpp_implementation.template
diff --git a/lib/html/templates/html/dartium/cpp_resolver.template b/sdk/lib/html/templates/html/dartium/cpp_resolver.template
similarity index 100%
rename from lib/html/templates/html/dartium/cpp_resolver.template
rename to sdk/lib/html/templates/html/dartium/cpp_resolver.template
diff --git a/lib/html/templates/html/dartium/dart_implementation.darttemplate b/sdk/lib/html/templates/html/dartium/dart_implementation.darttemplate
similarity index 93%
rename from lib/html/templates/html/dartium/dart_implementation.darttemplate
rename to sdk/lib/html/templates/html/dartium/dart_implementation.darttemplate
index 885414fa..bbecfdb 100644
--- a/lib/html/templates/html/dartium/dart_implementation.darttemplate
+++ b/sdk/lib/html/templates/html/dartium/dart_implementation.darttemplate
@@ -4,6 +4,7 @@
 
 // WARNING: Do not edit - generated code.
 
+/// @domName $DOMNAME
 class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
 }
diff --git a/lib/html/templates/html/dartium/factoryprovider.darttemplate b/sdk/lib/html/templates/html/dartium/factoryprovider.darttemplate
similarity index 100%
rename from lib/html/templates/html/dartium/factoryprovider.darttemplate
rename to sdk/lib/html/templates/html/dartium/factoryprovider.darttemplate
diff --git a/lib/html/templates/html/dartium/factoryprovider_HttpRequest.darttemplate b/sdk/lib/html/templates/html/dartium/factoryprovider_HttpRequest.darttemplate
similarity index 100%
rename from lib/html/templates/html/dartium/factoryprovider_HttpRequest.darttemplate
rename to sdk/lib/html/templates/html/dartium/factoryprovider_HttpRequest.darttemplate
diff --git a/lib/html/templates/html/dartium/html_dartium.darttemplate b/sdk/lib/html/templates/html/dartium/html_dartium.darttemplate
similarity index 88%
rename from lib/html/templates/html/dartium/html_dartium.darttemplate
rename to sdk/lib/html/templates/html/dartium/html_dartium.darttemplate
index 4225d60..eb16636 100644
--- a/lib/html/templates/html/dartium/html_dartium.darttemplate
+++ b/sdk/lib/html/templates/html/dartium/html_dartium.darttemplate
@@ -15,6 +15,7 @@
 
 part '$AUXILIARY_DIR/CrossFrameTypes.dart';
 part '$AUXILIARY_DIR/EventListener.dart';
+part '$AUXILIARY_DIR/KeyCode.dart';
 part '$AUXILIARY_DIR/KeyLocation.dart';
 part '$AUXILIARY_DIR/KeyName.dart';
 part '$AUXILIARY_DIR/ReadyState.dart';
@@ -35,6 +36,7 @@
 part '$AUXILIARY_DIR/native_DOMPublic.dart';
 part '$AUXILIARY_DIR/native_DOMImplementation.dart';
 
+// FIXME (blois): Rename to _window (ditto __document).
 LocalWindow __window;
 
 LocalWindow get window {
@@ -45,22 +47,19 @@
   return __window;
 }
 
-LocalWindow get _window native "Utils_window";
-
 Document __document;
 
 Document get document {
   if (__document != null) {
     return __document;
   }
-  __document = _document;
+  __document = window.document;
   return __document;
 }
 
-Document get _document => _window.document;
 
-Element query(String selector) => _document.query(selector);
-List<Element> queryAll(String selector) => _document.queryAll(selector);
+Element query(String selector) => document.query(selector);
+List<Element> queryAll(String selector) => document.queryAll(selector);
 
 int _getNewIsolateId() => _Utils._getNewIsolateId();
 
diff --git a/sdk/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate b/sdk/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate
new file mode 100644
index 0000000..0ce4dcf
--- /dev/null
+++ b/sdk/lib/html/templates/html/dartium/impl_LocalWindow.darttemplate
@@ -0,0 +1,36 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+
+  /**
+   * Executes a [callback] after the next batch of browser layout measurements
+   * has completed or would have completed if any browser layout measurements
+   * had been scheduled.
+   */
+  void requestLayoutFrame(TimeoutHandler callback) {
+    _addMeasurementFrameCallback(callback);
+  }
+
+  /**
+   * Lookup a port by its [name].  Return null if no port is
+   * registered under [name].
+   */
+  lookupPort(String name) {
+    var port = JSON.parse(localStorage['dart-port:$name']);
+    return _deserialize(port);
+  }
+
+  /**
+   * Register a [port] on this window under the given [name].  This
+   * port may be retrieved by any isolate (or JavaScript script)
+   * running in this window.
+   */
+  registerPort(String name, var port) {
+    var serialized = _serialize(port);
+    localStorage['dart-port:$name'] = JSON.stringify(serialized);
+  }
+
+$!MEMBERS
+}
diff --git a/sdk/lib/html/templates/html/dartium/impl_MouseEvent.darttemplate b/sdk/lib/html/templates/html/dartium/impl_MouseEvent.darttemplate
new file mode 100644
index 0000000..7be8ca8
--- /dev/null
+++ b/sdk/lib/html/templates/html/dartium/impl_MouseEvent.darttemplate
@@ -0,0 +1,19 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+  factory $CLASSNAME(String type, Window view, int detail, int screenX,
+      int screenY, int clientX, int clientY, int button, [bool canBubble = true,
+      bool cancelable = true, bool ctrlKey = false, bool altKey = false,
+      bool shiftKey = false, bool metaKey = false,
+      EventTarget relatedTarget = null]) =>
+      _$(CLASSNAME)FactoryProvider.create$CLASSNAME(
+          type, view, detail, screenX, screenY,
+          clientX, clientY, button, canBubble, cancelable,
+          ctrlKey, altKey, shiftKey, metaKey,
+          relatedTarget);
+$!MEMBERS
+}
diff --git a/lib/html/templates/html/impl/factoryprovider_Elements.darttemplate b/sdk/lib/html/templates/html/impl/factoryprovider_Elements.darttemplate
similarity index 100%
rename from lib/html/templates/html/impl/factoryprovider_Elements.darttemplate
rename to sdk/lib/html/templates/html/impl/factoryprovider_Elements.darttemplate
diff --git a/sdk/lib/html/templates/html/impl/impl_AudioContext.darttemplate b/sdk/lib/html/templates/html/impl/impl_AudioContext.darttemplate
new file mode 100644
index 0000000..3813d0e
--- /dev/null
+++ b/sdk/lib/html/templates/html/impl/impl_AudioContext.darttemplate
@@ -0,0 +1,33 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+  factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.create$CLASSNAME();
+$!MEMBERS
+$if DART2JS
+  GainNode createGain() {
+    if (JS('bool', '#.createGain !== undefined', this)) {
+      return JS('GainNode', '#.createGain()', this);
+    } else {
+      return JS('GainNode', '#.createGainNode()', this);
+    }
+  }
+
+  ScriptProcessorNode createScriptProcessor(int bufferSize,
+      [int numberOfInputChannels, int numberOfOutputChannels]) {
+    var function = JS('dynamic', '#.createScriptProcessor || '
+        '#.createJavaScriptNode', this, this);
+    if (?numberOfOutputChannels) {
+      return JS('ScriptProcessorNode', '#.call(#, #, #, #)', function, this,
+          bufferSize, numberOfInputChannels, numberOfOutputChannels);
+    } else if (?numberOfInputChannels) {
+      return JS('ScriptProcessorNode', '#.call(#, #, #)', function, this,
+          bufferSize, numberOfInputChannels);
+    } else {
+      return JS('ScriptProcessorNode', '#.call(#, #)', function, this,
+          bufferSize);
+    }
+  }
+$endif
+}
diff --git a/lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate b/sdk/lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
similarity index 99%
rename from lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
index d723977..adb8b73 100644
--- a/lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
@@ -20,6 +20,9 @@
 }
 
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+  factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.create$CLASSNAME();
+  factory $CLASSNAME.css(String css) =>
+      _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)_css(css);
 
 $!MEMBERS
 
diff --git a/lib/html/templates/html/impl/impl_CanvasElement.darttemplate b/sdk/lib/html/templates/html/impl/impl_CanvasElement.darttemplate
similarity index 80%
rename from lib/html/templates/html/impl/impl_CanvasElement.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_CanvasElement.darttemplate
index 7d9d2bf..dba7b01 100644
--- a/lib/html/templates/html/impl/impl_CanvasElement.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_CanvasElement.darttemplate
@@ -5,5 +5,8 @@
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 
+$if DART2JS
+  CanvasRenderingContext getContext(String contextId) native;
+$endif
   CanvasRenderingContext2D get context2d => getContext('2d');
 }
diff --git a/lib/html/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate b/sdk/lib/html/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
similarity index 60%
rename from lib/html/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
index 98a80fd..1198d89 100644
--- a/lib/html/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
@@ -5,18 +5,38 @@
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 $!MEMBERS
 
+  /**
+   * Sets the color used inside shapes.
+   * [r], [g], [b] are 0-255, [a] is 0-1.
+   */
   void setFillColorRgb(int r, int g, int b, [num a = 1]) {
     this.fillStyle = 'rgba($r, $g, $b, $a)';
   }
 
+  /**
+   * Sets the color used inside shapes.
+   * [h] is in degrees, 0-360.
+   * [s], [l] are in percent, 0-100.
+   * [a] is 0-1.
+   */
   void setFillColorHsl(int h, num s, num l, [num a = 1]) {
     this.fillStyle = 'hsla($h, $s%, $l%, $a)';
   }
 
+  /**
+   * Sets the color used for stroking shapes.
+   * [r], [g], [b] are 0-255, [a] is 0-1.
+   */
   void setStrokeColorRgb(int r, int g, int b, [num a = 1]) {
     this.strokeStyle = 'rgba($r, $g, $b, $a)';
   }
 
+  /**
+   * Sets the color used for stroking shapes.
+   * [h] is in degrees, 0-360.
+   * [s], [l] are in percent, 0-100.
+   * [a] is 0-1.
+   */
   void setStrokeColorHsl(int h, num s, num l, [num a = 1]) {
     this.strokeStyle = 'hsla($h, $s%, $l%, $a)';
   }
diff --git a/sdk/lib/html/templates/html/impl/impl_CustomEvent.darttemplate b/sdk/lib/html/templates/html/impl/impl_CustomEvent.darttemplate
new file mode 100644
index 0000000..d76c038
--- /dev/null
+++ b/sdk/lib/html/templates/html/impl/impl_CustomEvent.darttemplate
@@ -0,0 +1,12 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+  factory $CLASSNAME(String type, [bool canBubble = true, bool cancelable = true,
+      Object detail]) => _$(CLASSNAME)FactoryProvider.create$CLASSNAME(
+      type, canBubble, cancelable, detail);
+$!MEMBERS
+}
diff --git a/lib/html/templates/html/impl/impl_Document.darttemplate b/sdk/lib/html/templates/html/impl/impl_Document.darttemplate
similarity index 94%
rename from lib/html/templates/html/impl/impl_Document.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_Document.darttemplate
index 77bd731..5469b16 100644
--- a/lib/html/templates/html/impl/impl_Document.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Document.darttemplate
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-class $CLASSNAME extends _NodeImpl implements Document
+class $CLASSNAME extends Node
 $if DART2JS
     native "*HTMLDocument"
 $endif
@@ -11,7 +11,7 @@
 $!MEMBERS
   // TODO(jacobr): implement all Element methods not on Document.
 
-  _ElementImpl query(String selectors) {
+  Element query(String selectors) {
     // It is fine for our RegExp to detect element id query selectors to have
     // false negatives but not false positives.
     if (const RegExp("^#[_a-zA-Z]\\w*\$").hasMatch(selectors)) {
diff --git a/lib/html/templates/html/impl/impl_DocumentFragment.darttemplate b/sdk/lib/html/templates/html/impl/impl_DocumentFragment.darttemplate
similarity index 94%
rename from lib/html/templates/html/impl/impl_DocumentFragment.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_DocumentFragment.darttemplate
index c9dd6b7..d9e967d 100644
--- a/lib/html/templates/html/impl/impl_DocumentFragment.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_DocumentFragment.darttemplate
@@ -55,7 +55,7 @@
   }
 
   void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
-    throw const NotImplementedException();
+    throw new UnimplementedError();
   }
 
   void removeRange(int start, int rangeLength) {
@@ -63,7 +63,7 @@
   }
 
   void insertRange(int start, int rangeLength, [initialValue = null]) {
-    throw const NotImplementedException();
+    throw new UnimplementedError();
   }
 
   void clear() {
@@ -116,8 +116,8 @@
   const EmptyElementRect();
 }
 
-class _FrozenCSSClassSet extends _CssClassSet {
-  _FrozenCSSClassSet() : super(null);
+class _FrozenCssClassSet extends _CssClassSet {
+  _FrozenCssClassSet() : super(null);
 
   void _write(Set s) {
     throw new UnsupportedError(
@@ -129,6 +129,14 @@
 }
 
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+  factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.createDocumentFragment();
+
+  factory $CLASSNAME.html(String html) =>
+      _$(CLASSNAME)FactoryProvider.createDocumentFragment_html(html);
+
+  factory $CLASSNAME.svg(String svg) =>
+      new _$(CLASSNAME)FactoryProvider.createDocumentFragment_svg(svg);
+
   List<Element> _elements;
 
   List<Element> get elements {
@@ -147,7 +155,7 @@
     elements.addAll(copy);
   }
 
-  _ElementImpl query(String selectors) => $dom_querySelector(selectors);
+  Element query(String selectors) => $dom_querySelector(selectors);
 
   List<Element> queryAll(String selectors) =>
     new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
@@ -240,7 +248,7 @@
   Element get offsetParent => null;
   Element get parent => null;
   Map<String, String> get attributes => const {};
-  CSSClassSet get classes => new _FrozenCSSClassSet();
+  CssClassSet get classes => new _FrozenCssClassSet();
   Map<String, String> get dataAttributes => const {};
   CSSStyleDeclaration get style => new Element.tag('div').style;
   Future<CSSStyleDeclaration> get computedStyle =>
diff --git a/lib/html/templates/html/impl/impl_Element.darttemplate b/sdk/lib/html/templates/html/impl/impl_Element.darttemplate
similarity index 86%
rename from lib/html/templates/html/impl/impl_Element.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_Element.darttemplate
index e8b9ed5..f5c05f8 100644
--- a/lib/html/templates/html/impl/impl_Element.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Element.darttemplate
@@ -6,10 +6,10 @@
 // functionality.
 class _ChildrenElementList implements List {
   // Raw Element.
-  final _ElementImpl _element;
-  final _HTMLCollectionImpl _childElements;
+  final Element _element;
+  final HTMLCollection _childElements;
 
-  _ChildrenElementList._wrap(_ElementImpl element)
+  _ChildrenElementList._wrap(Element element)
     : _childElements = element.$dom_children,
       _element = element;
 
@@ -24,7 +24,7 @@
   bool contains(Element element) => _childElements.contains(element);
 
   void forEach(void f(Element element)) {
-    for (_ElementImpl element in _childElements) {
+    for (Element element in _childElements) {
       f(element);
     }
   }
@@ -73,11 +73,11 @@
     return _childElements.length;
   }
 
-  _ElementImpl operator [](int index) {
+  Element operator [](int index) {
     return _childElements[index];
   }
 
-  void operator []=(int index, _ElementImpl value) {
+  void operator []=(int index, Element value) {
     _element.$dom_replaceChild(value, _childElements[index]);
   }
 
@@ -86,17 +86,17 @@
      throw new UnsupportedError('');
    }
 
-  Element add(_ElementImpl value) {
+  Element add(Element value) {
     _element.$dom_appendChild(value);
     return value;
   }
 
-  Element addLast(_ElementImpl value) => add(value);
+  Element addLast(Element value) => add(value);
 
   Iterator<Element> iterator() => _toList().iterator();
 
   void addAll(Collection<Element> collection) {
-    for (_ElementImpl element in collection) {
+    for (Element element in collection) {
       _element.$dom_appendChild(element);
     }
   }
@@ -106,15 +106,15 @@
   }
 
   void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
-    throw const NotImplementedException();
+    throw new UnimplementedError();
   }
 
   void removeRange(int start, int rangeLength) {
-    throw const NotImplementedException();
+    throw new UnimplementedError();
   }
 
   void insertRange(int start, int rangeLength, [initialValue = null]) {
-    throw const NotImplementedException();
+    throw new UnimplementedError();
   }
 
   List getRange(int start, int rangeLength) =>
@@ -296,9 +296,18 @@
   bool get hasNext => _index < _list.length;
 }
 
-class _ElementAttributeMap implements AttributeMap {
+/**
+ * All your attribute manipulation needs in one place.
+ * Extends the regular Map interface by automatically coercing non-string
+ * values to strings.
+ */
+abstract class AttributeMap implements Map<String, String> {
+  void operator []=(String key, value);
+}
 
-  final _ElementImpl _element;
+class _ElementAttributeMap extends AttributeMap {
+
+  final Element _element;
 
   _ElementAttributeMap(this._element);
 
@@ -391,7 +400,7 @@
  * Provides a Map abstraction on top of data-* attributes, similar to the
  * dataSet in the old DOM.
  */
-class _DataAttributeMap implements AttributeMap {
+class _DataAttributeMap extends AttributeMap {
 
   final Map<String, String> $dom_attributes;
 
@@ -461,9 +470,23 @@
   String _strip(String key) => key.substring(5);
 }
 
-class _CssClassSet implements CSSClassSet {
+abstract class CssClassSet implements Set<String> {
+  /**
+   * Adds the class [token] to the element if it is not on it, removes it if it
+   * is.
+   */
+  bool toggle(String token);
 
-  final _ElementImpl _element;
+  /**
+   * Returns [:true:] if classes cannot be added or removed from this
+   * [:CssClassSet:].
+   */
+  bool get frozen;
+}
+
+class _CssClassSet extends CssClassSet {
+
+  final Element _element;
 
   _CssClassSet(this._element);
 
@@ -488,6 +511,10 @@
 
   bool get isEmpty => _read().isEmpty;
 
+  /**
+   * Returns [:true:] if classes cannot be added or removed from this
+   * [:CssClassSet:].
+   */
   bool get frozen => false;
 
   int get length =>_read().length;
@@ -510,6 +537,10 @@
     return result;
   }
 
+  /**
+   * Adds the class [token] to the element if it is not on it, removes it if it
+   * is.
+   */
   bool toggle(String value) {
     Set<String> s = _read();
     bool result = false;
@@ -620,20 +651,21 @@
 // rects as we must perform all measurement queries at a safe point to avoid
 // triggering unneeded layouts.
 /**
- * All your element measurement needs in one place
+ * All your element measurement needs in one place.
  * @domName none
  */
-class _ElementRectImpl implements ElementRect {
+class ElementRect {
+  // Relative to offsetParent.
   final ClientRect client;
   final ClientRect offset;
   final ClientRect scroll;
 
   // TODO(jacobr): should we move these outside of ElementRect to avoid the
   // overhead of computing them every time even though they are rarely used.
-  final _ClientRectImpl _boundingClientRect;
-  final _ClientRectListImpl _clientRects;
+  final ClientRect _boundingClientRect;
+  final _ClientRectList _clientRects;
 
-  _ElementRectImpl(_ElementImpl element) :
+  ElementRect(Element element) :
     client = new _SimpleClientRect(element.clientLeft,
                                   element.clientTop,
                                   element.clientWidth,
@@ -649,9 +681,10 @@
     _boundingClientRect = element.getBoundingClientRect(),
     _clientRects = element.getClientRects();
 
-  _ClientRectImpl get bounding => _boundingClientRect;
+  // In global coords.
+  ClientRect get bounding => _boundingClientRect;
 
-  // TODO(jacobr): cleanup.
+  // In global coords.
   List<ClientRect> get clientRects {
     final out = new List(_clientRects.length);
     for (num i = 0; i < _clientRects.length; i++) {
@@ -663,6 +696,11 @@
 
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
+  factory $CLASSNAME.html(String html) =>
+      _$(CLASSNAME)FactoryProvider.createElement_html(html);
+  factory $CLASSNAME.tag(String tag) =>
+      _$(CLASSNAME)FactoryProvider.createElement_tag(tag);
+
   /**
    * @domName Element.hasAttribute, Element.getAttribute, Element.setAttribute,
    *   Element.removeAttribute
@@ -683,17 +721,22 @@
     elements.addAll(value);
   }
 
+  /**
+   * @domName childElementCount, firstElementChild, lastElementChild,
+   *   children, Node.nodes.add
+   */
   List<Element> get elements => new _ChildrenElementList._wrap(this);
 
-  _ElementImpl query(String selectors) => $dom_querySelector(selectors);
+  Element query(String selectors) => $dom_querySelector(selectors);
 
   List<Element> queryAll(String selectors) =>
     new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
 
-  _CssClassSet get classes => new _CssClassSet(this);
+  /** @domName className, classList */
+  CssClassSet get classes => new _CssClassSet(this);
 
   void set classes(Collection<String> value) {
-    _CssClassSet classSet = classes;
+    CssClassSet classSet = classes;
     classSet.clear();
     classSet.addAll(value);
   }
@@ -709,32 +752,56 @@
     }
   }
 
+  /**
+   * @domName getClientRects, getBoundingClientRect, clientHeight, clientWidth,
+   * clientTop, clientLeft, offsetHeight, offsetWidth, offsetTop, offsetLeft,
+   * scrollHeight, scrollWidth, scrollTop, scrollLeft
+   */
   Future<ElementRect> get rect {
     return _createMeasurementFuture(
-        () => new _ElementRectImpl(this),
+        () => new ElementRect(this),
         new Completer<ElementRect>());
   }
 
+  /** @domName Window.getComputedStyle */
   Future<CSSStyleDeclaration> get computedStyle {
      // TODO(jacobr): last param should be null, see b/5045788
      return getComputedStyle('');
   }
 
+  /** @domName Window.getComputedStyle */
   Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement) {
     return _createMeasurementFuture(
-        () => _window.$dom_getComputedStyle(this, pseudoElement),
+        () => window.$dom_getComputedStyle(this, pseudoElement),
         new Completer<CSSStyleDeclaration>());
   }
 
+  /**
+   * Adds the specified text as a text node after the last child of this.
+   */
   void addText(String text) {
     this.insertAdjacentText('beforeend', text);
   }
 
+  /**
+   * Parses the specified text as HTML and adds the resulting node after the
+   * last child of this.
+   */
   void addHTML(String text) {
     this.insertAdjacentHTML('beforeend', text);
   }
 
   // Hooks to support custom WebComponents.
+  /**
+   * Experimental support for [web components][wc]. This field stores a
+   * reference to the component implementation. It was inspired by Mozilla's
+   * [x-tags][] project. Please note: in the future it may be possible to
+   * `extend Element` from your class, in which case this field will be
+   * deprecated and will simply return this [Element] object.
+   *
+   * [wc]: http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html
+   * [x-tags]: http://x-tags.org/
+   */
   var xtag;
 
 $if DARTIUM
@@ -855,7 +922,7 @@
         parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
       }
     }
-    final _ElementImpl temp = new Element.tag(parentTag);
+    final Element temp = new Element.tag(parentTag);
     temp.innerHTML = html;
 
     Element element;
@@ -882,6 +949,6 @@
       JS('Element', 'document.createElement(#)', tag);
 $else
   static Element createElement_tag(String tag) =>
-      _document.$dom_createElement(tag);
+      document.$dom_createElement(tag);
 $endif
 }
diff --git a/sdk/lib/html/templates/html/impl/impl_Event.darttemplate b/sdk/lib/html/templates/html/impl/impl_Event.darttemplate
new file mode 100644
index 0000000..55d6039
--- /dev/null
+++ b/sdk/lib/html/templates/html/impl/impl_Event.darttemplate
@@ -0,0 +1,17 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+  // In JS, canBubble and cancelable are technically required parameters to
+  // init*Event. In practice, though, if they aren't provided they simply
+  // default to false (since that's Boolean(undefined)).
+  //
+  // Contrary to JS, we default canBubble and cancelable to true, since that's
+  // what people want most of the time anyway.
+  factory $CLASSNAME(String type, [bool canBubble = true, bool cancelable = true]) =>
+      _$(CLASSNAME)FactoryProvider.create$CLASSNAME(type, canBubble, cancelable);
+$!MEMBERS
+}
diff --git a/sdk/lib/html/templates/html/impl/impl_EventTarget.darttemplate b/sdk/lib/html/templates/html/impl/impl_EventTarget.darttemplate
new file mode 100644
index 0000000..cc89779
--- /dev/null
+++ b/sdk/lib/html/templates/html/impl/impl_EventTarget.darttemplate
@@ -0,0 +1,56 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Events {
+  /* Raw event target. */
+  final EventTarget _ptr;
+
+  Events(this._ptr);
+
+  EventListenerList operator [](String type) {
+    return new EventListenerList(_ptr, type);
+  }
+}
+
+class EventListenerList {
+
+  final EventTarget _ptr;
+  final String _type;
+
+  EventListenerList(this._ptr, this._type);
+
+  // TODO(jacobr): implement equals.
+
+  EventListenerList add(EventListener listener,
+      [bool useCapture = false]) {
+    _add(listener, useCapture);
+    return this;
+  }
+
+  EventListenerList remove(EventListener listener,
+      [bool useCapture = false]) {
+    _remove(listener, useCapture);
+    return this;
+  }
+
+  bool dispatch(Event evt) {
+    return _ptr.$dom_dispatchEvent(evt);
+  }
+
+  void _add(EventListener listener, bool useCapture) {
+    _ptr.$dom_addEventListener(_type, listener, useCapture);
+  }
+
+  void _remove(EventListener listener, bool useCapture) {
+    _ptr.$dom_removeEventListener(_type, listener, useCapture);
+  }
+}
+
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+
+  /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
+  Events get on => new Events(this);
+$!MEMBERS
+}
diff --git a/sdk/lib/html/templates/html/impl/impl_HttpRequest.darttemplate b/sdk/lib/html/templates/html/impl/impl_HttpRequest.darttemplate
new file mode 100644
index 0000000..cfc265e
--- /dev/null
+++ b/sdk/lib/html/templates/html/impl/impl_HttpRequest.darttemplate
@@ -0,0 +1,13 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+  factory $CLASSNAME.get(String url, onSuccess($CLASSNAME request)) =>
+      _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)_get(url, onSuccess);
+
+  factory $CLASSNAME.getWithCredentials(String url, onSuccess($CLASSNAME request)) =>
+      _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)getWithCredentials(url, onSuccess);
+
+$!MEMBERS
+}
diff --git a/sdk/lib/html/templates/html/impl/impl_IDBKeyRange.darttemplate b/sdk/lib/html/templates/html/impl/impl_IDBKeyRange.darttemplate
new file mode 100644
index 0000000..3267cc9
--- /dev/null
+++ b/sdk/lib/html/templates/html/impl/impl_IDBKeyRange.darttemplate
@@ -0,0 +1,33 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+  /**
+   * @domName IDBKeyRange.only
+   */
+  factory IDBKeyRange.only(/*IDBKey*/ value) =>
+      _IDBKeyRangeFactoryProvider.create$(CLASSNAME)_only(value);
+
+  /**
+   * @domName IDBKeyRange.lowerBound
+   */
+  factory IDBKeyRange.lowerBound(/*IDBKey*/ bound, [bool open = false]) =>
+      _IDBKeyRangeFactoryProvider.create$(CLASSNAME)_lowerBound(bound, open);
+
+  /**
+   * @domName IDBKeyRange.upperBound
+   */
+  factory IDBKeyRange.upperBound(/*IDBKey*/ bound, [bool open = false]) =>
+      _IDBKeyRangeFactoryProvider.create$(CLASSNAME)_upperBound(bound, open);
+
+  /**
+   * @domName IDBKeyRange.bound
+   */
+  factory IDBKeyRange.bound(/*IDBKey*/ lower, /*IDBKey*/ upper,
+                            [bool lowerOpen = false, bool upperOpen = false]) =>
+      _IDBKeyRangeFactoryProvider.create$(CLASSNAME)_bound(
+          lower, upper, lowerOpen, upperOpen);
+
+$!MEMBERS
+}
diff --git a/lib/html/templates/html/impl/impl_MutationObserver.darttemplate b/sdk/lib/html/templates/html/impl/impl_MutationObserver.darttemplate
similarity index 96%
rename from lib/html/templates/html/impl/impl_MutationObserver.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_MutationObserver.darttemplate
index 45d337b..3bca460 100644
--- a/lib/html/templates/html/impl/impl_MutationObserver.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_MutationObserver.darttemplate
@@ -62,7 +62,7 @@
   static _add(m, String key, value) { m[key] = value; }
   static _fixupList(list) => list;
 
-  _call(Node target, options) {
+  void _call(Node target, options) {
     _observe(target, options);
   }
 $endif
@@ -73,6 +73,6 @@
   static _fixupList(list) => list;  // TODO: Ensure is a JavaScript Array.
 
   // Call native function with no conversions.
-  _call(target, options) native 'observe';
+  void _call(target, options) native 'observe';
 $endif
 }
diff --git a/lib/html/templates/html/impl/impl_Node.darttemplate b/sdk/lib/html/templates/html/impl/impl_Node.darttemplate
similarity index 79%
rename from lib/html/templates/html/impl/impl_Node.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_Node.darttemplate
index 594a2cc..48fab99 100644
--- a/lib/html/templates/html/impl/impl_Node.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Node.darttemplate
@@ -8,35 +8,35 @@
  * improving performance for the typical cases where it is not required.
  */
 class _ChildNodeListLazy implements List {
-  final _NodeImpl _this;
+  final Node _this;
 
   _ChildNodeListLazy(this._this);
 
 
 $if DART2JS
-  _NodeImpl get first => JS('_NodeImpl', '#.firstChild', _this);
-  _NodeImpl get last => JS('_NodeImpl', '#.lastChild', _this);
+  Node get first => JS('Node', '#.firstChild', _this);
+  Node get last => JS('Node', '#.lastChild', _this);
 $else
-  _NodeImpl get first => _this.$dom_firstChild;
-  _NodeImpl get last => _this.$dom_lastChild;
+  Node get first => _this.$dom_firstChild;
+  Node get last => _this.$dom_lastChild;
 $endif
 
-  void add(_NodeImpl value) {
+  void add(Node value) {
     _this.$dom_appendChild(value);
   }
 
-  void addLast(_NodeImpl value) {
+  void addLast(Node value) {
     _this.$dom_appendChild(value);
   }
 
 
-  void addAll(Collection<_NodeImpl> collection) {
-    for (_NodeImpl node in collection) {
+  void addAll(Collection<Node> collection) {
+    for (Node node in collection) {
       _this.$dom_appendChild(node);
     }
   }
 
-  _NodeImpl removeLast() {
+  Node removeLast() {
     final result = last;
     if (result != null) {
       _this.$dom_removeChild(result);
@@ -48,7 +48,7 @@
     _this.text = '';
   }
 
-  void operator []=(int index, _NodeImpl value) {
+  void operator []=(int index, Node value) {
     _this.$dom_replaceChild(value, this[index]);
   }
 
@@ -107,7 +107,7 @@
   // a local copy of $dom_childNodes is more efficient.
   int get length => _this.$dom_childNodes.length;
 
-  _NodeImpl operator[](int index) => _this.$dom_childNodes[index];
+  Node operator[](int index) => _this.$dom_childNodes[index];
 }
 
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
@@ -125,18 +125,26 @@
     }
   }
 
-  // TODO(jacobr): should we throw an exception if parent is already null?
-  // TODO(vsm): Use the native remove when available.
+  /**
+   * Removes this node from the DOM.
+   * @domName Node.removeChild
+   */
   void remove() {
+    // TODO(jacobr): should we throw an exception if parent is already null?
+    // TODO(vsm): Use the native remove when available.
     if (this.parent != null) {
-      final _NodeImpl parent = this.parent;
+      final Node parent = this.parent;
       parent.$dom_removeChild(this);
     }
   }
 
-  _NodeImpl replaceWith(Node otherNode) {
+  /**
+   * Replaces this node with another node.
+   * @domName Node.replaceChild
+   */
+  Node replaceWith(Node otherNode) {
     try {
-      final _NodeImpl parent = this.parent;
+      final Node parent = this.parent;
       parent.$dom_replaceChild(otherNode, this);
     } catch (e) {
 
diff --git a/lib/html/templates/html/impl/impl_NodeList.darttemplate b/sdk/lib/html/templates/html/impl/impl_NodeList.darttemplate
similarity index 94%
rename from lib/html/templates/html/impl/impl_NodeList.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_NodeList.darttemplate
index 5e94454..e21a044 100644
--- a/lib/html/templates/html/impl/impl_NodeList.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_NodeList.darttemplate
@@ -82,7 +82,7 @@
 }
 
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-  _NodeImpl _parent;
+  Node _parent;
 
   // -- start List<Node> mixins.
   // Node is the element type.
@@ -98,21 +98,21 @@
 
   // From Collection<Node>:
 
-  void add(_NodeImpl value) {
+  void add(Node value) {
     _parent.$dom_appendChild(value);
   }
 
-  void addLast(_NodeImpl value) {
+  void addLast(Node value) {
     _parent.$dom_appendChild(value);
   }
 
-  void addAll(Collection<_NodeImpl> collection) {
-    for (_NodeImpl node in collection) {
+  void addAll(Collection<Node> collection) {
+    for (Node node in collection) {
       _parent.$dom_appendChild(node);
     }
   }
 
-  _NodeImpl removeLast() {
+  Node removeLast() {
     final result = this.last;
     if (result != null) {
       _parent.$dom_removeChild(result);
@@ -124,7 +124,7 @@
     _parent.text = '';
   }
 
-  void operator []=(int index, _NodeImpl value) {
+  void operator []=(int index, Node value) {
     _parent.$dom_replaceChild(value, this[index]);
   }
 
diff --git a/lib/html/templates/html/dart2js/impl_CanvasElement.darttemplate b/sdk/lib/html/templates/html/impl/impl_Point.darttemplate
similarity index 67%
copy from lib/html/templates/html/dart2js/impl_CanvasElement.darttemplate
copy to sdk/lib/html/templates/html/impl/impl_Point.darttemplate
index 1c790c0..cc3451e 100644
--- a/lib/html/templates/html/dart2js/impl_CanvasElement.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Point.darttemplate
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-$!MEMBERS
+// WARNING: Do not edit - generated code.
 
-  _CanvasRenderingContext2DImpl get context2d => getContext('2d');
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+  factory $CLASSNAME(num x, num y) => _$(CLASSNAME)FactoryProvider.create$CLASSNAME(x, y);
+$!MEMBERS
 }
diff --git a/lib/html/templates/html/impl/impl_SVGElement.darttemplate b/sdk/lib/html/templates/html/impl/impl_SVGElement.darttemplate
similarity index 86%
rename from lib/html/templates/html/impl/impl_SVGElement.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_SVGElement.darttemplate
index 64eeccc..10fe7cc 100644
--- a/lib/html/templates/html/impl/impl_SVGElement.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_SVGElement.darttemplate
@@ -13,7 +13,12 @@
 }
 
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-  CSSClassSet get classes {
+  factory $CLASSNAME.tag(String tag) =>
+      _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)_tag(tag);
+  factory $CLASSNAME.svg(String svg) =>
+      _$(CLASSNAME)FactoryProvider.create$(CLASSNAME)_svg(svg);
+
+  CssClassSet get classes {
     if (_cssClassSet == null) {
       _cssClassSet = new _AttributeClassSet(_ptr);
     }
diff --git a/lib/html/templates/html/dart2js/impl_CanvasElement.darttemplate b/sdk/lib/html/templates/html/impl/impl_SVGSVGElement.darttemplate
similarity index 77%
rename from lib/html/templates/html/dart2js/impl_CanvasElement.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_SVGSVGElement.darttemplate
index 1c790c0..c9a30ba 100644
--- a/lib/html/templates/html/dart2js/impl_CanvasElement.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_SVGSVGElement.darttemplate
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-$!MEMBERS
+  factory $CLASSNAME() => _$(CLASSNAME)FactoryProvider.createSVGSVGElement();
 
-  _CanvasRenderingContext2DImpl get context2d => getContext('2d');
+$!MEMBERS
 }
diff --git a/lib/html/templates/html/impl/impl_ShadowRoot.darttemplate b/sdk/lib/html/templates/html/impl/impl_ShadowRoot.darttemplate
similarity index 100%
rename from lib/html/templates/html/impl/impl_ShadowRoot.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_ShadowRoot.darttemplate
diff --git a/lib/html/templates/html/impl/impl_Storage.darttemplate b/sdk/lib/html/templates/html/impl/impl_Storage.darttemplate
similarity index 94%
rename from lib/html/templates/html/impl/impl_Storage.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_Storage.darttemplate
index 38c83f2..f44d8d0 100644
--- a/lib/html/templates/html/impl/impl_Storage.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Storage.darttemplate
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+class $CLASSNAME$EXTENDS implements Map<String, String> $NATIVESPEC {
 
   // TODO(nweiz): update this when maps support lazy iteration
   bool containsValue(String value) => values.some((e) => e == value);
diff --git a/lib/html/templates/html/dart2js/impl_CanvasElement.darttemplate b/sdk/lib/html/templates/html/impl/impl_Text.darttemplate
similarity index 67%
copy from lib/html/templates/html/dart2js/impl_CanvasElement.darttemplate
copy to sdk/lib/html/templates/html/impl/impl_Text.darttemplate
index 1c790c0..615b530 100644
--- a/lib/html/templates/html/dart2js/impl_CanvasElement.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_Text.darttemplate
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-$!MEMBERS
+// WARNING: Do not edit - generated code.
 
-  _CanvasRenderingContext2DImpl get context2d => getContext('2d');
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+  factory $CLASSNAME(String data) => _$(CLASSNAME)FactoryProvider.create$CLASSNAME(data);
+$!MEMBERS
 }
diff --git a/lib/html/templates/html/dart2js/impl_CanvasElement.darttemplate b/sdk/lib/html/templates/html/impl/impl_WebSocket.darttemplate
similarity index 67%
copy from lib/html/templates/html/dart2js/impl_CanvasElement.darttemplate
copy to sdk/lib/html/templates/html/impl/impl_WebSocket.darttemplate
index 1c790c0..2c2ef59 100644
--- a/lib/html/templates/html/dart2js/impl_CanvasElement.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_WebSocket.darttemplate
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-$!MEMBERS
+// WARNING: Do not edit - generated code.
 
-  _CanvasRenderingContext2DImpl get context2d => getContext('2d');
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+  factory $CLASSNAME(String url) => _$(CLASSNAME)FactoryProvider.create$CLASSNAME(url);
+$!MEMBERS
 }
diff --git a/lib/html/templates/html/impl/impl_WheelEvent.darttemplate b/sdk/lib/html/templates/html/impl/impl_WheelEvent.darttemplate
similarity index 93%
rename from lib/html/templates/html/impl/impl_WheelEvent.darttemplate
rename to sdk/lib/html/templates/html/impl/impl_WheelEvent.darttemplate
index a2cf353..466b79a 100644
--- a/lib/html/templates/html/impl/impl_WheelEvent.darttemplate
+++ b/sdk/lib/html/templates/html/impl/impl_WheelEvent.darttemplate
@@ -6,6 +6,7 @@
 $!MEMBERS
 
 $if DART2JS
+  /** @domName WheelEvent.deltaY */
   num get deltaY {
     if (JS('bool', '#.deltaY !== undefined', this)) {
       // W3C WheelEvent
@@ -33,6 +34,7 @@
         'deltaY is not supported');
   }
 
+  /** @domName WheelEvent.deltaX */
   num get deltaX {
     if (JS('bool', '#.deltaX !== undefined', this)) {
       // W3C WheelEvent
@@ -77,8 +79,11 @@
   int get _deltaMode => JS('int', '#.deltaMode', this);
 
 $else
+  /** @domName WheelEvent.deltaX */
   num get deltaX => $dom_wheelDeltaX;
+  /** @domName WheelEvent.deltaY */
   num get deltaY => $dom_wheelDeltaY;
+  /** @domName WheelEvent.deltaMode */
   int get deltaMode => 0;
 
 $endif
diff --git a/sdk/lib/html/templates/html/impl/pure_interface.darttemplate b/sdk/lib/html/templates/html/impl/pure_interface.darttemplate
new file mode 100644
index 0000000..5f0e58c
--- /dev/null
+++ b/sdk/lib/html/templates/html/impl/pure_interface.darttemplate
@@ -0,0 +1,3 @@
+/// @domName $DOMNAME
+abstract class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS}
diff --git a/lib/html/templates/html/interface/interface.darttemplate b/sdk/lib/html/templates/html/interface/interface.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface.darttemplate
rename to sdk/lib/html/templates/html/interface/interface.darttemplate
diff --git a/lib/html/templates/html/interface/interface_AudioContext.darttemplate b/sdk/lib/html/templates/html/interface/interface_AudioContext.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_AudioContext.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_AudioContext.darttemplate
diff --git a/lib/html/templates/html/interface/interface_CSSStyleDeclaration.darttemplate b/sdk/lib/html/templates/html/interface/interface_CSSStyleDeclaration.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_CSSStyleDeclaration.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_CSSStyleDeclaration.darttemplate
diff --git a/lib/html/templates/html/interface/interface_CanvasElement.darttemplate b/sdk/lib/html/templates/html/interface/interface_CanvasElement.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_CanvasElement.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_CanvasElement.darttemplate
diff --git a/lib/html/templates/html/interface/interface_CanvasRenderingContext2D.darttemplate b/sdk/lib/html/templates/html/interface/interface_CanvasRenderingContext2D.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_CanvasRenderingContext2D.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_CanvasRenderingContext2D.darttemplate
diff --git a/lib/html/templates/html/interface/interface_CustomEvent.darttemplate b/sdk/lib/html/templates/html/interface/interface_CustomEvent.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_CustomEvent.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_CustomEvent.darttemplate
diff --git a/lib/html/templates/html/interface/interface_Document.darttemplate b/sdk/lib/html/templates/html/interface/interface_Document.darttemplate
similarity index 83%
rename from lib/html/templates/html/interface/interface_Document.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_Document.darttemplate
index 7d30daf..ac96d0c 100644
--- a/lib/html/templates/html/interface/interface_Document.darttemplate
+++ b/sdk/lib/html/templates/html/interface/interface_Document.darttemplate
@@ -5,7 +5,7 @@
 part of html;
 
 $!COMMENT
-abstract class Document extends HtmlElement {
+abstract class _IDocument extends _IHtmlElement {
 
 $!MEMBERS
 }
diff --git a/lib/html/templates/html/interface/interface_DocumentFragment.darttemplate b/sdk/lib/html/templates/html/interface/interface_DocumentFragment.darttemplate
similarity index 69%
rename from lib/html/templates/html/interface/interface_DocumentFragment.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_DocumentFragment.darttemplate
index e302f50..66af3d0 100644
--- a/lib/html/templates/html/interface/interface_DocumentFragment.darttemplate
+++ b/sdk/lib/html/templates/html/interface/interface_DocumentFragment.darttemplate
@@ -5,11 +5,11 @@
 part of html;
 
 $!COMMENT
-abstract class DocumentFragment extends Element {
+abstract class _IDocumentFragment extends Element {
 
-  factory DocumentFragment() => _$(ID)FactoryProvider.createDocumentFragment();
+  factory _IDocumentFragment() => _$(ID)FactoryProvider.createDocumentFragment();
 
-  factory DocumentFragment.html(String html) =>
+  factory _IDocumentFragment.html(String html) =>
       _$(ID)FactoryProvider.createDocumentFragment_html(html);
 
   // TODO(nweiz): enable this when XML is ported
@@ -17,7 +17,7 @@
   // DocumentFragment.xml(String xml);
 
   factory DocumentFragment.svg(String svg) =>
-      new _$(ID)FactoryProvider.DocumentFragment.svg(svg);
+      new _$(ID)FactoryProvider.createDocumentFragment_svg(svg);
 
   DocumentFragment clone(bool deep);
 
diff --git a/lib/html/templates/html/interface/interface_Element.darttemplate b/sdk/lib/html/templates/html/interface/interface_Element.darttemplate
similarity index 97%
rename from lib/html/templates/html/interface/interface_Element.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_Element.darttemplate
index 833fdfd..bb5e01b 100644
--- a/lib/html/templates/html/interface/interface_Element.darttemplate
+++ b/sdk/lib/html/templates/html/interface/interface_Element.darttemplate
@@ -49,7 +49,7 @@
 }
 
 $!COMMENT
-abstract class Element implements Node, NodeSelector {
+abstract class _IElement implements _INode, NodeSelector {
   factory Element.html(String html) =>
       _$(ID)FactoryProvider.createElement_html(html);
   factory Element.tag(String tag) =>
diff --git a/lib/html/templates/html/interface/interface_Event.darttemplate b/sdk/lib/html/templates/html/interface/interface_Event.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_Event.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_Event.darttemplate
diff --git a/lib/html/templates/html/interface/interface_EventTarget.darttemplate b/sdk/lib/html/templates/html/interface/interface_EventTarget.darttemplate
similarity index 91%
rename from lib/html/templates/html/interface/interface_EventTarget.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_EventTarget.darttemplate
index aa7288a..4ef6cb6 100644
--- a/lib/html/templates/html/interface/interface_EventTarget.darttemplate
+++ b/sdk/lib/html/templates/html/interface/interface_EventTarget.darttemplate
@@ -6,7 +6,7 @@
 
 part of html;
 
-abstract class EventListenerList {
+abstract class _IEventListenerList {
   EventListenerList add(EventListener handler, [bool useCapture]);
 
   EventListenerList remove(EventListener handler, [bool useCapture]);
@@ -14,7 +14,7 @@
   bool dispatch(Event evt);
 }
 
-abstract class Events {
+abstract class _IEvents {
   EventListenerList operator [](String type);
 }
 
diff --git a/lib/html/templates/html/interface/interface_HttpRequest.darttemplate b/sdk/lib/html/templates/html/interface/interface_HttpRequest.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_HttpRequest.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_HttpRequest.darttemplate
diff --git a/lib/html/templates/html/interface/interface_IDBKeyRange.darttemplate b/sdk/lib/html/templates/html/interface/interface_IDBKeyRange.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_IDBKeyRange.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_IDBKeyRange.darttemplate
diff --git a/lib/html/templates/html/interface/interface_LocalWindow.darttemplate b/sdk/lib/html/templates/html/interface/interface_LocalWindow.darttemplate
similarity index 75%
rename from lib/html/templates/html/interface/interface_LocalWindow.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_LocalWindow.darttemplate
index ff46f20..a079d72 100644
--- a/lib/html/templates/html/interface/interface_LocalWindow.darttemplate
+++ b/sdk/lib/html/templates/html/interface/interface_LocalWindow.darttemplate
@@ -29,15 +29,5 @@
    */
   void requestLayoutFrame(TimeoutHandler callback);
 
-  /**
-   * Creates a new object URL for the specified object. The URL will be
-   * available until revokeObjectUrl is called.
-   * [object] can be a Blob, MediaStream or MediaSource.
-   */
-  String createObjectUrl(object);
-
-  /** @domName DOMURL.revokeObjectURL */
-  void revokeObjectUrl(String objectUrl);
-
 $!MEMBERS
 }
diff --git a/lib/html/templates/html/interface/interface_MouseEvent.darttemplate b/sdk/lib/html/templates/html/interface/interface_MouseEvent.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_MouseEvent.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_MouseEvent.darttemplate
diff --git a/lib/html/templates/html/interface/interface_MutationObserver.darttemplate b/sdk/lib/html/templates/html/interface/interface_MutationObserver.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_MutationObserver.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_MutationObserver.darttemplate
diff --git a/lib/html/templates/html/interface/interface_Node.darttemplate b/sdk/lib/html/templates/html/interface/interface_Node.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_Node.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_Node.darttemplate
diff --git a/lib/html/templates/html/interface/interface_NodeList.darttemplate b/sdk/lib/html/templates/html/interface/interface_NodeList.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_NodeList.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_NodeList.darttemplate
diff --git a/lib/html/templates/html/interface/interface_NodeSelector.darttemplate b/sdk/lib/html/templates/html/interface/interface_NodeSelector.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_NodeSelector.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_NodeSelector.darttemplate
diff --git a/lib/html/templates/html/interface/interface_Point.darttemplate b/sdk/lib/html/templates/html/interface/interface_Point.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_Point.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_Point.darttemplate
diff --git a/lib/html/templates/html/interface/interface_SVGElement.darttemplate b/sdk/lib/html/templates/html/interface/interface_SVGElement.darttemplate
similarity index 89%
rename from lib/html/templates/html/interface/interface_SVGElement.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_SVGElement.darttemplate
index 47d4e6f..620c9d0 100644
--- a/lib/html/templates/html/interface/interface_SVGElement.darttemplate
+++ b/sdk/lib/html/templates/html/interface/interface_SVGElement.darttemplate
@@ -5,7 +5,7 @@
 part of html;
 
 $!COMMENT
-abstract class SVGElement implements Element {
+abstract class _ISVGElement implements _IElement {
 
   factory SVGElement.tag(String tag) =>
       _$(ID)FactoryProvider.create$(ID)_tag(tag);
diff --git a/sdk/lib/html/templates/html/interface/interface_SVGSVGElement.darttemplate b/sdk/lib/html/templates/html/interface/interface_SVGSVGElement.darttemplate
new file mode 100644
index 0000000..692955b
--- /dev/null
+++ b/sdk/lib/html/templates/html/interface/interface_SVGSVGElement.darttemplate
@@ -0,0 +1,11 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of html;
+
+$!COMMENT
+abstract class _ISVGSVGElement extends _ISVGElement implements _ISVGTests, _ISVGLangSpace, _ISVGExternalResourcesRequired, _ISVGStylable, _ISVGLocatable, _ISVGFitToViewBox, _ISVGZoomAndPan {
+
+$!MEMBERS
+}
diff --git a/lib/html/templates/html/interface/interface_ShadowRoot.darttemplate b/sdk/lib/html/templates/html/interface/interface_ShadowRoot.darttemplate
similarity index 85%
rename from lib/html/templates/html/interface/interface_ShadowRoot.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_ShadowRoot.darttemplate
index f30a8c6..a1d32df 100644
--- a/lib/html/templates/html/interface/interface_ShadowRoot.darttemplate
+++ b/sdk/lib/html/templates/html/interface/interface_ShadowRoot.darttemplate
@@ -9,5 +9,5 @@
 $!COMMENT
 abstract class $ID$EXTENDS {
 $!MEMBERS
-  static bool get supported => _$(ID)Impl.supported;
+  static bool get supported => $(ID).supported;
 }
diff --git a/lib/html/templates/html/interface/interface_Storage.darttemplate b/sdk/lib/html/templates/html/interface/interface_Storage.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_Storage.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_Storage.darttemplate
diff --git a/lib/html/templates/html/interface/interface_Text.darttemplate b/sdk/lib/html/templates/html/interface/interface_Text.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_Text.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_Text.darttemplate
diff --git a/lib/html/templates/html/interface/interface_WebSocket.darttemplate b/sdk/lib/html/templates/html/interface/interface_WebSocket.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_WebSocket.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_WebSocket.darttemplate
diff --git a/lib/html/templates/html/interface/interface_WheelEvent.darttemplate b/sdk/lib/html/templates/html/interface/interface_WheelEvent.darttemplate
similarity index 100%
rename from lib/html/templates/html/interface/interface_WheelEvent.darttemplate
rename to sdk/lib/html/templates/html/interface/interface_WheelEvent.darttemplate
diff --git a/lib/html/templates/immutable_list_mixin.darttemplate b/sdk/lib/html/templates/immutable_list_mixin.darttemplate
similarity index 100%
rename from lib/html/templates/immutable_list_mixin.darttemplate
rename to sdk/lib/html/templates/immutable_list_mixin.darttemplate
diff --git a/lib/html/templates/interface.darttemplate b/sdk/lib/html/templates/interface.darttemplate
similarity index 100%
rename from lib/html/templates/interface.darttemplate
rename to sdk/lib/html/templates/interface.darttemplate
diff --git a/lib/io/base64.dart b/sdk/lib/io/base64.dart
similarity index 100%
rename from lib/io/base64.dart
rename to sdk/lib/io/base64.dart
diff --git a/lib/io/buffer_list.dart b/sdk/lib/io/buffer_list.dart
similarity index 100%
rename from lib/io/buffer_list.dart
rename to sdk/lib/io/buffer_list.dart
diff --git a/lib/io/chunked_stream.dart b/sdk/lib/io/chunked_stream.dart
similarity index 100%
rename from lib/io/chunked_stream.dart
rename to sdk/lib/io/chunked_stream.dart
diff --git a/lib/io/common.dart b/sdk/lib/io/common.dart
similarity index 100%
rename from lib/io/common.dart
rename to sdk/lib/io/common.dart
diff --git a/lib/io/directory.dart b/sdk/lib/io/directory.dart
similarity index 73%
rename from lib/io/directory.dart
rename to sdk/lib/io/directory.dart
index 740f0cb..76b9d2e 100644
--- a/lib/io/directory.dart
+++ b/sdk/lib/io/directory.dart
@@ -38,20 +38,28 @@
   bool existsSync();
 
   /**
-   * Creates the directory with this name. If the directory already
-   * exists nothing is done. Returns a [:Future<Directory>:] that
-   * completes with this directory once it has been created. If the
-   * directory does not exist and cannot be created the future
-   * completes with an exception.
+   * Creates the directory with this name.
+   *
+   * If [recursive] is false, only the last directory in the path is
+   * created. If [recursive] is true, all non-existing path components
+   * are created. If the directory already exists nothing is done.
+   *
+   * Returns a [:Future<Directory>:] that completes with this
+   * directory once it has been created. If the directory cannot be
+   * created the future completes with an exception.
    */
-  Future<Directory> create();
+  Future<Directory> create({recursive: false});
 
   /**
-   * Synchronously creates the directory with this name. If the
-   * directory already exists nothing is done. If the directory does
-   * not exist and cannot be created an exception is thrown.
+   * Synchronously creates the directory with this name.
+   *
+   * If [recursive] is false, only the last directory in the path is
+   * created. If [recursive] is true, all non-existing path components
+   * are created. If the directory already exists nothing is done.
+   *
+   * If the directory cannot be created an exception is thrown.
    */
-  void createSync();
+  void createSync({recursive: false});
 
   /**
    * Creates a temporary directory with a name based on the current
@@ -75,32 +83,30 @@
   Directory createTempSync();
 
   /**
-   * Deletes the directory with this name. The directory must be
-   * empty. Returns a [:Future<Directory>:] that completes with
-   * this directory when the deletion is done.
+   * Deletes the directory with this name.
+   *
+   * If [recursive] is false, the directory must be empty.
+   *
+   * If [recursive] is true, this directory and all sub-directories
+   * and files in the directories are deleted.
+   *
+   * Returns a [:Future<Directory>:] that completes with this
+   * directory when the deletion is done. If the directory cannot be
+   * deleted, the future completes with an exception.
    */
-  Future<Directory> delete();
+  Future<Directory> delete({recursive: false});
 
   /**
-   * Synchronously deletes the directory with this name. The directory
-   * must be empty. Throws an exception if the directory cannot be
-   * deleted.
+   * Synchronously deletes the directory with this name.
+   *
+   * If [recursive] is false, the directory must be empty.
+   *
+   * If [recursive] is true, this directory and all sub-directories
+   * and files in the directories are deleted.
+   *
+   * Throws an exception if the directory cannot be deleted.
    */
-  void deleteSync();
-
-  /**
-   * Deletes this directory and all sub-directories and files in the
-   * directories. Returns a [:Future<Directory>:] that completes with
-   * this directory when the deletion is done.
-   */
-  Future<Directory> deleteRecursively();
-
-  /**
-   * Synchronously deletes this directory and all sub-directories and
-   * files in the directories. Throws an exception if the directory
-   * cannot be deleted.
-   */
-  void deleteRecursivelySync();
+  void deleteSync({recursive: false});
 
   /**
    * Rename this directory. Returns a [:Future<Directory>:] that completes
@@ -141,6 +147,12 @@
 /**
  * A [DirectoryLister] represents an actively running listing operation.
  *
+ * A [DirectoryLister] is obtained from a [Directory] object by calling
+ * the [:Directory.list:] method.
+ *
+ *     Directory dir = new Directory('path/to/my/dir');
+ *     DirectoryLister lister = dir.list();
+ *
  * For each file and directory, the file or directory handler is
  * called. When all directories have been listed the done handler is
  * called. If the listing operation is recursive, the error handler is
diff --git a/lib/io/directory_impl.dart b/sdk/lib/io/directory_impl.dart
similarity index 86%
rename from lib/io/directory_impl.dart
rename to sdk/lib/io/directory_impl.dart
index cbfa945..85968f1 100644
--- a/lib/io/directory_impl.dart
+++ b/sdk/lib/io/directory_impl.dart
@@ -51,7 +51,31 @@
     return (result == 1);
   }
 
-  Future<Directory> create() {
+  Future<Directory> createRecursively() {
+    if (_path is !String) {
+      throw new ArgumentError();
+    }
+    var path = new Path.fromNative(_path);
+    var current = new Path(path.isAbsolute ? '/' : '');
+    var future = null;
+    for (var segment in path.segments()) {
+      var next = current.append(segment);
+      if (future == null) {
+        future = new Directory.fromPath(current).create();
+      } else {
+        future = future.chain((_) => new Directory.fromPath(next).create());
+      }
+      current = next;
+    }
+    if (future == null) {
+      return new Future.immediate(this);
+    } else {
+      return future.transform((result) => this);
+    }
+  }
+
+  Future<Directory> create({recursive: false}) {
+    if (recursive) return createRecursively();
     _ensureDirectoryService();
     List request = new List(2);
     request[0] = CREATE_REQUEST;
@@ -64,10 +88,20 @@
     });
   }
 
-  void createSync() {
+  void createRecursivelySync() {
+    var path = new Path.fromNative(_path);
+    var current = new Path(path.isAbsolute ? '/' : '');
+    for (var segment in path.segments()) {
+      current = current.append(segment);
+      new Directory.fromPath(current).createSync();
+    }
+  }
+
+  void createSync({recursive: false}) {
     if (_path is !String) {
       throw new ArgumentError();
     }
+    if (recursive) return createRecursivelySync();
     var result = _create(_path);
     if (result is OSError) {
       throw new DirectoryIOException("Creation failed", _path, result);
@@ -102,6 +136,9 @@
   }
 
   Future<Directory> _deleteHelper(bool recursive, String errorMsg) {
+  }
+
+  Future<Directory> delete({recursive: false}) {
     _ensureDirectoryService();
     List request = new List(3);
     request[0] = DELETE_REQUEST;
@@ -109,35 +146,17 @@
     request[2] = recursive;
     return _directoryService.call(request).transform((response) {
       if (_isErrorResponse(response)) {
-        throw _exceptionOrErrorFromResponse(response, errorMsg);
+        throw _exceptionOrErrorFromResponse(response, "Deletion failed");
       }
       return this;
     });
   }
 
-  Future<Directory> delete() {
-    return _deleteHelper(false, "Deletion failed");
-  }
-
-  void deleteSync() {
+  void deleteSync({recursive: false}) {
     if (_path is !String) {
       throw new ArgumentError();
     }
-    var result = _delete(_path, false);
-    if (result is OSError) {
-      throw new DirectoryIOException("Deletion failed", _path, result);
-    }
-  }
-
-  Future<Directory> deleteRecursively() {
-    return _deleteHelper(true, "Deletion failed");
-  }
-
-  void deleteRecursivelySync() {
-    if (_path is !String) {
-      throw new ArgumentError();
-    }
-    var result = _delete(_path, true);
+    var result = _delete(_path, recursive);
     if (result is OSError) {
       throw new DirectoryIOException("Deletion failed", _path, result);
     }
diff --git a/lib/io/eventhandler.dart b/sdk/lib/io/eventhandler.dart
similarity index 100%
rename from lib/io/eventhandler.dart
rename to sdk/lib/io/eventhandler.dart
diff --git a/lib/io/file.dart b/sdk/lib/io/file.dart
similarity index 100%
rename from lib/io/file.dart
rename to sdk/lib/io/file.dart
diff --git a/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
similarity index 100%
rename from lib/io/file_impl.dart
rename to sdk/lib/io/file_impl.dart
diff --git a/lib/io/http.dart b/sdk/lib/io/http.dart
similarity index 100%
rename from lib/io/http.dart
rename to sdk/lib/io/http.dart
diff --git a/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
similarity index 95%
rename from lib/io/http_impl.dart
rename to sdk/lib/io/http_impl.dart
index 740dc36..440b635 100644
--- a/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -1144,12 +1144,13 @@
       for (int i = 0; i < cookies.length; i++) {
         if (cookies[i].name.toUpperCase() == _DART_SESSION_ID) {
           cookies[i].value = session.id;
+          cookies[i].httpOnly = true;
           found = true;
           break;
         }
       }
       if (!found) {
-        cookies.add(new Cookie(_DART_SESSION_ID, session.id));
+        cookies.add(new Cookie(_DART_SESSION_ID, session.id)..httpOnly = true);
       }
     }
     // Add all the cookies set to the headers.
@@ -1306,15 +1307,7 @@
     List<int> buffer = new Uint8List(available);
     int bytesRead = _socket.readList(buffer, 0, available);
     if (bytesRead > 0) {
-      int parsed = _httpParser.writeList(buffer, 0, bytesRead);
-      if (!_httpParser.upgrade) {
-        if (parsed != bytesRead) {
-          if (_socket != null) {
-            // TODO(sgjesse): Error handling.
-            _destroy();
-          }
-        }
-      }
+      _httpParser.writeList(buffer, 0, bytesRead);
     }
   }
 
@@ -1340,7 +1333,7 @@
     Socket socket = _socket;
     _socket = null;
     if (onDetach != null) onDetach();
-    return new _DetachedSocket(socket, _httpParser.unparsedData);
+    return new _DetachedSocket(socket, _httpParser.readUnparsedData());
   }
 
   HttpConnectionInfo get connectionInfo {
@@ -1398,7 +1391,7 @@
     // Don't report errors when HTTP parser is in idle state. Clients
     // can close the connection and cause a connection reset by peer
     // error which is OK.
-    if (e != null && onError != null && !_httpParser.isIdle) {
+    if (e != null && !_httpParser.isIdle) {
       onError(e);
       // Propagate the error to the streams.
       if (_request != null && _request._streamErrorHandler != null) {
@@ -1412,23 +1405,27 @@
     // If currently not processing any request close the socket when
     // we are done writing the response.
     if (_httpParser.isIdle) {
-      _socket.outputStream.onClosed = () {
-        _destroy();
-        if (onClosed != null && e == null) {
-          // Don't call onClosed if onError has been called.
+      // If the httpParser is idle and we get an error from the
+      // connection we deal with that as a closed connection and not
+      // as an error. When the client disappears we get a connection
+      // reset by peer and that is OK.
+      if (e != null) {
+        onClosed();
+      } else {
+        _socket.outputStream.onClosed = () {
+          _destroy();
           onClosed();
-        }
-      };
-      // If the client closes and we are done writing the response
-      // the connection should be closed.
-      if (_response == null) _close();
-      return;
-    }
-
-    // Processing a request.
-    if (e == null) {
-      // Indicate connection close to the HTTP parser.
-      _httpParser.connectionClosed();
+        };
+        // If the client closes and we are done writing the response
+        // the connection should be closed.
+        if (_response == null) _close();
+      }
+    } else {
+      // Processing a request.
+      if (e == null) {
+        // Indicate connection close to the HTTP parser.
+        _httpParser.connectionClosed();
+      }
     }
   }
 
@@ -1472,6 +1469,7 @@
     if (_closing) {
       _socket.outputStream.onClosed = () {
         _socket.close();
+        onClosed();
       };
     }
     _response = null;
@@ -1666,6 +1664,7 @@
     _httpConnection._onNoPendingWrites = null;
     // Ensure that any trailing data is written.
     _writeDone();
+    _connection._requestDone();
   }
 
   void _streamSetNoPendingWriteHandler(callback()) {
@@ -1802,7 +1801,7 @@
         // TODO(sgjesse): Support digest.
         if (cr.scheme == _AuthenticationScheme.BASIC) {
           inputStream.onData = inputStream.read;
-          inputStream.onClosed = _connection.retry;
+          _connection._retry();
           return;
         }
       }
@@ -1896,7 +1895,7 @@
         }
         // Drain body and redirect.
         inputStream.onData = inputStream.read;
-        inputStream.onClosed = _connection.redirect;
+        _connection.redirect();
       } else {
         throw new RedirectLimitExceededException(_connection._redirects);
       }
@@ -1951,6 +1950,11 @@
 
 class _HttpClientConnection
     extends _HttpConnectionBase implements HttpClientConnection {
+  static const int NONE = 0;
+  static const int REQUEST_DONE = 1;
+  static const int RESPONSE_DONE = 2;
+  static const int ALL_DONE = REQUEST_DONE | RESPONSE_DONE;
+
   _HttpClientConnection(_HttpClient this._client);
 
   void _connectionEstablished(_SocketConnection socketConn) {
@@ -1970,16 +1974,41 @@
     _httpParser.error = (e) => _onError(e);
   }
 
+  bool get _isRequestDone => (_state & REQUEST_DONE) == REQUEST_DONE;
+  bool get _isResponseDone => (_state & RESPONSE_DONE) == RESPONSE_DONE;
+  bool get _isAllDone => (_state & ALL_DONE) == ALL_DONE;
+
+  void _checkSocketDone() {
+    if (_isAllDone) {
+      if (!_closing) {
+        _client._returnSocketConnection(_socketConn);
+      }
+      _socket = null;
+      _socketConn = null;
+      assert(_pendingRedirect == null || _pendingRetry == null);
+      if (_pendingRedirect != null) {
+        _doRedirect(_pendingRedirect);
+        _pendingRedirect = null;
+      } else if (_pendingRetry != null) {
+        _doRetry(_pendingRetry);
+        _pendingRetry = null;
+      }
+    }
+  }
+
+  void _requestDone() {
+    _state |= REQUEST_DONE;
+    _checkSocketDone();
+  }
+
   void _responseDone() {
     if (_closing) {
       if (_socket != null) {
         _socket.close();
       }
-    } else {
-      _client._returnSocketConnection(_socketConn);
     }
-    _socket = null;
-    _socketConn = null;
+    _state |= RESPONSE_DONE;
+    _checkSocketDone();
   }
 
   HttpClientRequest open(String method, Uri uri) {
@@ -2056,32 +2085,58 @@
     _onErrorCallback = callback;
   }
 
-  void retry() {
-    if (_socketConn != null) {
-      throw new HttpException("Cannot retry with body data pending");
-    }
+  void _doRetry(_RedirectInfo retry) {
+    assert(_socketConn == null);
+    _request = null;
+    _response = null;
+
     // Retry the URL using the same connection instance.
-    _client._openUrl(_method, _request._uri, this);
+    _state = NONE;
+    _client._openUrl(retry.method, retry.location, this);
+  }
+
+  void _retry() {
+    var retry = new _RedirectInfo(_response.statusCode, _method, _request._uri);
+    // The actual retry is postponed until both response and request
+    // are done.
+    if (_isAllDone) {
+      _doRetry(retry);
+    } else {
+      // Prepare for retry.
+      assert(_pendingRedirect == null);
+      _pendingRetry = retry;
+    }
+  }
+
+  void _doRedirect(_RedirectInfo redirect) {
+    assert(_socketConn == null);
+
+    if (_redirects == null) {
+      _redirects = new List<_RedirectInfo>();
+    }
+    _redirects.add(redirect);
+    _doRetry(redirect);
   }
 
   void redirect([String method, Uri url]) {
-    if (_socketConn != null) {
-      throw new HttpException("Cannot redirect with body data pending");
-    }
     if (method == null) method = _method;
     if (url == null) {
       url = new Uri.fromString(_response.headers.value(HttpHeaders.LOCATION));
     }
-    if (_redirects == null) {
-      _redirects = new List<_RedirectInfo>();
+    var redirect = new _RedirectInfo(_response.statusCode, method, url);
+    // The actual redirect is postponed until both response and
+    // request are done.
+    if (_isAllDone) {
+      _doRedirect(redirect);
+    } else {
+      // Prepare for redirect.
+      assert(_pendingRetry == null);
+      _pendingRedirect = redirect;
     }
-    _redirects.add(new _RedirectInfo(_response.statusCode, method, url));
-    _request = null;
-    _response = null;
-    // Open redirect URL using the same connection instance.
-    _client._openUrl(method, url, this);
   }
 
+  int _state = NONE;
+
   List<RedirectInfo> get redirects => _redirects;
 
   Function _onRequest;
@@ -2099,6 +2154,8 @@
   bool followRedirects = true;
   int maxRedirects = 5;
   List<_RedirectInfo> _redirects;
+  _RedirectInfo _pendingRedirect;
+  _RedirectInfo _pendingRetry;
 
   // Callbacks.
   var requestReceived;
diff --git a/lib/io/http_parser.dart b/sdk/lib/io/http_parser.dart
similarity index 93%
rename from lib/io/http_parser.dart
rename to sdk/lib/io/http_parser.dart
index a5549c5..61e0a64 100644
--- a/lib/io/http_parser.dart
+++ b/sdk/lib/io/http_parser.dart
@@ -116,11 +116,12 @@
  * object will be [:true:] indicating that from now on the protocol is
  * not HTTP anymore and no more callbacks will happen, that is
  * [:dataReceived:] and [:dataEnd:] are not called in this case as
- * there is no more HTTP data. After the upgrade the call to
- * [:writeList:] causing the upgrade will return with the number of
- * bytes parsed as HTTP. Any unparsed bytes is part of the protocol
- * the connection is upgrading to and should be handled according to
- * that protocol.
+ * there is no more HTTP data. After the upgrade the method
+ * [:readUnparsedData:] can be used to read any remaining bytes in the
+ * HTTP parser which are part of the protocol the connection is
+ * upgrading to. These bytes cannot be processed by the HTTP parser
+ * and should be handled according to whatever protocol is being
+ * upgraded to.
  */
 class _HttpParser {
   _HttpParser() {
@@ -136,9 +137,7 @@
   // Request-Line    = Method SP Request-URI SP HTTP-Version CRLF
   // Status-Line     = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
   // message-header  = field-name ":" [ field-value ]
-  int writeList(List<int> buffer, int offset, int count) {
-    int index = offset;
-    int lastIndex = offset + count;
+  void _parse() {
     try {
       if (_state == _State.CLOSED) {
         throw new HttpParserException("Data on closed connection");
@@ -149,10 +148,11 @@
       if (_state == _State.FAILURE) {
         throw new HttpParserException("Data on failed connection");
       }
-      while ((index < lastIndex) &&
+      while (_buffer != null &&
+             _index < _lastIndex &&
              _state != _State.FAILURE &&
              _state != _State.UPGRADED) {
-        int byte = buffer[index];
+        int byte = _buffer[_index++];
         switch (_state) {
           case _State.START:
             if (byte == _Const.HTTP[0]) {
@@ -325,7 +325,9 @@
                   statusCode <= 199 || statusCode == 204 || statusCode == 304;
             }
             if (responseStart != null) {
-              responseStart(statusCode, _uri_or_reason_phrase.toString(), version);
+              responseStart(statusCode,
+                            _uri_or_reason_phrase.toString(),
+                            version);
             }
             _method_or_status_code.clear();
             _uri_or_reason_phrase.clear();
@@ -438,8 +440,6 @@
             }
             if (_connectionUpgrade) {
               _state = _State.UPGRADED;
-              _unparsedData =
-                  buffer.getRange(index + 1, count - (index + 1 - offset));
               if (headersComplete != null) headersComplete();
             } else {
               if (headersComplete != null) headersComplete();
@@ -513,22 +513,23 @@
 
           case _State.BODY:
             // The body is not handled one byte at a time but in blocks.
-            int dataAvailable = lastIndex - index;
+            _index--;
+            int dataAvailable = _lastIndex - _index;
             List<int> data;
             if (_remainingContent == null ||
                 dataAvailable <= _remainingContent) {
               data = new Uint8List(dataAvailable);
-              data.setRange(0, dataAvailable, buffer, index);
+              data.setRange(0, dataAvailable, _buffer, _index);
             } else {
               data = new Uint8List(_remainingContent);
-              data.setRange(0, _remainingContent, buffer, index);
+              data.setRange(0, _remainingContent, _buffer, _index);
             }
 
             if (dataReceived != null) dataReceived(data);
             if (_remainingContent != null) {
               _remainingContent -= data.length;
             }
-            index += data.length;
+            _index += data.length;
             if (_remainingContent == 0) {
               if (!_chunked) {
                 _bodyEnd();
@@ -537,9 +538,6 @@
                 _state = _State.CHUNK_SIZE_STARTING_CR;
               }
             }
-
-            // Hack - as we always do index++ below.
-            index--;
             break;
 
           case _State.FAILURE:
@@ -552,9 +550,6 @@
             assert(false);
             break;
         }
-
-        // Move to the next byte.
-        index++;
       }
     } catch (e) {
       // Report the error through the error callback if any. Otherwise
@@ -567,8 +562,17 @@
       }
     }
 
-    // Return the number of bytes parsed.
-    return index - offset;
+    // If all data is parsed or not needed due to failure there is no
+    // need to hold on to the buffer.
+    if (_state != _State.UPGRADED) _releaseBuffer();
+  }
+
+  void writeList(List<int> buffer, int offset, int count) {
+    assert(_buffer == null);
+    _buffer = buffer;
+    _index = offset;
+    _lastIndex = offset + count;
+    _parse();
   }
 
   void connectionClosed() {
@@ -623,7 +627,13 @@
 
   bool get isIdle => _state == _State.START;
 
-  List<int> get unparsedData => _unparsedData;
+  List<int> readUnparsedData() {
+    if (_buffer == null) return [];
+    if (_index == _lastIndex) return [];
+    var result = _buffer.getRange(_index, _lastIndex - _index);
+    _releaseBuffer();
+    return result;
+  }
 
   void _bodyEnd() {
     if (dataEnd != null) {
@@ -650,6 +660,12 @@
     _remainingContent = null;
   }
 
+  _releaseBuffer() {
+    _buffer = null;
+    _index = null;
+    _lastIndex = null;
+  }
+
   bool _isTokenChar(int byte) {
     return byte > 31 && byte < 128 && _Const.SEPARATORS.indexOf(byte) == -1;
   }
@@ -696,6 +712,11 @@
     }
   }
 
+  // The data that is currently being parsed.
+  List<int> _buffer;
+  int _index;
+  int _lastIndex;
+
   int _state;
   int _httpVersionIndex;
   int _messageType;
@@ -714,7 +735,6 @@
   String _responseToMethod;  // Indicates the method used for the request.
   int _remainingContent;
 
-  List<int> _unparsedData;  // Unparsed data after connection upgrade.
   // Callbacks.
   Function requestStart;
   Function responseStart;
diff --git a/lib/io/http_session.dart b/sdk/lib/io/http_session.dart
similarity index 100%
rename from lib/io/http_session.dart
rename to sdk/lib/io/http_session.dart
diff --git a/lib/io/http_utils.dart b/sdk/lib/io/http_utils.dart
similarity index 100%
rename from lib/io/http_utils.dart
rename to sdk/lib/io/http_utils.dart
diff --git a/lib/io/input_stream.dart b/sdk/lib/io/input_stream.dart
similarity index 100%
rename from lib/io/input_stream.dart
rename to sdk/lib/io/input_stream.dart
diff --git a/lib/io/io.dart b/sdk/lib/io/io.dart
similarity index 100%
rename from lib/io/io.dart
rename to sdk/lib/io/io.dart
diff --git a/lib/io/iolib_sources.gypi b/sdk/lib/io/iolib_sources.gypi
similarity index 100%
rename from lib/io/iolib_sources.gypi
rename to sdk/lib/io/iolib_sources.gypi
diff --git a/lib/io/list_stream.dart b/sdk/lib/io/list_stream.dart
similarity index 100%
rename from lib/io/list_stream.dart
rename to sdk/lib/io/list_stream.dart
diff --git a/lib/io/list_stream_impl.dart b/sdk/lib/io/list_stream_impl.dart
similarity index 100%
rename from lib/io/list_stream_impl.dart
rename to sdk/lib/io/list_stream_impl.dart
diff --git a/lib/io/mime_multipart_parser.dart b/sdk/lib/io/mime_multipart_parser.dart
similarity index 100%
rename from lib/io/mime_multipart_parser.dart
rename to sdk/lib/io/mime_multipart_parser.dart
diff --git a/lib/io/output_stream.dart b/sdk/lib/io/output_stream.dart
similarity index 100%
rename from lib/io/output_stream.dart
rename to sdk/lib/io/output_stream.dart
diff --git a/lib/io/path.dart b/sdk/lib/io/path.dart
similarity index 100%
rename from lib/io/path.dart
rename to sdk/lib/io/path.dart
diff --git a/lib/io/path_impl.dart b/sdk/lib/io/path_impl.dart
similarity index 98%
rename from lib/io/path_impl.dart
rename to sdk/lib/io/path_impl.dart
index d3467df..58e7ce3 100644
--- a/lib/io/path_impl.dart
+++ b/sdk/lib/io/path_impl.dart
@@ -75,7 +75,7 @@
       }
       return new Path(sb.toString());
     }
-    throw new NotImplementedException(
+    throw new UnimplementedError(
       "Unimplemented case of Path.relativeTo(base):\n"
       "  Only absolute paths are handled at present.\n"
       "  Arguments: $_path.relativeTo($base)");
@@ -189,7 +189,7 @@
     if (Platform.operatingSystem == 'windows') {
       String nativePath = _path;
       // Drop '/' before a drive letter.
-      if (nativePath.length > 3 &&
+      if (nativePath.length >= 3 &&
           nativePath.startsWith('/') &&
           nativePath[2] == ':') {
         nativePath = nativePath.substring(1);
diff --git a/lib/io/platform.dart b/sdk/lib/io/platform.dart
similarity index 100%
rename from lib/io/platform.dart
rename to sdk/lib/io/platform.dart
diff --git a/lib/io/platform_impl.dart b/sdk/lib/io/platform_impl.dart
similarity index 100%
rename from lib/io/platform_impl.dart
rename to sdk/lib/io/platform_impl.dart
diff --git a/lib/io/process.dart b/sdk/lib/io/process.dart
similarity index 100%
rename from lib/io/process.dart
rename to sdk/lib/io/process.dart
diff --git a/lib/io/socket.dart b/sdk/lib/io/socket.dart
similarity index 100%
rename from lib/io/socket.dart
rename to sdk/lib/io/socket.dart
diff --git a/lib/io/socket_stream_impl.dart b/sdk/lib/io/socket_stream_impl.dart
similarity index 100%
rename from lib/io/socket_stream_impl.dart
rename to sdk/lib/io/socket_stream_impl.dart
diff --git a/lib/io/stdio.dart b/sdk/lib/io/stdio.dart
similarity index 100%
rename from lib/io/stdio.dart
rename to sdk/lib/io/stdio.dart
diff --git a/lib/io/stream_util.dart b/sdk/lib/io/stream_util.dart
similarity index 100%
rename from lib/io/stream_util.dart
rename to sdk/lib/io/stream_util.dart
diff --git a/lib/io/string_stream.dart b/sdk/lib/io/string_stream.dart
similarity index 96%
rename from lib/io/string_stream.dart
rename to sdk/lib/io/string_stream.dart
index 5d71af4..8f99c66 100644
--- a/lib/io/string_stream.dart
+++ b/sdk/lib/io/string_stream.dart
@@ -85,22 +85,18 @@
 
   int get lineBreaks => _lineBreaks;
 
-  String decoded([int len]) {
+  String decoded([int length]) {
     if (isEmpty) return null;
 
-    String result;
-    if (len !== null && len < available()) {
-      result = new String.fromCharCodes(_result.getRange(_resultOffset, len));
+    List<int> result;
+    if (length != null && length < available()) {
+      result = _result.getRange(_resultOffset, length);
+    } else if (_resultOffset == 0) {
+      result = _result;
     } else {
-      if (_resultOffset == 0) {
-        result = new String.fromCharCodes(_result);
-      } else {
-        result =
-            new String.fromCharCodes(
-                _result.getRange(_resultOffset,
-                                 _result.length - _resultOffset));
-      }
+      result = _result.getRange(_resultOffset, _result.length - _resultOffset);
     }
+
     _resultOffset += result.length;
     while (!_lineBreakEnds.isEmpty &&
            _lineBreakEnds.first < _charOffset + _resultOffset) {
@@ -108,7 +104,7 @@
       _lineBreaks--;
     }
     if (_result.length == _resultOffset) _resetResult();
-    return result;
+    return new String.fromCharCodes(result);
   }
 
   String get decodedLine {
@@ -419,7 +415,7 @@
 
   void set onError(void callback(e)) {
     _input.onError = callback;
-    _decoder.onError = (e) { 
+    _decoder.onError = (e) {
       _clientCloseHandler = null;
       _input.close();
       callback(e);
diff --git a/lib/io/timer_impl.dart b/sdk/lib/io/timer_impl.dart
similarity index 100%
rename from lib/io/timer_impl.dart
rename to sdk/lib/io/timer_impl.dart
diff --git a/lib/io/websocket.dart b/sdk/lib/io/websocket.dart
similarity index 100%
rename from lib/io/websocket.dart
rename to sdk/lib/io/websocket.dart
diff --git a/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart
similarity index 100%
rename from lib/io/websocket_impl.dart
rename to sdk/lib/io/websocket_impl.dart
diff --git a/lib/isolate/base.dart b/sdk/lib/isolate/base.dart
similarity index 100%
rename from lib/isolate/base.dart
rename to sdk/lib/isolate/base.dart
diff --git a/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
similarity index 100%
rename from lib/isolate/isolate.dart
rename to sdk/lib/isolate/isolate.dart
diff --git a/lib/isolate/isolate_sources.gypi b/sdk/lib/isolate/isolate_sources.gypi
similarity index 100%
rename from lib/isolate/isolate_sources.gypi
rename to sdk/lib/isolate/isolate_sources.gypi
diff --git a/lib/isolate/timer.dart b/sdk/lib/isolate/timer.dart
similarity index 100%
rename from lib/isolate/timer.dart
rename to sdk/lib/isolate/timer.dart
diff --git a/lib/json/json.dart b/sdk/lib/json/json.dart
similarity index 100%
rename from lib/json/json.dart
rename to sdk/lib/json/json.dart
diff --git a/lib/math/base.dart b/sdk/lib/math/base.dart
similarity index 100%
rename from lib/math/base.dart
rename to sdk/lib/math/base.dart
diff --git a/lib/math/math.dart b/sdk/lib/math/math.dart
similarity index 100%
rename from lib/math/math.dart
rename to sdk/lib/math/math.dart
diff --git a/lib/math/math_sources.gypi b/sdk/lib/math/math_sources.gypi
similarity index 100%
rename from lib/math/math_sources.gypi
rename to sdk/lib/math/math_sources.gypi
diff --git a/lib/math/random.dart b/sdk/lib/math/random.dart
similarity index 100%
rename from lib/math/random.dart
rename to sdk/lib/math/random.dart
diff --git a/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
similarity index 100%
rename from lib/mirrors/mirrors.dart
rename to sdk/lib/mirrors/mirrors.dart
diff --git a/lib/mirrors/mirrors_sources.gypi b/sdk/lib/mirrors/mirrors_sources.gypi
similarity index 83%
rename from lib/mirrors/mirrors_sources.gypi
rename to sdk/lib/mirrors/mirrors_sources.gypi
index 8d2ecce..8134666 100644
--- a/lib/mirrors/mirrors_sources.gypi
+++ b/sdk/lib/mirrors/mirrors_sources.gypi
@@ -4,6 +4,6 @@
 
 {
   'sources': [
-    '../../runtime/lib/empty_source.dart',
+    '../../../runtime/lib/empty_source.dart',
   ],
-}
\ No newline at end of file
+}
diff --git a/lib/scalarlist/byte_arrays.dart b/sdk/lib/scalarlist/byte_arrays.dart
similarity index 100%
rename from lib/scalarlist/byte_arrays.dart
rename to sdk/lib/scalarlist/byte_arrays.dart
diff --git a/lib/scalarlist/scalarlist.dart b/sdk/lib/scalarlist/scalarlist.dart
similarity index 100%
rename from lib/scalarlist/scalarlist.dart
rename to sdk/lib/scalarlist/scalarlist.dart
diff --git a/lib/scalarlist/scalarlist_sources.gypi b/sdk/lib/scalarlist/scalarlist_sources.gypi
similarity index 100%
rename from lib/scalarlist/scalarlist_sources.gypi
rename to sdk/lib/scalarlist/scalarlist_sources.gypi
diff --git a/lib/uri/encode_decode.dart b/sdk/lib/uri/encode_decode.dart
similarity index 100%
rename from lib/uri/encode_decode.dart
rename to sdk/lib/uri/encode_decode.dart
diff --git a/lib/uri/helpers.dart b/sdk/lib/uri/helpers.dart
similarity index 100%
rename from lib/uri/helpers.dart
rename to sdk/lib/uri/helpers.dart
diff --git a/lib/uri/uri.dart b/sdk/lib/uri/uri.dart
similarity index 100%
rename from lib/uri/uri.dart
rename to sdk/lib/uri/uri.dart
diff --git a/lib/utf/utf.dart b/sdk/lib/utf/utf.dart
similarity index 100%
rename from lib/utf/utf.dart
rename to sdk/lib/utf/utf.dart
diff --git a/lib/utf/utf16.dart b/sdk/lib/utf/utf16.dart
similarity index 100%
rename from lib/utf/utf16.dart
rename to sdk/lib/utf/utf16.dart
diff --git a/lib/utf/utf32.dart b/sdk/lib/utf/utf32.dart
similarity index 100%
rename from lib/utf/utf32.dart
rename to sdk/lib/utf/utf32.dart
diff --git a/lib/utf/utf8.dart b/sdk/lib/utf/utf8.dart
similarity index 100%
rename from lib/utf/utf8.dart
rename to sdk/lib/utf/utf8.dart
diff --git a/lib/utf/utf_core.dart b/sdk/lib/utf/utf_core.dart
similarity index 95%
rename from lib/utf/utf_core.dart
rename to sdk/lib/utf/utf_core.dart
index fb9e0e4..a1cedce 100644
--- a/lib/utf/utf_core.dart
+++ b/sdk/lib/utf/utf_core.dart
@@ -2,20 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// TODO(jmesserly): would be nice to have this on String (dartbug.com/6501).
 /**
  * Provide a list of Unicode codepoints for a given string.
  */
 List<int> stringToCodepoints(String str) {
-  List<int> codepoints;
-  // TODO _is16BitCodeUnit() is used to work around a bug with dart2js
-  // (http://code.google.com/p/dart/issues/detail?id=1357). Consider
-  // removing after this issue is resolved.
-  if (_is16BitCodeUnit()) {
-    codepoints = _utf16CodeUnitsToCodepoints(str.charCodes);
-  } else {
-    codepoints = str.charCodes;
-  }
-  return codepoints;
+  // Note: str.charCodes gives us 16-bit code units on all Dart implementations.
+  // So we need to convert. The same is not true of "new String.fromCharCodes",
+  // which accepts code points on the VM but not dart2js (dartbug.com/1357).
+  return _utf16CodeUnitsToCodepoints(str.charCodes);
 }
 
 /**
diff --git a/tests/benchmark_smoke/benchmark_smoke_test.dart b/tests/benchmark_smoke/benchmark_smoke_test.dart
index 91cb484..2c46a48 100644
--- a/tests/benchmark_smoke/benchmark_smoke_test.dart
+++ b/tests/benchmark_smoke/benchmark_smoke_test.dart
@@ -1,13 +1,14 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-#library('benchmark_smoke_test');
+
+library benchmarksmoketest;
 
 // Tests that benchmark classes used in perf testing are not broken.
-#import('benchmark_lib.dart');
-#import('dart:html');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
+import 'benchmark_lib.dart';
+import 'dart:html';
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
 
 void main() {
   useHtmlConfiguration();
diff --git a/tests/co19/co19-compiler.status b/tests/co19/co19-compiler.status
index 25470a6..c8264bb 100644
--- a/tests/co19/co19-compiler.status
+++ b/tests/co19/co19-compiler.status
@@ -214,6 +214,155 @@
 Language/13_Libraries_and_Scripts/3_Includes_A02_t04: Fail, OK
 Language/13_Libraries_and_Scripts/4_Scripts_A01_t16: Fail, OK
 
+# co19 issue 303
+Language/05_Variables/05_Variables_A07_t09: Fail, OK
+Language/05_Variables/05_Variables_A08_t03: Fail, OK
+Language/05_Variables/05_Variables_A12_t06: Fail, OK
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t01: Fail, OK
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t02: Fail, OK
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t03: Fail, OK
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A17_t04: Fail, OK
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A18_t03: Fail, OK
+Language/07_Classes/6_Constructors/2_Factories_A01_t01: Fail, OK
+Language/07_Classes/6_Constructors/2_Factories_A06_t01: Fail, OK
+Language/07_Classes/6_Constructors/2_Factories_A06_t02: Fail, OK
+Language/07_Classes/6_Constructors/2_Factories_A06_t03: Fail, OK
+Language/07_Classes/6_Constructors/2_Factories_A06_t04: Fail, OK
+Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A01_t06: Fail, OK
+Language/09_Generics/09_Generics_A03_t01: Fail, OK
+Language/09_Generics/09_Generics_A04_t06: Fail, OK
+Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A01_t02: Fail, OK
+Language/11_Expressions/04_Booleans/1_Boolean_Conversion_A01_t01: Fail, OK
+Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t01: Fail, OK
+Language/11_Expressions/05_Strings_A18_t02: Fail, OK
+Language/11_Expressions/05_Strings_A18_t03: Fail, OK
+Language/11_Expressions/05_Strings_A18_t04: Fail, OK
+Language/11_Expressions/05_Strings_A18_t06: Fail, OK
+Language/11_Expressions/05_Strings_A18_t07: Fail, OK
+Language/11_Expressions/05_Strings_A18_t05: Fail, OK
+Language/11_Expressions/05_Strings_A18_t08: Fail, OK
+Language/11_Expressions/05_Strings_A18_t09: Fail, OK
+Language/11_Expressions/06_Lists_A09_t01: Fail, OK
+Language/11_Expressions/06_Lists_A09_t02: Fail, OK
+Language/11_Expressions/06_Lists_A09_t03: Fail, OK
+Language/11_Expressions/06_Lists_A09_t04: Fail, OK
+Language/11_Expressions/06_Lists_A09_t05: Fail, OK
+Language/11_Expressions/07_Maps_A10_t02: Fail, OK
+Language/11_Expressions/07_Maps_A10_t03: Fail, OK
+Language/11_Expressions/07_Maps_A10_t05: Fail, OK
+Language/11_Expressions/07_Maps_A10_t04: Fail, OK
+Language/11_Expressions/09_Function_Expressions_A03_t03: Fail, OK
+Language/11_Expressions/09_Function_Expressions_A03_t04: Fail, OK
+Language/11_Expressions/09_Function_Expressions_A04_t03: Fail, OK
+Language/11_Expressions/09_Function_Expressions_A04_t04: Fail, OK
+Language/11_Expressions/09_Function_Expressions_A05_t02: Fail, OK
+Language/11_Expressions/09_Function_Expressions_A05_t03: Fail, OK
+Language/11_Expressions/09_Function_Expressions_A05_t04: Fail, OK
+Language/11_Expressions/09_Function_Expressions_A05_t05: Fail, OK
+Language/11_Expressions/09_Function_Expressions_A06_t02: Fail, OK
+Language/11_Expressions/09_Function_Expressions_A06_t03: Fail, OK
+Language/11_Expressions/09_Function_Expressions_A06_t04: Fail, OK
+Language/11_Expressions/09_Function_Expressions_A06_t05: Fail, OK
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A02_t01: Fail, OK
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A03_t01: Fail, OK
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A05_t01: Fail, OK
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A05_t02: Fail, OK
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A05_t03: Fail, OK
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A05_t04: Fail, OK
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A08_t01: Fail, OK
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A08_t02: Fail, OK
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A08_t04: Fail, OK
+Language/11_Expressions/14_Function_Invocation/2_Binding_Actuals_to_Formals_A08_t03: Fail, OK
+Language/11_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t02: Fail, OK
+Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A06_t02: Fail, OK
+Language/11_Expressions/18_Assignment_A02_t01: Fail, OK
+Language/11_Expressions/18_Assignment_A03_t01: Fail, OK
+Language/11_Expressions/18_Assignment_A04_t06: Fail, OK
+Language/11_Expressions/18_Assignment_A04_t07: Fail, OK
+Language/11_Expressions/18_Assignment_A06_t01: Fail, OK
+Language/11_Expressions/19_Conditional_A02_t03: Fail, OK
+Language/11_Expressions/19_Conditional_A02_t04: Fail, OK
+Language/11_Expressions/20_Logical_Boolean_Expressions_A03_t01: Fail, OK
+Language/11_Expressions/22_Equality_A10_t02: Fail, OK
+Language/11_Expressions/27_Unary_Expressions_A02_t03: Fail, OK
+Language/11_Expressions/30_Identifier_Reference_A03_t01: Fail, OK
+Language/11_Expressions/30_Identifier_Reference_A10_t02: Fail, OK
+Language/12_Statements/03_Variable_Declaration_A01_t01: Fail, OK
+Language/12_Statements/03_Variable_Declaration_A01_t02: Fail, OK
+Language/12_Statements/05_If_A05_t01: Fail, OK
+Language/12_Statements/05_If_A05_t02: Fail, OK
+Language/12_Statements/06_For/1_For_Loop_A01_t07: Fail, OK
+Language/12_Statements/06_For/1_For_Loop_A01_t08: Fail, OK
+Language/12_Statements/07_While_A02_t02: Fail, OK
+Language/12_Statements/07_While_A03_t01: Fail, OK
+Language/12_Statements/07_While_A03_t02: Fail, OK
+Language/12_Statements/07_While_A03_t03: Fail, OK
+Language/12_Statements/08_Do_A02_t03: Fail, OK
+Language/12_Statements/15_Assert_A02_t01: Fail, OK
+Language/12_Statements/15_Assert_A03_t01: Fail, OK
+Language/12_Statements/15_Assert_A03_t02: Fail, OK
+Language/12_Statements/15_Assert_A03_t04: Fail, OK
+Language/12_Statements/15_Assert_A03_t03: Fail, OK
+Language/12_Statements/15_Assert_A03_t05: Fail, OK
+Language/12_Statements/15_Assert_A03_t08: Fail, OK
+Language/12_Statements/15_Assert_A03_t06: Fail, OK
+Language/12_Statements/15_Assert_A03_t09: Fail, OK
+Language/13_Libraries_and_Scripts/4_Scripts_A01_t17: Fail, OK
+Language/13_Libraries_and_Scripts/4_Scripts_A03_t01: Fail, OK
+Language/13_Libraries_and_Scripts/4_Scripts_A03_t02: Fail, OK
+Language/14_Types/1_Static_Types_A02_t09: Fail, OK
+Language/14_Types/2_Dynamic_Type_System_A01_t01: Fail, OK
+Language/14_Types/4_Interface_Types_A08_t03: Fail, OK
+Language/14_Types/8_Parameterized_Types_A02_t01: Fail, OK
+LibTest/core/AssertionError/column_A01_t02: Fail, OK
+LibTest/core/AssertionError/failedAssertion_A01_t01: Fail, OK
+LibTest/core/AssertionError/line_A01_t02: Fail, OK
+LibTest/core/AssertionError/toString_A01_t01: Fail, OK
+LibTest/core/AssertionError/url_A01_t01: Fail, OK
+LibTest/core/double/ceil_A01_t01: Fail, OK
+LibTest/core/double/ceil_A01_t03: Fail, OK
+LibTest/core/double/ceil_A01_t06: Fail, OK
+LibTest/core/double/floor_A01_t01: Fail, OK
+LibTest/core/double/floor_A01_t03: Fail, OK
+LibTest/core/double/floor_A01_t06: Fail, OK
+LibTest/core/double/operator_remainder_A01_t01: Fail, OK
+LibTest/core/double/round_A01_t05: Fail, OK
+LibTest/core/double/toDouble_A01_t03: Fail, OK
+LibTest/core/double/toInt_A01_t05: Fail, OK
+LibTest/core/double/truncate_A01_t05: Fail, OK
+LibTest/core/Future/chain_A02_t05: Fail, OK
+LibTest/core/Future/transform_A02_t04: Fail, OK
+LibTest/core/int/operator_addition_A01_t01: Fail, OK
+LibTest/core/int/operator_division_A01_t01: Fail, OK
+LibTest/core/int/operator_GE_A01_t01: Fail, OK
+LibTest/core/int/operator_GT_A01_t01: Fail, OK
+LibTest/core/int/operator_LE_A01_t01: Fail, OK
+LibTest/core/int/operator_LT_A01_t01: Fail, OK
+LibTest/core/int/operator_remainder_A01_t02: Fail, OK
+LibTest/core/int/operator_subtraction_A01_t01: Fail, OK
+LibTest/core/int/remainder_A01_t02: Fail, OK
+LibTest/core/int/toDouble_A01_t01: Fail, OK
+LibTest/core/List/addAll_A04_t01: Fail, OK
+LibTest/core/List/every_A01_t01: Fail, OK
+LibTest/core/List/forEach_A01_t02: Fail, OK
+LibTest/core/List/getRange_A06_t01: Fail, OK
+LibTest/core/List/indexOf_A06_t01: Fail, OK
+LibTest/core/List/insertRange_A08_t01: Fail, OK
+LibTest/core/List/length_A07_t01: Fail, OK
+LibTest/core/List/List.from_A03_t02: Fail, OK
+LibTest/core/List/List_A04_t01: Fail, OK
+LibTest/core/List/operator_subscript_A03_t01: Fail, OK
+LibTest/core/List/operator_subscripted_assignment_A03_t01: Fail, OK
+LibTest/core/List/setRange_A05_t01: Fail, OK
+LibTest/core/TypeError/dstName_A01_t01: Fail, OK
+LibTest/core/TypeError/column_A01_t01: Fail, OK
+LibTest/core/TypeError/failedAssertion_A01_t01: Fail, OK
+LibTest/core/TypeError/dstType_A01_t01: Fail, OK
+LibTest/core/TypeError/line_A01_t01: Fail, OK
+LibTest/core/TypeError/srcType_A01_t01: Fail, OK
+LibTest/core/TypeError/toString_A01_t01: Fail, OK
+LibTest/core/TypeError/url_A01_t01: Fail, OK
+
 
 
 Language/10_Expressions/30_Type_Cast_A01_t04: Fail, OK # the expected error is not specified
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 05deb6f..f5e2d1d 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -16,9 +16,10 @@
 Language/14_Types/4_Interface_Types_A10_t03: Fail
 
 
-Language/13_Libraries_and_Scripts/2_Exports_A04_t02: Crash # TODO(dart2dart-team): Please triage this crash.
-Language/13_Libraries_and_Scripts/2_Exports_A04_t03: Crash # TODO(dart2dart-team): Please triage this crash.
+Language/07_Classes/07_Classes_A03_t01: Fail, Pass # http://dartbug.com/6603 fails in minified, TRIAGE
+Language/11_Expressions/11_Instance_Creation/1_New_A12_t02: Fail, Pass # http://dartbug.com/6603 fails in minified, TRIAGE
 Language/12_Statements/10_Try_A06_t01: Fail, Pass # Fails in minified, TRIAGE
+Language/11_Expressions/11_Instance_Creation/1_New_A12_t01: Fail, Pass # Fails in minified, TRIAGE
 
 Language/03_Overview/1_Scoping_A02_t05: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/05_Variables/05_Variables_A05_t04: Fail # TODO(dart2dart-team): Please triage this failure.
@@ -103,21 +104,14 @@
 Language/13_Libraries_and_Scripts/1_Imports_A02_t19: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t28: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A03_t02: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t09: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t10: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A03_t22: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t29: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t30: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A03_t42: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t49: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t50: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A03_t62: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t69: Fail # TODO(dart2dart-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t70: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A01_t07: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A01_t15: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A01_t16: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A04_t01: Fail # TODO(dart2dart-team): Please triage this failure.
+Language/13_Libraries_and_Scripts/2_Exports_A04_t02: Fail # Inherited from dart2js
 Language/13_Libraries_and_Scripts/2_Exports_A04_t04: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A04_t05: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A04_t06: Fail # TODO(dart2dart-team): Please triage this failure.
@@ -188,26 +182,6 @@
 LibTest/core/EmptyQueueException/EmptyQueueException_A01_t01: Fail, OK # co19 issue 288
 LibTest/core/EmptyQueueException/toString_A01_t01: Fail, OK # co19 issue 288
 
-LibTest/core/List/getRange_A04_t01: Fail, OK # co19 issue 290
-LibTest/core/List/insertRange_A06_t01: Fail, OK # co19 issue 290
-LibTest/core/List/last_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/length_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/List_A01_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscripted_assignment_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/removeLast_A01_t02: Fail, OK # co19 issue 290
-LibTest/core/List/removeRange_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t02: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t02: Fail, OK # co19 issue 290
-LibTest/core/Match/group_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/groups_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/charCodeAt_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/substring_A02_t01: Fail, OK # co19 issue 290
-
 Language/03_Overview/1_Scoping_A01_t39: Fail # http://dartbug.com/5519
 Language/03_Overview/1_Scoping_A01_t40: Fail # http://dartbug.com/5519
 Language/03_Overview/1_Scoping_A01_t41: Fail # http://dartbug.com/5519
@@ -261,7 +235,6 @@
 Language/07_Classes/07_Classes_A02_t02: Fail # http://dartbug.com/5519
 Language/07_Classes/07_Classes_A02_t04: Fail # http://dartbug.com/5519
 Language/07_Classes/07_Classes_A02_t11: Fail # http://dartbug.com/5519
-Language/07_Classes/07_Classes_A03_t01: Fail # inherited from VM
 Language/07_Classes/07_Classes_A03_t02: Fail # http://dartbug.com/5519
 Language/07_Classes/07_Classes_A03_t07: Fail # inherited from dart2js
 Language/07_Classes/07_Classes_A03_t08: Fail # inherited from dart2js
@@ -391,8 +364,6 @@
 Language/11_Expressions/01_Constants_A17_t03: Crash # inherited from VM
 Language/11_Expressions/01_Constants_A17_t03: Fail # http://dartbug.com/5519
 Language/11_Expressions/01_Constants_A19_t04: Fail # http://dartbug.com/5519
-Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t04: Fail # Inherited from dart2js
-Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail # Inherited from dart2js
 Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # Inherited from dart2js
 Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t09: Fail, OK # co19 issue 210
 Language/11_Expressions/05_Strings/1_String_Interpolation_A03_t02: Fail # inherited from VM
@@ -414,8 +385,6 @@
 Language/11_Expressions/11_Instance_Creation/1_New_A02_t06: Fail # inherited from dart2js
 Language/11_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # inherited from dart2js
 Language/11_Expressions/11_Instance_Creation/1_New_A09_t09: Fail # inherited from VM
-Language/11_Expressions/11_Instance_Creation/1_New_A12_t01: Fail # co19 issue 255: unmatched bracket (same behavior in dart2js)
-Language/11_Expressions/11_Instance_Creation/1_New_A12_t02: Fail # Inherited from VM
 Language/11_Expressions/11_Instance_Creation/1_New_A13_t04: Fail # Inherited from VM
 Language/11_Expressions/11_Instance_Creation/1_New_A14_t01: Fail # Inherited from dart2js
 Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: Fail # http://dartbug.com/5519
@@ -445,28 +414,15 @@
 Language/11_Expressions/18_Assignment_A05_t02: Fail # inherited from VM
 Language/11_Expressions/18_Assignment_A05_t04: Fail # inherited from VM
 Language/11_Expressions/18_Assignment_A05_t05: Fail # inherited from VM
-Language/11_Expressions/19_Conditional_A01_t10: Fail # Inherited from dart2js
-Language/11_Expressions/19_Conditional_A01_t11: Fail # Inherited from dart2js
-Language/11_Expressions/19_Conditional_A01_t12: Fail # Inherited from dart2js
-Language/11_Expressions/19_Conditional_A01_t13: Fail # Inherited from dart2js
 Language/11_Expressions/19_Conditional_A01_t14: Fail # Inherited from dart2js
 Language/11_Expressions/19_Conditional_A01_t15: Fail # Inherited from dart2js
-Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t11: Fail # Inherited from dart2js
-Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail # http://dartbug.com/5519
-Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail # Inherited from dart2js
 Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail # Inherited from dart2js
-Language/11_Expressions/21_Bitwise_Expressions_A01_t13: Fail # Inherited from dart2js
-Language/11_Expressions/21_Bitwise_Expressions_A01_t14: Fail # http://dartbug.com/5519
-Language/11_Expressions/21_Bitwise_Expressions_A01_t15: Fail # Inherited from dart2js
 Language/11_Expressions/21_Bitwise_Expressions_A01_t16: Fail # Inherited from dart2js
 Language/11_Expressions/21_Bitwise_Expressions_A01_t17: Fail # Inherited from dart2js
 Language/11_Expressions/23_Relational_Expressions_A01_t10: Fail # http://dartbug.com/5519
 Language/11_Expressions/23_Relational_Expressions_A01_t11: Fail # http://dartbug.com/5519
 Language/11_Expressions/23_Relational_Expressions_A01_t12: Fail # http://dartbug.com/5519
 Language/11_Expressions/23_Relational_Expressions_A01_t13: Fail # http://dartbug.com/5519
-Language/11_Expressions/23_Relational_Expressions_A01_t19: Fail # Inherited from dart2js
-Language/11_Expressions/23_Relational_Expressions_A01_t20: Fail # http://dartbug.com/5519
-Language/11_Expressions/23_Relational_Expressions_A01_t21: Fail # Inherited from dart2js
 Language/11_Expressions/23_Relational_Expressions_A01_t22: Fail # Inherited from dart2js
 Language/11_Expressions/23_Relational_Expressions_A01_t23: Fail # Inherited from dart2js
 Language/11_Expressions/22_Equality_A01_t01: Fail # inherited from VM
@@ -477,37 +433,23 @@
 Language/11_Expressions/22_Equality_A01_t24: Fail # Inherited from dart2js
 Language/11_Expressions/22_Equality_A02_t03: Fail # inherited from VM
 Language/11_Expressions/22_Equality_A05_t01: Fail # inherited from VM
-Language/11_Expressions/24_Shift_A01_t10: Fail # Inherited from dart2js
-Language/11_Expressions/24_Shift_A01_t11: Fail # http://dartbug.com/5519
-Language/11_Expressions/24_Shift_A01_t12: Fail # Inherited from dart2js
 Language/11_Expressions/24_Shift_A01_t13: Fail # Inherited from dart2js
 Language/11_Expressions/24_Shift_A01_t14: Fail # Inherited from dart2js
-Language/11_Expressions/25_Additive_Expressions_A01_t08: Fail # Inherited from dart2js
-Language/11_Expressions/25_Additive_Expressions_A01_t11: Fail # Inherited from dart2js
-Language/11_Expressions/25_Additive_Expressions_A01_t12: Fail # Inherited from dart2js
 Language/11_Expressions/25_Additive_Expressions_A01_t13: Fail # Inherited from dart2js
 Language/11_Expressions/25_Additive_Expressions_A01_t14: Fail # Inherited from dart2js
-Language/11_Expressions/26_Multiplicative_Expressions_A01_t11: Fail # Inherited from dart2js
-Language/11_Expressions/26_Multiplicative_Expressions_A01_t14: Fail # Inherited from dart2js
-Language/11_Expressions/26_Multiplicative_Expressions_A01_t15: Fail # Inherited from dart2js
 Language/11_Expressions/26_Multiplicative_Expressions_A01_t16: Fail # Inherited from dart2js
 Language/11_Expressions/26_Multiplicative_Expressions_A01_t17: Fail # Inherited from dart2js
 Language/11_Expressions/27_Unary_Expressions_A01_t01: Fail # inherited from VM
 Language/11_Expressions/27_Unary_Expressions_A01_t02: Fail # Inherited from dart2js
 Language/11_Expressions/27_Unary_Expressions_A01_t04: Fail # Inherited from dart2js
 Language/11_Expressions/27_Unary_Expressions_A01_t05: Fail # Inherited from dart2js
-Language/11_Expressions/27_Unary_Expressions_A01_t17: Fail # Inherited from dart2js
-Language/11_Expressions/27_Unary_Expressions_A01_t18: Fail # Inherited from dart2js
-Language/11_Expressions/27_Unary_Expressions_A01_t19: Fail # Inherited from dart2js
 Language/11_Expressions/27_Unary_Expressions_A01_t20: Fail # Inherited from dart2js
 Language/11_Expressions/27_Unary_Expressions_A01_t21: Fail # Inherited from dart2js
 Language/11_Expressions/27_Unary_Expressions_A01_t22: Fail # Inherited from dart2js
 Language/11_Expressions/28_Postfix_Expressions_A01_t02: Fail # Inherited from dart2js
 Language/11_Expressions/28_Postfix_Expressions_A01_t03: Fail # Inherited from dart2js
 Language/11_Expressions/28_Postfix_Expressions_A01_t05: Fail # Inherited from dart2js
-Language/11_Expressions/29_Assignable_Expressions_A01_t06: Fail # Inherited from dart2js
 Language/11_Expressions/29_Assignable_Expressions_A01_t08: Fail # Inherited from dart2js
-Language/11_Expressions/29_Assignable_Expressions_A01_t09: Fail # Inherited from dart2js
 Language/11_Expressions/30_Identifier_Reference_A02_t01: Fail # Pseudo keyword "abstract".
 Language/11_Expressions/30_Identifier_Reference_A07_t01: Fail # http://dartbug.com/5519
 Language/12_Statements/03_Variable_Declaration_A04_t01: Fail # http://dartbug.com/5519
@@ -555,6 +497,10 @@
 
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A16_t07: Fail # http://dartbug.com/6242
 
+Language/11_Expressions/11_Instance_Creation/1_New_A01_t04: Fail, OK # co19 issue 241
+Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t15: Fail, OK # co19 issue 241
+Language/11_Expressions/22_Equality_A01_t20: Fail, OK # co19 issue 241
+
 LibTest/core/NoSuchMethodError/NoSuchMethodError_A01_t01: Fail, OK # co19 issue 300
 LibTest/core/NoSuchMethodError/toString_A01_t01: Fail, OK # co19 issue 300
 
@@ -562,3 +508,9 @@
 LibTest/core/double/operator_remainder_A01_t04: Fail # Result is NaN
 LibTest/core/double/round_A01_t01: Fail # Result is NaN
 LibTest/core/double/remainder_A01_t04: Fail # Result is NaN
+
+
+[ $compiler == dart2dart && $system == macos ]
+LibTest/math/acos_A01_t01: Fail, OK # co19 issue 44
+LibTest/math/asin_A01_t01: Fail, OK # co19 issue 44
+LibTest/math/atan_A01_t01: Fail, OK # co19 issue 44
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 9e1dc2d..8493286 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -6,9 +6,6 @@
 # Crashes first, please. Then untriaged bugs. There is a section below
 # for co19 bugs.
 [ $compiler == dart2js ]
-Language/13_Libraries_and_Scripts/2_Exports_A04_t02: Crash
-Language/13_Libraries_and_Scripts/2_Exports_A04_t03: Crash
-
 Language/03_Overview/1_Scoping_A02_t05: Fail # TODO(ahe): Please triage this failure.
 Language/03_Overview/1_Scoping_A02_t06: Fail # TODO(ahe): Please triage this failure.
 Language/05_Variables/05_Variables_A05_t02: Fail # TODO(ahe): Please triage this failure.
@@ -50,8 +47,6 @@
 Language/09_Generics/09_Generics_A05_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/01_Constants_A05_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/01_Constants_A13_t06: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t04: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t05: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/05_Strings/1_String_Interpolation_A01_t06: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/08_Throw_A01_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/08_Throw_A05_t01: Fail # TODO(ahe): Please triage this failure.
@@ -61,9 +56,6 @@
 Language/11_Expressions/11_Instance_Creation/1_New_A02_t05: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/1_New_A02_t06: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/1_New_A02_t07: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A12_t01: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A12_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/11_Instance_Creation/1_New_A13_t04: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/1_New_A14_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/17_Getter_Invocation_A02_t01: Fail # TODO(ahe): Please triage this failure.
@@ -71,73 +63,29 @@
 Language/11_Expressions/18_Assignment_A05_t04: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/18_Assignment_A05_t05: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/18_Assignment_A08_t04: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/19_Conditional_A01_t10: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/19_Conditional_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/19_Conditional_A01_t12: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/19_Conditional_A01_t13: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/19_Conditional_A01_t14: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/19_Conditional_A01_t15: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t10: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t12: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t13: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/20_Logical_Boolean_Expressions_A01_t14: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/21_Bitwise_Expressions_A01_t12: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/21_Bitwise_Expressions_A01_t13: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/21_Bitwise_Expressions_A01_t14: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/21_Bitwise_Expressions_A01_t15: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/21_Bitwise_Expressions_A01_t16: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/21_Bitwise_Expressions_A01_t17: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/22_Equality_A01_t23: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/22_Equality_A01_t24: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/22_Equality_A03_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/23_Relational_Expressions_A01_t18: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/23_Relational_Expressions_A01_t19: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/23_Relational_Expressions_A01_t20: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/23_Relational_Expressions_A01_t21: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/23_Relational_Expressions_A01_t22: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/23_Relational_Expressions_A01_t23: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/24_Shift_A01_t09: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/24_Shift_A01_t10: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/24_Shift_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/24_Shift_A01_t12: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/24_Shift_A01_t13: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/24_Shift_A01_t14: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/25_Additive_Expressions_A01_t07: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/25_Additive_Expressions_A01_t08: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/25_Additive_Expressions_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/25_Additive_Expressions_A01_t12: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/25_Additive_Expressions_A01_t13: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/25_Additive_Expressions_A01_t14: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/26_Multiplicative_Expressions_A01_t10: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/26_Multiplicative_Expressions_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/26_Multiplicative_Expressions_A01_t14: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/26_Multiplicative_Expressions_A01_t15: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/26_Multiplicative_Expressions_A01_t16: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/26_Multiplicative_Expressions_A01_t17: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t04: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t05: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t11: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t12: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t13: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t17: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t18: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/27_Unary_Expressions_A01_t19: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/27_Unary_Expressions_A01_t20: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/27_Unary_Expressions_A01_t21: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/27_Unary_Expressions_A01_t22: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/28_Postfix_Expressions_A01_t02: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/28_Postfix_Expressions_A01_t03: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/28_Postfix_Expressions_A01_t05: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/29_Assignable_Expressions_A01_t06: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/29_Assignable_Expressions_A01_t08: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/29_Assignable_Expressions_A01_t09: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/30_Identifier_Reference_A04_t09: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/30_Identifier_Reference_A05_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/30_Identifier_Reference_A05_t04: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/30_Identifier_Reference_A05_t12: Fail # TODO(ahe): Please triage this failure.
-Language/11_Expressions/30_Identifier_Reference_A06_t01: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/30_Identifier_Reference_A06_t02: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/31_Type_Test_A01_t02: Fail # TODO(ahe): Please triage this failure.
 Language/11_Expressions/31_Type_Test_A01_t04: Fail # TODO(ahe): Please triage this failure.
@@ -180,21 +128,14 @@
 Language/13_Libraries_and_Scripts/1_Imports_A02_t27: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t28: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A03_t02: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t09: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t10: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A03_t22: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t29: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t30: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A03_t42: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t49: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t50: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/1_Imports_A03_t62: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t69: Fail # TODO(ahe): Please triage this failure.
-Language/13_Libraries_and_Scripts/1_Imports_A03_t70: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A01_t07: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A01_t15: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A01_t16: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A04_t01: Fail # TODO(ahe): Please triage this failure.
+Language/13_Libraries_and_Scripts/2_Exports_A04_t02: Fail # Missing check for duplicate exports.
 Language/13_Libraries_and_Scripts/2_Exports_A04_t04: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A04_t05: Fail # TODO(ahe): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A04_t06: Fail # TODO(ahe): Please triage this failure.
@@ -231,26 +172,6 @@
 LibTest/core/EmptyQueueException/EmptyQueueException_A01_t01: Fail, OK # co19 issue 288
 LibTest/core/EmptyQueueException/toString_A01_t01: Fail, OK # co19 issue 288
 
-LibTest/core/List/getRange_A04_t01: Fail, OK # co19 issue 290
-LibTest/core/List/insertRange_A06_t01: Fail, OK # co19 issue 290
-LibTest/core/List/last_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/length_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/List_A01_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscripted_assignment_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/removeLast_A01_t02: Fail, OK # co19 issue 290
-LibTest/core/List/removeRange_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t02: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t02: Fail, OK # co19 issue 290
-LibTest/core/Match/group_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/groups_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/charCodeAt_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/substring_A02_t01: Fail, OK # co19 issue 290
-
 [ $compiler == dart2js && $unchecked ]
 LibTest/core/Date/Date.fromMillisecondsSinceEpoch_A03_t01: Fail # TODO(ahe): Please triage this failure.
 
@@ -301,7 +222,6 @@
 Language/12_Statements/05_If_A02_t01: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/06_For/1_For_Loop_A01_t08: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/09_Switch_A05_t01: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/11_Return_A04_t01: Fail # TODO(ahe): Please triage this failure.
 Language/14_Types/4_Interface_Types_A08_t03: Fail # TODO(ahe): Please triage this failure.
 Language/14_Types/8_Parameterized_Types_A02_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/AssertionError/column_A01_t02: Fail # TODO(ahe): Please triage this failure.
@@ -331,6 +251,14 @@
 Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t01: Fail # Checked mode failure for noSuchMethod type.
 Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t02: Fail # Checked mode failure for noSuchMethod type.
 
+# These tests return an object from a void function.
+Language/14_Types/7_Type_Void_A04_t02: Fail, OK
+Language/14_Types/7_Type_Void_A04_t03: Fail, OK
+Language/14_Types/7_Type_Void_A04_t04: Fail, OK
+Language/14_Types/7_Type_Void_A04_t05: Fail, OK
+
+Language/11_Expressions/11_Instance_Creation/1_New_A12_t02: Fail # http://dartbug.com/3970
+
 
 [ $compiler == dart2js ]
 LibTest/core/int/operator_GT_A01_t01: Fail, OK # co19 issue 200
@@ -459,6 +387,11 @@
 # can understand so he can file a bug later.
 #
 [ $compiler == dart2js ]
+Language/11_Expressions/11_Instance_Creation/1_New_A01_t04: Fail, OK # co19 issue 241
+Language/11_Expressions/22_Equality_A01_t19: Fail, OK # co19 issue 241
+Language/11_Expressions/22_Equality_A01_t20: Fail, OK # co19 issue 241
+Language/11_Expressions/32_Type_Cast_A01_t04: Fail, OK # co19 issue 241
+
 Language/11_Expressions/22_Equality_A01_t01: Fail, OK # Function declaration takes precedence over function expression.
 Language/11_Expressions/28_Postfix_Expressions_A01_t01: Fail, OK # A map literal cannot start an expression statement.
 LibTest/core/String/String_class_A02_t01: Pass, Fail, OK # issue 6418 compiler cancelled: Unhandled non-BMP character: U+10000
@@ -479,7 +412,6 @@
 Language/03_Overview/2_Privacy_A01_t09: Fail, OK # co19 issue 198
 Language/03_Overview/2_Privacy_A01_t10: Fail, OK # co19 issue 198
 
-Language/11_Expressions/11_Instance_Creation/1_New_A12_t01: Fail, OK # co19 issue 273
 LibTest/core/String/hashCode_A01_t01: Fail, OK # co19 issue 273
 LibTest/core/int/hashCode_A01_t01: Fail, OK # co19 issue 273
 
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 0666c0c..e27cb1b 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -26,6 +26,9 @@
 Language/13_Libraries_and_Scripts/1_Imports_A02_t21: Crash # TODO(vm-team): Please triage this crash.
 Language/13_Libraries_and_Scripts/1_Imports_A02_t22: Crash # TODO(vm-team): Please triage this crash.
 
+Language/11_Expressions/30_Identifier_Reference_A05_t04: Fail, OK # co19 issue 302
+
+
 Language/05_Variables/05_Variables_A05_t04: Fail # TODO(vm-team): Please triage this failure.
 Language/05_Variables/05_Variables_A05_t11: Fail # TODO(vm-team): Please triage this failure.
 Language/05_Variables/05_Variables_A05_t13: Fail # TODO(vm-team): Please triage this failure.
@@ -33,16 +36,14 @@
 Language/05_Variables/05_Variables_A05_t15: Fail # TODO(vm-team): Please triage this failure.
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t05: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/2_Getters_A01_t03: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/2_Getters_A01_t05: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/3_Setters_A04_t01: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/3_Setters_A04_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/3_Setters_A04_t03: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/3_Setters_A04_t04: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/3_Setters_A04_t05: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/3_Setters_A04_t06: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/3_Setters_A04_t07: Fail # TODO(vm-team): Please triage this failure.
-Language/07_Classes/3_Setters_A04_t08: Fail # TODO(vm-team): Please triage this failure.
+Language/07_Classes/07_Classes_A07_t03: Fail, OK # co19 issue 306
+Language/07_Classes/07_Classes_A07_t06: Fail, OK # co19 issue 306
+Language/07_Classes/2_Getters_A01_t03: Fail # Expects compile-time error when getter has empty parameter list.
+Language/07_Classes/2_Getters_A01_t05: Fail # Expects compile-time error when getter has empty parameter list.
+Language/07_Classes/3_Setters_A04_t03: Fail, OK # Syntax error, issue 304
+Language/07_Classes/3_Setters_A04_t06: Fail, OK # Syntax error, issue 304
+Language/07_Classes/3_Setters_A04_t07: Fail, OK # test error, issue 305
+Language/07_Classes/3_Setters_A04_t08: Fail, OK # test error, issue 305
 Language/07_Classes/4_Abstract_Instance_Members_A03_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/07_Classes/4_Abstract_Instance_Members_A03_t03: Fail # TODO(vm-team): Please triage this failure.
 Language/07_Classes/4_Abstract_Instance_Members_A03_t04: Fail # TODO(vm-team): Please triage this failure.
@@ -140,7 +141,6 @@
 Language/11_Expressions/29_Assignable_Expressions_A01_t08: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/29_Assignable_Expressions_A01_t09: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/30_Identifier_Reference_A05_t02: Fail # TODO(vm-team): Please triage this failure.
-Language/11_Expressions/30_Identifier_Reference_A05_t08: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/30_Identifier_Reference_A06_t01: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/30_Identifier_Reference_A06_t02: Fail # TODO(vm-team): Please triage this failure.
 Language/11_Expressions/30_Identifier_Reference_A07_t01: Fail # TODO(vm-team): Please triage this failure.
@@ -184,7 +184,6 @@
 Language/13_Libraries_and_Scripts/2_Exports_A04_t04: Fail # TODO(vm-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A04_t05: Fail # TODO(vm-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/2_Exports_A04_t06: Fail # TODO(vm-team): Please triage this failure.
-Language/13_Libraries_and_Scripts/3_Parts_A03_t03: Fail # TODO(vm-team): Please triage this failure.
 Language/13_Libraries_and_Scripts/4_Scripts_A01_t16: Fail # TODO(vm-team): Please triage this failure.
 Language/14_Types/5_Function_Types_A02_t01: Fail # TODO(vm-team): Please triage this failure.
 LibTest/core/Queue/Queue.from_A01_t02: Fail # TODO(vm-team): Please triage this failure.
@@ -374,26 +373,6 @@
 
 LibTest/core/Map/getValues_A01_t02: Fail, OK # co19 issue 287
 
-LibTest/core/List/List_A01_t01: Fail, OK # co19 issue 290
-LibTest/core/List/getRange_A04_t01: Fail, OK # co19 issue 290
-LibTest/core/List/insertRange_A06_t01: Fail, OK # co19 issue 290
-LibTest/core/List/last_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/length_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/operator_subscripted_assignment_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/removeLast_A01_t02: Fail, OK # co19 issue 290
-LibTest/core/List/removeRange_A05_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A02_t02: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t01: Fail, OK # co19 issue 290
-LibTest/core/List/setRange_A03_t02: Fail, OK # co19 issue 290
-LibTest/core/Match/group_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/groups_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/Match/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/charCodeAt_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/operator_subscript_A02_t01: Fail, OK # co19 issue 290
-LibTest/core/String/substring_A02_t01: Fail, OK # co19 issue 290
-
 [ $compiler == none && $runtime == vm ]
 LibTest/core/String/contains_A01_t03: Skip # Times out.
 
@@ -432,10 +411,6 @@
 Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A08_t02: Fail # co19 issue 251 or issue 5732
 
 
-# initializer must be a compile time constant
-Language/11_Expressions/30_Identifier_Reference_A05_t09: Fail
-
-
 # invalid operator overloading
 Language/07_Classes/1_Instance_Methods/2_Operators_A02_t01: Fail
 
diff --git a/tests/compiler/dart2js/backend_htype_list_test.dart b/tests/compiler/dart2js/backend_htype_list_test.dart
index 30369be..bc8ecc4 100644
--- a/tests/compiler/dart2js/backend_htype_list_test.dart
+++ b/tests/compiler/dart2js/backend_htype_list_test.dart
@@ -4,10 +4,11 @@
 
 import 'dart:uri';
 
-import '../../../lib/compiler/implementation/elements/elements.dart';
-import '../../../lib/compiler/implementation/js_backend/js_backend.dart';
-import '../../../lib/compiler/implementation/ssa/ssa.dart';
-import '../../../lib/compiler/implementation/dart2jslib.dart' show Selector;
+import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+       show Selector;
 
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
diff --git a/tests/compiler/dart2js/begin_end_token_test.dart b/tests/compiler/dart2js/begin_end_token_test.dart
index 954213e..d58a63b 100644
--- a/tests/compiler/dart2js/begin_end_token_test.dart
+++ b/tests/compiler/dart2js/begin_end_token_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'parser_helper.dart';
-import '../../../lib/compiler/implementation/tree/tree.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
 
 void testNode(Node node, String expected, String text, [bool hard = true]) {
   var debug = 'text=$text,expected=$expected,node:${node}';
diff --git a/tests/compiler/dart2js/call_site_type_inferer_static_test.dart b/tests/compiler/dart2js/call_site_type_inferer_static_test.dart
index 43e9477..8b73b45 100644
--- a/tests/compiler/dart2js/call_site_type_inferer_static_test.dart
+++ b/tests/compiler/dart2js/call_site_type_inferer_static_test.dart
@@ -2,13 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import("dart:uri");
+import "dart:uri";
 
-#import("../../../lib/compiler/implementation/js_backend/js_backend.dart");
-#import("../../../lib/compiler/implementation/ssa/ssa.dart");
+import "../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart";
 
-#import('compiler_helper.dart');
-#import('parser_helper.dart');
+import 'compiler_helper.dart';
+import 'parser_helper.dart';
 
 void compileAndFind(String code,
                     String functionName,
diff --git a/tests/compiler/dart2js/call_site_type_inferer_test.dart b/tests/compiler/dart2js/call_site_type_inferer_test.dart
index a32d9e6..a220063 100644
--- a/tests/compiler/dart2js/call_site_type_inferer_test.dart
+++ b/tests/compiler/dart2js/call_site_type_inferer_test.dart
@@ -4,8 +4,8 @@
 
 import 'dart:uri';
 
-import '../../../lib/compiler/implementation/js_backend/js_backend.dart';
-import '../../../lib/compiler/implementation/ssa/ssa.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart';
 
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index 96fcc3e..b6db836 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -7,12 +7,15 @@
 
 import "dart:uri";
 
-import "../../../lib/compiler/implementation/elements/elements.dart" as lego;
-import "../../../lib/compiler/implementation/js_backend/js_backend.dart" as js;
-import "../../../lib/compiler/implementation/dart2jslib.dart" as leg;
-import "../../../lib/compiler/implementation/ssa/ssa.dart" as ssa;
-import "../../../lib/compiler/implementation/util/util.dart";
-import '../../../lib/compiler/implementation/source_file.dart';
+import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+       as lego;
+import "../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart"
+       as js;
+import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart"
+       as leg;
+import "../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart" as ssa;
+import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
+import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
 
 import "mock_compiler.dart";
 import "parser_helper.dart";
diff --git a/tests/compiler/dart2js/compiler_test.dart b/tests/compiler/dart2js/compiler_test.dart
index 6015342..aa55eba 100644
--- a/tests/compiler/dart2js/compiler_test.dart
+++ b/tests/compiler/dart2js/compiler_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "../../../lib/compiler/implementation/dart2jslib.dart";
-import "../../../lib/compiler/implementation/elements/elements.dart";
-import "../../../lib/compiler/implementation/resolution/resolution.dart";
-import "../../../lib/compiler/implementation/tree/tree.dart";
-import "../../../lib/compiler/implementation/util/util.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/resolution/resolution.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
 import "mock_compiler.dart";
 import "parser_helper.dart";
 
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index 81046f2..c520581 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_test.dart
@@ -3,12 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:uri";
-import "../../../lib/compiler/implementation/elements/elements.dart";
-import '../../../lib/compiler/implementation/scanner/scannerlib.dart';
-import '../../../lib/compiler/implementation/source_file.dart';
-import '../../../lib/compiler/implementation/types/types.dart';
-import '../../../lib/compiler/implementation/tree/tree.dart';
-import "../../../lib/compiler/implementation/dart2jslib.dart" as leg;
+import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
+import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart" as leg;
 
 import "parser_helper.dart";
 import "compiler_helper.dart";
@@ -135,6 +135,7 @@
   abstract class Map {}
   class Closure {}
   class Null {}
+  class Type {}
   class Dynamic_ {}
   bool identical(Object a, Object b) {}''';
 
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 5a11b46..b082495 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -3,7 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 
 constant_folding_string_test: Fail
-redundant_phi_eliminator_test: Fail # Fails because of hack to allow aborting loops.
 pretty_parameter_test: Fail # TODO(floitsch): investigate.
 tree_shaking_test: Fail # Issue 4811
 
diff --git a/tests/compiler/dart2js/dart_backend_test.dart b/tests/compiler/dart2js/dart_backend_test.dart
index 6b59656..ce5702b 100644
--- a/tests/compiler/dart2js/dart_backend_test.dart
+++ b/tests/compiler/dart2js/dart_backend_test.dart
@@ -5,11 +5,11 @@
 import 'dart:uri';
 import 'parser_helper.dart';
 import 'mock_compiler.dart';
-import '../../../lib/compiler/compiler.dart';
-import '../../../lib/compiler/implementation/dart2jslib.dart' as leg;
-import '../../../lib/compiler/implementation/dart_backend/dart_backend.dart';
-import '../../../lib/compiler/implementation/elements/elements.dart';
-import '../../../lib/compiler/implementation/tree/tree.dart';
+import '../../../sdk/lib/_internal/compiler/compiler.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' as leg;
+import '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
 
 const coreLib = r'''
 #library('corelib');
@@ -26,6 +26,7 @@
 interface Dynamic_ {}
 interface Null {}
 interface TypeError {}
+class Type {}
 class Math {
   static double parseDouble(String s) => 1.0;
 }
@@ -103,8 +104,8 @@
 
   compile(
       scriptUri,
-      fileUri('libraryRoot'),
-      fileUri('packageRoot'),
+      fileUri('libraryRoot/'),
+      fileUri('packageRoot/'),
       provider,
       handler,
       options).then(continuation);
diff --git a/tests/compiler/dart2js/erroneous_element_test.dart b/tests/compiler/dart2js/erroneous_element_test.dart
index d616763..81b8f23 100644
--- a/tests/compiler/dart2js/erroneous_element_test.dart
+++ b/tests/compiler/dart2js/erroneous_element_test.dart
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import '../../../lib/compiler/implementation/elements/elements.dart';
-import '../../../lib/compiler/implementation/dart2jslib.dart' show MessageKind;
+import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' 
+       show MessageKind;
 import 'parser_helper.dart';
 
 void main() {
diff --git a/tests/compiler/dart2js/field_type_inferer_test.dart b/tests/compiler/dart2js/field_type_inferer_test.dart
index c712a97..a3253b4 100644
--- a/tests/compiler/dart2js/field_type_inferer_test.dart
+++ b/tests/compiler/dart2js/field_type_inferer_test.dart
@@ -2,14 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import("dart:uri");
+import 'dart:uri';
 
-#import("../../../lib/compiler/implementation/js_backend/js_backend.dart");
-#import("../../../lib/compiler/implementation/ssa/ssa.dart");
-#import("../../../lib/compiler/implementation/scanner/scannerlib.dart");
+import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
 
-#import('compiler_helper.dart');
-#import('parser_helper.dart');
+import 'compiler_helper.dart';
+import 'parser_helper.dart';
 
 void compileAndFind(String code,
                     String className,
diff --git a/tests/compiler/dart2js/find_my_name_test.dart b/tests/compiler/dart2js/find_my_name_test.dart
index 008575d..1961b3f 100644
--- a/tests/compiler/dart2js/find_my_name_test.dart
+++ b/tests/compiler/dart2js/find_my_name_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import("../../../lib/compiler/implementation/elements/elements.dart");
-#import("mock_compiler.dart");
-#import("parser_helper.dart");
+import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
+import "mock_compiler.dart";
+import "parser_helper.dart";
 
 main() {
   MockCompiler compiler = new MockCompiler();
diff --git a/tests/compiler/dart2js/link_test.dart b/tests/compiler/dart2js/link_test.dart
index a74073a..7dafb45 100644
--- a/tests/compiler/dart2js/link_test.dart
+++ b/tests/compiler/dart2js/link_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import '../../../lib/compiler/implementation/util/util.dart';
-import '../../../lib/compiler/implementation/util/util_implementation.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/util/util_implementation.dart';
 
 main() {
   test(const Link<Comparable>().prepend('three').prepend(2).prepend('one'),
diff --git a/tests/compiler/dart2js/metadata_test.dart b/tests/compiler/dart2js/metadata_test.dart
index 11d0bd5..df35845 100644
--- a/tests/compiler/dart2js/metadata_test.dart
+++ b/tests/compiler/dart2js/metadata_test.dart
@@ -7,8 +7,8 @@
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
 
-import '../../../lib/compiler/implementation/elements/elements.dart';
-import '../../../lib/compiler/implementation/dart2jslib.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart';
 
 void checkAnnotation(String name, String declaration,
                      {bool isTopLevelOnly: false}) {
diff --git a/tests/compiler/dart2js/mini_parser_test.dart b/tests/compiler/dart2js/mini_parser_test.dart
index 5fd37bf..369c3b0 100644
--- a/tests/compiler/dart2js/mini_parser_test.dart
+++ b/tests/compiler/dart2js/mini_parser_test.dart
@@ -4,8 +4,8 @@
 
 // Simple test to ensure that mini_parser keeps working.
 
-#import('../../../lib/compiler/implementation/tools/mini_parser.dart',
-        prefix: 'tool');
+import '../../../sdk/lib/_internal/compiler/implementation/tools/mini_parser.dart'
+    as tool;
 
 void main() {
   // Parse this script itself.
diff --git a/tests/compiler/dart2js/mirrors_helper.dart b/tests/compiler/dart2js/mirrors_helper.dart
index 7d33002..1e9485c 100644
--- a/tests/compiler/dart2js/mirrors_helper.dart
+++ b/tests/compiler/dart2js/mirrors_helper.dart
@@ -6,7 +6,7 @@
  * This file is read by 'mirrors_test.dart'.
  */
 
-#library('mirrors_helper');
+library mirrors_helper;
 
 typedef E Func<E,F extends Foo>(F f);
 
diff --git a/tests/compiler/dart2js/mirrors_test.dart b/tests/compiler/dart2js/mirrors_test.dart
index cec75b4..8b223fa7 100644
--- a/tests/compiler/dart2js/mirrors_test.dart
+++ b/tests/compiler/dart2js/mirrors_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import("../../../pkg/dartdoc/lib/mirrors.dart");
-#import("../../../pkg/dartdoc/lib/mirrors_util.dart");
+import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
 
-#import('dart:io');
+import 'dart:io';
 
 int count(Iterable iterable) {
   var count = 0;
@@ -36,7 +36,7 @@
 main() {
   var scriptPath = new Path.fromNative(new Options().script);
   var dirPath = scriptPath.directoryPath;
-  var libPath = dirPath.join(new Path.fromNative('../../../'));
+  var libPath = dirPath.join(new Path.fromNative('../../../sdk/'));
   var inputPath = dirPath.join(new Path.fromNative('mirrors_helper.dart'));
   var compilation = new Compilation.library([inputPath], libPath);
   Expect.isNotNull(compilation, "No compilation created");
@@ -55,6 +55,14 @@
   Expect.stringEquals("mirrors_helper", helperLibrary.qualifiedName,
     "Unexpected library qualified name");
 
+  var helperLibraryLocation = helperLibrary.location;
+  Expect.isNotNull(helperLibraryLocation);
+  Expect.equals(271, helperLibraryLocation.offset, "Unexpected offset");
+  Expect.equals(23, helperLibraryLocation.length, "Unexpected length");
+  Expect.equals(9, helperLibraryLocation.line, "Unexpected line");
+  Expect.equals(1, helperLibraryLocation.column, "Unexpected column");
+
+
   var classes = helperLibrary.classes;
   Expect.isNotNull(classes, "No classes map returned");
   Expect.isFalse(classes.isEmpty, "Empty classes map returned");
@@ -358,7 +366,7 @@
   Expect.equals(method1.owner, bazClass);
   Expect.isFalse(method1.isTopLevel);
   Expect.isFalse(method1.isConstructor);
-  Expect.isFalse(method1.isField);
+  Expect.isFalse(method1.isVariable);
   Expect.isTrue(method1.isMethod);
   Expect.isFalse(method1.isPrivate);
   Expect.isTrue(method1.isStatic);
@@ -412,7 +420,7 @@
   Expect.equals(method2.owner, bazClass);
   Expect.isFalse(method2.isTopLevel);
   Expect.isFalse(method2.isConstructor);
-  Expect.isFalse(method2.isField);
+  Expect.isFalse(method2.isVariable);
   Expect.isTrue(method2.isMethod);
   Expect.isFalse(method2.isPrivate);
   Expect.isFalse(method2.isStatic);
@@ -479,7 +487,7 @@
   Expect.equals(method3.owner, bazClass);
   Expect.isFalse(method3.isTopLevel);
   Expect.isFalse(method3.isConstructor);
-  Expect.isFalse(method3.isField);
+  Expect.isFalse(method3.isVariable);
   Expect.isTrue(method3.isMethod);
   Expect.isFalse(method3.isPrivate);
   Expect.isFalse(method3.isStatic);
@@ -605,7 +613,7 @@
   Expect.equals(operator_eq.owner, bazClass);
   Expect.isFalse(operator_eq.isTopLevel);
   Expect.isFalse(operator_eq.isConstructor);
-  Expect.isFalse(operator_eq.isField);
+  Expect.isFalse(operator_eq.isVariable);
   Expect.isTrue(operator_eq.isMethod);
   Expect.isFalse(operator_eq.isPrivate);
   Expect.isFalse(operator_eq.isStatic);
@@ -635,7 +643,7 @@
   Expect.equals(operator_negate.owner, bazClass);
   Expect.isFalse(operator_negate.isTopLevel);
   Expect.isFalse(operator_negate.isConstructor);
-  Expect.isFalse(operator_negate.isField);
+  Expect.isFalse(operator_negate.isVariable);
   Expect.isTrue(operator_negate.isMethod);
   Expect.isFalse(operator_negate.isPrivate);
   Expect.isFalse(operator_negate.isStatic);
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 50bb431..38ddd79 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -6,13 +6,14 @@
 
 import 'dart:uri';
 
-import '../../../lib/compiler/compiler.dart' as api;
-import '../../../lib/compiler/implementation/dart2jslib.dart' hide TreeElementMapping;
-import '../../../lib/compiler/implementation/elements/elements.dart';
-import '../../../lib/compiler/implementation/resolution/resolution.dart';
-import '../../../lib/compiler/implementation/source_file.dart';
-import '../../../lib/compiler/implementation/tree/tree.dart';
-import '../../../lib/compiler/implementation/util/util.dart';
+import '../../../sdk/lib/_internal/compiler/compiler.dart' as api;
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+       hide TreeElementMapping;
+import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/resolution/resolution.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
 import 'parser_helper.dart';
 
 class WarningMessage {
@@ -63,6 +64,7 @@
   class bool {}
   class String {}
   class Object {}
+  class Type {}
   class Function {}
   interface List default ListImplementation { List([length]);}
   class ListImplementation { factory List([length]) => null; }
diff --git a/tests/compiler/dart2js/parser_helper.dart b/tests/compiler/dart2js/parser_helper.dart
index fecc694..ed2af77 100644
--- a/tests/compiler/dart2js/parser_helper.dart
+++ b/tests/compiler/dart2js/parser_helper.dart
@@ -6,17 +6,18 @@
 
 import "dart:uri";
 
-import "../../../lib/compiler/implementation/elements/elements.dart";
-import "../../../lib/compiler/implementation/tree/tree.dart";
-import "../../../lib/compiler/implementation/scanner/scannerlib.dart";
-import "../../../lib/compiler/implementation/dart2jslib.dart" hide SourceString;
-import "../../../lib/compiler/implementation/source_file.dart";
-import "../../../lib/compiler/implementation/util/util.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart" 
+       hide SourceString;
+import "../../../sdk/lib/_internal/compiler/implementation/source_file.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
 
-export "../../../lib/compiler/implementation/dart2jslib.dart"
+export "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart"
        show DiagnosticListener;
 // TODO(ahe): We should have token library to export instead.
-export "../../../lib/compiler/implementation/scanner/scannerlib.dart";
+export "../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart";
 
 class LoggerCanceler implements DiagnosticListener {
   void cancel(String reason, {node, token, instruction, element}) {
diff --git a/tests/compiler/dart2js/parser_test.dart b/tests/compiler/dart2js/parser_test.dart
index c3a6e00..2bb1b49 100644
--- a/tests/compiler/dart2js/parser_test.dart
+++ b/tests/compiler/dart2js/parser_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import('parser_helper.dart');
-#import("../../../lib/compiler/implementation/tree/tree.dart");
+import 'parser_helper.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
 
 void testStatement(String statement) {
   Node node = parseStatement(statement);
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart
index 9770b3f..720c85d 100644
--- a/tests/compiler/dart2js/patch_test.dart
+++ b/tests/compiler/dart2js/patch_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "../../../lib/compiler/implementation/dart2jslib.dart";
-import "../../../lib/compiler/implementation/elements/elements.dart";
-import "../../../lib/compiler/implementation/tree/tree.dart";
-import "../../../lib/compiler/implementation/util/util.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
 import "mock_compiler.dart";
 import "parser_helper.dart";
 import "dart:uri";
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 3cb50bf..5d193b9 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -4,12 +4,12 @@
 
 import 'dart:uri';
 
-import "../../../lib/compiler/implementation/dart2jslib.dart"
-    hide TreeElementMapping, TreeElements, SourceString;
-import "../../../lib/compiler/implementation/resolution/resolution.dart";
-import "../../../lib/compiler/implementation/elements/elements.dart";
-import "../../../lib/compiler/implementation/tree/tree.dart";
-import "../../../lib/compiler/implementation/util/util.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart"
+       hide TreeElementMapping, TreeElements, SourceString;
+import "../../../sdk/lib/_internal/compiler/implementation/resolution/resolution.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
 import "compiler_helper.dart";
 import "mock_compiler.dart";
 import "parser_helper.dart";
@@ -730,6 +730,7 @@
          class Closure {}
          class Null {}
          class Dynamic_ {}
+         class Type {}
          class Object { Object() : super(); }''';
   resolveConstructor(script, "Object o = new Object();", "Object", "", 1,
                      expectedWarnings: [],
diff --git a/tests/compiler/dart2js/return_type_inferer_test.dart b/tests/compiler/dart2js/return_type_inferer_test.dart
index 43ef138..1dd60ff 100644
--- a/tests/compiler/dart2js/return_type_inferer_test.dart
+++ b/tests/compiler/dart2js/return_type_inferer_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import("../../../lib/compiler/implementation/ssa/ssa.dart");
+import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart';
 
-#import('compiler_helper.dart');
+import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
   f(p) { if (p == null) return p; else return p; }
diff --git a/tests/compiler/dart2js/scanner_offset_length_test.dart b/tests/compiler/dart2js/scanner_offset_length_test.dart
index 8c158b9..bf22baf 100644
--- a/tests/compiler/dart2js/scanner_offset_length_test.dart
+++ b/tests/compiler/dart2js/scanner_offset_length_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import('../../../lib/compiler/implementation/scanner/scannerlib.dart');
-#import('../../../lib/compiler/implementation/scanner/scanner_implementation.dart');
+import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/scanner/scanner_implementation.dart';
 
 Token scan(String text) =>
     new StringScanner(text, includeComments: true).tokenize();
diff --git a/tests/compiler/dart2js/scanner_test.dart b/tests/compiler/dart2js/scanner_test.dart
index d08f0fb..1126853 100644
--- a/tests/compiler/dart2js/scanner_test.dart
+++ b/tests/compiler/dart2js/scanner_test.dart
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import('../../../lib/utf/utf.dart');
-#import('../../../lib/compiler/implementation/scanner/scannerlib.dart');
-#import('../../../lib/compiler/implementation/scanner/scanner_implementation.dart');
-#import('../../../lib/compiler/implementation/util/characters.dart');
-#source('../../../lib/compiler/implementation/scanner/byte_strings.dart');
-#source('../../../lib/compiler/implementation/scanner/byte_array_scanner.dart');
+import 'dart:utf';
+import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/scanner/scanner_implementation.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/util/characters.dart';
+part '../../../sdk/lib/_internal/compiler/implementation/scanner/byte_strings.dart';
+part '../../../sdk/lib/_internal/compiler/implementation/scanner/byte_array_scanner.dart';
 
 Token scan(List<int> bytes) => new ByteArrayScanner(bytes).tokenize();
 
diff --git a/tests/compiler/dart2js/source_mapping_test.dart b/tests/compiler/dart2js/source_mapping_test.dart
index ee01064..fea3363 100644
--- a/tests/compiler/dart2js/source_mapping_test.dart
+++ b/tests/compiler/dart2js/source_mapping_test.dart
@@ -4,8 +4,8 @@
 
 import 'dart:uri';
 
-import "../../../lib/compiler/implementation/dart2jslib.dart";
-import '../../../lib/compiler/implementation/source_file.dart';
+import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
+import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
 import "mock_compiler.dart";
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index cb06d74..61d9286 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -2,10 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import '../../../lib/compiler/implementation/dart2jslib.dart' hide SourceString;
-import '../../../lib/compiler/implementation/elements/elements.dart';
-import '../../../lib/compiler/implementation/tree/tree.dart';
-import '../../../lib/compiler/implementation/util/util.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+       hide SourceString;
+import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
 import 'mock_compiler.dart';
 import 'parser_helper.dart';
 
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/type_combination_test.dart
index fa2c48a..2f5c030 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/type_combination_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import("mock_compiler.dart");
-#import("../../../lib/compiler/implementation/ssa/ssa.dart");
+import "mock_compiler.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart";
 
 const CONFLICTING = HType.CONFLICTING;
 const UNKNOWN = HType.UNKNOWN;
diff --git a/tests/compiler/dart2js/type_equals_test.dart b/tests/compiler/dart2js/type_equals_test.dart
index 7a24174..72eef67 100644
--- a/tests/compiler/dart2js/type_equals_test.dart
+++ b/tests/compiler/dart2js/type_equals_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "../../../lib/compiler/implementation/dart2jslib.dart";
-import "../../../lib/compiler/implementation/elements/elements.dart";
-import "../../../lib/compiler/implementation/tree/tree.dart";
-import "../../../lib/compiler/implementation/util/util.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
 import "compiler_helper.dart";
 import "parser_helper.dart";
 import "dart:uri";
diff --git a/tests/compiler/dart2js/unparser2_test.dart b/tests/compiler/dart2js/unparser2_test.dart
index 54f7b7e..6717dce 100644
--- a/tests/compiler/dart2js/unparser2_test.dart
+++ b/tests/compiler/dart2js/unparser2_test.dart
@@ -2,10 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "../../../lib/compiler/implementation/scanner/scannerlib.dart";
-import "../../../lib/compiler/implementation/elements/elements.dart" show CompilationUnitElement, LibraryElement;
-import "../../../lib/compiler/implementation/tree/tree.dart";
-import "../../../lib/compiler/implementation/dart2jslib.dart" show DiagnosticListener, Script;
+import "../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+       show CompilationUnitElement, LibraryElement;
+import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart"
+       show DiagnosticListener, Script;
 
 main() {
   testClassDef();
diff --git a/tests/compiler/dart2js/unparser_test.dart b/tests/compiler/dart2js/unparser_test.dart
index 10ac315..441269e 100644
--- a/tests/compiler/dart2js/unparser_test.dart
+++ b/tests/compiler/dart2js/unparser_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import('dart:uri');
-#import('parser_helper.dart');
-#import('mock_compiler.dart');
-#import("../../../lib/compiler/implementation/tree/tree.dart");
+import 'dart:uri';
+import 'parser_helper.dart';
+import 'mock_compiler.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
 
 testUnparse(String statement) {
   Node node = parseStatement(statement);
diff --git a/tests/compiler/dart2js/uri_extras_test.dart b/tests/compiler/dart2js/uri_extras_test.dart
index 651865b..65a524a9 100644
--- a/tests/compiler/dart2js/uri_extras_test.dart
+++ b/tests/compiler/dart2js/uri_extras_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import('dart:uri');
+import 'dart:uri';
 
-#import('../../../lib/compiler/implementation/util/uri_extras.dart');
+import '../../../sdk/lib/_internal/compiler/implementation/util/uri_extras.dart';
 
 
 void testRelativize() {
@@ -48,9 +48,9 @@
   c('/c:/BAR', '///c:/foo', '///c:/BAR', true);
   c('/c:/BAR', '///c:/foo/', '///c:/BAR', true);
 
-  c('../lib/compiler/implementation/dart2js.dart',
+  c('../sdk/lib/_internal/compiler/implementation/dart2js.dart',
     '///C:/Users/person/dart_checkout_for_stuff/dart/ReleaseIA32/dart.exe',
-    '///c:/Users/person/dart_checkout_for_stuff/dart/lib/compiler/'
+    '///c:/Users/person/dart_checkout_for_stuff/dart/sdk/lib/_internal/compiler/'
     'implementation/dart2js.dart',
     true);
 
diff --git a/tests/compiler/dart2js/value_range2_test.dart b/tests/compiler/dart2js/value_range2_test.dart
index c0c3bca..bd84602 100644
--- a/tests/compiler/dart2js/value_range2_test.dart
+++ b/tests/compiler/dart2js/value_range2_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "../../../lib/compiler/implementation/ssa/ssa.dart";
-import "../../../lib/compiler/implementation/dart2jslib.dart";
-import "../../../lib/compiler/implementation/js_backend/js_backend.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
+import "../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart";
 
 ValueRangeInfo info = new ValueRangeInfo(const JavaScriptConstantSystem());
 
diff --git a/tests/compiler/dart2js_extra/3_test.dart b/tests/compiler/dart2js_extra/3_test.dart
index 9ac1ed71..520d8a8 100644
--- a/tests/compiler/dart2js_extra/3_test.dart
+++ b/tests/compiler/dart2js_extra/3_test.dart
@@ -2,6 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-void main() {
+int main() {
   return 3;
 }
diff --git a/tests/compiler/dart2js_extra/async_helper.dart b/tests/compiler/dart2js_extra/async_helper.dart
new file mode 100644
index 0000000..a4263b5
--- /dev/null
+++ b/tests/compiler/dart2js_extra/async_helper.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async_helper;
+
+/**
+ * Asynchronous test runner.
+ *
+ * [test] is a one argument function which must accept a one argument
+ * function (onDone).  The test function may start asynchronous tasks,
+ * and must call onDone exactly once when all asynchronous tasks have
+ * completed.  The argument to onDone is a bool which indicates
+ * success of the complete test.
+ */
+void asyncTest(void test(void onDone(bool success))) {
+  onDone(bool success) {
+    if (!success) throw 'test failed';
+    print('unittest-suite-success');
+  }
+  test(onDone);
+  print('unittest-suite-wait-for-done');
+}
diff --git a/tests/compiler/dart2js_extra/bailout_test.dart b/tests/compiler/dart2js_extra/bailout_test.dart
index 2b42399..308658a 100644
--- a/tests/compiler/dart2js_extra/bailout_test.dart
+++ b/tests/compiler/dart2js_extra/bailout_test.dart
@@ -31,7 +31,7 @@
   }
 }
 
-void forBailout() {
+String forBailout() {
   var n = myString.length;
   var res = '';
   for (int i = 0; i < n; i++) {
@@ -42,7 +42,7 @@
   return res;
 }
 
-void forInBailout() {
+String forInBailout() {
   var n = myString.length;
   var res = '';
   for (int i in myString.charCodes) {
@@ -53,7 +53,7 @@
   return res;
 }
 
-void innerForBailout() {
+String innerForBailout() {
   var n = myString.length;
   var res = '';
   for (int i = 0; i < 2; i++) {
@@ -66,7 +66,7 @@
   return res;
 }
 
-void whileBailout() {
+String whileBailout() {
   var n = myString.length;
   var res = '';
   var i = 0;
@@ -79,7 +79,7 @@
   return res;
 }
 
-void doWhileBailout() {
+String doWhileBailout() {
   var n = myString.length;
   var res = '';
   var i = 0;
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 47ea3f2..4743a49 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -7,9 +7,7 @@
 statements_test: Fail
 typed_locals_test: Fail
 no_such_method_test: Fail # Wrong InvocationMirror.memberName.
-
-[ $compiler == dart2js && $runtime == ff && $system == windows ]
-regress/4740_test: Fail
+break_test: Fail # Complex control flow TODO(ngeoffray): investigating
 
 [ $compiler == dart2js && $checked ]
 parameter_bailout_test: Fail, OK
@@ -25,3 +23,14 @@
 
 [ $compiler == dart2js && $runtime == none ]
 *: Fail, Pass # TODO(ahe): Triage these tests.
+
+[ $jscl ]
+timer_test: Fail, OK # Timer is only supported in browsers.
+mirror_test: Fail, OK # Timer is only supported in browsers.
+
+[ $runtime == none ]
+timer_negative_test: Fail, OK # A negative runtime test.
+
+[ $compiler == none && $runtime == drt ]
+timer_test: Fail # http://dartbug.com/2264
+mirror_test: Fail # http://dartbug.com/2264
diff --git a/tests/compiler/dart2js_extra/foo7_test.dart b/tests/compiler/dart2js_extra/foo7_test.dart
index 35ee8ea..dc93acf 100644
--- a/tests/compiler/dart2js_extra/foo7_test.dart
+++ b/tests/compiler/dart2js_extra/foo7_test.dart
@@ -6,6 +6,6 @@
   print(foo());
 }
 
-void foo() {
+int foo() {
   return 3 + 4;
 }
diff --git a/tests/compiler/dart2js_extra/mirror_test.dart b/tests/compiler/dart2js_extra/mirror_test.dart
new file mode 100644
index 0000000..b2348a8
--- /dev/null
+++ b/tests/compiler/dart2js_extra/mirror_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:mirrors';
+
+import 'async_helper.dart';
+
+void test(void onDone(bool success)) {
+  var now = new Date.now();
+  InstanceMirror mirror = reflect(now);
+  print('now: ${now}');
+  print('mirror.type: ${mirror.type}');
+  print('now.toUtc(): ${now.toUtc()}');
+
+  mirror.invoke("toUtc", []).then((value) {
+    print('mirror.invoke("toUtc", []): $value');
+    Expect.isTrue(value.hasReflectee);
+    Expect.equals(now.toUtc(), value.reflectee);
+    onDone(true);
+  });
+}
+
+void main() {
+  print("""
+
+This program is using an experimental feature called \"mirrors\".  As
+currently implemented, mirrors do not work with minification, and will
+cause spurious errors depending on how code was optimized.
+
+The authors of this program are aware of these problems and have
+decided the thrill of using an experimental feature is outweighing the
+risks.  Furthermore, the authors of this program understand that
+long-term, to fix the problems mentioned above, mirrors may have
+negative impact on size and performance of Dart programs compiled to
+JavaScript.
+""");
+  asyncTest(test);
+}
diff --git a/tests/compiler/dart2js_extra/timer_negative_test.dart b/tests/compiler/dart2js_extra/timer_negative_test.dart
new file mode 100644
index 0000000..d446b8d
--- /dev/null
+++ b/tests/compiler/dart2js_extra/timer_negative_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:isolate';
+
+import 'async_helper.dart';
+
+void test(void onDone(bool success)) {
+  int expected = 4;
+
+  void timerCallback(timer) {
+    if (--expected == 0) onDone(false);
+  }
+
+  new Timer(0, timerCallback);
+  new Timer(10, timerCallback);
+  new Timer(100, timerCallback);
+  new Timer(1000, timerCallback);
+}
+
+main() {
+  asyncTest(test);
+}
diff --git a/tests/compiler/dart2js_extra/timer_test.dart b/tests/compiler/dart2js_extra/timer_test.dart
new file mode 100644
index 0000000..7bb325c
--- /dev/null
+++ b/tests/compiler/dart2js_extra/timer_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:isolate';
+
+import 'async_helper.dart';
+
+void test(void onDone(bool success)) {
+  int expected = 4;
+
+  void timerCallback(timer) {
+    if (--expected == 0) onDone(true);
+  }
+
+  new Timer(0, timerCallback);
+  new Timer(10, timerCallback);
+  new Timer(100, timerCallback);
+  new Timer(1000, timerCallback);
+}
+
+main() {
+  asyncTest(test);
+}
diff --git a/tests/compiler/dart2js_extra/variable_type_test.dart b/tests/compiler/dart2js_extra/variable_type_test.dart
index d130046..58454fc 100644
--- a/tests/compiler/dart2js_extra/variable_type_test.dart
+++ b/tests/compiler/dart2js_extra/variable_type_test.dart
@@ -4,7 +4,7 @@
 
 int foo(int i) {
   i = 'fisk';  /// 01: static type warning
-  return 'kat';  /// 02: static type warning
+  return 'kat';  /// 02: static type warning, dynamic type error
 }
 
 main() {
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 83da1cb..a7928d2 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -72,3 +72,15 @@
 # test issue 6324
 list_sort_test: Fail, OK
 sort_test: Fail, OK
+
+# test issue 6512
+big_integer_vm_test: Fail, OK
+collection_to_string_test: Fail, OK
+exception_implementation_test: Fail, OK
+futures_test: Fail, OK
+map_test: Fail, OK
+maps_test: Fail, OK
+queue_test: Fail, OK
+splay_tree_test: Fail, OK
+string_base_vm_test: Fail, OK
+stopwatch_test: Fail, OK
diff --git a/tests/html/async_window_test.dart b/tests/html/async_window_test.dart
index d3d81c6..59b3dee 100644
--- a/tests/html/async_window_test.dart
+++ b/tests/html/async_window_test.dart
@@ -1,7 +1,7 @@
-#library('AsyncWindowTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library AsyncWindowTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/audiobuffersourcenode_test.dart b/tests/html/audiobuffersourcenode_test.dart
index 360f9bc..54d0b6a 100644
--- a/tests/html/audiobuffersourcenode_test.dart
+++ b/tests/html/audiobuffersourcenode_test.dart
@@ -1,7 +1,7 @@
-#library('AudioBufferSourceNodeTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library AudioBufferSourceNodeTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
 
diff --git a/tests/html/audiocontext_test.dart b/tests/html/audiocontext_test.dart
index f84ddbf..8e78436 100644
--- a/tests/html/audiocontext_test.dart
+++ b/tests/html/audiocontext_test.dart
@@ -1,7 +1,7 @@
-#library('AudioContextTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library AudioContextTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
 
@@ -29,7 +29,7 @@
 
   test('audioRenames', () {
     AudioContext context = new AudioContext();
-    GainNode gainNode = context.createGainNode();
+    GainNode gainNode = context.createGain();
     gainNode.connect(context.destination, 0, 0);
     expect(gainNode is GainNode, isTrue);
 
@@ -38,6 +38,6 @@
     expect(context.createChannelSplitter() is ChannelSplitterNode, isTrue);
     expect(context.createOscillator() is OscillatorNode, isTrue);
     expect(context.createPanner() is PannerNode, isTrue);
-    expect(context.createJavaScriptNode(4096) is ScriptProcessorNode, isTrue);
+    expect(context.createScriptProcessor(4096) is ScriptProcessorNode, isTrue);
   });
 }
diff --git a/tests/html/audioelement_test.dart b/tests/html/audioelement_test.dart
index 988d140..0b518e0 100644
--- a/tests/html/audioelement_test.dart
+++ b/tests/html/audioelement_test.dart
@@ -1,7 +1,7 @@
-#library('AudioElementTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library AudioElementTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/b_element_test.dart b/tests/html/b_element_test.dart
index 2a73afb..1cd71b6 100644
--- a/tests/html/b_element_test.dart
+++ b/tests/html/b_element_test.dart
@@ -1,7 +1,7 @@
-#library('BElementTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library BElementTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/blob_constructor_test.dart b/tests/html/blob_constructor_test.dart
index 71071bc..93336f7 100644
--- a/tests/html/blob_constructor_test.dart
+++ b/tests/html/blob_constructor_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('blob_test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library blob_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/cache_test.dart b/tests/html/cache_test.dart
index 5164334..d771cce 100644
--- a/tests/html/cache_test.dart
+++ b/tests/html/cache_test.dart
@@ -1,7 +1,7 @@
-#library('CacheTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library CacheTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/callbacks_test.dart b/tests/html/callbacks_test.dart
index 7cb55d4..b4c55fa 100644
--- a/tests/html/callbacks_test.dart
+++ b/tests/html/callbacks_test.dart
@@ -1,7 +1,7 @@
-#library('CallbacksTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library CallbacksTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/canvas_pixel_array_type_alias_test.dart b/tests/html/canvas_pixel_array_type_alias_test.dart
index 7a9ba78..9fef8ab 100644
--- a/tests/html/canvas_pixel_array_type_alias_test.dart
+++ b/tests/html/canvas_pixel_array_type_alias_test.dart
@@ -1,7 +1,7 @@
-#library('CanvasTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library CanvasTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // We have aliased the legacy type CanvasPixelArray with the new type
 // Uint8ClampedArray by mapping the CanvasPixelArray type tag to
diff --git a/tests/html/canvas_test.dart b/tests/html/canvas_test.dart
index af9a823..0f9deae 100644
--- a/tests/html/canvas_test.dart
+++ b/tests/html/canvas_test.dart
@@ -1,7 +1,7 @@
-#library('CanvasTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library CanvasTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   CanvasElement canvas;
diff --git a/tests/html/canvasrenderingcontext2d_test.dart b/tests/html/canvasrenderingcontext2d_test.dart
index ff6888d..4a95b05 100644
--- a/tests/html/canvasrenderingcontext2d_test.dart
+++ b/tests/html/canvasrenderingcontext2d_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('url_test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library url_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/client_rect_test.dart b/tests/html/client_rect_test.dart
index 4ad9ddf..4086a0d 100644
--- a/tests/html/client_rect_test.dart
+++ b/tests/html/client_rect_test.dart
@@ -1,7 +1,7 @@
-#library('ClientRectTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library ClientRectTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
 
diff --git a/tests/html/contentelement_test.dart b/tests/html/contentelement_test.dart
index 1df3b10..b7911eb 100644
--- a/tests/html/contentelement_test.dart
+++ b/tests/html/contentelement_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('contentelement_test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library contentelement_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/cross_frame_test.dart b/tests/html/cross_frame_test.dart
index aa8043e..b5d9144 100644
--- a/tests/html/cross_frame_test.dart
+++ b/tests/html/cross_frame_test.dart
@@ -1,7 +1,7 @@
-#library('CrossFrameTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library CrossFrameTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/css_rule_list_test.dart b/tests/html/css_rule_list_test.dart
index 9d144b4..441397d 100644
--- a/tests/html/css_rule_list_test.dart
+++ b/tests/html/css_rule_list_test.dart
@@ -1,7 +1,7 @@
-#library('CSSRuleListTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library CSSRuleListTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
 
diff --git a/tests/html/css_test.dart b/tests/html/css_test.dart
index f4fa0b8..eeb52cf 100644
--- a/tests/html/css_test.dart
+++ b/tests/html/css_test.dart
@@ -1,7 +1,7 @@
-#library('CSSTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library CSSTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/cssstyledeclaration_test.dart b/tests/html/cssstyledeclaration_test.dart
index 068952a7..3822e07 100644
--- a/tests/html/cssstyledeclaration_test.dart
+++ b/tests/html/cssstyledeclaration_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('CSSStyleDeclarationTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library CSSStyleDeclarationTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
@@ -23,7 +23,7 @@
     expect(style.getPropertyPriority('color'), isEmpty);
     expect(style.item(0), isEmpty);
     expect(style, hasLength(0));
-    // These assertions throw a NotImplementedException in dartium:
+    // These assertions throw a UnimplementedError in dartium:
     // expect(style.parentRule, isNull);
     // expect(style.getPropertyCSSValue('color'), isNull);
     // expect(style.getPropertyShorthand('color'), isNull);
diff --git a/tests/html/dart_object_local_storage_test.dart b/tests/html/dart_object_local_storage_test.dart
index 3e8a36d..14fde11 100644
--- a/tests/html/dart_object_local_storage_test.dart
+++ b/tests/html/dart_object_local_storage_test.dart
@@ -1,7 +1,7 @@
-#library('DartObjectLocalStorageTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library DartObjectLocalStorageTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // TODO(vsm): Rename this to wrapper_caching_test or similar.  It's
 // basically a port of dom/dart_object_local_storage_test.dart.  For
diff --git a/tests/html/datalistelement_test.dart b/tests/html/datalistelement_test.dart
index 790f11d..e6022cb 100644
--- a/tests/html/datalistelement_test.dart
+++ b/tests/html/datalistelement_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('datalistelement_dataview_test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library datalistelement_dataview_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/document_test.dart b/tests/html/document_test.dart
index e535aba..7597f77 100644
--- a/tests/html/document_test.dart
+++ b/tests/html/document_test.dart
@@ -1,7 +1,7 @@
-#library('DocumentTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library DocumentTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/documentfragment_test.dart b/tests/html/documentfragment_test.dart
index fe6ecb6..6704bd4 100644
--- a/tests/html/documentfragment_test.dart
+++ b/tests/html/documentfragment_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('DocumentFragmentTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#source('util.dart');
+library DocumentFragmentTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+part 'util.dart';
 
 main() {
   useHtmlConfiguration();
@@ -43,7 +43,7 @@
     expect(style.getPropertyPriority('color'), equals(''));
     expect(style.item(0), equals(''));
     expect(style.length, isZero);
-    // TODO(jacobr): these checks throw NotImplementedExceptions in dartium.
+    // TODO(jacobr): these checks throw UnimplementedErrors in dartium.
     // expect(style.parentRule, isNull);
     // expect(style.getPropertyCSSValue('color'), isNull);
     // expect(style.getPropertyShorthand('color'), isNull);
diff --git a/tests/html/dom_constructors_test.dart b/tests/html/dom_constructors_test.dart
index 6354aac..c2f8ad0 100644
--- a/tests/html/dom_constructors_test.dart
+++ b/tests/html/dom_constructors_test.dart
@@ -1,7 +1,7 @@
-#library('DOMConstructorsTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library DOMConstructorsTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/dom_isolates_test.dart b/tests/html/dom_isolates_test.dart
index ab9bdcf..b630f75 100644
--- a/tests/html/dom_isolates_test.dart
+++ b/tests/html/dom_isolates_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file
 
-#library('DOMIsolatesTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#import('dart:isolate');
+library DOMIsolatesTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+import 'dart:isolate';
 
 isolateMain() {
   port.receive((msg, replyTo) {
diff --git a/tests/html/domparser_test.dart b/tests/html/domparser_test.dart
index 59d20fb..a40516f 100644
--- a/tests/html/domparser_test.dart
+++ b/tests/html/domparser_test.dart
@@ -1,7 +1,7 @@
-#library('DOMParserTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library DOMParserTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
 
diff --git a/tests/html/element_add_test.dart b/tests/html/element_add_test.dart
index 767dbe1..4acbea3 100644
--- a/tests/html/element_add_test.dart
+++ b/tests/html/element_add_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file
 
-#library('ElementAddTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#source('util.dart');
+library ElementAddTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+part 'util.dart';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/element_classes_test.dart b/tests/html/element_classes_test.dart
index 039e844..ab0be3b 100644
--- a/tests/html/element_classes_test.dart
+++ b/tests/html/element_classes_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('ElementTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library ElementTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/element_constructor_1_test.dart b/tests/html/element_constructor_1_test.dart
index 57f9439..74a40fa 100644
--- a/tests/html/element_constructor_1_test.dart
+++ b/tests/html/element_constructor_1_test.dart
@@ -6,10 +6,10 @@
 // Move constructors that fail on some configuration to their own
 // element_constructor_foo_test.dart file.
 
-#library('ElementConstructorTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library ElementConstructorTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/element_test.dart b/tests/html/element_test.dart
index 66968b2..21f9be7 100644
--- a/tests/html/element_test.dart
+++ b/tests/html/element_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('ElementTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library ElementTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 expectLargeRect(ClientRect rect) {
   expect(rect.top, 0);
diff --git a/tests/html/element_webkit_test.dart b/tests/html/element_webkit_test.dart
index 64f5c7e..4933d75 100644
--- a/tests/html/element_webkit_test.dart
+++ b/tests/html/element_webkit_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('ElementWebKitTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library ElementWebKitTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 
 // NOTE:
diff --git a/tests/html/event_customevent_test.dart b/tests/html/event_customevent_test.dart
index f7e789a..ce80b55 100644
--- a/tests/html/event_customevent_test.dart
+++ b/tests/html/event_customevent_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('EventCustomEventTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library EventCustomEventTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // TODO(nweiz): Make this private to testEvents when Frog supports closures with
 // optional arguments.
diff --git a/tests/html/event_test.dart b/tests/html/event_test.dart
index 7484432..e676fb4 100644
--- a/tests/html/event_test.dart
+++ b/tests/html/event_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('EventTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library EventTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // TODO(nweiz): Make this private to testEvents when Frog supports closures with
 // optional arguments.
diff --git a/tests/html/events_test.dart b/tests/html/events_test.dart
index 62fbb7e..ccd03e5 100644
--- a/tests/html/events_test.dart
+++ b/tests/html/events_test.dart
@@ -1,7 +1,7 @@
-#library('EventsTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library EventsTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/exceptions_test.dart b/tests/html/exceptions_test.dart
index 2895d02..98d7331 100644
--- a/tests/html/exceptions_test.dart
+++ b/tests/html/exceptions_test.dart
@@ -1,7 +1,7 @@
-#library('ExceptionsTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library ExceptionsTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/fileapi_test.dart b/tests/html/fileapi_test.dart
index bb15d15..031f1f1 100644
--- a/tests/html/fileapi_test.dart
+++ b/tests/html/fileapi_test.dart
@@ -1,7 +1,7 @@
-#library('fileapi');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library fileapi;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 void fail(message) {
   guardAsync(() {
diff --git a/tests/html/form_data_test.dart b/tests/html/form_data_test.dart
index 808c52f..61f0147 100644
--- a/tests/html/form_data_test.dart
+++ b/tests/html/form_data_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('FormDataTest');
+library FormDataTest;
 
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 void main() {
   // TODO(efortuna): This is a bad test. Revisit when we have tests that can run
diff --git a/tests/html/form_element_test.dart b/tests/html/form_element_test.dart
index a4b81f5..9539387 100644
--- a/tests/html/form_element_test.dart
+++ b/tests/html/form_element_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('FormElementTest');
+library FormElementTest;
 
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 void main() {
   useHtmlConfiguration();
diff --git a/tests/html/hidden_dom_1_test.dart b/tests/html/hidden_dom_1_test.dart
index 7d7e05a..d3208fc 100644
--- a/tests/html/hidden_dom_1_test.dart
+++ b/tests/html/hidden_dom_1_test.dart
@@ -1,7 +1,7 @@
-#library('HiddenDom1Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library HiddenDom1Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // Test that the dart:html API does not leak native jsdom methods:
 //   onfocus setter.
diff --git a/tests/html/hidden_dom_2_test.dart b/tests/html/hidden_dom_2_test.dart
index 1e73b37..a2cb124 100644
--- a/tests/html/hidden_dom_2_test.dart
+++ b/tests/html/hidden_dom_2_test.dart
@@ -1,7 +1,7 @@
-#library('HiddenDom2Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library HiddenDom2Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // Test that the dart:html API does not leak native jsdom methods:
 //   appendChild operation.
diff --git a/tests/html/history_test.dart b/tests/html/history_test.dart
index c80cce4..62dbc9c 100644
--- a/tests/html/history_test.dart
+++ b/tests/html/history_test.dart
@@ -1,7 +1,7 @@
-#library('HistoryTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library HistoryTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/html.status b/tests/html/html.status
index b31ad44..d9cfaa7 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -53,7 +53,6 @@
 
 [ $runtime == dartium || $runtime == chrome || $runtime == ie9 || $runtime == ie10 || $runtime == safari || $runtime == ff || $runtime == opera ]
 history_test: Fail
-audiocontext_test: Fail # After WebKit roll due to renamed method?
 
 [$runtime == ie10 ]
 # TODO(efortuna, blois): Triage.
@@ -274,7 +273,6 @@
 
 [ $compiler == dart2js && $runtime == drt ]
 # Unknown error - should investigate.
-audiocontext_test: Fail
 htmloptionscollection_test: Fail # Issue 3813.
 unknownelement_test: Fail # Issue 4189
 
diff --git a/tests/html/htmlaudioelement_test.dart b/tests/html/htmlaudioelement_test.dart
index 6d1b1c9..b3bcc08 100644
--- a/tests/html/htmlaudioelement_test.dart
+++ b/tests/html/htmlaudioelement_test.dart
@@ -1,7 +1,7 @@
-#library('AudioElementTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library AudioElementTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
 
diff --git a/tests/html/htmlcollection_test.dart b/tests/html/htmlcollection_test.dart
index 7f6ce9c..32a31d9 100644
--- a/tests/html/htmlcollection_test.dart
+++ b/tests/html/htmlcollection_test.dart
@@ -1,7 +1,7 @@
-#library('ElementListTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library ElementListTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // Test that List<Element> implements List<T>
 main() {
diff --git a/tests/html/htmlelement_test.dart b/tests/html/htmlelement_test.dart
index ea99338..b7964c2 100644
--- a/tests/html/htmlelement_test.dart
+++ b/tests/html/htmlelement_test.dart
@@ -1,7 +1,7 @@
-#library('ElementTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library ElementTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/htmloptionscollection_test.dart b/tests/html/htmloptionscollection_test.dart
index 7f0657e..ccc5da5 100644
--- a/tests/html/htmloptionscollection_test.dart
+++ b/tests/html/htmloptionscollection_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('HTMLOptionsCollectionTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library HTMLOptionsCollectionTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/indexeddb_1_test.dart b/tests/html/indexeddb_1_test.dart
index 2f2c6c7..d55494c 100644
--- a/tests/html/indexeddb_1_test.dart
+++ b/tests/html/indexeddb_1_test.dart
@@ -1,7 +1,7 @@
-#library('IndexedDB1Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library IndexedDB1Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 const String DB_NAME = 'Test';
 const String STORE_NAME = 'TEST';
diff --git a/tests/html/indexeddb_2_test.dart b/tests/html/indexeddb_2_test.dart
index f37be90..d10feb2 100644
--- a/tests/html/indexeddb_2_test.dart
+++ b/tests/html/indexeddb_2_test.dart
@@ -1,9 +1,9 @@
-#library('IndexedDB1Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#import('dart:collection');
-#import('utils.dart');
+library IndexedDB1Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+import 'dart:collection';
+import 'utils.dart';
 
 // Write and re-read Maps: simple Maps; Maps with DAGs; Maps with cycles.
 
diff --git a/tests/html/indexeddb_3_test.dart b/tests/html/indexeddb_3_test.dart
index 03cb79a..4c55d97 100644
--- a/tests/html/indexeddb_3_test.dart
+++ b/tests/html/indexeddb_3_test.dart
@@ -1,7 +1,7 @@
-#library('IndexedDB3Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library IndexedDB3Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // Read with cursor.
 
diff --git a/tests/html/indexeddb_4_test.dart b/tests/html/indexeddb_4_test.dart
index cbe4f77..d0ac66e 100644
--- a/tests/html/indexeddb_4_test.dart
+++ b/tests/html/indexeddb_4_test.dart
@@ -1,7 +1,7 @@
-#library('IndexedDB4Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library IndexedDB4Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // Test for IDBKeyRange and IDBCursor.
 
diff --git a/tests/html/inner_frame_test.dart b/tests/html/inner_frame_test.dart
index 0579412..ef42a84 100644
--- a/tests/html/inner_frame_test.dart
+++ b/tests/html/inner_frame_test.dart
@@ -1,7 +1,7 @@
-#library('InnerFrameTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library InnerFrameTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   if (window != window.top) {
diff --git a/tests/html/instance_of_test.dart b/tests/html/instance_of_test.dart
index ee21a9d..0643507 100644
--- a/tests/html/instance_of_test.dart
+++ b/tests/html/instance_of_test.dart
@@ -1,7 +1,7 @@
-#library('InstanceOfTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library InstanceOfTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   CanvasElement canvas;
diff --git a/tests/html/isolates_test.dart b/tests/html/isolates_test.dart
index 8b31ca3..76e465b 100644
--- a/tests/html/isolates_test.dart
+++ b/tests/html/isolates_test.dart
@@ -1,9 +1,9 @@
-#library('IsolatesTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#import('dart:json');
-#import('dart:isolate', prefix:'isolate');
+library IsolatesTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+import 'dart:json';
+import 'dart:isolate' as isolate;
 
 String responseFor(message) => 'response for $message';
 
diff --git a/tests/html/js_interop_1_test.dart b/tests/html/js_interop_1_test.dart
index e63322d..610d873 100644
--- a/tests/html/js_interop_1_test.dart
+++ b/tests/html/js_interop_1_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file
 
-#library('JsInterop1Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#import('dart:json');
+library JsInterop1Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+import 'dart:json';
 
 injectSource(code) {
   final script = new ScriptElement();
diff --git a/tests/html/js_interop_2_test.dart b/tests/html/js_interop_2_test.dart
index bf7cfde..0f03f54 100644
--- a/tests/html/js_interop_2_test.dart
+++ b/tests/html/js_interop_2_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file
 
-#library('JsInterop2Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#import('dart:isolate');
+library JsInterop2Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+import 'dart:isolate';
 
 injectSource(code) {
   final script = new ScriptElement();
diff --git a/tests/html/js_interop_3_test.dart b/tests/html/js_interop_3_test.dart
index 92f7294..844dd11 100644
--- a/tests/html/js_interop_3_test.dart
+++ b/tests/html/js_interop_3_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file
 
-#library('JsInterop3Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#import('dart:isolate');
+library JsInterop3Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+import 'dart:isolate';
 
 injectSource(code) {
   final script = new ScriptElement();
diff --git a/tests/html/js_interop_4_test.dart b/tests/html/js_interop_4_test.dart
index 3e0fe4e..935c790 100644
--- a/tests/html/js_interop_4_test.dart
+++ b/tests/html/js_interop_4_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file
 
-#library('JsInterop4Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#import('dart:isolate');
+library JsInterop4Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+import 'dart:isolate';
 
 const testData = const [1, '2', 'true'];
 
diff --git a/tests/html/key_name_location_test.dart b/tests/html/key_name_location_test.dart
index 856b615..e276de1 100644
--- a/tests/html/key_name_location_test.dart
+++ b/tests/html/key_name_location_test.dart
@@ -1,7 +1,7 @@
-#library('KeyNameLocationTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library KeyNameLocationTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // Test for existence of some KeyName and KeyLocation constants.
 
diff --git a/tests/html/localstorage_test.dart b/tests/html/localstorage_test.dart
index 3e4aeda..ff9a7a3 100644
--- a/tests/html/localstorage_test.dart
+++ b/tests/html/localstorage_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('LocalStorageTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library LocalStorageTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/location_test.dart b/tests/html/location_test.dart
index a46f528..e1f0fb8 100644
--- a/tests/html/location_test.dart
+++ b/tests/html/location_test.dart
@@ -1,7 +1,7 @@
-#library('LocationTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library LocationTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/measurement_test.dart b/tests/html/measurement_test.dart
index 74c4182..3b83d7d 100644
--- a/tests/html/measurement_test.dart
+++ b/tests/html/measurement_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('MeasurementTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library MeasurementTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/messageevent_test.dart b/tests/html/messageevent_test.dart
index ff0a6a1..102f324 100644
--- a/tests/html/messageevent_test.dart
+++ b/tests/html/messageevent_test.dart
@@ -1,7 +1,7 @@
-#library('SerializedScriptValueTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library SerializedScriptValueTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/mutationobserver_test.dart b/tests/html/mutationobserver_test.dart
index 07bf311..6f93d84 100644
--- a/tests/html/mutationobserver_test.dart
+++ b/tests/html/mutationobserver_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('mutationobserver_test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library mutationobserver_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 /**
  * Test suite for Mutation Observers. This is just a small set of sanity
diff --git a/tests/html/native_gc_test.dart b/tests/html/native_gc_test.dart
index 0044ac4..fe27e0b 100644
--- a/tests/html/native_gc_test.dart
+++ b/tests/html/native_gc_test.dart
@@ -1,7 +1,7 @@
-#library('NativeGCTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library NativeGCTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/node_test.dart b/tests/html/node_test.dart
index df490ab..75237225 100644
--- a/tests/html/node_test.dart
+++ b/tests/html/node_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('NodeTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library NodeTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 Node makeNode() => new Element.tag('div');
 Node makeNodeWithChildren() =>
diff --git a/tests/html/performance_api_test.dart b/tests/html/performance_api_test.dart
index 74db2dd..a6d885c 100644
--- a/tests/html/performance_api_test.dart
+++ b/tests/html/performance_api_test.dart
@@ -1,7 +1,7 @@
-#library('PerformanceApiTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library PerformanceApiTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/postmessage_structured_test.dart b/tests/html/postmessage_structured_test.dart
index a37280f..31f2a33 100644
--- a/tests/html/postmessage_structured_test.dart
+++ b/tests/html/postmessage_structured_test.dart
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file
 
-#library('postmessage_js_test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#import('dart:collection');  // SplayTreeMap
-#import('utils.dart');
+library postmessage_js_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+import 'dart:collection';  // SplayTreeMap
+import 'utils.dart';
 
 injectSource(code) {
   final script = new ScriptElement();
diff --git a/tests/html/query_test.dart b/tests/html/query_test.dart
index 5713652..33fabc5 100644
--- a/tests/html/query_test.dart
+++ b/tests/html/query_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('QueryTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library QueryTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/queryall_test.dart b/tests/html/queryall_test.dart
index ce580e1..2d3fe95 100644
--- a/tests/html/queryall_test.dart
+++ b/tests/html/queryall_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file
 
-#library('NodeListTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library NodeListTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/request_animation_frame_test.dart b/tests/html/request_animation_frame_test.dart
index c61c9ce..2bf8a0c 100644
--- a/tests/html/request_animation_frame_test.dart
+++ b/tests/html/request_animation_frame_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('RequestAnimationFrameTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library RequestAnimationFrameTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/selectelement_test.dart b/tests/html/selectelement_test.dart
index 0d354df..9de1d68 100644
--- a/tests/html/selectelement_test.dart
+++ b/tests/html/selectelement_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('selectelement_test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library selectelement_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/serialized_script_value_test.dart b/tests/html/serialized_script_value_test.dart
index 5eb1e4034..efb20d0 100644
--- a/tests/html/serialized_script_value_test.dart
+++ b/tests/html/serialized_script_value_test.dart
@@ -1,8 +1,8 @@
-#library('SerializedScriptValueTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#import('utils.dart');
+library SerializedScriptValueTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+import 'utils.dart';
 
 serializationTest(name, value) => test(name, () {
       // To check how value is serialized and deserialized, we create a MessageEvent.
diff --git a/tests/html/shadow_dom_test.dart b/tests/html/shadow_dom_test.dart
index 4f058eb..8e9a932 100644
--- a/tests/html/shadow_dom_test.dart
+++ b/tests/html/shadow_dom_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('ShadowDOMTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library ShadowDOMTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/shadowroot_test.dart b/tests/html/shadowroot_test.dart
index 4a55b27..4fb6fa0 100644
--- a/tests/html/shadowroot_test.dart
+++ b/tests/html/shadowroot_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('ShadowRootTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library ShadowRootTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/storage_test.dart b/tests/html/storage_test.dart
index 25f127e..cb00f86 100644
--- a/tests/html/storage_test.dart
+++ b/tests/html/storage_test.dart
@@ -1,7 +1,7 @@
-#library('StorageTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library StorageTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/svg_1_test.dart b/tests/html/svg_1_test.dart
index f536f2c..97c9ac6 100644
--- a/tests/html/svg_1_test.dart
+++ b/tests/html/svg_1_test.dart
@@ -1,7 +1,7 @@
-#library('SVG1Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library SVG1Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // Test that SVG is present in dart:html API
 
diff --git a/tests/html/svg_2_test.dart b/tests/html/svg_2_test.dart
index 1c355c0..b893a3c 100644
--- a/tests/html/svg_2_test.dart
+++ b/tests/html/svg_2_test.dart
@@ -1,7 +1,7 @@
-#library('SVG2Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library SVG2Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // Test that SVG elements explicitly implement the IDL interfaces (is-checks
 // only, see SVGTest3 for behavioural tests).
diff --git a/tests/html/svg_3_test.dart b/tests/html/svg_3_test.dart
index 573c198..520b138 100644
--- a/tests/html/svg_3_test.dart
+++ b/tests/html/svg_3_test.dart
@@ -1,7 +1,7 @@
-#library('SVG3Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library SVG3Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // Test that SVG elements have the operations advertised through all the IDL
 // interfaces.  This is a 'duck typing' test, and does not explicitly use 'is'
diff --git a/tests/html/svgelement2_test.dart b/tests/html/svgelement2_test.dart
index 024cf6b..caa85cb 100644
--- a/tests/html/svgelement2_test.dart
+++ b/tests/html/svgelement2_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('SVGElement2Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#import('svgelement_test.dart', prefix: 'originalTest');
+library SVGElement2Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+import 'svgelement_test.dart' as originalTest;
 
 class A {
   var _this;
diff --git a/tests/html/svgelement_test.dart b/tests/html/svgelement_test.dart
index 69ab4fe..49bfef6 100644
--- a/tests/html/svgelement_test.dart
+++ b/tests/html/svgelement_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('SVGElementTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library SVGElementTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/table_test.dart b/tests/html/table_test.dart
index 3441dcb..fda9fcc 100644
--- a/tests/html/table_test.dart
+++ b/tests/html/table_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('TableTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library TableTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/transferables_test.dart b/tests/html/transferables_test.dart
index 8779362..0a709a5 100644
--- a/tests/html/transferables_test.dart
+++ b/tests/html/transferables_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('TransferableTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library TransferableTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/typed_arrays_1_test.dart b/tests/html/typed_arrays_1_test.dart
index 860ed71..ccd13d0 100644
--- a/tests/html/typed_arrays_1_test.dart
+++ b/tests/html/typed_arrays_1_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('TypedArrays1Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library TypedArrays1Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/typed_arrays_2_test.dart b/tests/html/typed_arrays_2_test.dart
index a2e747e..d109ddc 100644
--- a/tests/html/typed_arrays_2_test.dart
+++ b/tests/html/typed_arrays_2_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('TypedArrays2Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library TypedArrays2Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/typed_arrays_3_test.dart b/tests/html/typed_arrays_3_test.dart
index a1f9416..6dcd67b 100644
--- a/tests/html/typed_arrays_3_test.dart
+++ b/tests/html/typed_arrays_3_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('TypedArrays3Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library TypedArrays3Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/typed_arrays_4_test.dart b/tests/html/typed_arrays_4_test.dart
index 59e532c..112e382 100644
--- a/tests/html/typed_arrays_4_test.dart
+++ b/tests/html/typed_arrays_4_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('TypedArrays4Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library TypedArrays4Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/typed_arrays_5_test.dart b/tests/html/typed_arrays_5_test.dart
index a0792aa..b1930fe 100644
--- a/tests/html/typed_arrays_5_test.dart
+++ b/tests/html/typed_arrays_5_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('typed_arrays_5_test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library typed_arrays_5_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/typed_arrays_arraybuffer_test.dart b/tests/html/typed_arrays_arraybuffer_test.dart
index afc4770..69d8d28 100644
--- a/tests/html/typed_arrays_arraybuffer_test.dart
+++ b/tests/html/typed_arrays_arraybuffer_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('typed_arrays_arraybuffer_test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library typed_arrays_arraybuffer_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/typed_arrays_dataview_test.dart b/tests/html/typed_arrays_dataview_test.dart
index 2a486f0..d73f312 100644
--- a/tests/html/typed_arrays_dataview_test.dart
+++ b/tests/html/typed_arrays_dataview_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('typed_arrays_dataview_test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library typed_arrays_dataview_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/typed_arrays_range_checks_test.dart b/tests/html/typed_arrays_range_checks_test.dart
index 7e7f953..bb8ee10 100644
--- a/tests/html/typed_arrays_range_checks_test.dart
+++ b/tests/html/typed_arrays_range_checks_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('TypedArraysRangeCheckTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library TypedArraysRangeCheckTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/typing_test.dart b/tests/html/typing_test.dart
index ec544d8..c0a8389 100644
--- a/tests/html/typing_test.dart
+++ b/tests/html/typing_test.dart
@@ -1,7 +1,7 @@
-#library('TypingTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library TypingTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/unknownelement_test.dart b/tests/html/unknownelement_test.dart
index 00d7ca6..fda531e 100644
--- a/tests/html/unknownelement_test.dart
+++ b/tests/html/unknownelement_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file
 
-#library('UnknownElementTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library UnknownElementTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/url_test.dart b/tests/html/url_test.dart
index 8fec60a..4b784ca 100644
--- a/tests/html/url_test.dart
+++ b/tests/html/url_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('url_test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library url_test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
@@ -36,7 +36,7 @@
   group('blob', () {
     test('createObjectUrl', () {
       var blob = createImageBlob();
-      var url = window.createObjectUrl(blob);
+      var url = Url.createObjectUrl(blob);
       expect(url.length, greaterThan(0));
       expect(url, startsWith('blob:'));
 
@@ -54,9 +54,9 @@
 
     test('revokeObjectUrl', () {
       var blob = createImageBlob();
-      var url = window.createObjectUrl(blob);
+      var url = Url.createObjectUrl(blob);
       expect(url, startsWith('blob:'));
-      window.revokeObjectUrl(url);
+      Url.revokeObjectUrl(url);
 
       var img = new ImageElement();
       // Image should fail to load since the URL was revoked.
diff --git a/tests/html/utils.dart b/tests/html/utils.dart
index 9752239..09eeaaa 100644
--- a/tests/html/utils.dart
+++ b/tests/html/utils.dart
@@ -1,5 +1,5 @@
-#library('TestUtils');
-#import('../../pkg/unittest/unittest.dart');
+library TestUtils;
+import '../../pkg/unittest/lib/unittest.dart';
 
 /**
  * Verifies that [actual] has the same graph structure as [expected].
diff --git a/tests/html/webgl_1_test.dart b/tests/html/webgl_1_test.dart
index 8ad757c..87073d3 100644
--- a/tests/html/webgl_1_test.dart
+++ b/tests/html/webgl_1_test.dart
@@ -1,7 +1,7 @@
-#library('WebGL1Test');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library WebGL1Test;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 // Test that WebGL is present in dart:html API
 
diff --git a/tests/html/websocket_test.dart b/tests/html/websocket_test.dart
index d14765f..982afa4 100644
--- a/tests/html/websocket_test.dart
+++ b/tests/html/websocket_test.dart
@@ -1,7 +1,7 @@
-#library('WebSocketTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library WebSocketTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
 
diff --git a/tests/html/websql_test.dart b/tests/html/websql_test.dart
index 047e9b3..ea64f50 100644
--- a/tests/html/websql_test.dart
+++ b/tests/html/websql_test.dart
@@ -1,7 +1,7 @@
-#library('WebDBTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library WebDBTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 void fail(message) {
   guardAsync(() {
diff --git a/tests/html/window_eq_test.dart b/tests/html/window_eq_test.dart
index 015c985..718011c 100644
--- a/tests/html/window_eq_test.dart
+++ b/tests/html/window_eq_test.dart
@@ -1,7 +1,7 @@
-#library('WindowEqualityTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library WindowEqualityTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/window_mangling_test.dart b/tests/html/window_mangling_test.dart
index 83d5481..33704b3 100644
--- a/tests/html/window_mangling_test.dart
+++ b/tests/html/window_mangling_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('WindowManglingTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html', prefix: 'dom');
+library WindowManglingTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html' as dom;
 
 // Defined in dom.Window.
 get navigator => "Dummy";
diff --git a/tests/html/window_nosuchmethod_test.dart b/tests/html/window_nosuchmethod_test.dart
index cad0678..7b8c0ef 100644
--- a/tests/html/window_nosuchmethod_test.dart
+++ b/tests/html/window_nosuchmethod_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('WindowNSMETest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html', prefix: 'dom');
+library WindowNSMETest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html' as dom;
 
 // Not defined in dom.Window.
 foo(x) => x;
diff --git a/tests/html/window_open_test.dart b/tests/html/window_open_test.dart
index 76ae473..664953f 100644
--- a/tests/html/window_open_test.dart
+++ b/tests/html/window_open_test.dart
@@ -1,7 +1,7 @@
-#library('WindowOpenTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library WindowOpenTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/xhr_cross_origin_test.dart b/tests/html/xhr_cross_origin_test.dart
index a210f66..d39af2c 100644
--- a/tests/html/xhr_cross_origin_test.dart
+++ b/tests/html/xhr_cross_origin_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('XHRCrossOriginTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#import('dart:json');
+library XHRCrossOriginTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+import 'dart:json';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/xhr_test.dart b/tests/html/xhr_test.dart
index a17389c..b5ea6c1 100644
--- a/tests/html/xhr_test.dart
+++ b/tests/html/xhr_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('XHRTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
-#import('dart:json');
+library XHRTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
+import 'dart:json';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/xmldocument_test.dart b/tests/html/xmldocument_test.dart
index 980801d..5667812 100644
--- a/tests/html/xmldocument_test.dart
+++ b/tests/html/xmldocument_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('XMLDocumentTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library XMLDocumentTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/xmlelement_test.dart b/tests/html/xmlelement_test.dart
index b134a69..0831518 100644
--- a/tests/html/xmlelement_test.dart
+++ b/tests/html/xmlelement_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('XMLElementTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library XMLElementTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/html/xsltprocessor_test.dart b/tests/html/xsltprocessor_test.dart
index 5216726..c56f8c6 100644
--- a/tests/html/xsltprocessor_test.dart
+++ b/tests/html/xsltprocessor_test.dart
@@ -1,7 +1,7 @@
-#library('XSLTProcessorTest');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
-#import('dart:html');
+library XSLTProcessorTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
+import 'dart:html';
 
 main() {
 
diff --git a/tests/isolate/compute_this_script_browser_test.dart b/tests/isolate/compute_this_script_browser_test.dart
index 1064eef..49fbf2d 100644
--- a/tests/isolate/compute_this_script_browser_test.dart
+++ b/tests/isolate/compute_this_script_browser_test.dart
@@ -5,13 +5,12 @@
 // Test that spawn works even when there are many script files in the page.
 // This requires computing correctly the URL to the orignal script, so we can
 // pass it to the web worker APIs.
-#library('compute_this_script');
+library compute_this_script;
 
-#import('dart:html');
-#import('dart:isolate');
-
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
+import 'dart:html';
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
 
 child() {
   port.receive((msg, reply) {
diff --git a/tests/isolate/count_test.dart b/tests/isolate/count_test.dart
index 2bee065..be1d65a 100644
--- a/tests/isolate/count_test.dart
+++ b/tests/isolate/count_test.dart
@@ -2,20 +2,20 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library("CountTest");
-#import('dart:isolate');
-#import('../../pkg/unittest/unittest.dart');
+library CountTest;
+import '../../pkg/unittest/lib/unittest.dart';
+import 'dart:isolate';
 
 void countMessages() {
   int count = 0;
   port.receive((int message, SendPort replyTo) {
     if (message == -1) {
-      Expect.equals(10, count);
+      expect(count, 10);
       replyTo.send(-1, null);
       port.close();
       return;
     }
-    Expect.equals(count, message);
+    expect(message, count);
     count++;
     replyTo.send(message * 2, null);
   });
@@ -30,12 +30,12 @@
 
     local.receive(expectAsync2((int message, SendPort replyTo) {
       if (message == -1) {
-        Expect.equals(11, count);
+        expect(count, 11);
         local.close();
         return;
       }
 
-      Expect.equals((count - 1) * 2, message);
+      expect(message, (count - 1) * 2);
       remote.send(count++, reply);
       if (count == 10) {
         remote.send(-1, reply);
diff --git a/tests/isolate/cross_isolate_message_test.dart b/tests/isolate/cross_isolate_message_test.dart
index 9676c34..41b2c7a 100644
--- a/tests/isolate/cross_isolate_message_test.dart
+++ b/tests/isolate/cross_isolate_message_test.dart
@@ -5,9 +5,9 @@
 // Dart test program for testing that isolates can communicate to isolates
 // other than the main isolate.
 
-#library('CrossIsolateMessageTest');
-#import('dart:isolate');
-#import('../../pkg/unittest/unittest.dart');
+library CrossIsolateMessageTest;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 void crossIsolate1() {
   port.receive((msg, replyTo) {
@@ -44,12 +44,12 @@
     // Create a new receive port and send it to isolate2.
     ReceivePort myPort = new ReceivePort();
     port2.call(myPort.toSendPort()).then(expectAsync1((msg) {
-      Expect.equals("ready", msg[0]);
+      expect(msg[0], "ready");
       // Send port of isolate2 to isolate1.
       port1.call(msg[1]).then(expectAsync1((msg) {
-        Expect.equals("ready", msg[0]);
+        expect(msg[0], "ready");
         myPort.receive(expectAsync2((msg, replyTo) {
-          Expect.equals(499, msg);
+          expect(msg, 499);
           myPort.close();
         }));
         msg[1].send(42, null);
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 6e106f5..f3a482b 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -30,8 +30,9 @@
 spawn_uri_vm_negative_test: Fail, OK # Fails at runtime.
 unresolved_ports_negative_test: Fail, OK # Fails at runtime.
 
-# packages issue 6340
-compute_this_script_browser_test: Fail, OK
+# test issue 6512
+isolate2_negative_test: Pass
+compute_this_script_browser_test: Pass
 
 
 [ $compiler == dart2js ]
diff --git a/tests/isolate/isolate3_negative_test.dart b/tests/isolate/isolate3_negative_test.dart
index 5a275800..59510eb 100644
--- a/tests/isolate/isolate3_negative_test.dart
+++ b/tests/isolate/isolate3_negative_test.dart
@@ -5,9 +5,9 @@
 // Dart test program for testing that errors thrown from isolates are
 // processed correctly and don't result in crashes.
 
-#library('Isolate3NegativeTest');
-#import('dart:isolate');
-#import('../../pkg/unittest/unittest.dart');
+library Isolate3NegativeTest;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 class TestClass {
   TestClass.named(num this.fld1) : fld2=fld1 {
diff --git a/tests/isolate/isolate_complex_messages_test.dart b/tests/isolate/isolate_complex_messages_test.dart
index 3d0e6a4..e4fae99 100644
--- a/tests/isolate/isolate_complex_messages_test.dart
+++ b/tests/isolate/isolate_complex_messages_test.dart
@@ -5,9 +5,9 @@
 // Dart test program for testing isolate communication with
 // complex messages.
 
-#library('IsolateComplexMessagesTest');
-#import('dart:isolate');
-#import('../../pkg/unittest/unittest.dart');
+library IsolateComplexMessagesTest;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("complex messages are serialized correctly", () {
@@ -20,7 +20,7 @@
     remote.send(const ["Hello", "World", 0xffffffffff], null);
     // Shutdown the LogRunner.
     remote.call(-1).then(expectAsync1((int message) {
-      Expect.equals(6, message);
+      expect(message, 6);
     }));
   });
 }
@@ -36,35 +36,35 @@
     } else {
       switch (count) {
         case 0:
-          Expect.equals(1, message);
+          expect(message, 1);
           break;
         case 1:
-          Expect.equals("Hello", message);
+          expect(message, "Hello");
           break;
         case 2:
-          Expect.equals("World", message);
+          expect(message, "World");
           break;
         case 3:
-          Expect.equals(5, message.length);
-          Expect.equals(null, message[0]);
-          Expect.equals(1, message[1]);
-          Expect.equals(2, message[2]);
-          Expect.equals(3, message[3]);
-          Expect.equals(4, message[4]);
+          expect(message.length, 5);
+          expect(message[0], null);
+          expect(message[1], 1);
+          expect(message[2], 2);
+          expect(message[3], 3);
+          expect(message[4], 4);
           break;
         case 4:
-          Expect.equals(5, message.length);
-          Expect.equals(1, message[0]);
-          Expect.equals(2.0, message[1]);
-          Expect.equals(true, message[2]);
-          Expect.equals(false, message[3]);
-          Expect.equals(0xffffffffff, message[4]);
+          expect(message.length, 5);
+          expect(message[0], 1);
+          expect(message[1], 2.0);
+          expect(message[2], true);
+          expect(message[3], false);
+          expect(message[4], 0xffffffffff);
           break;
         case 5:
-          Expect.equals(3, message.length);
-          Expect.equals("Hello", message[0]);
-          Expect.equals("World", message[1]);
-          Expect.equals(0xffffffffff, message[2]);
+          expect(message.length, 3);
+          expect(message[0], "Hello");
+          expect(message[1], "World");
+          expect(message[2], 0xffffffffff);
           break;
       }
       count++;
diff --git a/tests/isolate/isolate_negative_test.dart b/tests/isolate/isolate_negative_test.dart
index 90a2c93..5fe9e30 100644
--- a/tests/isolate/isolate_negative_test.dart
+++ b/tests/isolate/isolate_negative_test.dart
@@ -4,9 +4,9 @@
 
 // Dart test program for testing that isolates are spawned.
 
-#library('IsolateNegativeTest');
-#import('dart:isolate');
-#import('../../pkg/unittest/unittest.dart');
+library IsolateNegativeTest;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 void entry() {
   port.receive((ignored, replyTo) {
@@ -18,7 +18,7 @@
   test("ensure isolate code is executed", () {
     SendPort port = spawnFunction(entry);
     port.call("foo").then(expectAsync1((message) {
-      Expect.equals(true, "Expected fail");   // <=-------- Should fail here.
+      expect("Expected fail", isTrue);   // <=-------- Should fail here.
     }));
   });
 }
diff --git a/tests/isolate/mandel_isolate_test.dart b/tests/isolate/mandel_isolate_test.dart
index d74b05b..d849e919 100644
--- a/tests/isolate/mandel_isolate_test.dart
+++ b/tests/isolate/mandel_isolate_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('MandelIsolateTest');
-#import('dart:isolate');
-#import('dart:math');
-#import('../../pkg/unittest/unittest.dart');
+library MandelIsolateTest;
+import 'dart:isolate';
+import 'dart:math';
+import '../../pkg/unittest/lib/unittest.dart';
 
 const TERMINATION_MESSAGE = -1;
 const N = 100;
diff --git a/tests/isolate/message2_test.dart b/tests/isolate/message2_test.dart
index e3eb23b..07b34e6 100644
--- a/tests/isolate/message2_test.dart
+++ b/tests/isolate/message2_test.dart
@@ -5,10 +5,9 @@
 // Dart test program for testing serialization of messages.
 // VMOptions=--enable_type_checks --enable_asserts
 
-#library('Message2Test');
-#import("dart:isolate");
-
-#import('../../pkg/unittest/unittest.dart');
+library Message2Test;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 // ---------------------------------------------------------------------------
 // Message passing test 2.
@@ -16,14 +15,14 @@
 
 class MessageTest {
   static void mapEqualsDeep(Map expected, Map actual) {
-    Expect.equals(true, expected is Map);
-    Expect.equals(true, actual is Map);
-    Expect.equals(expected.length, actual.length);
+    expect(expected, isMap);
+    expect(actual, isMap);
+    expect(actual.length, expected.length);
     testForEachMap(key, value) {
       if (value is List) {
         listEqualsDeep(value, actual[key]);
       } else {
-        Expect.equals(value, actual[key]);
+        expect(actual[key], value);
       }
     }
     expected.forEach(testForEachMap);
@@ -36,7 +35,7 @@
       } else if (expected[i] is Map) {
         mapEqualsDeep(expected[i], actual[i]);
       } else {
-        Expect.equals(expected[i], actual[i]);
+        expect(actual[i], expected[i]);
       }
     }
   }
diff --git a/tests/isolate/message_test.dart b/tests/isolate/message_test.dart
index 06f2d19..ee00de5 100644
--- a/tests/isolate/message_test.dart
+++ b/tests/isolate/message_test.dart
@@ -5,9 +5,9 @@
 // Dart test program for testing serialization of messages.
 // VMOptions=--enable_type_checks --enable_asserts
 
-#library('MessageTest');
-#import("dart:isolate");
-#import('../../pkg/unittest/unittest.dart');
+library MessageTest;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 // ---------------------------------------------------------------------------
 // Message passing test.
@@ -29,14 +29,14 @@
   ];
 
   static void VerifyMap(Map expected, Map actual) {
-    Expect.equals(true, expected is Map);
-    Expect.equals(true, actual is Map);
-    Expect.equals(expected.length, actual.length);
+    expect(expected, isMap);
+    expect(actual,  isMap);
+    expect(actual.length, expected.length);
     testForEachMap(key, value) {
       if (value is List) {
         VerifyList(value, actual[key]);
       } else {
-        Expect.equals(value, actual[key]);
+        expect(actual[key], value);
       }
     }
     expected.forEach(testForEachMap);
@@ -49,16 +49,16 @@
       } else if (expected[i] is Map) {
         VerifyMap(expected[i], actual[i]);
       } else {
-        Expect.equals(expected[i], actual[i]);
+        expect(actual[i], expected[i]);
       }
     }
   }
 
   static void VerifyObject(int index, var actual) {
     var expected = elms[index];
-    Expect.equals(true, expected is List);
-    Expect.equals(true, actual is List);
-    Expect.equals(expected.length, actual.length);
+    expect(expected, isList);
+    expect(actual, isList);
+    expect(actual.length, expected.length);
     VerifyList(expected, actual);
   }
 }
@@ -107,22 +107,22 @@
     sendObject[3] = sendObject;
     sendObject[4] = local_list3;
     remote.call(sendObject).then((var replyObject) {
-      Expect.equals(true, sendObject is List);
-      Expect.equals(true, replyObject is List);
-      Expect.equals(sendObject.length, replyObject.length);
-      Expect.equals(true, replyObject[1] === replyObject);
-      Expect.equals(true, replyObject[3] === replyObject);
-      Expect.equals(true, replyObject[0] === replyObject[2][1]);
-      Expect.equals(true, replyObject[0] === replyObject[2][2]);
-      Expect.equals(true, replyObject[2] === replyObject[4][0]);
-      Expect.equals(true, replyObject[0][0] === replyObject[0][2]);
+      expect(sendObject, isList);
+      expect(replyObject, isList);
+      expect(sendObject.length, equals(replyObject.length));
+      expect(replyObject[1], same(replyObject));
+      expect(replyObject[3], same(replyObject));
+      expect(replyObject[0], same(replyObject[2][1]));
+      expect(replyObject[0], same(replyObject[2][2]));
+      expect(replyObject[2], same(replyObject[4][0]));
+      expect(replyObject[0][0], same(replyObject[0][2]));
       // Bigint literals are not canonicalized so do a == check.
-      Expect.equals(true, replyObject[0][3] == replyObject[4][4]);
+      expect(replyObject[0][3], equals(replyObject[4][4]));
     });
 
     // Shutdown the MessageServer.
     remote.call(-1).then(expectAsync1((int message) {
-        Expect.equals(MessageTest.elms.length + 1, message);
+        expect(message, MessageTest.elms.length + 1);
       }));
   });
 }
diff --git a/tests/isolate/mint_maker_test.dart b/tests/isolate/mint_maker_test.dart
index 2c32a08..90ad058 100644
--- a/tests/isolate/mint_maker_test.dart
+++ b/tests/isolate/mint_maker_test.dart
@@ -5,9 +5,9 @@
 // Things that should be "auto-generated" are between AUTO START and
 // AUTO END (or just AUTO if it's a single line).
 
-#library("MintMakerTest");
-#import("dart:isolate");
-#import('../../pkg/unittest/unittest.dart');
+library MintMakerTest;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 class Mint {
   Mint() : registry_ = new Map<SendPort, Purse>() {
@@ -222,18 +222,18 @@
     deferred {
       MintWrapper mint = asynccall mintMaker.createMint();
       PurseWrapper purse = asynccall mint.createPurse(100);
-      Expect.equals(100, asynccall purse.queryBalance());
+      expect(asynccall purse.queryBalance(), 100);
 
       PurseWrapper sprouted = asynccall purse.sproutPurse();
-      Expect.equals(0, asynccall sprouted.queryBalance());
+      expect(asynccall sprouted.queryBalance(), 0);
 
       asynccall sprouted.deposit(purse, 5);
-      Expect.equals(0 + 5, asynccall sprouted.queryBalance());
-      Expect.equals(100 - 5, asynccall purse.queryBalance());
+      expect(asynccall sprouted.queryBalance(), 0 + 5);
+      expect(asynccall purse.queryBalance(), 100 - 5);
 
       asynccall sprouted.deposit(purse, 42);
-      Expect.equals(0 + 5 + 42, asynccall sprouted.queryBalance());
-      Expect.equals(100 - 5 - 42, asynccall purse.queryBalance());
+      expect(asynccall sprouted.queryBalance(), 0 + 5 + 42);
+      expect(asynccall purse.queryBalance(), 100 - 5 - 42);
     }
   }
   */
@@ -244,18 +244,18 @@
     Wrapper<MintMaker> mintMaker = spawnMintMaker();
     Future<Mint> mint = mintMaker...createMint();
     Future<Purse> purse = mint...createPurse(100);
-    Expect.equals(100, purse.queryBalance());
+    expect(purse.queryBalance(), 100);
 
     Future<Purse> sprouted = purse...sproutPurse();
-    Expect.equals(0, sprouted.queryBalance());
+    expect(0, sprouted.queryBalance());
 
     sprouted...deposit(purse, 5);
-    Expect.equals(0 + 5, sprouted.queryBalance());
-    Expect.equals(100 - 5, purse.queryBalance());
+    expect(sprouted.queryBalance(), 0 + 5);
+    expect(purse.queryBalance(), 100 - 5);
 
     sprouted...deposit(purse, 42);
-    Expect.equals(0 + 5 + 42, sprouted.queryBalance());
-    Expect.equals(100 - 5 - 42, purse.queryBalance());
+    expect(sprouted.queryBalance(), 0 + 5 + 42);
+    expect(purse.queryBalance(), 100 - 5 - 42);
   }
   */
 }
diff --git a/tests/isolate/multiple_timer_test.dart b/tests/isolate/multiple_timer_test.dart
index 9071e88..d1da947 100644
--- a/tests/isolate/multiple_timer_test.dart
+++ b/tests/isolate/multiple_timer_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('multiple_timer_test');
+library multiple_timer_test;
 
-#import("dart:isolate");
-#import('../../pkg/unittest/unittest.dart');
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 const int TIMEOUT1 = 1000;
 const int TIMEOUT2 = 2000;
diff --git a/tests/isolate/nested_spawn2_test.dart b/tests/isolate/nested_spawn2_test.dart
index 74175e3..a868084 100644
--- a/tests/isolate/nested_spawn2_test.dart
+++ b/tests/isolate/nested_spawn2_test.dart
@@ -6,13 +6,13 @@
 // that the nested isolates can communicate with the main once the spawner has
 // disappeared.
 
-#library('NestedSpawn2Test');
-#import("dart:isolate");
-#import('../../pkg/unittest/unittest.dart');
+library NestedSpawn2Test;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 void isolateA() {
   port.receive((msg, replyTo) {
-    Expect.equals("launch nested!", msg);
+    expect(msg, "launch nested!");
     SendPort p = spawnFunction(isolateB);
     p.send(replyTo, null);
     port.close();
@@ -42,11 +42,11 @@
     // Do a little ping-pong dance to give the intermediate isolate
     // time to die.
     _call(mainPort, msg0, ((msg, replyTo) {
-      Expect.equals("1", msg[0]);
+      expect(msg[0], "1");
       _call(replyTo, msg2, ((msg, replyTo) {
-        Expect.equals("3", msg[0]);
+        expect(msg[0], "3");
         _call(replyTo, msg4, ((msg, replyTo) {
-          Expect.equals("5", msg[0]);
+          expect(msg[0], "5");
           replyTo.send(msg6, null);
         }));
       }));
@@ -58,13 +58,13 @@
   test("spawned isolate can spawn other isolates", () {
     SendPort port = spawnFunction(isolateA);
     _call(port, "launch nested!", expectAsync2((msg, replyTo) {
-      Expect.equals("0", msg[0]);
+      expect(msg[0], "0");
       _call(replyTo, msg1, expectAsync2((msg, replyTo) {
-        Expect.equals("2", msg[0]);
+        expect(msg[0], "2");
         _call(replyTo, msg3, expectAsync2((msg, replyTo) {
-          Expect.equals("4", msg[0]);
+          expect(msg[0], "4");
           _call(replyTo, msg5, expectAsync2((msg, replyTo) {
-            Expect.equals("6", msg[0]);
+            expect(msg[0], "6");
           }));
         }));
       }));
diff --git a/tests/isolate/nested_spawn_test.dart b/tests/isolate/nested_spawn_test.dart
index b40c89d..795ad99 100644
--- a/tests/isolate/nested_spawn_test.dart
+++ b/tests/isolate/nested_spawn_test.dart
@@ -4,16 +4,16 @@
 
 // Dart test program for testing that isolates can spawn other isolates.
 
-#library('NestedSpawnTest');
-#import("dart:isolate");
-#import('../../pkg/unittest/unittest.dart');
+library NestedSpawnTest;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 void isolateA() {
   port.receive((msg, replyTo) {
-    Expect.equals("launch nested!", msg);
+    expect(msg, "launch nested!");
     SendPort p = spawnFunction(isolateB);
     p.call("alive?").then((msg) {
-      Expect.equals("and kicking", msg);
+      expect(msg, "and kicking");
       replyTo.send(499, null);
       port.close();
     });
@@ -22,7 +22,7 @@
 
 void isolateB() {
   port.receive((msg, replyTo) {
-    Expect.equals("alive?", msg);
+    expect(msg, "alive?");
     replyTo.send("and kicking", null);
     port.close();
   });
@@ -33,7 +33,7 @@
   test("spawned isolates can spawn nested isolates", () {
     SendPort port = spawnFunction(isolateA);
     port.call("launch nested!").then(expectAsync1((msg) {
-      Expect.equals(499, msg);
+      expect(msg, 499);
     }));
   });
 }
diff --git a/tests/isolate/port_test.dart b/tests/isolate/port_test.dart
index 02ea365..d3adfdd 100644
--- a/tests/isolate/port_test.dart
+++ b/tests/isolate/port_test.dart
@@ -6,9 +6,9 @@
 // Note: unittest.dart depends on ports, in particular on the behaviour tested
 // here. To keep things simple, we don't use the unittest library here.
 
-#library("PortTest");
-#import("dart:isolate");
-
+library PortTest;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/matcher.dart';
 
 main() {
   testHashCode();
@@ -19,8 +19,8 @@
 void testHashCode() {
   ReceivePort rp0 = new ReceivePort();
   ReceivePort rp1 = new ReceivePort();
-  Expect.equals(rp0.toSendPort().hashCode, rp0.toSendPort().hashCode);
-  Expect.equals(rp1.toSendPort().hashCode, rp1.toSendPort().hashCode);
+  expect(rp0.toSendPort().hashCode, rp0.toSendPort().hashCode);
+  expect(rp1.toSendPort().hashCode, rp1.toSendPort().hashCode);
   rp0.close();
   rp1.close();
 }
@@ -28,9 +28,9 @@
 void testEquals() {
   ReceivePort rp0 = new ReceivePort();
   ReceivePort rp1 = new ReceivePort();
-  Expect.equals(rp0.toSendPort(), rp0.toSendPort());
-  Expect.equals(rp1.toSendPort(), rp1.toSendPort());
-  Expect.equals(false, (rp0.toSendPort() == rp1.toSendPort()));
+  expect(rp0.toSendPort(), rp0.toSendPort());
+  expect(rp1.toSendPort(), rp1.toSendPort());
+  expect(rp0.toSendPort() == rp1.toSendPort(), isFalse);
   rp0.close();
   rp1.close();
 }
@@ -41,20 +41,20 @@
   final map = new Map<SendPort, int>();
   map[rp0.toSendPort()] = 42;
   map[rp1.toSendPort()] = 87;
-  Expect.equals(42, map[rp0.toSendPort()]);
-  Expect.equals(87, map[rp1.toSendPort()]);
+  expect(map[rp0.toSendPort()], 42);
+  expect(map[rp1.toSendPort()], 87);
 
   map[rp0.toSendPort()] = 99;
-  Expect.equals(99, map[rp0.toSendPort()]);
-  Expect.equals(87, map[rp1.toSendPort()]);
+  expect(map[rp0.toSendPort()], 99);
+  expect(map[rp1.toSendPort()], 87);
 
   map.remove(rp0.toSendPort());
-  Expect.equals(false, map.containsKey(rp0.toSendPort()));
-  Expect.equals(87, map[rp1.toSendPort()]);
+  expect(map.containsKey(rp0.toSendPort()), isFalse);
+  expect(map[rp1.toSendPort()], 87);
 
   map.remove(rp1.toSendPort());
-  Expect.equals(false, map.containsKey(rp0.toSendPort()));
-  Expect.equals(false, map.containsKey(rp1.toSendPort()));
+  expect(map.containsKey(rp0.toSendPort()), isFalse);
+  expect(map.containsKey(rp1.toSendPort()), isFalse);
 
   rp0.close();
   rp1.close();
diff --git a/tests/isolate/request_reply_test.dart b/tests/isolate/request_reply_test.dart
index 753564e..b582569 100644
--- a/tests/isolate/request_reply_test.dart
+++ b/tests/isolate/request_reply_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library("RequestReplyTest");
+library RequestReplyTest;
 
-#import("dart:isolate");
-#import('../../pkg/unittest/unittest.dart');
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 void entry() {
   port.receive((message, SendPort replyTo) {
@@ -18,7 +18,7 @@
   test("call", () {
     SendPort port = spawnFunction(entry);
     port.call(42).then(expectAsync1((message) {
-      Expect.equals(42 + 87, message);
+      expect(message, 42 + 87);
     }));
   });
 
@@ -27,7 +27,7 @@
     ReceivePort reply = new ReceivePort();
     port.send(99, reply.toSendPort());
     reply.receive(expectAsync2((message, replyTo) {
-      Expect.equals(99 + 87, message);
+      expect(message, 99 + 87);
       reply.close();
     }));
   });
diff --git a/tests/isolate/spawn_function_custom_class_test.dart b/tests/isolate/spawn_function_custom_class_test.dart
index c605fcf..73f9a1d 100644
--- a/tests/isolate/spawn_function_custom_class_test.dart
+++ b/tests/isolate/spawn_function_custom_class_test.dart
@@ -7,9 +7,9 @@
 // Regression test for vm bug 2235: We were forgetting to finalize
 // classes in new isolates started using the v2 api.
 
-#library('spawn_tests');
-#import('dart:isolate');
-#import('../../pkg/unittest/unittest.dart');
+library spawn_tests;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 class MyClass {
   var myVar = 'there';
diff --git a/tests/isolate/spawn_function_negative_test.dart b/tests/isolate/spawn_function_negative_test.dart
index 564f57e..faecde09 100644
--- a/tests/isolate/spawn_function_negative_test.dart
+++ b/tests/isolate/spawn_function_negative_test.dart
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // Negative test to make sure that we are reaching all assertions.
-#library('spawn_tests');
-#import('dart:isolate');
-#import('../../pkg/unittest/unittest.dart');
+library spawn_tests;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 child() {
   port.receive((msg, reply) => reply.send('re: $msg'));
diff --git a/tests/isolate/spawn_function_test.dart b/tests/isolate/spawn_function_test.dart
index ae47227..6829fd1 100644
--- a/tests/isolate/spawn_function_test.dart
+++ b/tests/isolate/spawn_function_test.dart
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // Example of spawning an isolate from a function.
-#library('spawn_tests');
-#import('dart:isolate');
-#import('../../pkg/unittest/unittest.dart');
+library spawn_tests;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 child() {
   port.receive((msg, reply) => reply.send('re: $msg'));
diff --git a/tests/isolate/spawn_uri_negative_test.dart b/tests/isolate/spawn_uri_negative_test.dart
index bb87cde2..6e5be3b 100644
--- a/tests/isolate/spawn_uri_negative_test.dart
+++ b/tests/isolate/spawn_uri_negative_test.dart
@@ -6,9 +6,9 @@
 // Note: the following comment is used by test.dart to additionally compile the
 // other isolate's code.
 // OtherScripts=spawn_uri_child_isolate.dart
-#library('spawn_tests');
-#import('../../pkg/unittest/unittest.dart');
-#import('dart:isolate');
+library spawn_tests;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('isolate fromUri - negative test', () {
diff --git a/tests/isolate/spawn_uri_test.dart b/tests/isolate/spawn_uri_test.dart
index 89d7bb8..5a33903 100644
--- a/tests/isolate/spawn_uri_test.dart
+++ b/tests/isolate/spawn_uri_test.dart
@@ -6,9 +6,9 @@
 // Note: the following comment is used by test.dart to additionally compile the
 // other isolate's code.
 // OtherScripts=spawn_uri_child_isolate.dart
-#library('spawn_tests');
-#import('../../pkg/unittest/unittest.dart');
-#import('dart:isolate');
+library spawn_tests;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('isolate fromUri - send and reply', () {
diff --git a/tests/isolate/spawn_uri_vm_negative_test.dart b/tests/isolate/spawn_uri_vm_negative_test.dart
index af82ea9..a342bfe 100644
--- a/tests/isolate/spawn_uri_vm_negative_test.dart
+++ b/tests/isolate/spawn_uri_vm_negative_test.dart
@@ -6,9 +6,9 @@
 // Note: the following comment is used by test.dart to additionally compile the
 // other isolate's code.
 // OtherScripts=spawn_uri_child_isolate.dart
-#library('spawn_tests');
-#import('../../pkg/unittest/unittest.dart');
-#import('dart:isolate');
+library spawn_tests;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('isolate fromUri - negative test', () {
diff --git a/tests/isolate/spawn_uri_vm_test.dart b/tests/isolate/spawn_uri_vm_test.dart
index 1edb3d7..e9bb0da 100644
--- a/tests/isolate/spawn_uri_vm_test.dart
+++ b/tests/isolate/spawn_uri_vm_test.dart
@@ -6,9 +6,9 @@
 // Note: the following comment is used by test.dart to additionally compile the
 // other isolate's code.
 // OtherScripts=spawn_uri_child_isolate.dart
-#library('spawn_tests');
-#import('../../pkg/unittest/unittest.dart');
-#import('dart:isolate');
+library spawn_tests;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('isolate fromUri - send and reply', () {
diff --git a/tests/isolate/timer_cancel1_test.dart b/tests/isolate/timer_cancel1_test.dart
index 052d9fe..c4d4277 100644
--- a/tests/isolate/timer_cancel1_test.dart
+++ b/tests/isolate/timer_cancel1_test.dart
@@ -2,10 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('timer_cancel1_test');
-
-#import("dart:isolate");
-#import('../../pkg/unittest/unittest.dart');
+library timer_cancel1_test;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 main() {
   // Test that a timeout handler can cancel another.
diff --git a/tests/isolate/timer_cancel2_test.dart b/tests/isolate/timer_cancel2_test.dart
index 025638c..f01a8cc 100644
--- a/tests/isolate/timer_cancel2_test.dart
+++ b/tests/isolate/timer_cancel2_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('timer_cancel2_test');
+library timer_cancel2_test;
 
-#import("dart:isolate");
-#import('../../pkg/unittest/unittest.dart');
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 main() {
   // Test that a timeout handler can cancel itself.
diff --git a/tests/isolate/timer_cancel_test.dart b/tests/isolate/timer_cancel_test.dart
index ffb866d..745a91b 100644
--- a/tests/isolate/timer_cancel_test.dart
+++ b/tests/isolate/timer_cancel_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('timer_cancel_test');
+library timer_cancel_test;
 
-#import("dart:isolate");
-#import('../../pkg/unittest/unittest.dart');
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("simple timer", () {
diff --git a/tests/isolate/timer_isolate_test.dart b/tests/isolate/timer_isolate_test.dart
index f98ffd2..afe29b5 100644
--- a/tests/isolate/timer_isolate_test.dart
+++ b/tests/isolate/timer_isolate_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('multiple_timer_test');
+library multiple_timer_test;
 
-#import("dart:isolate");
-#import('../../pkg/unittest/unittest.dart');
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 const int TIMEOUT = 100;
 
diff --git a/tests/isolate/timer_not_available_test.dart b/tests/isolate/timer_not_available_test.dart
index 96fb3c5..5234591 100644
--- a/tests/isolate/timer_not_available_test.dart
+++ b/tests/isolate/timer_not_available_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('timer_not_available');
+library timerNotAvailable;
 
-#import("dart:isolate");
+import 'dart:isolate';
 
 main() {
   bool failed = false;
diff --git a/tests/isolate/timer_repeat_test.dart b/tests/isolate/timer_repeat_test.dart
index 96be94d..31653dc 100644
--- a/tests/isolate/timer_repeat_test.dart
+++ b/tests/isolate/timer_repeat_test.dart
@@ -2,28 +2,28 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('timer_repeat_test');
+library timer_repeat_test;
 
-#import("dart:isolate");
-#import('../../pkg/unittest/unittest.dart');
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
-  const int TIMEOUT = 500;
-  const int ITERATIONS = 5;
+const int TIMEOUT = 500;
+const int ITERATIONS = 5;
 
-  Timer timer;
-  int startTime;
-  int iteration;
+Timer timer;
+int startTime;
+int iteration;
   
-  void timeoutHandler(Timer timer) {
-    int endTime = (new Date.now()).millisecondsSinceEpoch;
-    iteration++;
-    if (iteration < ITERATIONS) {
-      startTime = (new Date.now()).millisecondsSinceEpoch;
-    } else {
-      expect(iteration, ITERATIONS);
-      timer.cancel();
-    }
+void timeoutHandler(Timer timer) {
+  int endTime = (new Date.now()).millisecondsSinceEpoch;
+  iteration++;
+  if (iteration < ITERATIONS) {
+    startTime = (new Date.now()).millisecondsSinceEpoch;
+  } else {
+    expect(iteration, ITERATIONS);
+    timer.cancel();
   }
+}
 
 main() {
   test("timer_repeat", () {
diff --git a/tests/isolate/timer_test.dart b/tests/isolate/timer_test.dart
index 4a151e0..0ec4bf45 100644
--- a/tests/isolate/timer_test.dart
+++ b/tests/isolate/timer_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('timer_test');
+library timer_test;
 
-#import("dart:isolate");
-#import('../../pkg/unittest/unittest.dart');
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 const int STARTTIMEOUT = 1050;
 const int DECREASE = 200;
diff --git a/tests/isolate/unresolved_ports_negative_test.dart b/tests/isolate/unresolved_ports_negative_test.dart
index 67edb08..518884b 100644
--- a/tests/isolate/unresolved_ports_negative_test.dart
+++ b/tests/isolate/unresolved_ports_negative_test.dart
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // negative test to ensure that API_unresolvedPortsTest works.
-#library('unresolved_ports');
-#import('dart:isolate');
-#import('../../pkg/unittest/unittest.dart');
+library unresolved_ports;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 bethIsolate() {
   port.receive(expectAsync2((msg, reply) => msg[1].send(
diff --git a/tests/isolate/unresolved_ports_test.dart b/tests/isolate/unresolved_ports_test.dart
index 5dfe3fc..06f5d58 100644
--- a/tests/isolate/unresolved_ports_test.dart
+++ b/tests/isolate/unresolved_ports_test.dart
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // spawns multiple isolates and sends unresolved ports between them.
-#library('unresolved_ports');
-#import('dart:isolate');
-#import('../../pkg/unittest/unittest.dart');
+library unresolved_ports;
+import 'dart:isolate';
+import '../../pkg/unittest/lib/unittest.dart';
 
 // This test does the following:
 //  - main spawns two isolates: 'tim' and 'beth'
diff --git a/tests/json/json_test.dart b/tests/json/json_test.dart
index 649deba..ef1c20e 100644
--- a/tests/json/json_test.dart
+++ b/tests/json/json_test.dart
@@ -2,12 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('json_tests');
-
-#import('dart:json');
-#import('dart:html');
-#import('../../pkg/unittest/unittest.dart');
-#import('../../pkg/unittest/html_config.dart');
+library json_tests;
+import 'dart:json';
+import 'dart:html';
+import '../../pkg/unittest/lib/unittest.dart';
+import '../../pkg/unittest/lib/html_config.dart';
 
 main() {
   useHtmlConfiguration();
diff --git a/tests/language/bad_override_test.dart b/tests/language/bad_override_test.dart
index 2bb6900..646df5c 100644
--- a/tests/language/bad_override_test.dart
+++ b/tests/language/bad_override_test.dart
@@ -3,12 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class Fisk {
-  get fisk => null;
-  static /// 01: compile-time error
+  get fisk => null;	
+  static            /// 01: static type warning	
   set fisk(x) {}
-  static /// 02: compile-time error
-  get hest => null;
-  set hest(x) {}
+
+  static            /// 02: static type warning	
+  get hest => null;	
+  set hest(x) {}	
+
   foo() {}
   var field;
   method() {}
@@ -16,10 +18,10 @@
 }
 
 class Hest extends Fisk {
-  static foo() {} /// 03: compile-time error
-  field() {} /// 04: compile-time error
-  var method; /// 05: compile-time error
-  nullary(x) {} /// 06: compile-time error
+  static foo() {}   /// 03: compile-time error
+  field() {}        /// 04: compile-time error
+  var method;       /// 05: compile-time error
+  nullary(x) {}     /// 06: compile-time error
 }
 
 main() {
diff --git a/tests/language/checked_null_test.dart b/tests/language/checked_null_test.dart
new file mode 100644
index 0000000..cd95d61
--- /dev/null
+++ b/tests/language/checked_null_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  Map a;
+  Comparator b;
+  // This code exhibited a bug in dart2js checked mode, where the type
+  // of [a] was inferred to be [Comparator] or null;
+  A() : b = null, a = null;
+}
+
+main() { 
+  Expect.throws(bar);
+}
+
+bar() {
+  // We would create a typed selector for the call to foo, where the
+  // receiver type is a typedef. Some code in the dart2js backend were
+  // not dealing correctly with typedefs and lead the compiler to
+  // crash.
+  new A().a.foo();
+}
diff --git a/tests/language/do_while2_test.dart b/tests/language/do_while2_test.dart
new file mode 100644
index 0000000..c6cae30
--- /dev/null
+++ b/tests/language/do_while2_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+var a = 42;
+
+foo1() {
+  var i = 0;
+  var saved;
+  do {
+    saved = i;
+    i = a;
+  } while (i == saved);
+  Expect.equals(0, saved);
+  Expect.equals(42, i);
+}
+
+foo2() {
+  var i = 0;
+  var saved;
+  do {
+    saved = i;
+    i = a;
+  } while (i != saved);
+  Expect.equals(42, saved);
+  Expect.equals(42, i);
+}
+
+foo3() {
+  var i = 0;
+  var saved;
+  do {
+    saved = i;
+    i = a;
+    if (i == saved) continue;
+  } while (i != saved);
+  Expect.equals(42, saved);
+  Expect.equals(42, i);
+}
+
+main() {
+  foo1();
+  foo2();
+  foo3();
+}
diff --git a/tests/language/field7a_negative_test.dart b/tests/language/field7a_negative_test.dart
deleted file mode 100644
index 1e26e68..0000000
--- a/tests/language/field7a_negative_test.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Dart test to catch error reporting bugs in class fields declarations.
-// Should be an error because we have a function overriding a setter name.
-
-class A {
-  void set a(var val) {
-    int i = val;
-  }
-  int a() {
-    return 1;
-  }
-}
-
-class Field7aNegativeTest {
-  static testMain() {
-  }
-}
-
-main() {
-  Field7aNegativeTest.testMain();
-}
diff --git a/tests/language/first_class_types_libraries_test.dart b/tests/language/first_class_types_libraries_test.dart
index b04c572..521f2fa 100644
--- a/tests/language/first_class_types_libraries_test.dart
+++ b/tests/language/first_class_types_libraries_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+library firstClassLibrariestest;
 import 'first_class_types_lib1.dart' as lib1;
 import 'first_class_types_lib2.dart' as lib2;
 
diff --git a/tests/language/first_class_types_literals_test.dart b/tests/language/first_class_types_literals_test.dart
new file mode 100644
index 0000000..9e8093f
--- /dev/null
+++ b/tests/language/first_class_types_literals_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class C<T> {}
+
+class D {}
+
+typedef int Foo(bool b);
+
+sameType(a, b) {
+  Expect.identical(a.runtimeType, b.runtimeType);
+}
+
+differentType(a, b) {
+  print("a: ${a.runtimeType}");
+  print("b: ${b.runtimeType}");
+  Expect.isFalse(a.runtimeType === b.runtimeType);
+}
+
+main() {
+  // Test type literals.
+  Expect.identical(int, int);
+  Expect.isFalse(int === num);
+  Expect.identical(Foo, Foo);
+
+  // Test that class literals return instances of Type.
+  Expect.isTrue((D).runtimeType is Type);
+
+  // Test that types from runtimeType and literals agree.
+  Expect.identical(int, 1.runtimeType);
+  Expect.identical(C, new C().runtimeType);
+  Expect.identical(D, new D().runtimeType);
+
+  // runtimeType on type is idempotent.
+  Expect.identical((D).runtimeType, (D).runtimeType.runtimeType);
+
+  // Test that operator calls on class literals go to Type.
+  Expect.throws(() => C = 1, (e) => e is NoSuchMethodError);
+  Expect.throws(() => C++, (e) => e is NoSuchMethodError);
+  Expect.throws(() => C + 1, (e) => e is NoSuchMethodError);
+  Expect.throws(() => C[2], (e) => e is NoSuchMethodError);
+  Expect.throws(() => C[2] = 'hest', (e) => e is NoSuchMethodError);
+}
diff --git a/tests/language/first_class_types_test.dart b/tests/language/first_class_types_test.dart
index 82c128f..5db1e54 100644
--- a/tests/language/first_class_types_test.dart
+++ b/tests/language/first_class_types_test.dart
@@ -5,9 +5,7 @@
 class C<T> {}
 
 sameType(a, b) {
-  print("a: ${a.runtimeType}");
-  print("b: ${b.runtimeType}");
-  Expect.isTrue(a.runtimeType === b.runtimeType);
+  Expect.identical(a.runtimeType, b.runtimeType);
 }
 
 differentType(a, b) {
@@ -17,6 +15,7 @@
 }
 
 main() {
+  // Test types obtained by calling runtimeType.
   var v1 = new C<int>();
   var v2 = new C<int>();
   sameType(v1, v2);
diff --git a/tests/language/import_combinators_negative_test.dart b/tests/language/import_combinators_negative_test.dart
index efbb344..20d6e68 100644
--- a/tests/language/import_combinators_negative_test.dart
+++ b/tests/language/import_combinators_negative_test.dart
@@ -4,6 +4,7 @@
 
 // Dart test program importing with show/hide combinators.
 
+library importCombinatorsNegativeTest;
 import "import1_lib.dart" show hide, show hide ugly;
 
 main() {
diff --git a/tests/language/import_combinators_test.dart b/tests/language/import_combinators_test.dart
index 5d0dd84..0d91356 100644
--- a/tests/language/import_combinators_test.dart
+++ b/tests/language/import_combinators_test.dart
@@ -4,6 +4,7 @@
 
 // Dart test program importing with show/hide combinators.
 
+library importCombinatorsTest;
 import "import1_lib.dart" show hide, show hide ugly;
 import "export1_lib.dart";
 import "dart:math" as M show E;
diff --git a/tests/language/instance_inline_test.dart b/tests/language/instance_inline_test.dart
new file mode 100644
index 0000000..e45dde2
--- /dev/null
+++ b/tests/language/instance_inline_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test inlining of assignments in parameter passing. If [StringScanner.charAt]
+// is inlined, the argument expresion [: ++byteOffset :] should not be
+// duplicated.
+
+class StringScanner {
+  final String string;
+  int byteOffset = -1;
+
+  StringScanner(this.string);
+
+  int nextByte() => charAt(++byteOffset);
+
+  int charAt(index)
+      => (string.length > index) ? string.charCodeAt(index) : -1;
+}
+
+void main() {
+  var scanner = new StringScanner('az9');
+  Expect.equals(0x61, scanner.nextByte()); // Expect a.
+  Expect.equals(0x7A, scanner.nextByte()); // Expect z.
+  Expect.equals(0x39, scanner.nextByte()); // Expect 9.
+  Expect.equals(-1, scanner.nextByte());
+}
\ No newline at end of file
diff --git a/tests/language/language.status b/tests/language/language.status
index fd80dde..aa20e9f 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -19,12 +19,6 @@
 part_test: Fail
 part2_test: Fail
 gc_test: Fail # Issue 1487
-field_override_test/none: Fail  # Issue 742: field shadowing now allowed
-field_override_test/01: Fail    # Issue 742: field shadowing now allowed
-super_field_access_test: Fail    # Issue 742: field shadowing now allowed
-pseudo_kw_illegal_test/03: Fail  # Issue 356
-pseudo_kw_illegal_test/08: Fail  # Issue 356
-pseudo_kw_illegal_test/10: Fail  # Issue 356
 pseudo_kw_illegal_test/14: Fail  # Issue 356
 
 # These bugs refer currently ongoing language discussions.
@@ -42,9 +36,6 @@
 
 parameter_initializer6_negative_test: Fail # Issue 3502
 
-bad_override_test/01: Fail # Issue 3859.
-bad_override_test/02: Fail # Issue 3859.
-
 named_parameters_aggregated_test/05: Fail # Compile-time error reported instead of static type warning.
 
 lazy_static3_test: Fail # Issue 3558
@@ -57,13 +48,12 @@
 
 compile_time_constant10_test/none: Fail # issue 5214
 
-export_cyclic_test: Crash # issue 6060
-
 call_through_null_getter_test: Fail # issue 6124
 
 invocation_mirror_test: Fail # issue 3326, 3622.
 no_such_method_test: Fail # issue 3326, 3622.
 
+export_cyclic_test: Fail, Crash # issue 6060
 invocation_mirror_indirect_test: Fail # Issue 3326
 
 [ $compiler == none && ($system == macos || $system == linux) && $arch == ia32 && $checked ]
@@ -72,8 +62,13 @@
 [ $compiler == none && $mode == debug ]
 gc_test: Skip  # Takes too long.
 
+
+[ $compiler == none && $checked ]
+redirecting_factory_infinite_steps_test/01: Fail # http://dartbug.com/6596
+
+
 [ $compiler == none && $unchecked ]
-field_override_test/02: Fail    # Issue 742: field shadowing now allowed
+
 
 # Only checked mode reports an error on type assignment
 # problems in compile time constants.
@@ -92,8 +87,12 @@
 compile_time_constant_checked3_test/06: Fail, OK
 
 [ $compiler == dartc ]
+redirecting_factory_infinite_steps_test/01: Fail # http://dartbug.com/6560
+redirecting_factory_infinite_steps_test/02: Fail # http://dartbug.com/6560
 implicit_this_test/none: Fail # should not warn about allocating SubAbstract2
 metadata_test: Fail
+bad_override_test/01: Fail
+bad_override_test/02: Fail
 get_set_syntax_test/none: Fail # does not accept getter/setter with no method body
 application_negative_test: Fail # Runtime only test, rewrite as multitest
 assign_instance_method_negative_test: Fail # Runtime only test, rewrite as multitest
@@ -136,15 +135,14 @@
 class_literal_test/28 : Fail # language change 3368
 class_literal_test/29 : Fail # language change 3368
 closure_call_wrong_argument_count_negative_test: Fail # Runtime only test, rewrite as multitest
-compile_time_constant_test/02: Fail # issue 5987.
 compile_time_constant10_test/none: Fail # issue 5215.
 constructor3_negative_test: Fail # Runtime only test, rewrite as multitest
 constructor_call_wrong_argument_count_negative_test: Fail # Runtime only test, rewrite as multitest
 disable_privacy_test: Fail # Issue 1882: Needs --disable_privacy support.
 factory5_test/00: Fail # issue 3079
 field_method4_negative_test: Fail  # Runtime only test, rewrite as multitest
-field7_negative_test: Fail, OK # language changed, test issue 5249
-field7a_negative_test: Fail, OK # language changed, test issue 5249
+
+first_class_types_literals_test: Fail # issue 6283
 getter_no_setter_test/01: Fail # Fails to detect compile-time error.
 getter_no_setter2_test/01: Fail # Fails to detect compile-time error.
 instance_call_wrong_argument_count_negative_test: Fail # Runtime only test, rewrite as multitest
@@ -161,8 +159,6 @@
 many_overridden_no_such_method_test: Fail
 no_such_method_negative_test: Fail # Runtime only test, rewrite as multitest
 override_field_test/03: Fail # still a valid test? Issue 3894
-override_field_test/04: Fail # still a valid test? Issue 3656
-override_field_method3_negative_test: Fail, OK # test issue 5249
 override_field_method6_negative_test: Fail, OK # test issue 5249
 overridden_no_such_method_test: Fail
 parameter_initializer6_negative_test: Fail # language change 4288
@@ -304,6 +300,45 @@
 type_variable_bounds_test/07: Pass
 
 
+# test issue 6512
+arithmetic_test: Fail, OK
+call_constructor_on_unresolvable_class_test/none: Fail, OK
+call_constructor_on_unresolvable_class_test/01: Fail, OK
+call_constructor_on_unresolvable_class_test/02: Fail, OK
+call_constructor_on_unresolvable_class_test/07: Fail, OK
+call_constructor_on_unresolvable_class_test/03: Fail, OK
+closure_type_test: Fail, OK
+const_var_test: Fail, OK
+ct_const4_test: Fail, OK
+cyclic_import_test: Fail, OK
+function_type_alias3_test: Fail, OK
+getter_setter_in_lib_test: Fail, OK
+import_collection_no_prefix_test: Fail, OK
+import_core_no_prefix_test: Fail, OK
+import_core_prefix_test: Fail, OK
+import_core_test: Fail, OK
+intrinsified_methods_test: Fail, OK
+issue1363_test: Fail, OK
+library5_test: Fail, OK
+library_private_in_constructor_test: Fail, OK
+numbers_test: Fail, OK
+prefix101_test: Fail, OK
+prefix10_negative_test: Pass
+prefix10_test: Fail, OK
+prefix11_test: Fail, OK
+prefix12_test: Fail, OK
+prefix1_negative_test: Pass
+prefix21_test: Fail, OK
+prefix4_negative_test: Pass
+prefix5_negative_test: Pass
+prefix_new_test: Fail, OK
+prefix_test: Fail, OK
+private_member3_negative_test: Pass
+private_member_test: Fail, OK
+top_level_prefixed_declaration_test: Fail, OK
+typed_message_test: Fail, OK
+
+
 
 #
 # Add new dartc annotations above in alphabetical order
@@ -320,12 +355,6 @@
 final_variable_assignment_test/03: Fail
 final_variable_assignment_test/04: Fail
 gc_test: Skip # Issue 1487
-prefix_new_test: Fail
-import_combinators_test: Fail
-export_test: Fail # Issue 5785
-export_cyclic_test: Fail # Issue 5785
-first_class_types_libraries_test: Fail # Issue 2264
-local_export_test: Fail # http://dartbug.com/2264
 
 
 [ $runtime == dartium ]
@@ -333,6 +362,7 @@
 
 
 [ $runtime == vm || ($runtime == drt && $compiler == none) ]
+first_class_types_literals_test: Fail # issue 6282
 call_test: Fail # Issue 1604
 
 [ $runtime == chrome ]
@@ -354,12 +384,21 @@
 *: Skip
 
 [ $compiler == dart2dart ]
+redirecting_factory_infinite_steps_test/01: Fail, Pass # TRIAGE: fails in minified mode. http://dartbug.com/6603
+
 many_overridden_no_such_method_test: Fail, Pass # TRIAGE: fails in minified mode
 overridden_no_such_method_test: Fail, Pass # TRIAGE: fails in minified mode
 # Calling unresolved class constructor:
 # call_constructor_on_unresolvable_class_test/07: Fail
 call_nonexistent_constructor_test: Fail
 
+bad_override_test/01: Fail
+bad_override_test/02: Fail
+
+illegal_invocation_test/01: Fail, OK # Typedef literals are expressions now.
+illegal_invocation_test/04: Fail, OK # Class literals are expressions now.
+illegal_invocation_test/05: Fail, OK # Type variables are expressions now.
+
 # Renaming type from platform library:
 dynamic_test: Fail
 
@@ -386,19 +425,6 @@
 type_variable_scope_test: Fail
 constructor_redirect2_test/03: Fail
 
-class_literal_test/05: Fail # http://dartbug.com/5519
-class_literal_test/10: Fail # http://dartbug.com/5519
-class_literal_test/11: Fail # http://dartbug.com/5519
-class_literal_test/12: Fail # http://dartbug.com/5519
-class_literal_test/17: Fail # http://dartbug.com/5519
-class_literal_test/18: Fail # http://dartbug.com/5519
-class_literal_test/19: Fail # http://dartbug.com/5519
-class_literal_test/20: Fail # http://dartbug.com/5519
-class_literal_test/22: Fail # http://dartbug.com/5519
-class_literal_test/25: Fail # http://dartbug.com/5519
-class_literal_test/27: Fail # http://dartbug.com/5519
-class_literal_test/28: Fail # http://dartbug.com/5519
-class_literal_test/29: Fail # http://dartbug.com/5519
 compile_time_constant10_test/01: Fail # http://dartbug.com/5519
 compile_time_constant10_test/02: Fail # http://dartbug.com/5519
 compile_time_constant_arguments_test/01: Fail # http://dartbug.com/5519
@@ -436,7 +462,6 @@
 named_parameters_aggregated_test/03: Fail # http://dartbug.com/5519
 named_parameters_aggregated_test/04: Fail # http://dartbug.com/5519
 not_enough_positional_arguments_test/01: Fail # http://dartbug.com/5519
-override_field_test/04: Fail # http://dartbug.com/5519
 static_field3_test/01: Fail # http://dartbug.com/5519
 static_field3_test/02: Fail # http://dartbug.com/5519
 static_field3_test/03: Fail # http://dartbug.com/5519
@@ -456,7 +481,6 @@
 class_cycle_negative_test: Fail, OK # Bad test: assumes eager loading.
 field1_negative_test: Fail, OK # Bad test: assumes eager loading.
 field6_negative_test: Fail, OK # Bad test: assumes eager loading.
-field7_negative_test: Fail, OK # Bad test: assumes eager loading.
 interface_cycle_negative_test: Fail, OK # Bad test: assumes eager loading.
 # Common problems with dart2js.  In illegal family, invalid
 # declarations are simply not parsed.  In pseudo kw dart2js
@@ -480,7 +504,6 @@
 field4_negative_test: Fail
 field5_negative_test: Fail
 field6a_negative_test: Fail
-field7a_negative_test: Fail
 interface_factory_constructor_negative_test: Fail
 interface_static_method_negative_test: Fail
 non_const_super_negative_test: Fail
@@ -522,11 +545,7 @@
 constructor5_test: Fail
 constructor6_test: Fail
 closure_in_initializer_test: Fail
-field_override_test/01: Fail
-field_override_test/02: Fail
-field_override_test/none: Fail
 gc_test: Fail
-super_field_access_test: Fail
 super_first_constructor_test: Fail
 # VM specific tests.
 disable_privacy_test: Fail, Ok
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 8bcd4fd..3f87fe4 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -3,11 +3,36 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2js || $compiler == dart2dart ]
+class_literal_test/01: Fail # Class literals are expression now; delete this test.
+class_literal_test/02: Fail # Class literals are expression now; delete this test.
+class_literal_test/05: Fail # Class literals are expression now; delete this test.
+class_literal_test/06: Fail # Class literals are expression now; delete this test.
+class_literal_test/07: Fail # Class literals are expression now; delete this test.
+class_literal_test/10: Fail # Class literals are expression now; delete this test.
+class_literal_test/11: Fail # Class literals are expression now; delete this test.
+class_literal_test/12: Fail # Class literals are expression now; delete this test.
+class_literal_test/13: Fail # Class literals are expression now; delete this test.
+class_literal_test/14: Fail # Class literals are expression now; delete this test.
+class_literal_test/17: Fail # Class literals are expression now; delete this test.
+class_literal_test/18: Fail # Class literals are expression now; delete this test.
+class_literal_test/19: Fail # Class literals are expression now; delete this test.
+class_literal_test/20: Fail # Class literals are expression now; delete this test.
+class_literal_test/21: Fail # Class literals are expression now; delete this test.
+class_literal_test/22: Fail # Class literals are expression now; delete this test.
+class_literal_test/23: Fail # Class literals are expression now; delete this test.
+class_literal_test/24: Fail # Class literals are expression now; delete this test.
+class_literal_test/25: Fail # Class literals are expression now; delete this test.
+class_literal_test/26: Fail # Class literals are expression now; delete this test.
+class_literal_test/27: Fail # Class literals are expression now; delete this test.
+class_literal_test/28: Fail # Class literals are expression now; delete this test.
+class_literal_test/29: Fail # Class literals are expression now; delete this test.
+
 # VM specific tests that should not be run by dart2js.
 *vm_test: Skip
 *vm_negative_test: Skip
 
 [ $compiler == dart2js && $checked ]
+redirecting_factory_infinite_steps_test/01: Fail
 assert_with_type_test_or_cast_test: Fail # Issue 4929
 type_variable_bounds_test/01: Fail
 type_variable_bounds_test/02: Fail
@@ -31,7 +56,6 @@
 closure_type_test: Fail # does not detect type error in checked mode.
 function_type_test: Fail # does not detect type error in checked mode.
 function_malformed_result_type_test: Fail # does not detect type error in checked mode.
-void_type_test: Fail # does not detect type error in checked mode.
 
 type_parameter_test/01: Fail # Issue 4932
 type_parameter_test/02: Fail # Issue 4932
@@ -61,10 +85,18 @@
 compile_time_constant_checked3_test/06: Fail, OK
 
 [ $compiler == dart2js ]
+factory_redirection_test/none: fail
+factory_redirection_test/01: fail
+factory_redirection_test/02: fail
+factory_redirection_test/03: fail
+factory_redirection_test/05: fail
+factory_redirection_test/06: fail
 final_variable_assignment_test/01: Fail
 final_variable_assignment_test/02: Fail
 final_variable_assignment_test/03: Fail
 final_variable_assignment_test/04: Fail
+bad_override_test/01: Fail
+bad_override_test/02: Fail
 bad_constructor_test/04: Fail # http://dartbug.com/5519
 bad_constructor_test/05: Fail # http://dartbug.com/5519
 bad_constructor_test/06: Fail # http://dartbug.com/5519
@@ -77,6 +109,10 @@
 isnot_malformed_type_test/01: Fail # http://dartbug.com/5519
 not_enough_positional_arguments_test/01: Fail # http://dartbug.com/5519
 
+constructor_negative_test: Pass # Wrong reason: the expression 'C()' is valid with class literals.
+illegal_invocation_test/01: Fail, OK # Typedef literals are expressions now.
+illegal_invocation_test/04: Fail, OK # Class literals are expressions now.
+
 throw_expr_test: Fail
 metadata_test: Fail # Metadata on type parameters not supported.
 infinity_test: Fail # Issue 4984
@@ -107,14 +143,6 @@
 char_escape_test: Fail # Unhandled non-BMP character: U+10000
 default_factory_library_test: Fail # lib is not a type
 dynamic_test: Fail # cannot resolve type F1
-factory_redirection_test/none: Fail # Not implemented.
-factory_redirection_test/01: Fail # Not implemented.
-factory_redirection_test/02: Fail # Not implemented.
-factory_redirection_test/03: Fail # Not implemented.
-factory_redirection_test/04: Pass # For the wrong reason. Not implemented.
-factory_redirection_test/05: Fail # Not implemented.
-factory_redirection_test/06: Fail # Not implemented.
-factory_redirection_test/07: Pass # For the wrong reason. Not implemented.
 constructor_redirect2_test/03: Fail # redirecting ctor with initializing formal
 factory3_test: Fail # internal error: visitIs for type variables not implemented
 function_type_alias2_test: Fail # cannot resolve type f1
@@ -199,7 +227,6 @@
 external_test/16: Fail, OK # Bad test: assumes eager loading.
 field1_negative_test: Fail, OK # Bad test: assumes eager loading.
 field6_negative_test: Fail, OK # Bad test: assumes eager loading.
-field7_negative_test: Fail, OK # Bad test: assumes eager loading.
 interface_cycle_negative_test: Fail, OK # Bad test: assumes eager loading.
 syntax_test/47: Fail, OK # Bad test: assumes eager loading.
 
@@ -218,7 +245,6 @@
 const_init_negative_test: Fail # Negative language test.
 const_syntax_test/04: Fail # Negative language test.
 constructor2_negative_test: Fail # Negative language test.
-constructor_negative_test: Pass # For the wrong reason.
 constructor_return_negative_test: Fail # Negative language test.
 constructor_return_with_arrow_negative_test: Fail # Negative language test.
 constructor_return_with_init_and_arrow_negative_test: Fail # Negative language test.
@@ -235,7 +261,6 @@
 field4_negative_test: Fail # Negative language test.
 field5_negative_test: Fail # Negative language test.
 field6a_negative_test: Fail # Negative language test.
-field7a_negative_test: Fail # Negative language test.
 final_for_in_variable_test/01: Fail # Negative language test
 final_param_negative_test: Fail # Negative language test.
 final_var_negative_test: Fail # Negative language test.
@@ -250,7 +275,6 @@
 non_const_super_negative_test: Fail # Negative language test.
 number_identifier_negative_test: Fail # Negative language test.
 operator1_negative_test: Fail # Negative language test.
-override_field_test/04: Fail # Broken test.
 prefix16_test: Fail
 prefix18_negative_test: Fail # Negative language test.
 prefix20_negative_test: Fail # Negative language test.
@@ -334,17 +358,6 @@
 null_pointer_exception_test: Fail # Uncaught error: Instance of 'TypeError'
 string_interpolate_npe_test: Fail # Uncaught error: Instance of 'TypeError'
 
-[ $compiler == dart2js && $runtime == ff && $system == windows ]
-prefix_new_test: Fail # TODO(ahe): Enable wrapper-less tests on Firefox/Windows.
-part2_test: Fail # TODO(ahe): Enable wrapper-less tests on Firefox/Windows.
-part_test: Fail # TODO(ahe): Enable wrapper-less tests on Firefox/Windows.
-export_test: Fail # Issue 5785 (root cause: issue 2264)
-export_cyclic_test: Fail # Issue 5785 (root cause: issue 2264)
-import_combinators_test: Fail # Issue 5785 (root cause: issue 2264)
-first_class_types_libraries_test: Fail
-local_export_test: Fail # TODO(ahe): Enable wrapper-less tests on Firefox/Windows.
-
-
 [ $runtime == opera ]
 call_through_null_getter_test: Fail
 closure3_test: Fail
diff --git a/lib/html/templates/html/interface/interface_Document.darttemplate b/tests/language/lazy_map_test.dart
similarity index 72%
copy from lib/html/templates/html/interface/interface_Document.darttemplate
copy to tests/language/lazy_map_test.dart
index 7d30daf..f1ff770 100644
--- a/lib/html/templates/html/interface/interface_Document.darttemplate
+++ b/tests/language/lazy_map_test.dart
@@ -2,10 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of html;
-
-$!COMMENT
-abstract class Document extends HtmlElement {
-
-$!MEMBERS
+var data = { 'a': 'a' };
+main() {
+  Expect.equals('a', data['a']);
 }
diff --git a/tests/language/local_export_test.dart b/tests/language/local_export_test.dart
index fe4df96..ce2ca1d 100644
--- a/tests/language/local_export_test.dart
+++ b/tests/language/local_export_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+library localExportTest;
 import 'local_export_a.dart';
 
 void main() {
diff --git a/tests/language/named_parameters_with_dollars_test.dart b/tests/language/named_parameters_with_dollars_test.dart
index d1bc0f6..6bd7af3 100644
--- a/tests/language/named_parameters_with_dollars_test.dart
+++ b/tests/language/named_parameters_with_dollars_test.dart
@@ -37,8 +37,8 @@
 makeTestClass(n) => [new TestClass(), new Decoy(), 'string'][n % 3];
 
 class Decoy {
-  method([a$b, b, a]) { throw const NotImplementedException(); }
-  psycho([$$$, $$, $])  { throw const NotImplementedException(); }
+  method([a$b, b, a]) { throw new UnimplementedError(); }
+  psycho([$$$, $$, $])  { throw new UnimplementedError(); }
 }
 
 testDollar() {
diff --git a/tests/language/optimized_constant_array_string_access.dart b/tests/language/optimized_constant_array_string_access.dart
new file mode 100644
index 0000000..2e0b1ba
--- /dev/null
+++ b/tests/language/optimized_constant_array_string_access.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test optimized constant string and constant array access.
+
+int testConstantStringAndIndexCharCodeAt() {
+  int test(b) {
+    if (b) return "hest".charCodeAt(400);
+    return "hest".charCodeAt(2);
+  }
+
+  Expect.throws(() => test(true));
+  for (int i = 0; i < 10000; i++) test(false);
+  Expect.throws(() => test(true));
+}
+
+
+int testConstantArrayAndIndexAt() {
+  int test(b) {
+    var a = const [1,2,3,4];
+    if (b) return a[400];
+    return a[2];
+  }
+
+  Expect.throws(() => test(true));
+  for (int i = 0; i < 10000; i++) test(false);
+  Expect.throws(() => test(true));
+}
+
+
+foo(a) {
+  if (a == 1) { return 2; }
+  var aa = const [1, 2];
+  return aa[2.3];
+}
+
+
+int testNonSmiIndex() {
+  for (int i = 0; i < 10000; i++) { foo(1); }
+  Expect.throws(() => foo(2));
+}
+
+
+main() {
+  testConstantStringAndIndexCharCodeAt();
+  testConstantArrayAndIndexAt();
+  testNonSmiIndex();
+}
diff --git a/tests/language/optimized_string_charcodeat.dart b/tests/language/optimized_string_charcodeat.dart
new file mode 100644
index 0000000..1e84590
--- /dev/null
+++ b/tests/language/optimized_string_charcodeat.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test optimized charCodeAt and array access.
+
+String one_byte = "hest";
+String two_byte = "høns";
+
+int testOneByteCharCodeAt(String x, int i) {
+  int test() {
+    return x.charCodeAt(i);
+  }
+  for (int i = 0; i < 10000; i++) test();
+  return test();
+}
+
+
+int testTwoByteCharCodeAt(String x, int i) {
+  int test() {
+    return x.charCodeAt(i);
+  }
+  for (int i = 0; i < 10000; i++) test();
+  return test();
+}
+
+
+int testConstantStringCharCodeAt(int i) {
+  int test() {
+    return "høns".charCodeAt(i);
+  }
+  for (int i = 0; i < 10000; i++) test();
+  return test();
+}
+
+
+int testConstantIndexCharCodeAt(String x) {
+  int test() {
+    return x.charCodeAt(1);
+  }
+  for (int i = 0; i < 10000; i++) test();
+  return test();
+}
+
+
+main() {
+  Expect.equals(101, testOneByteCharCodeAt(one_byte, 1));
+  Expect.equals(248, testTwoByteCharCodeAt(two_byte, 1));
+  Expect.equals(248, testConstantStringCharCodeAt(1));
+  Expect.equals(101, testConstantIndexCharCodeAt(one_byte));
+}
diff --git a/tests/language/override_field_method3_negative_test.dart b/tests/language/override_field_method3_negative_test.dart
deleted file mode 100644
index 5811aec..0000000
--- a/tests/language/override_field_method3_negative_test.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Dart test error for overriding setter with method.
-
-class A {
-  set foo(x) { }
-}
-
-class B extends A {
-  foo(x) {}  // method cannot override setter.
-}
-
-class OverrideFieldMethod3NegativeTest {
-  static testMain() {
-    new B().foo(10);
-  }
-}
-
-main() {
-  OverrideFieldMethod3NegativeTest.testMain();
-}
diff --git a/tests/language/override_field_method6_negative_test.dart b/tests/language/override_field_method6_negative_test.dart
deleted file mode 100644
index 09998b7..0000000
--- a/tests/language/override_field_method6_negative_test.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Dart test error for overriding method with setter.
-
-class A {
-  foo(x) { }
-}
-
-class B extends A {
-  set foo(x) { }  // setter cannot override method.
-}
-
-class OverrideFieldMethod6NegativeTest {
-  static testMain() {
-    new B().foo = 10;
-  }
-}
-
-main() {
-  OverrideFieldMethod6NegativeTest.testMain();
-}
diff --git a/tests/language/override_field_test.dart b/tests/language/override_field_test.dart
index ebc289f..4d57d18 100644
--- a/tests/language/override_field_test.dart
+++ b/tests/language/override_field_test.dart
@@ -4,19 +4,14 @@
 // Dart test checking that static/instance field shadowing do not conflict.
 
 class A {
-  A() {}  // DartC has no implicit constructors yet.
-
   int instanceFieldInA;
   static int staticFieldInA;
 }
 
 class B extends A {
-  B() : super() {}  // DartC has no implicit constructors yet.
-
-  static int instanceFieldInA; /// 01: compile-time error
-  int staticFieldInA; /// 02: static type warning
-  static int staticFieldInA; /// 03: static type warning
-  int instanceFieldInA; /// 04: compile-time error
+  static int instanceFieldInA;   /// 01: compile-time error
+  int staticFieldInA;            /// 02: static type warning
+  static int staticFieldInA;     /// 03: static type warning
 }
 
 main() {
diff --git a/tests/language/pseudo_kw_illegal_test.dart b/tests/language/pseudo_kw_illegal_test.dart
index a8962b1..815a8be 100644
--- a/tests/language/pseudo_kw_illegal_test.dart
+++ b/tests/language/pseudo_kw_illegal_test.dart
@@ -7,6 +7,7 @@
 class abstract { }    /// 01: compile-time error
 class assert { }      /// 02: compile-time error
 class dynamic { }     /// 04: compile-time error
+class export { }      /// 17: compile-time error
 class factory { }     /// 05: compile-time error
 class get { }         /// 06: compile-time error
 class implements { }  /// 07: compile-time error
@@ -14,6 +15,7 @@
 class interface { }   /// 09: compile-time error
 class library { }     /// 10: compile-time error
 class operator { }    /// 12: compile-time error
+class part { }        /// 18: compile-time error
 class set { }         /// 13: compile-time error
 class source { }      /// 14: compile-time error
 class static { }      /// 15: compile-time error
diff --git a/tests/language/redirecting_factory_infinite_steps_test.dart b/tests/language/redirecting_factory_infinite_steps_test.dart
new file mode 100644
index 0000000..e655080
--- /dev/null
+++ b/tests/language/redirecting_factory_infinite_steps_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// From Dart Language Specification, 0.12 M1, "7.6.2 Factories": It is
+// a compile-time error if a redirecting factory constructor does not
+// redirect to a non-redirecting factory constructor or to a
+// generative constructor in a finite number of steps.
+
+// TODO(ahe): The above specification will probably change to
+// something like: "It is a compile-time error if a redirecting
+// factory constructor redirects to itself, either directly or
+// indirectly via a sequence of redirections."
+
+class Foo extends Bar {
+  factory Foo() = Bar; /// 01: static type warning, dynamic type error
+}
+
+class Bar {
+  factory Bar() = Foo; /// 02: compile-time error
+}
+
+main() {
+  new Foo();
+}
diff --git a/tests/language/return_in_loop_test.dart b/tests/language/return_in_loop_test.dart
index d65caf0..a960ba6 100644
--- a/tests/language/return_in_loop_test.dart
+++ b/tests/language/return_in_loop_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// Test for a leg bug where the live environment was not computed
+// Test for a dart2js bug where the live environment was not computed
 // right.
 
 class A {
diff --git a/tests/language/return_type_test.dart b/tests/language/return_type_test.dart
new file mode 100644
index 0000000..462282d
--- /dev/null
+++ b/tests/language/return_type_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+isCheckedMode() {
+  try {
+    var i = 1;
+    String s = i;
+    return false;
+  } catch (e) {
+    return true;
+  }
+}
+
+int returnString1() => 's';
+void returnNull() => null;
+void returnString2() => 's';
+
+main() {
+  if (isCheckedMode()) {
+    Expect.throws(returnString1, (e) => e is TypeError);
+    Expect.throws(returnString2, (e) => e is TypeError);
+    returnNull();
+  } else {
+    returnString1();
+    returnNull();
+    returnString2();
+  }
+}
diff --git a/tests/language/field7_negative_test.dart b/tests/language/setter4_test.dart
similarity index 83%
rename from tests/language/field7_negative_test.dart
rename to tests/language/setter4_test.dart
index 6a043aa..8428a7a 100644
--- a/tests/language/field7_negative_test.dart
+++ b/tests/language/setter4_test.dart
@@ -13,11 +13,5 @@
   }
 }
 
-class Field7NegativeTest {
-  static testMain() {
-  }
-}
-
 main() {
-  Field7NegativeTest.testMain();
 }
diff --git a/tests/language/state_mangling3_test.dart b/tests/language/state_mangling3_test.dart
new file mode 100644
index 0000000..195a2dd
--- /dev/null
+++ b/tests/language/state_mangling3_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+foo(state0) {
+  if (state0 == null) return 0;
+  var sum = 0;
+  for (int i = 0; i < state0.length; i++) {
+    sum += state0[i];
+  }
+  state0 = inscrutableId(state0);
+  for (int i = 0; i < state0.length; i++) {
+    sum += state0[i];
+  }
+  return sum;
+}
+
+int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
+
+inscrutableId(x) {
+  if (x == 0) return inscrutable(x);
+  return (3 == inscrutable(3)) ? x : false;
+}
+
+class A {
+  int length = 3;
+  operator [](i) => 1;
+}
+
+main() {
+  Expect.equals(12, foo([1, 2, 3]));
+  if (inscrutableId(0) == 0) {
+    Expect.equals(6, foo(new A()));
+  }
+}
diff --git a/tests/language/state_mangling4_test.dart b/tests/language/state_mangling4_test.dart
new file mode 100644
index 0000000..b6aab91
--- /dev/null
+++ b/tests/language/state_mangling4_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+foo(env1) {
+  if (env1 == null) return 0;
+  var env0 = 0;
+  for (int i = 0; i < env1.length; i++) {
+    env0 += env1[i];
+  }
+  env1 = inscrutableId(new A());
+  for (int i = 0; i < env1.length; i++) {
+    env0 += env1[i];
+  }
+  return env0;
+}
+
+int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
+
+inscrutableId(x) {
+  if (x == 0) return inscrutable(x);
+  return (3 == inscrutable(3)) ? x : false;
+}
+
+class A {
+  int length = 3;
+  operator [](i) => 1;
+}
+
+main() {
+  Expect.equals(9, foo([1, 2, 3]));
+  if (inscrutableId(0) == 0) {
+    Expect.equals(6, foo(new A()));
+  }
+}
diff --git a/tests/language/static_inline_test.dart b/tests/language/static_inline_test.dart
new file mode 100644
index 0000000..4c5ad9a
--- /dev/null
+++ b/tests/language/static_inline_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test inlining of assignments in parameter passing. If [StringScanner.charAt]
+// is inlined, the argument expresion [: ++byteOffset :] should not be
+// duplicated.
+
+class StringScanner {
+  static String string;
+  int byteOffset = -1;
+
+  int nextByte(foo) {
+    if (foo) return -2;
+    return charAt(++byteOffset);
+  }
+
+  static int charAt(index)
+      => (string.length > index) ? string.charCodeAt(index) : -1;
+}
+
+void main() {
+  var scanner = new StringScanner();
+  StringScanner.string = 'az9';
+  Expect.equals(0x61, scanner.nextByte(false)); // Expect a.
+  Expect.equals(0x7A, scanner.nextByte(false)); // Expect z.
+  Expect.equals(0x39, scanner.nextByte(false)); // Expect 9.
+  Expect.equals(-1, scanner.nextByte(false));
+}
\ No newline at end of file
diff --git a/tests/language/try_catch4_test.dart b/tests/language/try_catch4_test.dart
new file mode 100644
index 0000000..16a0457
--- /dev/null
+++ b/tests/language/try_catch4_test.dart
@@ -0,0 +1,195 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Check that our SSA graph does have the try body a predecessor of a
+// try/finally.
+
+var a;
+
+foo1() {
+  var b = false;
+  var entered = false;
+  while (true) {
+    if (entered) return b;
+    b = 8 == a; // This expression should not be GVN'ed.
+    try {
+      a = 8;
+      return;
+    } finally {
+      b = 8 == a;
+      entered = true;
+      continue;
+    }
+  }
+}
+
+doThrow() { throw 2; }
+
+foo2() {
+  var b = false;
+  var entered = false;
+  while (true) {
+    if (entered) return b;
+    b = 8 == a; // This expression should not be GVN'ed.
+    try {
+      a = 8;
+      doThrow();
+      return;
+    } catch(e) {
+      b = 8 == a;
+      entered = true;
+      continue;
+    }
+  }
+}
+
+foo3() {
+  var b = false;
+  var entered = false;
+  while (true) {
+    if (entered) return b;
+    b = 8 == a; // This expression should not be GVN'ed.
+    try {
+      doThrow();
+    } catch(e) {
+      a = 8;
+      entered = true;
+      return;
+    } finally {
+      b = 8 == a;
+      entered = true;
+      continue;
+    }
+  }
+}
+
+foo4() {
+  var b = false;
+  var entered = false;
+  while (true) {
+    if (entered) return b;
+    b = 8 == a; // This expression should not be GVN'ed.
+    try {
+      a = 8;
+      break;
+    } finally {
+      b = 8 == a;
+      entered = true;
+      continue;
+    }
+  }
+}
+
+foo5() {
+  var b = false;
+  var entered = false;
+  while (true) {
+    if (entered) return b;
+    b = 8 == a; // This expression should not be GVN'ed.
+    try {
+      a = 8;
+      doThrow();
+      break;
+    } catch(e) {
+      b = 8 == a;
+      entered = true;
+      continue;
+    }
+  }
+}
+
+foo6() {
+  var b = false;
+  var entered = false;
+  while (true) {
+    if (entered) return b;
+    b = 8 == a; // This expression should not be GVN'ed.
+    try {
+      doThrow();
+    } catch(e) {
+      a = 8;
+      entered = true;
+      break;
+    } finally {
+      b = 8 == a;
+      entered = true;
+      continue;
+    }
+  }
+}
+
+foo7() {
+  var b = false;
+  var entered = false;
+  while (true) {
+    if (entered) return b;
+    b = 8 == a; // This expression should not be GVN'ed.
+    try {
+      a = 8;
+      continue;
+    } finally {
+      b = 8 == a;
+      entered = true;
+      continue;
+    }
+  }
+}
+
+foo8() {
+  var b = false;
+  var entered = false;
+  while (true) {
+    if (entered) return b;
+    b = 8 == a; // This expression should not be GVN'ed.
+    try {
+      a = 8;
+      doThrow();
+      continue;
+    } catch(e) {
+      b = 8 == a;
+      entered = true;
+      continue;
+    }
+  }
+}
+
+foo9() {
+  var b = false;
+  var entered = false;
+  while (true) {
+    if (entered) return b;
+    b = 8 == a; // This expression should not be GVN'ed.
+    try {
+      doThrow();
+    } catch(e) {
+      a = 8;
+      entered = true;
+      continue;
+    } finally {
+      b = 8 == a;
+      entered = true;
+      continue;
+    }
+  }
+}
+
+main() {
+  a = 0;
+  Expect.isTrue(foo1());
+  a = 0;
+  Expect.isTrue(foo2());
+  a = 0;
+  Expect.isTrue(foo3());
+  a = 0;
+  Expect.isTrue(foo4());
+  a = 0;
+  Expect.isTrue(foo5());
+  a = 0;
+  Expect.isTrue(foo6());
+  a = 0;
+  Expect.isTrue(foo7());
+  a = 0;
+  Expect.isTrue(foo8());
+  a = 0;
+  Expect.isTrue(foo9());
+}
diff --git a/tests/language/try_catch5_test.dart b/tests/language/try_catch5_test.dart
new file mode 100644
index 0000000..cf74a47
--- /dev/null
+++ b/tests/language/try_catch5_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Check that our SSA graph does have the try body a predecessor of a
+// try/finally.
+
+var a;
+
+foo1() {
+  var b = false;
+  var entered = false;
+  while (true) {
+    if (entered) return b;
+    b = 8 == a; // This expression should not be GVN'ed.
+    try {
+      try {
+        a = 8;
+        return;
+      } finally {
+        b = 8 == a;
+        entered = true;
+        continue;
+      }
+    } finally {
+      continue;
+    }
+  }
+}
+
+main() {
+  a = 0;
+  Expect.isTrue(foo1());
+}
diff --git a/tests/language/typed_selector2_test.dart b/tests/language/typed_selector2_test.dart
new file mode 100644
index 0000000..618f13a
--- /dev/null
+++ b/tests/language/typed_selector2_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test for dart2js to handle a typed selector with a typedef as a
+// receiver type.
+
+getComparator() => (a, b) => 42;
+
+class A {
+  foo() => 42;
+}
+
+main() {
+  Comparator a = getComparator();
+  if (a(1, 2) != 42) {
+    // This call used to crash dart2js because 'foo' was a typed
+    // selector with a typedef as a receiver type.
+    a.foo();
+  }
+  var b = new A();
+  b.foo();
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 63ffc68..a2732a1 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -20,3 +20,7 @@
 crypto/hmac_sha256_test: Fail, OK
 crypto/sha1_test: Fail, OK
 crypto/sha256_test: Fail, OK
+
+# test issue 6512
+crypto/base64_test: Fail, OK
+crypto/hmac_md5_test: Fail, OK
diff --git a/tests/lib/mirrors/mirrors_test.dart b/tests/lib/mirrors/mirrors_test.dart
index 522e187..14ab436 100644
--- a/tests/lib/mirrors/mirrors_test.dart
+++ b/tests/lib/mirrors/mirrors_test.dart
@@ -5,9 +5,9 @@
 // TODO(rmacnak): Move the existing mirror tests here (a place for 
 // cross-implementation tests).
 
-#library("MirrorsTest.dart");
-#import("dart:mirrors");
-#import("../../../pkg/unittest/unittest.dart");
+library MirrorsTest;
+import "dart:mirrors";
+import "../../../pkg/unittest/lib/unittest.dart";
 
 var topLevelField;
 
@@ -21,7 +21,7 @@
 testFieldAccess(mirrors) {
   var instance = new Class();
 
-  var libMirror = mirrors.libraries["MirrorsTest.dart"];
+  var libMirror = mirrors.libraries["MirrorsTest"];
   var classMirror = libMirror.classes["Class"];
   var instMirror = reflect(instance);
 
@@ -64,7 +64,7 @@
 }
 
 testInvokeConstructor(mirrors) {
-  var libMirror = mirrors.libraries["MirrorsTest.dart"];
+  var libMirror = mirrors.libraries["MirrorsTest"];
   var classMirror = libMirror.classes["Class"];
   
   var future = classMirror.newInstance('', []);
diff --git a/tests/standalone/byte_array_test.dart b/tests/standalone/byte_array_test.dart
index c2a1165..da95209 100644
--- a/tests/standalone/byte_array_test.dart
+++ b/tests/standalone/byte_array_test.dart
@@ -23,7 +23,7 @@
 
 }
 
-void testUnsignedByteArrayRange() {
+void testUnsignedByteArrayRange(bool check_throws) {
   Uint8List byteArray;
   byteArray = new Uint8List(10);
 
@@ -32,16 +32,18 @@
   byteArray[1] = 0;
   Expect.equals(0, byteArray[1]);
 
-  Expect.throws(() {
-    byteArray[1] = 1.2;
-  });
   // These should eventually throw.
   byteArray[1] = 256;
   byteArray[1] = -1;
   byteArray[2] = -129;
+  if (check_throws) {
+    Expect.throws(() {
+      byteArray[1] = 1.2;
+    });
+  }
 }
 
-void testByteArrayRange() {
+void testByteArrayRange(bool check_throws) {
   Int8List byteArray;
   byteArray = new Int8List(10);
   byteArray[1] = 0;
@@ -50,12 +52,14 @@
   Expect.equals(-128, byteArray[2]);
   byteArray[3] = 127;
   Expect.equals(127, byteArray[3]);
-  Expect.throws(() {
-    byteArray[1] = 1.2;
-  });
   // This should eventually throw.
   byteArray[0] = 128;
   byteArray[4] = -129;
+  if (check_throws) {
+    Expect.throws(() {
+      byteArray[1] = 1.2;
+    });
+  }
 }
 
 void testSetRange() {
@@ -158,12 +162,14 @@
 main() {
   for (int i = 0; i < 2000; i++) {
     testCreateByteArray();
-    testByteArrayRange();
-    testUnsignedByteArrayRange();
+    testByteArrayRange(false);
+    testUnsignedByteArrayRange(false);
     testSetRange();
     testIndexOutOfRange();
     testIndexOf();
     testSubArray();
   }
+  testByteArrayRange(true);
+  testUnsignedByteArrayRange(true);
 }
 
diff --git a/tests/standalone/crypto/base64_test.dart b/tests/standalone/crypto/base64_test.dart
index 96de0c2..a4a020d 100644
--- a/tests/standalone/crypto/base64_test.dart
+++ b/tests/standalone/crypto/base64_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#source("../../../lib/io/base64.dart");
+#source("../../../sdk/lib/io/base64.dart");
 
 void main() {
   String line;
diff --git a/tests/standalone/io/dart_std_io_pipe_test.dart b/tests/standalone/io/dart_std_io_pipe_test.dart
index 5264a72..aa9e89d 100644
--- a/tests/standalone/io/dart_std_io_pipe_test.dart
+++ b/tests/standalone/io/dart_std_io_pipe_test.dart
@@ -65,14 +65,14 @@
       }
 
       // Cleanup test directory.
-      dir.deleteRecursivelySync();
+      dir.deleteSync(recursive: true);
     };
     // Drain out and err streams so they close.
     process.stdout.onData = process.stdout.read;
     process.stderr.onData = process.stderr.read;
   });
   future.handleException((ProcessException error) {
-    dir.deleteRecursivelySync();
+    dir.deleteSync(recursive: true);
     Expect.fail(error.toString());
   });
 }
diff --git a/tests/standalone/io/directory_error_test.dart b/tests/standalone/io/directory_error_test.dart
index 96eaf32..cf90f91 100644
--- a/tests/standalone/io/directory_error_test.dart
+++ b/tests/standalone/io/directory_error_test.dart
@@ -137,10 +137,10 @@
 
 void testDeleteRecursivelyNonExistent(Directory temp, Function done) {
   Directory nonExistent = new Directory("${temp.path}/nonExistent");
-  Expect.throws(() => nonExistent.deleteRecursivelySync(),
+  Expect.throws(() => nonExistent.deleteSync(recursive: true),
                 (e) => checkDeleteRecursivelyNonExistentFileException(e));
 
-  nonExistent.deleteRecursively().handleException((e) {
+  nonExistent.delete(recursive: true).handleException((e) {
     checkDeleteRecursivelyNonExistentFileException(e);
     done();
     return true;
@@ -222,7 +222,7 @@
   renameDone.then((ignore) => Expect.fail('rename dir overwrite file'));
   renameDone.handleException((e) {
     Expect.isTrue(e is DirectoryIOException);
-    temp1.deleteRecursivelySync();
+    temp1.deleteSync(recursive: true);
     done();
     return true;
   });
@@ -237,7 +237,7 @@
   ReceivePort p = new ReceivePort();
   p.receive((x,y) {
     p.close();
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
 
   // Run the test.
diff --git a/tests/standalone/io/directory_fuzz_test.dart b/tests/standalone/io/directory_fuzz_test.dart
index 3aa46d4..625e994 100644
--- a/tests/standalone/io/directory_fuzz_test.dart
+++ b/tests/standalone/io/directory_fuzz_test.dart
@@ -23,7 +23,7 @@
       doItSync(() {
         // Let's be a little careful. If the directory exists we don't
         // want to delete it and all its contents.
-        if (!d.existsSync()) d.deleteRecursivelySync();
+        if (!d.existsSync()) d.deleteSync(recursive: true);
       });
       typeMapping.forEach((k2, v2) {
         doItSync(() => d.renameSync(v2));
@@ -48,7 +48,7 @@
     }));
     futures.add(doItAsync(() {
       return d.exists().chain((res) {
-        if (!res) return d.deleteRecursively();
+        if (!res) return d.delete(recursive: true);
         return new Future.immediate(true);
       });
     }));
diff --git a/tests/standalone/io/directory_test.dart b/tests/standalone/io/directory_test.dart
index 7f29525..f3bd2bd 100644
--- a/tests/standalone/io/directory_test.dart
+++ b/tests/standalone/io/directory_test.dart
@@ -40,7 +40,7 @@
       Expect.isTrue(completed, "directory listing did not complete");
       Expect.isTrue(listedDir, "directory not found");
       Expect.isTrue(listedFile, "file not found");
-      directory.deleteRecursively().then((ignore) {
+      directory.delete(recursive: true).then((ignore) {
         f.exists().then((exists) => Expect.isFalse(exists));
         directory.exists().then((exists) => Expect.isFalse(exists));
         subDirectory.exists().then((exists) => Expect.isFalse(exists));
@@ -84,7 +84,7 @@
         lister.onError = (e) {
           Expect.isTrue(e is DirectoryIOException);
           if (++errors == 2) {
-            d.deleteRecursively();
+            d.delete(recursive: true);
           }
         };
         lister.onFile = (file) {
@@ -129,7 +129,7 @@
     new Directory("").createTemp().then((d) {
       d.delete().then((ignore) {
         setupFutureHandlers(d.delete());
-        setupFutureHandlers(d.deleteRecursively());
+        setupFutureHandlers(d.delete(recursive: true));
       });
     });
   }
@@ -152,12 +152,12 @@
           onError(e) {
             Expect.isTrue(e is DirectoryIOException);
             if (++errors == 2) {
-              d.deleteRecursively().then((ignore) => port.close());
+              d.delete(recursive: true).then((ignore) => port.close());
             }
             return true;
           }
           long.delete().handleException(onError);
-          long.deleteRecursively().handleException(onError);
+          long.delete(recursive: true).handleException(onError);
         });
     });
   }
@@ -166,7 +166,7 @@
     Directory d = new Directory("").createTempSync();
     d.deleteSync();
     Expect.throws(d.deleteSync);
-    Expect.throws(() => d.deleteRecursivelySync());
+    Expect.throws(() => d.deleteSync(recursive: true));
   }
 
   static void testDeleteTooLongNameSync() {
@@ -183,8 +183,8 @@
     }
     var long = new Directory("${buffer.toString()}");
     Expect.throws(long.deleteSync);
-    Expect.throws(() => long.deleteRecursivelySync());
-    d.deleteRecursivelySync();
+    Expect.throws(() => long.deleteSync(recursive: true));
+    d.deleteSync(recursive: true);
   }
 
   static void testDeleteSymlink() {
@@ -216,13 +216,13 @@
 
     Process.run(cmd, args).then((_) {
       // Delete the directory containing the junction.
-      b.deleteRecursivelySync();
+      b.deleteSync(recursive: true);
 
       // We should not have recursed through a_link into a.
       Expect.isTrue(f.existsSync());
 
       // Clean up after ourselves.
-      d.deleteRecursivelySync();
+      d.deleteSync(recursive: true);
     });
   }
 
@@ -470,7 +470,7 @@
   Expect.isTrue(subDir.existsSync());
   subDir.createSync();
   Expect.isTrue(subDir.existsSync());
-  temp.deleteRecursivelySync();
+  temp.deleteSync(recursive: true);
 }
 
 
@@ -488,7 +488,7 @@
           subDir.create().then((_) {
             subDir.exists().then((dirExists) {
               Expect.isTrue(dirExists);
-              temp.deleteRecursively().then((_) {
+              temp.delete(recursive: true).then((_) {
                 port.close();
               });
             });
@@ -510,7 +510,7 @@
   Expect.isTrue(file.existsSync());
   Expect.throws(new Directory(path).createSync,
                 (e) => e is DirectoryIOException);
-  temp.deleteRecursivelySync();
+  temp.deleteSync(recursive: true);
 }
 
 
@@ -527,7 +527,7 @@
         ..then((_) { Expect.fail("dir create should fail on existing file"); })
         ..handleException((e) {
             Expect.isTrue(e is DirectoryIOException);
-            temp.deleteRecursively().then((_) {
+            temp.delete(recursive: true).then((_) {
               port.close();
             });
             return true;
@@ -537,6 +537,32 @@
 }
 
 
+testCreateRecursiveSync() {
+  var temp = new Directory('').createTempSync();
+  var d = new Directory('${temp.path}/a/b/c');
+  d.createSync(recursive: true);
+  Expect.isTrue(new Directory('${temp.path}/a').existsSync());
+  Expect.isTrue(new Directory('${temp.path}/a/b').existsSync());
+  Expect.isTrue(new Directory('${temp.path}/a/b/c').existsSync());
+  temp.deleteSync(recursive: true);
+}
+
+
+testCreateRecursive() {
+  var port = new ReceivePort();
+  new Directory('').createTemp().then((temp) {
+    var d = new Directory('${temp.path}/a/b/c');
+    d.create(recursive: true).then((_) {
+      Expect.isTrue(new Directory('${temp.path}/a').existsSync());
+      Expect.isTrue(new Directory('${temp.path}/a/b').existsSync());
+      Expect.isTrue(new Directory('${temp.path}/a/b/c').existsSync());
+      temp.deleteSync(recursive: true);
+      port.close();
+    });
+  });
+}
+
+
 testRename() {
   var d = new Directory('');
   var temp1 = d.createTempSync();
@@ -552,7 +578,7 @@
     Expect.isTrue(temp1.existsSync());
     Expect.isTrue(temp4.existsSync());
     Expect.equals(temp1.path, temp4.path);
-    temp1.deleteRecursivelySync();
+    temp1.deleteSync(recursive: true);
   });
 }
 
@@ -565,5 +591,7 @@
   testCreateExisting();
   testCreateDirExistingFileSync();
   testCreateDirExistingFile();
+  testCreateRecursive();
+  testCreateRecursiveSync();
   testRename();
 }
diff --git a/tests/standalone/io/file_error_test.dart b/tests/standalone/io/file_error_test.dart
index 094064c..4a6a309 100644
--- a/tests/standalone/io/file_error_test.dart
+++ b/tests/standalone/io/file_error_test.dart
@@ -52,7 +52,7 @@
   ReceivePort p = new ReceivePort();
   p.receive((x, y) {
     p.close();
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
   var file = new File("${temp.path}/nonExistentFile");
 
@@ -75,7 +75,7 @@
   ReceivePort p = new ReceivePort();
   p.receive((x, y) {
     p.close();
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
   var file = new File("${temp.path}/nonExistentFile");
 
@@ -98,7 +98,7 @@
   ReceivePort p = new ReceivePort();
   p.receive((x, y) {
     p.close();
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
   var file = new File("${temp.path}/nonExistentFile");
 
@@ -141,7 +141,7 @@
   ReceivePort p = new ReceivePort();
   p.receive((x, y) {
     p.close();
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
   var file = new File("${temp.path}/nonExistentDirectory/newFile");
 
@@ -182,7 +182,7 @@
   ReceivePort p = new ReceivePort();
   p.receive((x, y) {
     p.close();
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
   var file = new File("${temp.path}/nonExistentDirectory");
 
@@ -224,7 +224,7 @@
   ReceivePort p = new ReceivePort();
   p.receive((x, y) {
     p.close();
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
   var file = new File("${temp.path}/nonExistentDirectory/newFile");
 
@@ -246,7 +246,7 @@
   ReceivePort p = new ReceivePort();
   p.receive((x, y) {
     p.close();
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
   var file = new File("${temp.path}/nonExistentFile3");
 
@@ -268,7 +268,7 @@
   ReceivePort p = new ReceivePort();
   p.receive((x, y) {
     p.close();
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
   var file = new File("${temp.path}/nonExistentFile4");
 
@@ -290,7 +290,7 @@
   ReceivePort p = new ReceivePort();
   p.receive((x, y) {
     p.close();
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
   var file = new File("${temp.path}/nonExistentFile5");
 
@@ -323,7 +323,7 @@
   ReceivePort p = new ReceivePort();
   p.receive((x, y) {
     p.close();
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
 
   var file = new File("${temp.path}/test_file");
diff --git a/tests/standalone/io/file_fuzz_test.dart b/tests/standalone/io/file_fuzz_test.dart
index a7918fa..faed2ef 100644
--- a/tests/standalone/io/file_fuzz_test.dart
+++ b/tests/standalone/io/file_fuzz_test.dart
@@ -84,7 +84,7 @@
     }
     opened.closeSync();
   }
-  temp.deleteRecursivelySync();
+  temp.deleteSync(recursive: true);
 }
 
 fuzzAsyncRandomAccessMethods() {
@@ -115,7 +115,7 @@
     for (var opened in openedFiles) {
       opened.closeSync();
     }
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
 }
 
diff --git a/tests/standalone/io/file_output_stream_test.dart b/tests/standalone/io/file_output_stream_test.dart
index 75e2732..412ea5c 100644
--- a/tests/standalone/io/file_output_stream_test.dart
+++ b/tests/standalone/io/file_output_stream_test.dart
@@ -38,7 +38,7 @@
   // Create a port for waiting on the final result of this test.
   ReceivePort done = new ReceivePort();
   done.receive((message, replyTo) {
-    tempDirectory.deleteRecursively().then((ignore) => done.close());
+    tempDirectory.delete(recursive: true).then((ignore) => done.close());
   });
 
   new Directory('').createTemp().then((temp) {
diff --git a/tests/standalone/io/file_system_links_test.dart b/tests/standalone/io/file_system_links_test.dart
index e0f90e0..63c6a4d 100644
--- a/tests/standalone/io/file_system_links_test.dart
+++ b/tests/standalone/io/file_system_links_test.dart
@@ -31,7 +31,7 @@
     new File(y).createSync();
     Expect.isTrue(new File(x).existsSync());
     Expect.isTrue(new File(y).existsSync());
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
 }
 
@@ -53,7 +53,7 @@
       new File(y).deleteSync();
       Expect.isTrue(new File(x).existsSync());
       Expect.isFalse(new File(y).existsSync());
-      temp.deleteRecursivelySync();
+      temp.deleteSync(recursive: true);
     });
   });
 }
@@ -74,7 +74,7 @@
       Expect.listEquals(data, read);
       var read2 = new File(x).readAsBytesSync();
       Expect.listEquals(data, read2);
-      temp.deleteRecursivelySync();
+      temp.deleteSync(recursive: true);
     };
   });
 }
@@ -88,7 +88,7 @@
     Expect.isFalse(new Directory(x).existsSync());
     Expect.isFalse(new Directory(y).existsSync());
     Expect.throws(new Directory(y).createSync);
-    temp.deleteRecursivelySync();
+    temp.deleteSync(recursive: true);
   });
 }
 
@@ -108,11 +108,11 @@
     Expect.isTrue(temp2.existsSync());
     createLink(temp2.path, y, true, () {
       Expect.isTrue(link.existsSync());
-      temp.deleteRecursivelySync();
+      temp.deleteSync(recursive: true);
       Expect.isFalse(link.existsSync());
       Expect.isTrue(temp2.existsSync());
       Expect.isTrue(new File(x).existsSync());
-      temp2.deleteRecursivelySync();
+      temp2.deleteSync(recursive: true);
     });
   });
 }
@@ -136,8 +136,8 @@
       Expect.isTrue(files[0].endsWith(x));
       Expect.equals(1, dirs.length);
       Expect.isTrue(dirs[0].endsWith(y));
-      temp.deleteRecursivelySync();
-      temp2.deleteRecursivelySync();
+      temp.deleteSync(recursive: true);
+      temp2.deleteSync(recursive: true);
     };
   });
 }
@@ -164,7 +164,7 @@
       Expect.equals(0, dirs.length);
       Expect.equals(1, errors.length);
       Expect.isTrue(errors[0].toString().contains(link));
-      temp.deleteRecursivelySync();
+      temp.deleteSync(recursive: true);
     };
   });
 }
diff --git a/tests/standalone/io/file_test.dart b/tests/standalone/io/file_test.dart
index 02ee65f..2f210f4 100644
--- a/tests/standalone/io/file_test.dart
+++ b/tests/standalone/io/file_test.dart
@@ -36,7 +36,7 @@
   }
 
   static void deleteTempDirectory() {
-    tempDirectory.deleteRecursivelySync();
+    tempDirectory.deleteSync(recursive: true);
   }
 
   // Test for file read functionality.
diff --git a/tests/standalone/io/http_advanced_test.dart b/tests/standalone/io/http_advanced_test.dart
index a37d025..bca0def 100644
--- a/tests/standalone/io/http_advanced_test.dart
+++ b/tests/standalone/io/http_advanced_test.dart
@@ -255,7 +255,8 @@
   bool _chunkedEncoding = false;
 }
 
-void testHost() {
+Future testHost() {
+  Completer completer = new Completer();
   TestServerMain testServerMain = new TestServerMain();
   testServerMain.setServerStartedHandler((int port) {
     HttpClient httpClient = new HttpClient();
@@ -288,12 +289,15 @@
       Expect.equals(HttpStatus.OK, response.statusCode);
       httpClient.shutdown();
       testServerMain.shutdown();
+      completer.complete(true);
     };
   });
   testServerMain.start();
+  return completer.future;
 }
 
-void testExpires() {
+Future testExpires() {
+  Completer completer = new Completer();
   TestServerMain testServerMain = new TestServerMain();
   testServerMain.setServerStartedHandler((int port) {
     int responses = 0;
@@ -309,6 +313,7 @@
       if (responses == 2) {
         httpClient.shutdown();
         testServerMain.shutdown();
+        completer.complete(true);
       }
     }
 
@@ -322,9 +327,11 @@
     };
   });
   testServerMain.start();
+  return completer.future;
 }
 
-void testContentType() {
+Future testContentType() {
+  Completer completer = new Completer();
   TestServerMain testServerMain = new TestServerMain();
   testServerMain.setServerStartedHandler((int port) {
     int responses = 0;
@@ -343,6 +350,7 @@
       if (responses == 2) {
         httpClient.shutdown();
         testServerMain.shutdown();
+        completer.complete(true);
       }
     }
 
@@ -370,9 +378,11 @@
     };
   });
   testServerMain.start();
+  return completer.future;
 }
 
-void testCookies() {
+Future testCookies() {
+  Completer completer = new Completer();
   TestServerMain testServerMain = new TestServerMain();
   testServerMain.setServerStartedHandler((int port) {
     int responses = 0;
@@ -408,13 +418,16 @@
       conn2.onResponse = (HttpClientResponse ignored) {
         httpClient.shutdown();
         testServerMain.shutdown();
+        completer.complete(true);
       };
     };
   });
   testServerMain.start();
+  return completer.future;
 }
 
-void testFlush() {
+Future testFlush() {
+  Completer completer = new Completer();
   TestServerMain testServerMain = new TestServerMain();
   testServerMain.setServerStartedHandler((int port) {
     HttpClient httpClient = new HttpClient();
@@ -428,15 +441,28 @@
       Expect.equals(HttpStatus.OK, response.statusCode);
       httpClient.shutdown();
       testServerMain.shutdown();
+      completer.complete(true);
     };
   });
   testServerMain.start();
+  return completer.future;
 }
 
 void main() {
-  testHost();
-  testExpires();
-  testContentType();
-  testCookies();
-  testFlush();
+  print('testHost()');
+  testHost().chain((_) {
+  print('testExpires()');
+    return testExpires().chain((_) {
+      print('testContentType()');
+      return testContentType().chain((_) {
+        print('testCookies()');
+        return testCookies().chain((_) {
+          print('testFlush()');
+          return testFlush();
+        });
+      });
+    });
+  }).then((_) {
+    print('done');
+  });
 }
diff --git a/tests/standalone/io/http_date_test.dart b/tests/standalone/io/http_date_test.dart
index 81ed109..1f4c685 100644
--- a/tests/standalone/io/http_date_test.dart
+++ b/tests/standalone/io/http_date_test.dart
@@ -2,17 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import("dart:math");
+import "dart:math";
 
-#source("../../../lib/io/input_stream.dart");
-#source("../../../lib/io/output_stream.dart");
-#source("../../../lib/io/chunked_stream.dart");
-#source("../../../lib/io/string_stream.dart");
-#source("../../../lib/io/stream_util.dart");
-#source("../../../lib/io/http.dart");
-#source("../../../lib/io/http_impl.dart");
-#source("../../../lib/io/http_parser.dart");
-#source("../../../lib/io/http_utils.dart");
+part "../../../sdk/lib/io/input_stream.dart";
+part "../../../sdk/lib/io/output_stream.dart";
+part "../../../sdk/lib/io/chunked_stream.dart";
+part "../../../sdk/lib/io/string_stream.dart";
+part "../../../sdk/lib/io/stream_util.dart";
+part "../../../sdk/lib/io/http.dart";
+part "../../../sdk/lib/io/http_impl.dart";
+part "../../../sdk/lib/io/http_parser.dart";
+part "../../../sdk/lib/io/http_utils.dart";
 
 void testParseHttpDate() {
   Date date;
diff --git a/tests/standalone/io/http_headers_test.dart b/tests/standalone/io/http_headers_test.dart
index feb579a..6e81fee 100644
--- a/tests/standalone/io/http_headers_test.dart
+++ b/tests/standalone/io/http_headers_test.dart
@@ -2,17 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import('dart:math');
+import 'dart:math';
 
-#source("../../../lib/io/input_stream.dart");
-#source("../../../lib/io/output_stream.dart");
-#source("../../../lib/io/chunked_stream.dart");
-#source("../../../lib/io/string_stream.dart");
-#source("../../../lib/io/stream_util.dart");
-#source("../../../lib/io/http.dart");
-#source("../../../lib/io/http_impl.dart");
-#source("../../../lib/io/http_parser.dart");
-#source("../../../lib/io/http_utils.dart");
+part "../../../sdk/lib/io/input_stream.dart";
+part "../../../sdk/lib/io/output_stream.dart";
+part "../../../sdk/lib/io/chunked_stream.dart";
+part "../../../sdk/lib/io/string_stream.dart";
+part "../../../sdk/lib/io/stream_util.dart";
+part "../../../sdk/lib/io/http.dart";
+part "../../../sdk/lib/io/http_impl.dart";
+part "../../../sdk/lib/io/http_parser.dart";
+part "../../../sdk/lib/io/http_utils.dart";
 
 void testMultiValue() {
   _HttpHeaders headers = new _HttpHeaders();
diff --git a/tests/standalone/io/http_parser_test.dart b/tests/standalone/io/http_parser_test.dart
index 1c6538d..1145ec7 100644
--- a/tests/standalone/io/http_parser_test.dart
+++ b/tests/standalone/io/http_parser_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import('dart:math');
-#import('dart:scalarlist');
+import 'dart:math';
+import 'dart:scalarlist';
 
-#source("../../../lib/io/http_parser.dart");
+part '../../../sdk/lib/io/http_parser.dart';
 
 class HttpParserTest {
   static void runAllTests() {
@@ -86,8 +86,8 @@
         int remaining = requestData.length - pos;
         int writeLength = min(chunkSize, remaining);
         written += writeLength;
-        int parsed = httpParser.writeList(requestData, pos, writeLength);
-        unparsed = writeLength - parsed;
+        httpParser.writeList(requestData, pos, writeLength);
+        unparsed = httpParser.readUnparsedData().length;
         if (httpParser.upgrade) {
           unparsed += requestData.length - written;
           break;
@@ -133,7 +133,9 @@
     void testWrite(List<int> requestData, [int chunkSize = -1]) {
       if (chunkSize == -1) chunkSize = requestData.length;
       reset();
-      for (int pos = 0; pos < requestData.length; pos += chunkSize) {
+      for (int pos = 0;
+           pos < requestData.length && !errorCalled;
+           pos += chunkSize) {
         int remaining = requestData.length - pos;
         int writeLength = min(chunkSize, remaining);
         httpParser.writeList(requestData, pos, writeLength);
@@ -230,8 +232,8 @@
         int remaining = requestData.length - pos;
         int writeLength = min(chunkSize, remaining);
         written += writeLength;
-        int parsed = httpParser.writeList(requestData, pos, writeLength);
-        unparsed = writeLength - parsed;
+        httpParser.writeList(requestData, pos, writeLength);
+        unparsed = httpParser.readUnparsedData().length;
         if (httpParser.upgrade) {
           unparsed += requestData.length - written;
           break;
@@ -280,7 +282,9 @@
     void testWrite(List<int> requestData, [int chunkSize = -1]) {
       if (chunkSize == -1) chunkSize = requestData.length;
       reset();
-      for (int pos = 0; pos < requestData.length; pos += chunkSize) {
+      for (int pos = 0;
+           pos < requestData.length && !errorCalled;
+           pos += chunkSize) {
         int remaining = requestData.length - pos;
         int writeLength = min(chunkSize, remaining);
         httpParser.writeList(requestData, pos, writeLength);
diff --git a/tests/standalone/io/http_server_handler_test.dart b/tests/standalone/io/http_server_handler_test.dart
index 52aed5c..e44a6cf 100644
--- a/tests/standalone/io/http_server_handler_test.dart
+++ b/tests/standalone/io/http_server_handler_test.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 //
 
-#import("dart:io");
-#import("dart:isolate");
+import 'dart:io';
+import 'dart:isolate';
 
 class Handler1 {
   void onRequest(HttpRequest request, HttpResponse response) {
diff --git a/tests/standalone/io/http_session_test.dart b/tests/standalone/io/http_session_test.dart
index dd2e059..2b7f81c 100644
--- a/tests/standalone/io/http_session_test.dart
+++ b/tests/standalone/io/http_session_test.dart
@@ -10,6 +10,7 @@
   var id = cookies.reduce(null, (last, cookie) {
     if (last != null) return last;
     if (cookie.name.toUpperCase() == SESSION_ID) {
+      Expect.isTrue(cookie.httpOnly);
       return cookie.value;
     }
     return null;
diff --git a/tests/standalone/io/mime_multipart_parser_test.dart b/tests/standalone/io/mime_multipart_parser_test.dart
index b46e5d1..122e075 100644
--- a/tests/standalone/io/mime_multipart_parser_test.dart
+++ b/tests/standalone/io/mime_multipart_parser_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import('dart:math');
+import 'dart:math';
 
-#source("../../../lib/io/http_parser.dart");
-#source("../../../lib/io/mime_multipart_parser.dart");
+part "../../../sdk/lib/io/http_parser.dart";
+part "../../../sdk/lib/io/mime_multipart_parser.dart";
 
 void testParse(String message,
                String boundary,
diff --git a/tests/standalone/io/regress-6521.dart b/tests/standalone/io/regress-6521.dart
new file mode 100644
index 0000000..a02025d
--- /dev/null
+++ b/tests/standalone/io/regress-6521.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Regression test for http://code.google.com/p/dart/issues/detail?id=6393.
+
+import "dart:io";
+import "dart:uri";
+
+var client = new HttpClient();
+var clientRequest;
+
+void main() {
+  var server = new HttpServer();
+  server.listen("127.0.0.1", 0);
+  server.defaultRequestHandler = (req, rsp) {
+    req.inputStream.onData = () {
+      req.inputStream.read();
+      rsp.outputStream.close();
+    };
+    req.inputStream.onClosed = () {
+      client.shutdown();
+      server.close();
+    };
+  };
+
+  var connection = client.openUrl(
+      "POST",
+      new Uri.fromString("http://localhost:${server.port}/"));
+  connection.onRequest = (request) {
+    // Keep a reference to the client request object.
+    clientRequest = request;
+    request.outputStream.write([0]);
+  };
+  connection.onResponse = (response) {
+    response.inputStream.onClosed = () {
+      // Wait with closing the client request until the response is done.
+      clientRequest.outputStream.close();
+    };
+  };
+}
diff --git a/tests/standalone/io/string_stream_test.dart b/tests/standalone/io/string_stream_test.dart
index e9bb7af..f335291 100644
--- a/tests/standalone/io/string_stream_test.dart
+++ b/tests/standalone/io/string_stream_test.dart
@@ -11,20 +11,26 @@
                     0xc2, 0x80,
                     0xdf, 0xbf,
                     0xe0, 0xa0, 0x80,
-                    0xef, 0xbf, 0xbf];
+                    0xef, 0xbf, 0xbf,
+                    0xf0, 0x9d, 0x84, 0x9e];
   ListInputStream s = new ListInputStream();
   s.write(data);
   s.markEndOfStream();
   StringInputStream stream = new StringInputStream(s);
   void stringData() {
     String s = stream.read();
-    Expect.equals(6, s.length);
+    Expect.equals(8, s.length);
     Expect.equals(new String.fromCharCodes([0x01]), s[0]);
     Expect.equals(new String.fromCharCodes([0x7f]), s[1]);
     Expect.equals(new String.fromCharCodes([0x80]), s[2]);
     Expect.equals(new String.fromCharCodes([0x7ff]), s[3]);
     Expect.equals(new String.fromCharCodes([0x800]), s[4]);
     Expect.equals(new String.fromCharCodes([0xffff]), s[5]);
+    Expect.equals(new String.fromCharCodes([0xffff]), s[5]);
+
+    // Surrogate pair for U+1D11E.
+    Expect.equals(new String.fromCharCodes([0xd834]), s[6]);
+    Expect.equals(new String.fromCharCodes([0xdd1e]), s[7]);
   }
   stream.onData = stringData;
 }
@@ -300,7 +306,7 @@
 }
 
 testEncodingErrorWithHandler() {
-  var port = new ReceivePort();    
+  var port = new ReceivePort();
   var errors = 0;
   var expected = [206, 187, 120, 46, 32, 120, 10];
   ListInputStream input = new ListInputStream();
diff --git a/tests/standalone/io/url_encoding_test.dart b/tests/standalone/io/url_encoding_test.dart
index 7148c77..f491d5c 100644
--- a/tests/standalone/io/url_encoding_test.dart
+++ b/tests/standalone/io/url_encoding_test.dart
@@ -2,16 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import("dart:utf");
-#source("../../../lib/io/input_stream.dart");
-#source("../../../lib/io/output_stream.dart");
-#source("../../../lib/io/chunked_stream.dart");
-#source("../../../lib/io/string_stream.dart");
-#source("../../../lib/io/stream_util.dart");
-#source("../../../lib/io/http.dart");
-#source("../../../lib/io/http_impl.dart");
-#source("../../../lib/io/http_parser.dart");
-#source("../../../lib/io/http_utils.dart");
+import "dart:utf";
+part "../../../sdk/lib/io/input_stream.dart";
+part "../../../sdk/lib/io/output_stream.dart";
+part "../../../sdk/lib/io/chunked_stream.dart";
+part "../../../sdk/lib/io/string_stream.dart";
+part "../../../sdk/lib/io/stream_util.dart";
+part "../../../sdk/lib/io/http.dart";
+part "../../../sdk/lib/io/http_impl.dart";
+part "../../../sdk/lib/io/http_parser.dart";
+part "../../../sdk/lib/io/http_utils.dart";
 
 void testParseEncodedString() {
   String encodedString = 'foo+bar%20foobar%25%26';
diff --git a/tests/standalone/io/web_socket_protocol_processor_test.dart b/tests/standalone/io/web_socket_protocol_processor_test.dart
index 568a705..46356c0 100644
--- a/tests/standalone/io/web_socket_protocol_processor_test.dart
+++ b/tests/standalone/io/web_socket_protocol_processor_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import("dart:math");
+import "dart:math";
 
-#source("../../../lib/io/websocket.dart");
-#source("../../../lib/io/websocket_impl.dart");
+part "../../../sdk/lib/io/websocket.dart";
+part "../../../sdk/lib/io/websocket_impl.dart";
 
 class WebSocketFrame {
   WebSocketFrame(int opcode, List<int> data);
diff --git a/tests/standalone/package/package_isolate_test.dart b/tests/standalone/package/package_isolate_test.dart
index a94a268..96e304f 100644
--- a/tests/standalone/package/package_isolate_test.dart
+++ b/tests/standalone/package/package_isolate_test.dart
@@ -3,10 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library package_isolate_test;
-
 import 'package:shared.dart' as shared;
 import 'dart:isolate';
-import '../../../pkg/unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 
 expectResponse() {
   port.receive(expectAsync2((msg, r) {
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 265fae8..7008256 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -2,6 +2,8 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+io/http_basic_test: Pass, Timeout  # Issue 6393
+
 out_of_memory_test: Skip # Issue 2345
 
 package/invalid_uri_test: Fail, OK # Fails intentionally
@@ -25,7 +27,6 @@
 # This is expected as MacOS by default runs with a very low number
 # of allowed open files ('ulimit -n' says something like 256).
 io/socket_many_connections_test: Skip
-io/http_proxy_test: Fail, Pass # http://dartbug.com/5717
 
 [ $runtime == vm && $system == windows ]
 io/file_system_links_test: Skip  # No links on Windows.
diff --git a/tests/utils/dummy_compiler_test.dart b/tests/utils/dummy_compiler_test.dart
index 7389be8..d0a7797 100644
--- a/tests/utils/dummy_compiler_test.dart
+++ b/tests/utils/dummy_compiler_test.dart
@@ -4,8 +4,8 @@
 
 // Smoke test of the dart2js compiler API.
 
-#import('../../lib/compiler/compiler.dart');
-#import('dart:uri');
+import '../../sdk/lib/_internal/compiler/compiler.dart';
+import 'dart:uri';
 
 Future<String> provider(Uri uri) {
   Completer<String> completer = new Completer<String>();
@@ -15,7 +15,8 @@
   } else if (uri.scheme == "lib") {
     if (uri.path.endsWith("/core.dart")) {
       source = """#library('core');
-                  class Object{}
+                  class Object {}
+                  class Type {}
                   class bool {}
                   class num {}
                   class int {}
@@ -55,8 +56,8 @@
 
 main() {
   String code = compile(new Uri.fromComponents(scheme: 'main'),
-                        new Uri.fromComponents(scheme: 'lib'),
-                        new Uri.fromComponents(scheme: 'package'),
+                        new Uri.fromComponents(scheme: 'lib', path: '/'),
+                        new Uri.fromComponents(scheme: 'package', path: '/'),
                         provider, handler).value;
   if (code === null) {
     throw 'Compilation failed';
diff --git a/tests/utils/recursive_import_test.dart b/tests/utils/recursive_import_test.dart
index fdf5fb4..0ad898c 100644
--- a/tests/utils/recursive_import_test.dart
+++ b/tests/utils/recursive_import_test.dart
@@ -4,8 +4,8 @@
 
 // Test of "recursive" imports using the dart2js compiler API.
 
-#import('../../lib/compiler/compiler.dart');
-#import('dart:uri');
+import '../../sdk/lib/_internal/compiler/compiler.dart';
+import 'dart:uri';
 
 const CORE_LIB = """
 library core;
@@ -20,6 +20,7 @@
 class Map {}
 class Closure {}
 class Dynamic_ {}
+class Type {}
 class Null {}
 getRuntimeTypeInfo(o) {}
 setRuntimeTypeInfo(o, i) {}
@@ -78,8 +79,8 @@
   }
 
   String code = compile(new Uri.fromComponents(scheme: 'main'),
-                        new Uri.fromComponents(scheme: 'lib'),
-                        new Uri.fromComponents(scheme: 'package'),
+                        new Uri.fromComponents(scheme: 'lib', path: '/'),
+                        new Uri.fromComponents(scheme: 'package', path: '/'),
                         provider, handler).value;
   Expect.isNull(code);
   Expect.isTrue(10 < count);
diff --git a/tests/utils/uri_test.dart b/tests/utils/uri_test.dart
index 38d79c8..7acc5cf 100644
--- a/tests/utils/uri_test.dart
+++ b/tests/utils/uri_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('uriTest');
+library uriTest;
 
-#import('../../lib/utf/utf.dart');
-#import('../../lib/uri/uri.dart');
+import 'dart:utf';
+import 'dart:uri';
 
 testUri(String uri, bool isAbsolute) {
   Expect.equals(isAbsolute, new Uri.fromString(uri).isAbsolute());
diff --git a/tests/utils/utf_test.dart b/tests/utils/utf_test.dart
new file mode 100644
index 0000000..6441789
--- /dev/null
+++ b/tests/utils/utf_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utf_test;
+import 'dart:utf';
+
+main() {
+  String str = codepointsToString([0x1d537]);
+  // String.charCodes gives 16-bit code units, but stringToCodepoints gives
+  // back the original code points.
+  Expect.listEquals([0xd835, 0xdd37], str.charCodes);
+  Expect.listEquals([0x1d537], stringToCodepoints(str));
+}
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index d06160b..e5bbdb6 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -17,9 +17,6 @@
 [ $compiler == dart2js && $browser ]
 *: Skip
 
-[ $runtime == dartium || $runtime == drt ]
-utf8_test: Fail # TRIAGE
-
 [ $runtime == vm ]
 *_layout_test: Skip
 
@@ -27,6 +24,16 @@
 *_layout_test: Skip
 
 [ $compiler == dartc ]
+# dart2js issue 6323
+dummy_compiler_test: Fail, OK
+recursive_import_test: Fail, OK
+txt_layout_test: Fail, OK
+png_layout_test: Fail, OK
+
+# test issue 6512
+json_test: Fail, OK
+utf8_test: Fail, OK
+
 
 [ $compiler == dart2dart ]
 # Skip until we stabilize language tests.
diff --git a/tools/VERSION b/tools/VERSION
index 91a307d..1858bc2 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 2
-BUILD 2
-PATCH 1
+BUILD 3
+PATCH 0
diff --git a/tools/bots/pub.py b/tools/bots/pub.py
index 9d40778..e101783 100755
--- a/tools/bots/pub.py
+++ b/tools/bots/pub.py
@@ -41,8 +41,7 @@
     print 'Generating API Docs: %s' % (' '.join(args))
     bot.RunProcess(args)
 
-  # TODO(rnystrom): Eventually test other targets here like 'utils'?
-  bot.RunTest('pub', build_info, ['pub'])
+  bot.RunTest('pub', build_info, ['pub', 'pkg'])
 
 
 if __name__ == '__main__':
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index 857ba0e..c42f3e8 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -38,8 +38,6 @@
 # ......scalarlist/
 # ....pkg/
 # ......args/
-# ......compiler/
-# ......dartdoc/
 #.......htmlescape/
 # ......intl/
 # ......logging/
@@ -106,7 +104,7 @@
 
 def CopyDart2Js(build_dir, sdk_root, version):
   if version:
-    ReplaceInFiles([os.path.join(sdk_root, 'pkg', 'compiler',
+    ReplaceInFiles([os.path.join(sdk_root, 'lib', '_internal', 'compiler',
                                  'implementation', 'compiler.dart')],
                    [(r"BUILD_ID = 'build number could not be determined'",
                      r"BUILD_ID = '%s'" % version)])
@@ -115,34 +113,18 @@
     Copy(os.path.join(build_dir, 'dart2js.bat'), dart2js)
     dartdoc = os.path.join(sdk_root, 'bin', 'dartdoc.bat')
     Copy(os.path.join(build_dir, 'dartdoc.bat'), dartdoc)
-    # TODO(dgrove) - fix this once issue 4788 is addressed.
-    ReplaceInFiles([dart2js],
-                   [(r'%SCRIPTPATH%\.\.\\\.\.\\lib', r'%SCRIPTPATH%..\\pkg')])
-    ReplaceInFiles([dartdoc],
-                   [(r'%SCRIPTPATH%\.\.\\\.\.\\pkg', r'%SCRIPTPATH%..\\pkg')])
   else:
     dart2js = os.path.join(sdk_root, 'bin', 'dart2js')
     Copy(os.path.join(build_dir, 'dart2js'), dart2js)
     dartdoc = os.path.join(sdk_root, 'bin', 'dartdoc')
     Copy(os.path.join(build_dir, 'dartdoc'), dartdoc)
 
-    # TODO(dgrove) - fix this once issue 4788 is addressed.
-    ReplaceInFiles([dart2js],
-                   [(r'\$BIN_DIR/\.\./\.\./lib', r'$BIN_DIR/../pkg')])
-    ReplaceInFiles([dartdoc],
-                   [(r'\$BIN_DIR/\.\./\.\.', r'$BIN_DIR/..')])
-
     # TODO(ahe): Enable for Windows as well.
     subprocess.call([os.path.join(build_dir, 'gen_snapshot'),
-
-                     # TODO(ahe): Remove option when
-                     # http://dartbug.com/5989 is fixed.
-                     '--optimization_counter_threshold=-1',
-
                      '--script_snapshot=%s' %
-                     os.path.join(sdk_root, 'pkg', 'compiler',
+                     os.path.join(sdk_root, 'lib', '_internal', 'compiler',
                                   'implementation', 'dart2js.dart.snapshot'),
-                     os.path.join(sdk_root, 'pkg', 'compiler',
+                     os.path.join(sdk_root, 'lib', '_internal', 'compiler',
                                   'implementation', 'dart2js.dart')])
 
 
@@ -226,7 +208,7 @@
   for library in ['_internal', 'collection', 'core', 'coreimpl', 'crypto', 'io',
                   'isolate', join('html', 'dart2js'), join('html', 'dartium'),
                   'json', 'math', 'mirrors', 'scalarlist', 'uri', 'utf']:
-    copytree(join(HOME, 'lib', library), join(LIB, library),
+    copytree(join(HOME, 'sdk', 'lib', library), join(LIB, library),
              ignore=ignore_patterns('*.svn', 'doc', '*.py', '*.gypi', '*.sh'))
 
 
@@ -238,34 +220,12 @@
   # Create and populate pkg/{args, intl, logging, meta, unittest}
   #
 
-  for library in ['args', 'htmlescape', 'dartdoc', 'intl', 'logging',
+  for library in ['args', 'htmlescape', 'intl', 'logging',
                   'meta', 'unittest']:
     copytree(join(HOME, 'pkg', library), join(PKG, library),
              ignore=ignore_patterns('*.svn', 'doc', 'docs',
                                     '*.py', '*.gypi', '*.sh'))
 
-  # TODO(dgrove): Remove this once issue 4788 is addressed.
-  copytree(join(HOME, 'lib', 'compiler'), join(PKG, 'compiler'),
-             ignore=ignore_patterns('*.svn', 'doc', '*.py', '*.gypi', '*.sh'))
-
-  ReplaceInFiles(
-        [join(LIB, '_internal', 'libraries.dart')],
-        [('"compiler/', '"../pkg/compiler/')])
-
-  # Fixup dartdoc
-  # TODO(dgrove): Remove this once issue 4788 is addressed.
-  ReplaceInFiles([
-      join(PKG, 'dartdoc', 'lib', 'src', 'mirrors', 'dart2js_mirror.dart'),
-      join(PKG, 'dartdoc', 'lib', 'mirrors_util.dart'),
-      join(PKG, 'dartdoc', 'lib', 'classify.dart'),
-      join(PKG, 'dartdoc', 'lib', 'src', 'client', 'client-live-nav.dart'),
-      join(PKG, 'dartdoc', 'lib', 'src', 'client', 'client-static.dart'),
-      join(PKG, 'dartdoc', 'lib', 'dartdoc.dart'),
-    ], [
-      ("../../lib/compiler",
-       "../../pkg/compiler"),
-    ])
-
   # Create and copy tools.
   UTIL = join(SDK_tmp, 'util')
   os.makedirs(UTIL)
@@ -312,6 +272,25 @@
   # Copy dart2js.
   CopyDart2Js(build_dir, SDK_tmp, version)
 
+  # TODO(dgrove) remove this once we get sdk/bin created
+  if (utils.GuessOS() == 'win32'):
+    ReplaceInFiles([join(SDK_tmp, 'bin', 'dart2js.bat'),
+                    join(SDK_tmp, 'bin', 'dartdoc.bat'),
+                    join(SDK_tmp, 'bin', 'pub.bat')],
+                   [(r'..\\..\\sdk\\lib', r'..\lib')])
+  else:
+    ReplaceInFiles([join(SDK_tmp, 'bin', 'dart2js'),
+                    join(SDK_tmp, 'bin', 'dartdoc'),
+                    join(SDK_tmp, 'bin', 'pub')],
+                   [('../../sdk/lib', '../lib')])
+
+  # Fix up dartdoc.
+  # TODO(dgrove): Remove this once sdk and dart-sdk match.
+  ReplaceInFiles([join(SDK_tmp, 'lib', '_internal', 'dartdoc',
+                       'bin', 'dartdoc.dart')],
+                 [("../../../../../pkg/args/lib/args.dart",
+                   "../../../../pkg/args/lib/args.dart")])
+
   # Write the 'version' file
   versionFile = open(os.path.join(SDK_tmp, 'version'), 'w')
   versionFile.write(version + '\n')
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index 099cd20..6900999 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -27,6 +27,7 @@
           '-fPIC',
           '-fvisibility=hidden',
           '-fvisibility-inlines-hidden',
+          '-fno-omit-frame-pointer',
         ],
         'ldflags': [
           '-rdynamic',
diff --git a/tools/testing/dart/browser_test.dart b/tools/testing/dart/browser_test.dart
index fc0d05b..ec6d9a8 100644
--- a/tools/testing/dart/browser_test.dart
+++ b/tools/testing/dart/browser_test.dart
@@ -47,19 +47,17 @@
 
 String wrapDartTestInLibrary(Path test) =>
 """
-#library('libraryWrapper');
-#source('$test');
+library libraryWrapper;
+part '$test';
 """;
 
 String dartTestWrapper(Path dartHome, Path library) =>
 """
-#library('test');
+library test;
 
-#import('${dartHome.append('pkg/unittest/unittest.dart')}', prefix: 'unittest');
-#import('${dartHome.append('pkg/unittest/html_config.dart')}',
-        prefix: 'config');
-
-#import('${library}', prefix: "Test");
+import '${dartHome.append('pkg/unittest/lib/unittest.dart')}' as unittest;
+import '${dartHome.append('pkg/unittest/lib/html_config.dart')}' as config;
+import '${library}' as Test;
 
 main() {
   config.useHtmlConfiguration();
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index dd639df..cf13237 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -407,6 +407,11 @@
     }
 
     Set<String> expectations = testExpectations.expectations(testName);
+    if (info.hasCompileError &&
+        TestUtils.isBrowserRuntime(configuration['runtime'])) {
+      SummaryReport.addCompileErrorSkipTest();
+      return;
+    }
     if (configuration['report']) {
       // Tests with multiple VMOptions are counted more than once.
       for (var dummy in getVmOptions(optionsFromFile)) {
@@ -422,11 +427,6 @@
       enqueueStandardTest(info, testName, expectations);
     } else if (TestUtils.isBrowserRuntime(configuration['runtime'])) {
       bool isWrappingRequired = configuration['compiler'] != 'dart2js';
-      if (configuration['runtime'] == 'ff' &&
-          Platform.operatingSystem == 'windows') {
-        // TODO(ahe): Investigate why this doesn't work on Windows.
-        isWrappingRequired = true;
-      }
       enqueueBrowserTest(info, testName, expectations, isWrappingRequired);
     } else {
       enqueueStandardTest(info, testName, expectations);
@@ -976,13 +976,13 @@
     RegExp staticCleanRegExp = const RegExp(r"// @static-clean");
     RegExp leadingHashRegExp = const RegExp(r"^#", multiLine: true);
     RegExp isolateStubsRegExp = const RegExp(r"// IsolateStubs=(.*)");
+    // TODO(gram) Clean these up once the old directives are not supported.
     RegExp domImportRegExp =
-        const RegExp(r"^#import.*(dart:(dom|html)|html\.dart).*\)",
-                     multiLine: true);
+        const RegExp(r"^[#]?import.*dart:html", multiLine: true);
     RegExp libraryDefinitionRegExp =
-        const RegExp(r"^#library\(", multiLine: true);
+        const RegExp(r"^[#]?library[\( ]", multiLine: true);
     RegExp sourceOrImportRegExp =
-        const RegExp(r"^#(source|import|resource)\(", multiLine: true);
+        const RegExp("^(#source|#import|part)[ \t]+[\('\"]", multiLine: true);
 
     // Read the entire file into a byte buffer and transform it to a
     // String. This will treat the file as ascii but the only parts
@@ -1451,6 +1451,7 @@
   static int fail = 0;
   static int crash = 0;
   static int timeout = 0;
+  static int compileErrorSkip = 0;
 
   static void add(Set<String> expectations) {
     ++total;
@@ -1479,6 +1480,11 @@
     }
   }
 
+  static void addCompileErrorSkipTest() {
+    total++;
+    compileErrorSkip++;
+  }
+
   static void printReport() {
     if (total == 0) return;
     String report = """Total: $total tests
@@ -1489,6 +1495,7 @@
  * $fail tests are expected to fail that we should fix
  * $crash tests are expected to crash that we should fix
  * $timeout tests are allowed to timeout
+ * $compileErrorSkip tests are skipped on browsers due to compile-time error
 """;
     print(report);
    }
diff --git a/tools/testing/run_selenium.py b/tools/testing/run_selenium.py
index e9e1119..e97963e 100755
--- a/tools/testing/run_selenium.py
+++ b/tools/testing/run_selenium.py
@@ -40,6 +40,7 @@
 import sys
 import time
 import urllib2
+import threading
 
 TIMEOUT_ERROR_MSG = 'FAIL (timeout)'
 
@@ -170,10 +171,8 @@
     profile.set_preference('dom.max_chrome_script_run_time', 0)
     profile.set_preference('app.update.auto', True)
     profile.set_preference('app.update.enabled', True)
-    xpi = os.path.join(script_dir, 'extensions', 'firefox',                               'ConsoleCollector.xpi')
-    profile.add_extension(xpi);
     return selenium.webdriver.Firefox(firefox_profile=profile)
-  elif ((browser == 'ie9' or browser == 'ie10') and 
+  elif ((browser == 'ie9' or browser == 'ie10') and
       platform.system() == 'Windows'):
     return selenium.webdriver.Ie()
   elif browser == 'safari' and platform.system() == 'Darwin':
@@ -245,12 +244,6 @@
       index += len('<body>')
       end_index = source.find('</body')
       print unicode(source[index : end_index]).encode("utf-8")
-      if type(browser) is selenium.webdriver.firefox.webdriver.WebDriver:
-        logs = browser.execute_script("return window.ConsoleCollector.read()");
-        for msg in logs:
-          print('%s:%s:%s:%s %s' %(
-              msg['source'], msg['line'], msg['column'],
-              msg['category'], msg['message']))
       return 1
 
 
@@ -323,9 +316,27 @@
         print '>>> TEST FAIL'
       sys.stdout.flush()
   finally:
+    sys.stdin.close()
     print("Closing browser");
-    close_browser(browser)
 
+    def close_output_streams():
+      sys.stdout.flush()
+      sys.stdout.close()
+      sys.stderr.flush()
+      sys.stderr.close()
+
+    def close_and_exit():
+      print("Timed out waiting for browser to close")
+      close_output_streams()
+      exit(1)
+
+    timer = threading.Timer(5.0, close_and_exit)
+    timer.start()
+    try:
+      close_browser(browser)
+      timer.cancel()
+    finally:
+      close_output_streams()
 
 def main(args):
   # Run in batch mode if the --batch flag is passed.
diff --git a/tools/utils/vim/syntax/dart.vim b/tools/utils/vim/syntax/dart.vim
index fa5aa9d..f954ebd 100644
--- a/tools/utils/vim/syntax/dart.vim
+++ b/tools/utils/vim/syntax/dart.vim
@@ -34,7 +34,7 @@
 syn keyword dartStatement      return
 syn keyword dartStorageClass   static abstract
 syn keyword dartExceptions     throw try catch finally
-syn keyword dartExceptions     FormatException Exception ExpectException FutureAlreadyCompleteException FutureNotCompleteException./b ArgumentError IllegalJSRegExpException IndexOutOfRangeException IntegerDivisionByZeroException NoSuchMethodError NotImplementedException NullPointerException OutOfMemoryError StackOverflowException StateError UnsupportedError
+syn keyword dartExceptions     Error FormatException Exception ExpectException FutureAlreadyCompleteException FutureNotCompleteException ArgumentError IllegalJSRegExpException IntegerDivisionByZeroException NoSuchMethodError NullPointerException OutOfMemoryError RangeError StackOverflowException StateError UnimplementedError UnsupportedError
 syn keyword dartExceptions_DEPRECATED     BadNumberFormatException
 syn keyword dartAssert         assert
 syn keyword dartClassDecl      extends implements interface
diff --git a/utils/apidoc/apidoc.dart b/utils/apidoc/apidoc.dart
index 931a5fe..793cd68 100644
--- a/utils/apidoc/apidoc.dart
+++ b/utils/apidoc/apidoc.dart
@@ -12,17 +12,16 @@
  *
  *     $ dart apidoc.dart [--out=<output directory>]
  */
+library apidoc;
 
-#library('apidoc');
-
-#import('dart:io');
-#import('dart:json');
-#import('html_diff.dart');
+import 'dart:io';
+import 'dart:json';
+import 'html_diff.dart';
 // TODO(rnystrom): Use "package:" URL (#4968).
-#import('../../pkg/dartdoc/lib/mirrors.dart');
-#import('../../pkg/dartdoc/lib/mirrors_util.dart');
-#import('../../pkg/dartdoc/lib/dartdoc.dart', prefix: 'doc');
-#import('../../lib/_internal/libraries.dart');
+import '../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
+import '../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
+import '../../sdk/lib/_internal/dartdoc/lib/dartdoc.dart' as doc;
+import '../../sdk/lib/_internal/libraries.dart';
 
 HtmlDiff _diff;
 
@@ -65,14 +64,14 @@
     }
   }
 
-  final libPath = doc.scriptDir.append('../../');
+  final libPath = doc.scriptDir.append('../../sdk/');
   final pkgPath = doc.scriptDir.append('../../pkg/');
 
   doc.cleanOutputDirectory(outputDir);
 
   // The basic dartdoc-provided static content.
   final copiedStatic = doc.copyDirectory(
-      doc.scriptDir.append('../../pkg/dartdoc/static'),
+      doc.scriptDir.append('../../sdk/lib/_internal/dartdoc/static'),
       outputDir);
 
   // The apidoc-specific static content.
@@ -94,7 +93,7 @@
   final htmldoc = new Htmldoc();
   htmldoc.includeApi = true;
   htmldoc.documentLibraries(
-    <Path>[doc.scriptDir.append('../../lib/html/doc/html.dartdoc')],
+    <Path>[doc.scriptDir.append('../../sdk/lib/html/doc/html.dartdoc')],
     libPath, pkgPath);
 
   // Process libraries.
@@ -136,7 +135,8 @@
     print('Generating docs...');
     final apidoc = new Apidoc(mdn, htmldoc, outputDir, mode, generateAppCache,
         excludedLibraries);
-    apidoc.dartdocPath = doc.scriptDir.append('../../pkg/dartdoc/');
+    apidoc.dartdocPath =
+        doc.scriptDir.append('../../sdk/lib/_internal/dartdoc/');
     // Select the libraries to include in the produced documentation:
     apidoc.includeApi = true;
     apidoc.includedLibraries = includedLibraries;
diff --git a/utils/apidoc/apidoc.gyp b/utils/apidoc/apidoc.gyp
index 7710b91..931a11a 100644
--- a/utils/apidoc/apidoc.gyp
+++ b/utils/apidoc/apidoc.gyp
@@ -22,7 +22,7 @@
         '../../runtime/dart-runtime.gyp:dart',
       ],
       'includes': [
-        '../../lib/core/corelib_sources.gypi',
+        '../../sdk/lib/core/corelib_sources.gypi',
       ],
       'actions': [
         {
@@ -31,8 +31,8 @@
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
             '<(PRODUCT_DIR)/dart2js',
             '<(PRODUCT_DIR)/dart2js.bat',
-            '<!@(["python", "../../tools/list_files.py", "\\.(css|ico|js|json|png|sh|txt|yaml|py)$", ".", "../../pkg/dartdoc"])',
-            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../lib", "../../runtime/lib", "../../runtime/bin", "../../pkg/dartdoc"])',
+            '<!@(["python", "../../tools/list_files.py", "\\.(css|ico|js|json|png|sh|txt|yaml|py)$", ".", "../../sdk/lib/_internal/dartdoc"])',
+            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../lib", "../../runtime/lib", "../../runtime/bin", "../../sdk/lib/_internal/dartdoc"])',
           ],
           'outputs': [
             '<(PRODUCT_DIR)/api_docs/index.html',
@@ -44,6 +44,7 @@
             '--out=<(PRODUCT_DIR)/api_docs',
             '--mode=static',
             '--exclude-lib=webdriver',
+            '--exclude-lib=http',
             '--exclude-lib=dartdoc',
           ],
           'message': 'Running apidoc: <(_action)',
diff --git a/utils/apidoc/html_diff.dart b/utils/apidoc/html_diff.dart
index 2de79b7..130666d 100644
--- a/utils/apidoc/html_diff.dart
+++ b/utils/apidoc/html_diff.dart
@@ -6,15 +6,15 @@
  * A script to assist in documenting the difference between the dart:html API
  * and the old DOM API.
  */
-#library('html_diff');
+library html_diff;
 
-#import('dart:coreimpl');
-#import('dart:io');
+import 'dart:coreimpl';
+import 'dart:io';
 
 // TODO(rnystrom): Use "package:" URL (#4968).
-#import('../../pkg/dartdoc/lib/dartdoc.dart');
-#import('../../pkg/dartdoc/lib/mirrors.dart');
-#import('../../pkg/dartdoc/lib/mirrors_util.dart');
+import '../../sdk/lib/_internal/dartdoc/lib/dartdoc.dart';
+import '../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
+import '../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
 
 // TODO(amouravski): There is currently magic that looks at dart:* libraries
 // rather than the declared library names. This changed due to recent syntax
diff --git a/utils/apidoc/scripts/list_files.dart b/utils/apidoc/scripts/list_files.dart
index b7a62f4..08a5fdf 100644
--- a/utils/apidoc/scripts/list_files.dart
+++ b/utils/apidoc/scripts/list_files.dart
@@ -19,7 +19,7 @@
   final scriptDir = new File(new Options().script).directorySync().path;
   final dartDir = '$scriptDir/../../../';
   listFiles('$dartDir/utils/apidoc');
-  listFiles('$dartDir/pkg/dartdoc');
+  listFiles('$dartDir/sdk/lib/_internal/dartdoc');
 }
 
 void listFiles(String dirPath) {
diff --git a/utils/compiler/build_helper.dart b/utils/compiler/build_helper.dart
index 971bb58..e7e31d7 100644
--- a/utils/compiler/build_helper.dart
+++ b/utils/compiler/build_helper.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#import('dart:io');
-#import('dart:uri');
+import 'dart:io';
+import 'dart:uri';
 
-#import('../../lib/compiler/implementation/util/uri_extras.dart');
-#import('../../lib/compiler/implementation/filenames.dart');
+import '../../sdk/lib/_internal/compiler/implementation/util/uri_extras.dart';
+import '../../sdk/lib/_internal/compiler/implementation/filenames.dart';
 
 main() {
   List<String> arguments = new Options().arguments;
@@ -29,19 +29,20 @@
   List<String> productionScript = buildScript(
       'dart2js-production',
       dartUri, dartVmUri,
-      'lib/compiler/implementation/dart2js.dart', '');
+      'sdk/lib/_internal/compiler/implementation/dart2js.dart', '');
   writeScript(productionUri, productionScript);
 
   List<String> developerScript = buildScript(
       'dart2js-developer',
       dartUri, dartVmUri,
-      'lib/compiler/implementation/dart2js.dart', ' --enable_checked_mode');
+      'sdk/lib/_internal/compiler/implementation/dart2js.dart',
+      ' --enable_checked_mode');
   writeScript(developerUri, developerScript);
 
   List<String> dartdocScript = buildScript(
       'dartdoc',
       dartUri, dartVmUri,
-      'pkg/dartdoc/bin/dartdoc.dart', '');
+      'sdk/lib/_internal/dartdoc/bin/dartdoc.dart', '');
   writeScript(dartdocUri, dartdocScript);
 }
 
diff --git a/utils/compiler/compiler.gyp b/utils/compiler/compiler.gyp
index abb576d..2dee58f 100644
--- a/utils/compiler/compiler.gyp
+++ b/utils/compiler/compiler.gyp
@@ -49,8 +49,8 @@
           'inputs': [
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)gen_snapshot<(EXECUTABLE_SUFFIX)',
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
-            '../../lib/_internal/libraries.dart',
-            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../lib/compiler", "../../runtime/lib"])',
+            '../../sdk/lib/_internal/libraries.dart',
+            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../sdk/lib/_internal/compiler", "../../runtime/lib"])',
           ],
           'outputs': [
             '<(PRODUCT_DIR)/dart2js.snapshot',
@@ -67,7 +67,7 @@
             # for dart2js compiler engineers.  However, we install the
             # snapshot in the proper location when building the SDK.
             '--script_snapshot=<(PRODUCT_DIR)/dart2js.snapshot',
-            '../../lib/compiler/implementation/dart2js.dart',
+            '../../sdk/lib/_internal/compiler/implementation/dart2js.dart',
           ],
         },
       ],
diff --git a/utils/pub/hosted_source.dart b/utils/pub/hosted_source.dart
index eb4b86fd..07ea60f 100644
--- a/utils/pub/hosted_source.dart
+++ b/utils/pub/hosted_source.dart
@@ -41,12 +41,7 @@
       var doc = JSON.parse(body);
       return doc['versions'].map((version) => new Version.parse(version));
     }).transformException((ex) {
-      if (ex is PubHttpException && ex.statusCode == 404) {
-        throw 'Could not find package "${parsed.first}" on ${parsed.last}.';
-      }
-
-      // Otherwise re-throw the original exception.
-      throw ex;
+      _throwFriendlyError(ex, parsed.first, parsed.last);
     });
   }
 
@@ -58,8 +53,11 @@
     var parsed = _parseDescription(id.description);
     var fullUrl = "${parsed.last}/packages/${parsed.first}/versions/"
       "${id.version}.yaml";
+
     return httpGetString(fullUrl).transform((yaml) {
       return new Pubspec.parse(yaml, systemCache.sources);
+    }).transformException((ex) {
+      _throwFriendlyError(ex, id, parsed.last);
     });
   }
 
@@ -121,6 +119,27 @@
     _parseDescription(description);
   }
 
+  /// When an error occurs trying to read something about [package] from [url],
+  /// this tries to translate into a more user friendly error message. Always
+  /// throws an error, either the original one or a better one.
+  void _throwFriendlyError(ex, package, url) {
+    if (ex is PubHttpException && ex.statusCode == 404) {
+      throw 'Could not find package "$package" at $url.';
+    }
+
+    if (ex is TimeoutException) {
+      throw 'Timed out trying to find package "$package" at $url.';
+    }
+
+    if (ex is io.SocketIOException) {
+      throw 'Got socket error trying to find package "$package" at $url.\n'
+          '${ex.osError}';
+    }
+
+    // Otherwise re-throw the original exception.
+    throw ex;
+  }
+
   /**
    * Parses the description for a package.
    *
diff --git a/utils/pub/io.dart b/utils/pub/io.dart
index 8b632e3..cccedfc17 100644
--- a/utils/pub/io.dart
+++ b/utils/pub/io.dart
@@ -222,7 +222,7 @@
  */
 Future<Directory> deleteDir(dir) {
   dir = _getDirectory(dir);
-  return dir.deleteRecursively();
+  return dir.delete(recursive: true);
 }
 
 /**
@@ -712,6 +712,8 @@
   final String reason;
 
   const PubHttpException(this.statusCode, this.reason);
+
+  String toString() => 'HTTP error $statusCode: $reason';
 }
 
 /**
@@ -721,6 +723,8 @@
   final String message;
 
   const TimeoutException(this.message);
+
+  String toString() => message;
 }
 
 /**
diff --git a/utils/pub/package.dart b/utils/pub/package.dart
index 8d84546..b8ee759 100644
--- a/utils/pub/package.dart
+++ b/utils/pub/package.dart
@@ -137,7 +137,10 @@
            other.version == version;
   }
 
-  String toString() => "$name $version from ${source.name}";
+  String toString() {
+    if (source.isDefault) return "$name $version";
+    return "$name $version from $source";
+  }
 
   int compareTo(Comparable other) {
     if (other is! PackageId) throw new ArgumentError(other);
diff --git a/utils/pub/source.dart b/utils/pub/source.dart
index bb956c9..0dc6a23 100644
--- a/utils/pub/source.dart
+++ b/utils/pub/source.dart
@@ -23,6 +23,9 @@
    */
   abstract String get name;
 
+  /// Whether or not this source is the default source.
+  bool get isDefault => systemCache.sources.defaultSource == this;
+
   /**
    * Whether this source's packages should be cached in Pub's global cache
    * directory.
@@ -189,4 +192,7 @@
    * By default, this just returns [id].
    */
   Future<PackageId> resolveId(PackageId id) => new Future.immediate(id);
+
+  /// Returns the source's name.
+  String toString() => name;
 }
diff --git a/utils/tests/archive/reader_test.dart b/utils/tests/archive/reader_test.dart
index 5640ae7..77fd88f 100644
--- a/utils/tests/archive/reader_test.dart
+++ b/utils/tests/archive/reader_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('reader_test');
+library reader_test;
 
-#import('dart:io');
-#import('../../../pkg/unittest/unittest.dart');
-#import('../../archive/archive.dart');
+import 'dart:io';
+import '../../../pkg/unittest/lib/unittest.dart'
+import '../../archive/archive.dart';
 
 final String dataPath = "utils/tests/archive/data";
 
diff --git a/utils/tests/archive/utils_test.dart b/utils/tests/archive/utils_test.dart
index e85af66..bd51d75 100644
--- a/utils/tests/archive/utils_test.dart
+++ b/utils/tests/archive/utils_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('utils_test');
+library utils_test;
 
-#import('../../../pkg/unittest/unittest.dart');
-#import('../../archive/utils.dart');
+import '../../../pkg/unittest/lib/unittest.dart';
+import '../../archive/utils.dart';
 
 main() {
   // TODO(nweiz): re-enable this once issue 4378 is fixed.
diff --git a/utils/tests/pub/install/git/check_out_and_update_test.dart b/utils/tests/pub/install/git/check_out_and_update_test.dart
index c61502a..fa632b6 100644
--- a/utils/tests/pub/install/git/check_out_and_update_test.dart
+++ b/utils/tests/pub/install/git/check_out_and_update_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('checks out and updates a package from Git', () {
diff --git a/utils/tests/pub/install/git/check_out_branch_test.dart b/utils/tests/pub/install/git/check_out_branch_test.dart
index 9db508f..9c06391 100644
--- a/utils/tests/pub/install/git/check_out_branch_test.dart
+++ b/utils/tests/pub/install/git/check_out_branch_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('checks out a package at a specific branch from Git', () {
diff --git a/utils/tests/pub/install/git/check_out_revision_test.dart b/utils/tests/pub/install/git/check_out_revision_test.dart
index 81ebaf7..9259682 100644
--- a/utils/tests/pub/install/git/check_out_revision_test.dart
+++ b/utils/tests/pub/install/git/check_out_revision_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('checks out a package at a specific revision from Git', () {
diff --git a/utils/tests/pub/install/git/check_out_test.dart b/utils/tests/pub/install/git/check_out_test.dart
index 4ff253d..e3d7191 100644
--- a/utils/tests/pub/install/git/check_out_test.dart
+++ b/utils/tests/pub/install/git/check_out_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('checks out a package from Git', () {
diff --git a/utils/tests/pub/install/git/check_out_transitive_test.dart b/utils/tests/pub/install/git/check_out_transitive_test.dart
index ef77b14..f8327ba 100644
--- a/utils/tests/pub/install/git/check_out_transitive_test.dart
+++ b/utils/tests/pub/install/git/check_out_transitive_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('checks out packages transitively from Git', () {
diff --git a/utils/tests/pub/install/git/check_out_twice_test.dart b/utils/tests/pub/install/git/check_out_twice_test.dart
index 8c2c59e..2b768e7 100644
--- a/utils/tests/pub/install/git/check_out_twice_test.dart
+++ b/utils/tests/pub/install/git/check_out_twice_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('checks out a package from Git twice', () {
diff --git a/utils/tests/pub/install/git/check_out_with_trailing_slash_test.dart b/utils/tests/pub/install/git/check_out_with_trailing_slash_test.dart
index b3afa6e..1a27e90 100644
--- a/utils/tests/pub/install/git/check_out_with_trailing_slash_test.dart
+++ b/utils/tests/pub/install/git/check_out_with_trailing_slash_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   group("(regression)", () {
diff --git a/utils/tests/pub/install/git/dependency_name_match_pubspec_test.dart b/utils/tests/pub/install/git/dependency_name_match_pubspec_test.dart
index 1cf60c5..c2733be 100644
--- a/utils/tests/pub/install/git/dependency_name_match_pubspec_test.dart
+++ b/utils/tests/pub/install/git/dependency_name_match_pubspec_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('requires the dependency name to match the remote pubspec name', () {
diff --git a/utils/tests/pub/install/git/different_repo_name_test.dart b/utils/tests/pub/install/git/different_repo_name_test.dart
index 85f4306..2b9013e 100644
--- a/utils/tests/pub/install/git/different_repo_name_test.dart
+++ b/utils/tests/pub/install/git/different_repo_name_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('doesn\'t require the repository name to match the name in the '
diff --git a/utils/tests/pub/install/git/lock_version_test.dart b/utils/tests/pub/install/git/lock_version_test.dart
index e3a7a38..4676ae2 100644
--- a/utils/tests/pub/install/git/lock_version_test.dart
+++ b/utils/tests/pub/install/git/lock_version_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('keeps a Git package locked to the version in the lockfile', () {
diff --git a/utils/tests/pub/install/git/require_pubspec_name_test.dart b/utils/tests/pub/install/git/require_pubspec_name_test.dart
index 6ca6866..bde1ee1 100644
--- a/utils/tests/pub/install/git/require_pubspec_name_test.dart
+++ b/utils/tests/pub/install/git/require_pubspec_name_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('requires the dependency to have a pubspec with a name field', () {
diff --git a/utils/tests/pub/install/git/require_pubspec_test.dart b/utils/tests/pub/install/git/require_pubspec_test.dart
index dc8a8b8..00eb9d2 100644
--- a/utils/tests/pub/install/git/require_pubspec_test.dart
+++ b/utils/tests/pub/install/git/require_pubspec_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('requires the dependency to have a pubspec', () {
diff --git a/utils/tests/pub/install/git/stay_locked_if_compatible_test.dart b/utils/tests/pub/install/git/stay_locked_if_compatible_test.dart
index de12dc9..c5e2331 100644
--- a/utils/tests/pub/install/git/stay_locked_if_compatible_test.dart
+++ b/utils/tests/pub/install/git/stay_locked_if_compatible_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("doesn't update a locked Git package with a new compatible "
diff --git a/utils/tests/pub/install/git/unlock_if_incompatible_test.dart b/utils/tests/pub/install/git/unlock_if_incompatible_test.dart
index 433ef05..25476fc 100644
--- a/utils/tests/pub/install/git/unlock_if_incompatible_test.dart
+++ b/utils/tests/pub/install/git/unlock_if_incompatible_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('updates a locked Git package with a new incompatible constraint', () {
diff --git a/utils/tests/pub/install/hosted/check_out_test.dart b/utils/tests/pub/install/hosted/check_out_test.dart
index c0eafff..c738daa 100644
--- a/utils/tests/pub/install/hosted/check_out_test.dart
+++ b/utils/tests/pub/install/hosted/check_out_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('checks out a package from a pub server', () {
diff --git a/utils/tests/pub/install/hosted/check_out_transitive_test.dart b/utils/tests/pub/install/hosted/check_out_transitive_test.dart
index d13cc92..7a2f26a 100644
--- a/utils/tests/pub/install/hosted/check_out_transitive_test.dart
+++ b/utils/tests/pub/install/hosted/check_out_transitive_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('checks out packages transitively from a pub server', () {
diff --git a/utils/tests/pub/install/hosted/do_not_update_on_removed_constraints_test.dart b/utils/tests/pub/install/hosted/do_not_update_on_removed_constraints_test.dart
index c10eb56..a41873c 100644
--- a/utils/tests/pub/install/hosted/do_not_update_on_removed_constraints_test.dart
+++ b/utils/tests/pub/install/hosted/do_not_update_on_removed_constraints_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("doesn't update dependencies whose constraints have been removed", () {
diff --git a/utils/tests/pub/install/hosted/fail_gracefully_on_missing_package_test.dart b/utils/tests/pub/install/hosted/fail_gracefully_on_missing_package_test.dart
index e333b00..dae4ce6 100644
--- a/utils/tests/pub/install/hosted/fail_gracefully_on_missing_package_test.dart
+++ b/utils/tests/pub/install/hosted/fail_gracefully_on_missing_package_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('fails gracefully if the package does not exist', () {
@@ -16,7 +16,7 @@
     appDir([dependency("foo", "1.2.3")]).scheduleCreate();
 
     schedulePub(args: ['install'],
-        error: const RegExp('Could not find package "foo" on '
+        error: const RegExp('Could not find package "foo" at '
                             'http://localhost:'),
         exitCode: 1);
 
diff --git a/utils/tests/pub/install/hosted/fail_gracefully_on_url_resolve_test.dart b/utils/tests/pub/install/hosted/fail_gracefully_on_url_resolve_test.dart
index b8728d6..ffb48496 100644
--- a/utils/tests/pub/install/hosted/fail_gracefully_on_url_resolve_test.dart
+++ b/utils/tests/pub/install/hosted/fail_gracefully_on_url_resolve_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('fails gracefully if the url does not resolve', () {
diff --git a/utils/tests/pub/install/hosted/remove_removed_dependency_test.dart b/utils/tests/pub/install/hosted/remove_removed_dependency_test.dart
index 8198b6e..add5837 100644
--- a/utils/tests/pub/install/hosted/remove_removed_dependency_test.dart
+++ b/utils/tests/pub/install/hosted/remove_removed_dependency_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("removes a dependency that's been removed from the pubspec", () {
diff --git a/utils/tests/pub/install/hosted/remove_removed_transitive_dependency_test.dart b/utils/tests/pub/install/hosted/remove_removed_transitive_dependency_test.dart
index 90772c5..62007fb 100644
--- a/utils/tests/pub/install/hosted/remove_removed_transitive_dependency_test.dart
+++ b/utils/tests/pub/install/hosted/remove_removed_transitive_dependency_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("removes a transitive dependency that's no longer depended on", () {
diff --git a/utils/tests/pub/install/hosted/resolve_constraints_test.dart b/utils/tests/pub/install/hosted/resolve_constraints_test.dart
index f3784ff..077f899 100644
--- a/utils/tests/pub/install/hosted/resolve_constraints_test.dart
+++ b/utils/tests/pub/install/hosted/resolve_constraints_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('resolves version constraints from a pub server', () {
diff --git a/utils/tests/pub/install/hosted/stay_locked_if_compatible_test.dart b/utils/tests/pub/install/hosted/stay_locked_if_compatible_test.dart
index d16495f..7ac56bf 100644
--- a/utils/tests/pub/install/hosted/stay_locked_if_compatible_test.dart
+++ b/utils/tests/pub/install/hosted/stay_locked_if_compatible_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("doesn't update a locked pub server package with a new compatible "
diff --git a/utils/tests/pub/install/hosted/stay_locked_if_new_is_satisfied_test.dart b/utils/tests/pub/install/hosted/stay_locked_if_new_is_satisfied_test.dart
index 4d955fe..30b0966 100644
--- a/utils/tests/pub/install/hosted/stay_locked_if_new_is_satisfied_test.dart
+++ b/utils/tests/pub/install/hosted/stay_locked_if_new_is_satisfied_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("doesn't unlock dependencies if a new dependency is already "
diff --git a/utils/tests/pub/install/hosted/stay_locked_test.dart b/utils/tests/pub/install/hosted/stay_locked_test.dart
index 3a57916..c6e4b00 100644
--- a/utils/tests/pub/install/hosted/stay_locked_test.dart
+++ b/utils/tests/pub/install/hosted/stay_locked_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('keeps a pub server package locked to the version in the lockfile', () {
diff --git a/utils/tests/pub/install/hosted/unlock_if_incompatible_test.dart b/utils/tests/pub/install/hosted/unlock_if_incompatible_test.dart
index 07aa514..3016bf5 100644
--- a/utils/tests/pub/install/hosted/unlock_if_incompatible_test.dart
+++ b/utils/tests/pub/install/hosted/unlock_if_incompatible_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('updates a locked pub server package with a new incompatible '
diff --git a/utils/tests/pub/install/hosted/unlock_if_new_is_unsatisfied_test.dart b/utils/tests/pub/install/hosted/unlock_if_new_is_unsatisfied_test.dart
index 5e63c78..21bb7cb 100644
--- a/utils/tests/pub/install/hosted/unlock_if_new_is_unsatisfied_test.dart
+++ b/utils/tests/pub/install/hosted/unlock_if_new_is_unsatisfied_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("unlocks dependencies if necessary to ensure that a new dependency "
diff --git a/utils/tests/pub/install/pub_install_test.dart b/utils/tests/pub/install/pub_install_test.dart
index 4a57cbd..4c953b0 100644
--- a/utils/tests/pub/install/pub_install_test.dart
+++ b/utils/tests/pub/install/pub_install_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../test_pub.dart';
-import '../../../../pkg/unittest/unittest.dart';
+import '../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   group('requires', () {
diff --git a/utils/tests/pub/install/sdk/check_out_test.dart b/utils/tests/pub/install/sdk/check_out_test.dart
index 5c07b20..279869f 100644
--- a/utils/tests/pub/install/sdk/check_out_test.dart
+++ b/utils/tests/pub/install/sdk/check_out_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('checks out a package from the SDK', () {
diff --git a/utils/tests/pub/install/sdk/check_out_transitive_test.dart b/utils/tests/pub/install/sdk/check_out_transitive_test.dart
index 000e6dd..25c6457 100644
--- a/utils/tests/pub/install/sdk/check_out_transitive_test.dart
+++ b/utils/tests/pub/install/sdk/check_out_transitive_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('includes transitive dependencies', () {
diff --git a/utils/tests/pub/lock_file_test.dart b/utils/tests/pub/lock_file_test.dart
index e3eec8a..d1aeb00 100644
--- a/utils/tests/pub/lock_file_test.dart
+++ b/utils/tests/pub/lock_file_test.dart
@@ -4,7 +4,7 @@
 
 library lock_file_test;
 
-import '../../../pkg/unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 import '../../pub/lock_file.dart';
 import '../../pub/package.dart';
 import '../../pub/source.dart';
diff --git a/utils/tests/pub/pub_test.dart b/utils/tests/pub/pub_test.dart
index 9a28941..a1e1bc7 100644
--- a/utils/tests/pub/pub_test.dart
+++ b/utils/tests/pub/pub_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import 'test_pub.dart';
-import '../../../pkg/unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 
 final USAGE_STRING = """
     Pub is a package manager for Dart.
diff --git a/utils/tests/pub/pubspec_test.dart b/utils/tests/pub/pubspec_test.dart
index d952611..d93a408 100644
--- a/utils/tests/pub/pubspec_test.dart
+++ b/utils/tests/pub/pubspec_test.dart
@@ -4,7 +4,7 @@
 
 library pubspec_test;
 
-import '../../../pkg/unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 import '../../pub/pubspec.dart';
 import '../../pub/source.dart';
 import '../../pub/source_registry.dart';
diff --git a/utils/tests/pub/test_pub.dart b/utils/tests/pub/test_pub.dart
index 67ac4a7..3b45775 100644
--- a/utils/tests/pub/test_pub.dart
+++ b/utils/tests/pub/test_pub.dart
@@ -16,7 +16,7 @@
 import 'dart:math';
 import 'dart:uri';
 
-import '../../../pkg/unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 import '../../lib/file_system.dart' as fs;
 import '../../pub/git_source.dart';
 import '../../pub/hosted_source.dart';
@@ -1157,7 +1157,9 @@
       return create(tempDir);
     }).then((tar) {
       var sourceStream = tar.openInputStream();
-      pipeInputToInput(sourceStream, sinkStream, tempDir.deleteRecursively);
+      pipeInputToInput(sourceStream,
+                       sinkStream,
+                       () => tempDir.delete(recursive: true));
     });
     return sinkStream;
   }
diff --git a/utils/tests/pub/update/git/do_not_update_if_unneeded_test.dart b/utils/tests/pub/update/git/do_not_update_if_unneeded_test.dart
index 098e25a..829a459 100644
--- a/utils/tests/pub/update/git/do_not_update_if_unneeded_test.dart
+++ b/utils/tests/pub/update/git/do_not_update_if_unneeded_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("doesn't update one locked Git package's dependencies if it's not "
diff --git a/utils/tests/pub/update/git/update_locked_test.dart b/utils/tests/pub/update/git/update_locked_test.dart
index 758cb7c..00ae0f8 100644
--- a/utils/tests/pub/update/git/update_locked_test.dart
+++ b/utils/tests/pub/update/git/update_locked_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("updates locked Git packages", () {
diff --git a/utils/tests/pub/update/git/update_one_locked_test.dart b/utils/tests/pub/update/git/update_one_locked_test.dart
index 84ee856..1c793c6 100644
--- a/utils/tests/pub/update/git/update_one_locked_test.dart
+++ b/utils/tests/pub/update/git/update_one_locked_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("updates one locked Git package but no others", () {
diff --git a/utils/tests/pub/update/git/update_to_incompatible_pubspec_test.dart b/utils/tests/pub/update/git/update_to_incompatible_pubspec_test.dart
index 87c3e09..e6086b5 100644
--- a/utils/tests/pub/update/git/update_to_incompatible_pubspec_test.dart
+++ b/utils/tests/pub/update/git/update_to_incompatible_pubspec_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("updates Git packages to an incompatible pubspec", () {
diff --git a/utils/tests/pub/update/git/update_to_nonexistent_pubspec_test.dart b/utils/tests/pub/update/git/update_to_nonexistent_pubspec_test.dart
index 647b6de..c30157e 100644
--- a/utils/tests/pub/update/git/update_to_nonexistent_pubspec_test.dart
+++ b/utils/tests/pub/update/git/update_to_nonexistent_pubspec_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("updates Git packages to a nonexistent pubspec", () {
diff --git a/utils/tests/pub/update/hosted/fail_gracefully_on_missing_package_test.dart b/utils/tests/pub/update/hosted/fail_gracefully_on_missing_package_test.dart
index 51a0dba..381923e 100644
--- a/utils/tests/pub/update/hosted/fail_gracefully_on_missing_package_test.dart
+++ b/utils/tests/pub/update/hosted/fail_gracefully_on_missing_package_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('fails gracefully if the package does not exist', () {
@@ -16,7 +16,7 @@
     appDir([dependency("foo", "1.2.3")]).scheduleCreate();
 
     schedulePub(args: ['update'],
-        error: const RegExp('Could not find package "foo" on '
+        error: const RegExp('Could not find package "foo" at '
                             'http://localhost:'),
         exitCode: 1);
 
diff --git a/utils/tests/pub/update/hosted/fail_gracefully_on_url_resolve_test.dart b/utils/tests/pub/update/hosted/fail_gracefully_on_url_resolve_test.dart
index 6dd0071..c231122 100644
--- a/utils/tests/pub/update/hosted/fail_gracefully_on_url_resolve_test.dart
+++ b/utils/tests/pub/update/hosted/fail_gracefully_on_url_resolve_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test('fails gracefully if the url does not resolve', () {
diff --git a/utils/tests/pub/update/hosted/remove_removed_dependency_test.dart b/utils/tests/pub/update/hosted/remove_removed_dependency_test.dart
index 8e52eddf..60fc438 100644
--- a/utils/tests/pub/update/hosted/remove_removed_dependency_test.dart
+++ b/utils/tests/pub/update/hosted/remove_removed_dependency_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("removes a dependency that's been removed from the pubspec", () {
diff --git a/utils/tests/pub/update/hosted/remove_removed_transitive_dependency_test.dart b/utils/tests/pub/update/hosted/remove_removed_transitive_dependency_test.dart
index 38970d2..2f98b51 100644
--- a/utils/tests/pub/update/hosted/remove_removed_transitive_dependency_test.dart
+++ b/utils/tests/pub/update/hosted/remove_removed_transitive_dependency_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("removes a transitive dependency that's no longer depended on", () {
diff --git a/utils/tests/pub/update/hosted/unlock_dependers_test.dart b/utils/tests/pub/update/hosted/unlock_dependers_test.dart
index 0a9510f..64f58cd 100644
--- a/utils/tests/pub/update/hosted/unlock_dependers_test.dart
+++ b/utils/tests/pub/update/hosted/unlock_dependers_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("updates a locked package's dependers in order to get it to max "
diff --git a/utils/tests/pub/update/hosted/unlock_if_necessary_test.dart b/utils/tests/pub/update/hosted/unlock_if_necessary_test.dart
index ab43ad5..4525f82 100644
--- a/utils/tests/pub/update/hosted/unlock_if_necessary_test.dart
+++ b/utils/tests/pub/update/hosted/unlock_if_necessary_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("updates one locked pub server package's dependencies if it's "
diff --git a/utils/tests/pub/update/hosted/update_removed_constraints_test.dart b/utils/tests/pub/update/hosted/update_removed_constraints_test.dart
index 38ac584..b73347a 100644
--- a/utils/tests/pub/update/hosted/update_removed_constraints_test.dart
+++ b/utils/tests/pub/update/hosted/update_removed_constraints_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../../test_pub.dart';
-import '../../../../../pkg/unittest/unittest.dart';
+import '../../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   test("updates dependencies whose constraints have been removed", () {
diff --git a/utils/tests/pub/update/pub_update_test.dart b/utils/tests/pub/update/pub_update_test.dart
index 29d8ca1..f4900f5 100644
--- a/utils/tests/pub/update/pub_update_test.dart
+++ b/utils/tests/pub/update/pub_update_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import '../test_pub.dart';
-import '../../../../pkg/unittest/unittest.dart';
+import '../../../../pkg/unittest/lib/unittest.dart';
 
 main() {
   group('requires', () {
diff --git a/utils/tests/pub/version_solver_test.dart b/utils/tests/pub/version_solver_test.dart
index 4777aa41..8bec240 100644
--- a/utils/tests/pub/version_solver_test.dart
+++ b/utils/tests/pub/version_solver_test.dart
@@ -13,10 +13,11 @@
 import '../../pub/root_source.dart';
 import '../../pub/source.dart';
 import '../../pub/source_registry.dart';
+import '../../pub/system_cache.dart';
 import '../../pub/utils.dart';
 import '../../pub/version.dart';
 import '../../pub/version_solver.dart';
-import '../../../pkg/unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 
 final noVersion = 'no version';
 final disjointConstraint = 'disjoint';
@@ -353,14 +354,14 @@
     var isCouldNotSolveException = predicate((x)=> x is CouldNotSolveException,
             "is a CouldNotSolveException");
 
-    var sources = new SourceRegistry();
+    var cache = new SystemCache('.');
     source1 = new MockSource('mock1');
     source2 = new MockSource('mock2');
     versionlessSource = new MockVersionlessSource();
-    sources.register(source1);
-    sources.register(source2);
-    sources.register(versionlessSource);
-    sources.setDefault(source1.name);
+    cache.register(source1);
+    cache.register(source2);
+    cache.register(versionlessSource);
+    cache.sources.setDefault(source1.name);
 
     // Build the test package graph.
     var root;
@@ -380,7 +381,7 @@
         // remote server.
         root = package;
         rootSource = new RootSource(root);
-        sources.register(rootSource);
+        cache.register(rootSource);
       } else {
         source.addPackage(package);
       }
@@ -409,7 +410,7 @@
     }
 
     // Resolve the versions.
-    var future = resolveVersions(sources, root, realLockFile);
+    var future = resolveVersions(cache.sources, root, realLockFile);
 
     if (result != null) {
       expect(future, completion(predicate((actualResult) {
diff --git a/utils/tests/pub/version_test.dart b/utils/tests/pub/version_test.dart
index 314ab5b..d3fa7e5 100644
--- a/utils/tests/pub/version_test.dart
+++ b/utils/tests/pub/version_test.dart
@@ -4,7 +4,7 @@
 
 library version_test;
 
-import '../../../pkg/unittest/unittest.dart';
+import '../../../pkg/unittest/lib/unittest.dart';
 import '../../pub/utils.dart';
 import '../../pub/version.dart';
 
diff --git a/utils/tests/pub/yaml_test.dart b/utils/tests/pub/yaml_test.dart
index cb4e1be..a71c3ba 100644
--- a/utils/tests/pub/yaml_test.dart
+++ b/utils/tests/pub/yaml_test.dart
@@ -2,14 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#library('yaml_test');
+library yaml_test;
 
-#import('dart:math');
+import 'dart:math';
 
-#import('../../../pkg/unittest/unittest.dart');
-#import('../../pub/yaml/yaml.dart');
-#import('../../pub/yaml/deep_equals.dart');
-#import('../../../tests/utils/test_utils.dart');
+import '../../../pkg/unittest/lib/unittest.dart';
+import '../../pub/yaml/yaml.dart';
+import '../../pub/yaml/deep_equals.dart';
+import '../../../tests/utils/test_utils.dart';
 
 /** Constructs a new yaml.YamlMap, optionally from a normal Map. */
 Map yamlMap([Map from]) =>
@@ -44,8 +44,8 @@
       _expectKeyWorks(keyFn()) {
         var map = yamlMap();
         map[keyFn()] = 5;
-        Expect.isTrue(map.containsKey(keyFn()));
-        Expect.equals(5, map[keyFn()]);
+        expect(map.containsKey(keyFn()), isTrue);
+        expect(map[keyFn()], 5);
       }
 
       test('null', () => _expectKeyWorks(() => null));
@@ -59,14 +59,14 @@
     test('works as a hash key', () {
       var normalMap = new Map();
       normalMap[yamlMap({'foo': 'bar'})] = 'baz';
-      Expect.isTrue(normalMap.containsKey(yamlMap({'foo': 'bar'})));
-      Expect.equals('baz', normalMap[yamlMap({'foo': 'bar'})]);
+      expect(normalMap.containsKey(yamlMap({'foo': 'bar'})), isTrue);
+      expect(normalMap[yamlMap({'foo': 'bar'})], 'baz');
     });
 
     test('treats YamlMap keys the same as normal maps', () {
       var map = yamlMap();
       map[{'a': 'b'}] = 5;
-      Expect.equals(5, map[yamlMap({'a': 'b'})]);
+      expect(map[yamlMap({'a': 'b'})], 5);
     });
   });
 
