diff --git a/CHANGELOG.md b/CHANGELOG.md
index 70ee965..b1b1823 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,6 +14,7 @@
 * `dart:io`: Added functions `File.lastAccessed`, `File.lastAccessedSync`,
   `File.setLastModified`, `File.setLastModifiedSync`, `File.setLastAccessed`,
   and `File.setLastAccessedSync`.
+* `dart:io`: Added `Platform.ansiSupported`.
 
 
 ### Dart VM
@@ -28,17 +29,24 @@
   * The `dartanalyzer` now follows the same rules as the analysis server to find an analysis options file,
     stopping when an analysis options file is found:
     * Search up the directory hierarchy looking for an analysis options file.
-    * If analyzing a project referencing the [Flutter](https://flutter.io/) package, then use the 
+    * If analyzing a project referencing the [Flutter](https://flutter.io/) package, then use the
       [default Flutter analysis options](https://github.com/flutter/flutter/blob/master/packages/flutter/lib/analysis_options_user.yaml)
       found in `package:flutter`.
     * If in a Bazel workspace, then use the analysis options in `package:dart.analysis_options/default.yaml` if it exists.
     * Use the default analysis options rules.
   * In addition, specific to `dartanalyzer`:
-    * an analysis options file can be specified on the command line via `--options` 
+    * an analysis options file can be specified on the command line via `--options`
       and that file will be used instead of searching for an analysis options file.
-    * any analysis option specified on the command line (e.g. `--strong` or `--no-strong`) 
+    * any analysis option specified on the command line (e.g. `--strong` or `--no-strong`)
       takes precedence over any corresponding value specified in the analysis options file.
 
+* Dartium, dart2js, and DDC
+
+  * Imports to `dart:io` are allowed, but the imported library is not supported
+    and will likely fail on most APIs at runtime. This change was made as a
+    stopgap measure to make it easier to write libraries that share code between
+    platforms (like package `http`). This might change again when configuration
+    specific imports are supported.
 
 ## 1.22.0 - 2017-02-14
 
diff --git a/DEPS b/DEPS
index b09e671..c8e604c 100644
--- a/DEPS
+++ b/DEPS
@@ -91,11 +91,11 @@
   "ply_rev": "@604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "@1.3.0",
   "protobuf_tag": "@0.5.3",
-  "pub_rev": "@53327f4a7ca2ddd20a40f6a94db61ac136371b03",
+  "pub_rev": "@58da7fa8d16af488ae52b89b1d4227064a51a541",
   "pub_semver_tag": "@1.3.2",
   "quiver_tag": "@0.22.0",
   "resource_rev":"@a49101ba2deb29c728acba6fb86000a8f730f4b1",
-  "root_certificates_rev": "@0068d8911140e591ebb750af296e81940a9906f5",
+  "root_certificates_rev": "@a4c7c6f23a664a37bc1b6f15a819e3f2a292791a",
   "scheduled_test_tag": "@0.12.9",
   "shelf_static_tag": "@0.2.4",
   "shelf_packages_handler_tag": "@1.0.0",
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_locator.dart b/pkg/analysis_server/lib/src/plugin/plugin_locator.dart
index ac7c1f0..968ee53 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_locator.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_locator.dart
@@ -65,10 +65,12 @@
         YamlNode contents = document.contents;
         if (contents is YamlMap) {
           String pluginPath = contents[analysisPluginKey];
-          Folder pluginFolder =
-              packageFolder.getChildAssumingFolder(pluginPath);
-          if (pluginFolder.exists) {
-            return pluginFolder.path;
+          if (pluginPath != null) {
+            Folder pluginFolder =
+                packageFolder.getChildAssumingFolder(pluginPath);
+            if (pluginFolder.exists) {
+              return pluginFolder.path;
+            }
           }
         }
       } catch (exception) {
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
new file mode 100644
index 0000000..7275e20
--- /dev/null
+++ b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
@@ -0,0 +1,153 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for 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 'package:analysis_server/src/plugin/plugin_locator.dart';
+import 'package:analysis_server/src/plugin/plugin_manager.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/util/absolute_path.dart';
+import 'package:analyzer_plugin/protocol/protocol_generated.dart';
+
+/**
+ * An object that watches the results produced by analysis drivers to identify
+ * references to previously unseen packages and, if those packages have plugins
+ * associated with them, causes the plugin to be associated with the driver's
+ * context root (which in turn might cause the plugin to be started).
+ */
+class PluginWatcher {
+  /**
+   * The resource provider used to access the file system.
+   */
+  final ResourceProvider resourceProvider;
+
+  /**
+   * The object managing the execution of plugins.
+   */
+  final PluginManager manager;
+
+  /**
+   * The object used to locate plugins within packages.
+   */
+  final PluginLocator _locator;
+
+  /**
+   * A table mapping analysis drivers to information related to the driver.
+   */
+  Map<AnalysisDriver, _DriverInfo> _driverInfo =
+      <AnalysisDriver, _DriverInfo>{};
+
+  /**
+   * Initialize a newly created plugin watcher.
+   */
+  PluginWatcher(this.resourceProvider, this.manager)
+      : _locator = new PluginLocator(resourceProvider);
+
+  /**
+   * The context manager has just added the given analysis [driver]. This method
+   * must be called before the driver has been allowed to perform any analysis.
+   */
+  void addedDriver(AnalysisDriver driver, ContextRoot contextRoot) {
+    _driverInfo[driver] = new _DriverInfo(
+        contextRoot, <String>[contextRoot.root, _getSdkPath(driver)]);
+    driver.results.listen((AnalysisResult result) {
+      List<String> addedPluginPaths = _checkPluginsFor(driver);
+      for (String pluginPath in addedPluginPaths) {
+        manager.addPluginToContextRoot(contextRoot, pluginPath);
+      }
+    });
+  }
+
+  /**
+   * The context manager has just removed the given analysis [driver].
+   */
+  void removedDriver(AnalysisDriver driver) {
+    _DriverInfo info = _driverInfo[driver];
+    if (info == null) {
+      throw new StateError('Cannot remove a driver that was not added');
+    }
+    manager.removedContextRoot(info.contextRoot);
+    _driverInfo.remove(driver);
+  }
+
+  /**
+   * Check all of the files that have been analyzed so far by the given [driver]
+   * to see whether any of them are in a package that had not previously been
+   * seen that defines a plugin. Return a list of the roots of all such plugins
+   * that are found.
+   */
+  List<String> _checkPluginsFor(AnalysisDriver driver) {
+    AbsolutePathContext context = resourceProvider.absolutePathContext;
+    List<String> packageRoots = _driverInfo[driver].packageRoots;
+
+    bool isInRoot(String path) {
+      for (String root in packageRoots) {
+        if (context.isWithin(root, path)) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    String getPackageRoot(String path, Uri uri) {
+      List<String> segments = uri.pathSegments.toList();
+      segments[0] = 'lib';
+      String suffix = resourceProvider.pathContext.joinAll(segments);
+      return path.substring(0, path.length - suffix.length - 1);
+    }
+
+    List<String> addedPluginPaths = <String>[];
+    for (FileState state in driver.fsState.knownFiles) {
+      String path = state.path;
+      if (!isInRoot(path)) {
+        // Found a file not in a previously known package.
+        Uri uri = state.uri;
+        if (PackageMapUriResolver.isPackageUri(uri)) {
+          String packageRoot = getPackageRoot(path, uri);
+          packageRoots.add(packageRoot);
+          String pluginPath = _locator.findPlugin(packageRoot);
+          if (pluginPath != null) {
+            addedPluginPaths.add(pluginPath);
+          }
+        }
+      }
+    }
+    return addedPluginPaths;
+  }
+
+  /**
+   * Return the path to the root of the SDK being used by the given analysis
+   * [driver].
+   */
+  String _getSdkPath(AnalysisDriver driver) {
+    AbsolutePathContext context = resourceProvider.absolutePathContext;
+    String sdkRoot = driver.sourceFactory.forUri('dart:core').fullName;
+    while (sdkRoot.isNotEmpty && context.basename(sdkRoot) != 'lib') {
+      sdkRoot = context.dirname(sdkRoot);
+    }
+    return sdkRoot;
+  }
+}
+
+/**
+ * Information related to an analysis driver.
+ */
+class _DriverInfo {
+  /**
+   * The context root representing the context being analyzed by the driver.
+   */
+  final ContextRoot contextRoot;
+
+  /**
+   * A list of the absolute paths of directories inside of which we have already
+   * searched for a plugin.
+   */
+  final List<String> packageRoots;
+
+  /**
+   * Initialize a newly created information holder.
+   */
+  _DriverInfo(this.contextRoot, this.packageRoots);
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 9c19900..34bd735 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -598,7 +598,7 @@
       // In the future consider better values than null for specific element types.
       sb.append('$paramName: null');
 
-      _insertBuilder(sb, targetElement);
+      _insertBuilder(sb, null);
       _addFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, [paramName]);
     }
   }
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index ecbd880..6c41464 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -77,13 +77,19 @@
 ''');
   }
 
-  assertHasFix(FixKind kind, String expected) async {
+  assertHasFix(FixKind kind, String expected, {String target}) async {
     AnalysisError error = await _findErrorToFix();
     fix = await _assertHasFix(kind, error);
     change = fix.change;
+
     // apply to "file"
     List<SourceFileEdit> fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
+
+    if (target != null) {
+      expect(target, fileEdits.first.file);
+    }
+
     resultCode = SourceEdit.applySequence(testCode, change.edits[0].edits);
     // verify
     expect(resultCode, expected);
@@ -429,13 +435,20 @@
 
   test_addMissingRequiredArg_cons_single() async {
     _addMetaPackageSource();
-
-    await resolveTestUnit('''
+    addSource(
+        '/libA.dart',
+        r'''
+library libA;
 import 'package:meta/meta.dart';
 
 class A {
   A({@required int a}) {}
 }
+''');
+
+    await resolveTestUnit('''
+import 'libA.dart';
+
 main() {
   A a = new A();
 }
@@ -443,15 +456,13 @@
     await assertHasFix(
         DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT,
         '''
-import 'package:meta/meta.dart';
+import 'libA.dart';
 
-class A {
-  A({@required int a}) {}
-}
 main() {
   A a = new A(a: null);
 }
-''');
+''',
+        target: '/test.dart');
   }
 
   test_addMissingRequiredArg_multiple() async {
diff --git a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
new file mode 100644
index 0000000..27f76c2
--- /dev/null
+++ b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
@@ -0,0 +1,150 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for 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:async';
+import 'dart:typed_data';
+
+import 'package:analysis_server/src/plugin/plugin_manager.dart';
+import 'package:analysis_server/src/plugin/plugin_watcher.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer_plugin/protocol/protocol_generated.dart';
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../mock_sdk.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(PluginWatcherTest);
+  });
+}
+
+@reflectiveTest
+class PluginWatcherTest {
+  MemoryResourceProvider resourceProvider;
+  TestPluginManager manager;
+  PluginWatcher watcher;
+
+  void setUp() {
+    resourceProvider = new MemoryResourceProvider();
+    manager = new TestPluginManager();
+    watcher = new PluginWatcher(resourceProvider, manager);
+  }
+
+  test_addedDriver() async {
+    String pkg1Path = resourceProvider.convertPath('/pkg1');
+    ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
+    TestDriver driver = new TestDriver(resourceProvider, contextRoot);
+    watcher.addedDriver(driver, contextRoot);
+    expect(manager.addedContextRoots, isEmpty);
+    //
+    // Test to see whether the listener was configured correctly.
+    //
+    // Use a file in the package being analyzed.
+    //
+    resourceProvider.newFile(
+        resourceProvider.convertPath('/pkg1/lib/test1.dart'), '');
+    await driver.computeResult('package:pkg1/test1.dart');
+    expect(manager.addedContextRoots, isEmpty);
+    //
+    // Use a file that imports a package with a plugin.
+    //
+    resourceProvider.newFile(
+        resourceProvider.convertPath('/pkg2/lib/pkg2.dart'), '');
+    resourceProvider.newFile(
+        resourceProvider.convertPath('/pkg2/pubspec.yaml'), 'name: pkg2');
+    resourceProvider.newFile(
+        resourceProvider
+            .convertPath('/pkg2/tools/analysis_plugin/bin/plugin.dart'),
+        '');
+    await driver.computeResult('package:pkg2/pk2.dart');
+    expect(manager.addedContextRoots, hasLength(1));
+  }
+
+  void test_creation() {
+    expect(watcher.resourceProvider, resourceProvider);
+    expect(watcher.manager, manager);
+  }
+
+  test_removedDriver() {
+    String pkg1Path = resourceProvider.convertPath('/pkg1');
+    ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
+    TestDriver driver = new TestDriver(resourceProvider, contextRoot);
+    watcher.addedDriver(driver, contextRoot);
+    watcher.removedDriver(driver);
+    expect(manager.removedContextRoots, equals([contextRoot]));
+  }
+}
+
+class TestDriver implements AnalysisDriver {
+  final MemoryResourceProvider resourceProvider;
+
+  SourceFactory sourceFactory;
+  FileSystemState fsState;
+
+  final _resultController = new StreamController<AnalysisResult>();
+
+  TestDriver(this.resourceProvider, ContextRoot contextRoot) {
+    path.Context pathContext = resourceProvider.pathContext;
+    MockSdk sdk = new MockSdk(resourceProvider: resourceProvider);
+    String packageName = pathContext.basename(contextRoot.root);
+    String libPath = pathContext.join(contextRoot.root, 'lib');
+    sourceFactory = new SourceFactory([
+      new DartUriResolver(sdk),
+      new PackageMapUriResolver(resourceProvider, {
+        packageName: [resourceProvider.getFolder(libPath)],
+        'pkg2': [
+          resourceProvider.getFolder(resourceProvider.convertPath('/pkg2/lib'))
+        ]
+      })
+    ]);
+    fsState = new FileSystemState(
+        new PerformanceLog(null),
+        new MemoryByteStore(),
+        null,
+        resourceProvider,
+        sourceFactory,
+        new AnalysisOptionsImpl(),
+        new Uint32List(0));
+  }
+
+  Stream<AnalysisResult> get results => _resultController.stream;
+
+  Future<Null> computeResult(String uri) {
+    FileState file = fsState.getFileForUri(Uri.parse(uri));
+    AnalysisResult result = new AnalysisResult(this, null, file.path, null,
+        true, null, null, null, null, null, null, null);
+    _resultController.add(result);
+    return new Future.delayed(new Duration(milliseconds: 1));
+  }
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+class TestPluginManager implements PluginManager {
+  List<ContextRoot> addedContextRoots = <ContextRoot>[];
+
+  List<ContextRoot> removedContextRoots = <ContextRoot>[];
+
+  @override
+  Future<Null> addPluginToContextRoot(
+      ContextRoot contextRoot, String path) async {
+    addedContextRoots.add(contextRoot);
+    return null;
+  }
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  @override
+  void removedContextRoot(ContextRoot contextRoot) {
+    removedContextRoots.add(contextRoot);
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 8090044..718f943 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -7537,7 +7537,7 @@
   @override
   Object visitGenericFunctionType(GenericFunctionType node) {
     _visitNode(node.returnType);
-    _writer.print(' Function ');
+    _writer.print(' Function');
     _visitNode(node.typeParameters);
     _visitNode(node.parameters);
     return null;
@@ -7880,7 +7880,10 @@
     _visitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
     _visitTokenWithSuffix(node.covariantKeyword, ' ');
     _visitTokenWithSuffix(node.keyword, " ");
-    _visitNodeWithSuffix(node.type, " ");
+    _visitNode(node.type);
+    if (node.type != null && node.identifier != null) {
+      _writer.print(' ');
+    }
     _visitNode(node.identifier);
     return null;
   }
@@ -8847,7 +8850,7 @@
   @override
   Object visitGenericFunctionType(GenericFunctionType node) {
     safelyVisitNode(node.returnType);
-    sink.write(' Function ');
+    sink.write(' Function');
     safelyVisitNode(node.typeParameters);
     safelyVisitNode(node.parameters);
     return null;
@@ -9190,7 +9193,10 @@
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
     safelyVisitTokenWithSuffix(node.covariantKeyword, ' ');
     safelyVisitTokenWithSuffix(node.keyword, " ");
-    safelyVisitNodeWithSuffix(node.type, " ");
+    safelyVisitNode(node.type);
+    if (node.type != null && node.identifier != null) {
+      sink.write(' ');
+    }
     safelyVisitNode(node.identifier);
     return null;
   }
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
index 115bad5..b0c28c6 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -612,6 +612,23 @@
           identifier: identifier3(identifier),
           parameters: formalParameterList(parameters));
 
+  static GenericFunctionType genericFunctionType(TypeAnnotation returnType,
+          TypeParameterList typeParameters, FormalParameterList parameters) =>
+      astFactory.genericFunctionType(returnType,
+          TokenFactory.tokenFromString("Function"), typeParameters, parameters);
+
+  static GenericTypeAlias genericTypeAlias(String name,
+          TypeParameterList typeParameters, GenericFunctionType functionType) =>
+      astFactory.genericTypeAlias(
+          null,
+          null,
+          TokenFactory.tokenFromKeyword(Keyword.TYPEDEF),
+          identifier3(name),
+          typeParameters,
+          TokenFactory.tokenFromType(TokenType.EQ),
+          functionType,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
   static HideCombinator hideCombinator(List<SimpleIdentifier> identifiers) =>
       astFactory.hideCombinator(
           TokenFactory.tokenFromString("hide"), identifiers);
@@ -1069,7 +1086,8 @@
           keyword:
               keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
           type: type,
-          identifier: identifier3(parameterName));
+          identifier:
+              parameterName == null ? null : identifier3(parameterName));
 
   static SimpleFormalParameter simpleFormalParameter3(String parameterName) =>
       simpleFormalParameter2(null, null, parameterName);
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index a3cd302..0945db2 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -436,6 +436,16 @@
     return null;
   }
 
+  @override
+  MethodElement getMethod(String methodName) {
+    for (MethodElement method in methods) {
+      if (method.name == methodName) {
+        return method;
+      }
+    }
+    return null;
+  }
+
   /**
    * Perform type inference and cycle detection on this class and
    * store the resulting information in [compilationUnit].
@@ -644,16 +654,6 @@
   }
 
   @override
-  MethodElement getMethod(String methodName) {
-    for (MethodElement method in methods) {
-      if (method.name == methodName) {
-        return method;
-      }
-    }
-    return null;
-  }
-
-  @override
   void link(CompilationUnitElementInBuildUnit compilationUnit) {
     for (ConstructorElementForLink constructorElement in constructors) {
       constructorElement.link(compilationUnit);
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index a9da17f..6a41a02 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -95,13 +95,6 @@
 
   @override
   @failingTest
-  void test_parseConstructor_with_pseudo_function_literal() {
-    // TODO(paulberry): Expected: an object with length of <1>
-    super.test_parseConstructor_with_pseudo_function_literal();
-  }
-
-  @override
-  @failingTest
   void test_parseConstructorFieldInitializer_qualified() {
     // TODO(paulberry): Unhandled event: ThisExpression
     super.test_parseConstructorFieldInitializer_qualified();
@@ -1112,66 +1105,12 @@
 
   @override
   @failingTest
-  void test_parseForStatement_loop_c() {
-    super.test_parseForStatement_loop_c();
-  }
-
-  @override
-  @failingTest
-  void test_parseForStatement_loop_cu() {
-    super.test_parseForStatement_loop_cu();
-  }
-
-  @override
-  @failingTest
-  void test_parseForStatement_loop_ecu() {
-    super.test_parseForStatement_loop_ecu();
-  }
-
-  @override
-  @failingTest
-  void test_parseForStatement_loop_i() {
-    super.test_parseForStatement_loop_i();
-  }
-
-  @override
-  @failingTest
   void test_parseForStatement_loop_i_withMetadata() {
     super.test_parseForStatement_loop_i_withMetadata();
   }
 
   @override
   @failingTest
-  void test_parseForStatement_loop_ic() {
-    super.test_parseForStatement_loop_ic();
-  }
-
-  @override
-  @failingTest
-  void test_parseForStatement_loop_icu() {
-    super.test_parseForStatement_loop_icu();
-  }
-
-  @override
-  @failingTest
-  void test_parseForStatement_loop_iicuu() {
-    super.test_parseForStatement_loop_iicuu();
-  }
-
-  @override
-  @failingTest
-  void test_parseForStatement_loop_iu() {
-    super.test_parseForStatement_loop_iu();
-  }
-
-  @override
-  @failingTest
-  void test_parseForStatement_loop_u() {
-    super.test_parseForStatement_loop_u();
-  }
-
-  @override
-  @failingTest
   void test_parseNonLabeledStatement_functionDeclaration() {
     super.test_parseNonLabeledStatement_functionDeclaration();
   }
@@ -1332,16 +1271,6 @@
 
   @override
   @failingTest
-  void
-      test_parseCompilationUnitMember_function_generic_noReturnType_annotated() {
-    // TODO(paulberry,ahe): Fasta doesn't appear to support annotated type
-    // parameters.
-    super
-        .test_parseCompilationUnitMember_function_generic_noReturnType_annotated();
-  }
-
-  @override
-  @failingTest
   void test_parseDirectives_mixed() {
     // TODO(paulberry,ahe): This test verifies the analyzer parser's ability to
     // stop parsing as soon as the first non-directive is encountered; this is
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 264cb69..517a895 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -1092,6 +1092,33 @@
     expect(constructor.body, new isInstanceOf<EmptyFunctionBody>());
   }
 
+  void test_parseConstructor_initializers_field() {
+    createParser('C(x, y) : _x = x, this._y = y;');
+    ClassMember member = parser.parseClassMember('C');
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ConstructorDeclaration>());
+    ConstructorDeclaration constructor = member as ConstructorDeclaration;
+    NodeList<ConstructorInitializer> initializers = constructor.initializers;
+    expect(initializers, hasLength(2));
+
+    {
+      var initializer = initializers[0] as ConstructorFieldInitializer;
+      expect(initializer.thisKeyword, isNull);
+      expect(initializer.period, isNull);
+      expect(initializer.fieldName.name, '_x');
+      expect(initializer.expression, isNotNull);
+    }
+
+    {
+      var initializer = initializers[1] as ConstructorFieldInitializer;
+      expect(initializer.thisKeyword, isNotNull);
+      expect(initializer.period, isNotNull);
+      expect(initializer.fieldName.name, '_y');
+      expect(initializer.expression, isNotNull);
+    }
+  }
+
   void test_parseConstructor_assert() {
     enableAssertInitializer = true;
     createParser('C(x, y) : _x = x, assert (x < y), _y = y;');
@@ -14729,6 +14756,17 @@
     expectCommentText(typeAlias.documentationComment, '/// Doc');
   }
 
+  void test_parseTypeVariable_withDocumentationComment() {
+    createParser('''
+class A<
+    /// Doc
+    B> {}
+''');
+    var classDeclaration = parseFullCompilationUnitMember() as ClassDeclaration;
+    var typeVariable = classDeclaration.typeParameters.typeParameters[0];
+    expectCommentText(typeVariable.documentationComment, '/// Doc');
+  }
+
   /**
    * Assert that the given [name] is in declaration context.
    */
diff --git a/pkg/analyzer/test/src/dart/ast/utilities_test.dart b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
index 2f07775..83a8b97 100644
--- a/pkg/analyzer/test/src/dart/ast/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
@@ -2509,6 +2509,33 @@
             parameters: AstTestFactory.formalParameterList([])));
   }
 
+  void test_visitGenericFunctionType() {
+    _assertSource(
+        "int Function<T>(T)",
+        AstTestFactory.genericFunctionType(
+            AstTestFactory.typeName4("int"),
+            AstTestFactory.typeParameterList(['T']),
+            AstTestFactory.formalParameterList([
+              AstTestFactory.simpleFormalParameter4(
+                  AstTestFactory.typeName4("T"), null)
+            ])));
+  }
+
+  void test_visitGenericTypeAlias() {
+    _assertSource(
+        "typedef X<S> = S Function<T>(T)",
+        AstTestFactory.genericTypeAlias(
+            'X',
+            AstTestFactory.typeParameterList(['S']),
+            AstTestFactory.genericFunctionType(
+                AstTestFactory.typeName4("S"),
+                AstTestFactory.typeParameterList(['T']),
+                AstTestFactory.formalParameterList([
+                  AstTestFactory.simpleFormalParameter4(
+                      AstTestFactory.typeName4("T"), null)
+                ]))));
+  }
+
   void test_visitIfStatement_withElse() {
     _assertSource(
         "if (c) {} else {}",
@@ -4858,6 +4885,33 @@
             parameters: AstTestFactory.formalParameterList([])));
   }
 
+  void test_visitGenericFunctionType() {
+    _assertSource(
+        "int Function<T>(T)",
+        AstTestFactory.genericFunctionType(
+            AstTestFactory.typeName4("int"),
+            AstTestFactory.typeParameterList(['T']),
+            AstTestFactory.formalParameterList([
+              AstTestFactory.simpleFormalParameter4(
+                  AstTestFactory.typeName4("T"), null)
+            ])));
+  }
+
+  void test_visitGenericTypeAlias() {
+    _assertSource(
+        "typedef X<S> = S Function<T>(T)",
+        AstTestFactory.genericTypeAlias(
+            'X',
+            AstTestFactory.typeParameterList(['S']),
+            AstTestFactory.genericFunctionType(
+                AstTestFactory.typeName4("S"),
+                AstTestFactory.typeParameterList(['T']),
+                AstTestFactory.formalParameterList([
+                  AstTestFactory.simpleFormalParameter4(
+                      AstTestFactory.typeName4("T"), null)
+                ]))));
+  }
+
   void test_visitIfStatement_withElse() {
     _assertSource(
         "if (c) {} else {}",
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 5cbe2e9..5d2a096 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -5483,6 +5483,36 @@
     }
   }
 
+  test_constExpr_pushReference_enum_method() {
+    var library = checkLibrary('''
+enum E {a}
+final vToString = E.a.toString();
+''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E a;
+}
+final String vToString;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E a;
+}
+final dynamic vToString;
+''');
+    }
+  }
+
   test_constExpr_pushReference_field_simpleIdentifier() {
     var library = checkLibrary('''
 class C {
diff --git a/pkg/compiler/bin/resolver.dart b/pkg/compiler/bin/resolver.dart
index 428508b..30d715b 100644
--- a/pkg/compiler/bin/resolver.dart
+++ b/pkg/compiler/bin/resolver.dart
@@ -27,8 +27,7 @@
       .map((uri) => currentDirectory.resolve(nativeToUriPath(uri)))
       .toList();
 
-  var text = await resolve(
-      inputs,
+  var text = await resolve(inputs,
       deps: args['deps'],
       root: args['library-root'],
       packages: args['packages'],
diff --git a/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart b/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart
index a18ce66..6fc156d 100644
--- a/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/generated/shared_messages.dart
@@ -11,98 +11,95 @@
 */
 import '../messages.dart' show MessageKind, MessageTemplate;
 
-const Map<MessageKind, MessageTemplate> TEMPLATES = const <MessageKind, MessageTemplate>{ 
+const Map<MessageKind, MessageTemplate> TEMPLATES =
+    const <MessageKind, MessageTemplate>{
   MessageKind.CONST_CONSTRUCTOR_WITH_BODY: const MessageTemplate(
-    MessageKind.CONST_CONSTRUCTOR_WITH_BODY,
-    "Const constructor can't have a body.",
-    howToFix: "Try removing the 'const' keyword or the body.",
-    examples: const [
-      r"""
+      MessageKind.CONST_CONSTRUCTOR_WITH_BODY,
+      "Const constructor can't have a body.",
+      howToFix: "Try removing the 'const' keyword or the body.",
+      examples: const [
+        r"""
          class C {
            const C() {}
          }
 
          main() => new C();""",
-    ]
-  ),  // Generated. Don't edit.
-  MessageKind.CONST_FACTORY: const MessageTemplate(
-    MessageKind.CONST_FACTORY,
-    "Only redirecting factory constructors can be declared to be 'const'.",
-    howToFix: "Try removing the 'const' keyword or replacing the body with '=' followed by a valid target.",
-    examples: const [
-      r"""
+      ]), // Generated. Don't edit.
+  MessageKind.CONST_FACTORY: const MessageTemplate(MessageKind.CONST_FACTORY,
+      "Only redirecting factory constructors can be declared to be 'const'.",
+      howToFix:
+          "Try removing the 'const' keyword or replacing the body with '=' followed by a valid target.",
+      examples: const [
+        r"""
          class C {
            const factory C() {}
          }
 
          main() => new C();""",
-    ]
-  ),  // Generated. Don't edit.
+      ]), // Generated. Don't edit.
   MessageKind.EXTRANEOUS_MODIFIER: const MessageTemplate(
-    MessageKind.EXTRANEOUS_MODIFIER,
-    "Can't have modifier '#{modifier}' here.",
-    howToFix: "Try removing '#{modifier}'.",
-    examples: const [
-      "var String foo; main(){}",
-      "var set foo; main(){}",
-      "var final foo; main(){}",
-      "var var foo; main(){}",
-      "var const foo; main(){}",
-      "var abstract foo; main(){}",
-      "var static foo; main(){}",
-      "var external foo; main(){}",
-      "get var foo; main(){}",
-      "set var foo; main(){}",
-      "final var foo; main(){}",
-      "var var foo; main(){}",
-      "const var foo; main(){}",
-      "abstract var foo; main(){}",
-      "static var foo; main(){}",
-      "external var foo; main(){}",
-    ]
-  ),  // Generated. Don't edit.
+      MessageKind.EXTRANEOUS_MODIFIER,
+      "Can't have modifier '#{modifier}' here.",
+      howToFix: "Try removing '#{modifier}'.",
+      examples: const [
+        "var String foo; main(){}",
+        "var set foo; main(){}",
+        "var final foo; main(){}",
+        "var var foo; main(){}",
+        "var const foo; main(){}",
+        "var abstract foo; main(){}",
+        "var static foo; main(){}",
+        "var external foo; main(){}",
+        "get var foo; main(){}",
+        "set var foo; main(){}",
+        "final var foo; main(){}",
+        "var var foo; main(){}",
+        "const var foo; main(){}",
+        "abstract var foo; main(){}",
+        "static var foo; main(){}",
+        "external var foo; main(){}",
+      ]), // Generated. Don't edit.
   MessageKind.EXTRANEOUS_MODIFIER_REPLACE: const MessageTemplate(
-    MessageKind.EXTRANEOUS_MODIFIER_REPLACE,
-    "Can't have modifier '#{modifier}' here.",
-    howToFix: "Try replacing modifier '#{modifier}' with 'var', 'final', or a type.",
-    examples: const [
-      "set foo; main(){}",
-      "abstract foo; main(){}",
-      "static foo; main(){}",
-      "external foo; main(){}",
-    ]
-  ),  // Generated. Don't edit.
+      MessageKind.EXTRANEOUS_MODIFIER_REPLACE,
+      "Can't have modifier '#{modifier}' here.",
+      howToFix:
+          "Try replacing modifier '#{modifier}' with 'var', 'final', or a type.",
+      examples: const [
+        "set foo; main(){}",
+        "abstract foo; main(){}",
+        "static foo; main(){}",
+        "external foo; main(){}",
+      ]), // Generated. Don't edit.
   MessageKind.CONSTRUCTOR_WITH_RETURN_TYPE: const MessageTemplate(
-    MessageKind.CONSTRUCTOR_WITH_RETURN_TYPE,
-    "Constructors can't have a return type.",
-    howToFix: "Try removing the return type.",
-    examples: const [
-      "class A { int A() {} } main() { new A(); }",
-    ]
-  ),  // Generated. Don't edit.
+      MessageKind.CONSTRUCTOR_WITH_RETURN_TYPE,
+      "Constructors can't have a return type.",
+      howToFix: "Try removing the return type.",
+      examples: const [
+        "class A { int A() {} } main() { new A(); }",
+      ]), // Generated. Don't edit.
   MessageKind.MISSING_EXPRESSION_IN_THROW: const MessageTemplate(
-    MessageKind.MISSING_EXPRESSION_IN_THROW,
-    "Missing expression after 'throw'.",
-    howToFix: "Did you mean 'rethrow'?",
-    examples: const [
-      "main() { throw; }",
-      "main() { try { throw 0; } catch(e) { throw; } }",
-    ]
-  ),  // Generated. Don't edit.
+      MessageKind.MISSING_EXPRESSION_IN_THROW,
+      "Missing expression after 'throw'.",
+      howToFix: "Did you mean 'rethrow'?",
+      examples: const [
+        "main() { throw; }",
+        "main() { try { throw 0; } catch(e) { throw; } }",
+      ]), // Generated. Don't edit.
   MessageKind.RETHROW_OUTSIDE_CATCH: const MessageTemplate(
-    MessageKind.RETHROW_OUTSIDE_CATCH,
-    "Rethrow must be inside of catch clause.",
-    howToFix: "Try moving the expression into a catch clause, or using a 'throw' expression.",
-    examples: const [
-      "main() { rethrow; }",
-    ]
-  ),  // Generated. Don't edit.
+      MessageKind.RETHROW_OUTSIDE_CATCH,
+      "Rethrow must be inside of catch clause.",
+      howToFix:
+          "Try moving the expression into a catch clause, or using a 'throw' expression.",
+      examples: const [
+        "main() { rethrow; }",
+      ]), // Generated. Don't edit.
   MessageKind.RETURN_IN_GENERATIVE_CONSTRUCTOR: const MessageTemplate(
-    MessageKind.RETURN_IN_GENERATIVE_CONSTRUCTOR,
-    "Constructors can't return values.",
-    howToFix: "Try removing the return statement or using a factory constructor.",
-    examples: const [
-      r"""
+      MessageKind.RETURN_IN_GENERATIVE_CONSTRUCTOR,
+      "Constructors can't return values.",
+      howToFix:
+          "Try removing the return statement or using a factory constructor.",
+      examples: const [
+        r"""
         class C {
           C() {
             return 1;
@@ -110,130 +107,118 @@
         }
 
         main() => new C();""",
-    ]
-  ),  // Generated. Don't edit.
+      ]), // Generated. Don't edit.
   MessageKind.RETURN_IN_GENERATOR: const MessageTemplate(
-    MessageKind.RETURN_IN_GENERATOR,
-    "Can't return a value from a generator function (using the '#{modifier}' modifier).",
-    howToFix: "Try removing the value, replacing 'return' with 'yield' or changing the method body modifier.",
-    examples: const [
-      r"""
+      MessageKind.RETURN_IN_GENERATOR,
+      "Can't return a value from a generator function (using the '#{modifier}' modifier).",
+      howToFix:
+          "Try removing the value, replacing 'return' with 'yield' or changing the method body modifier.",
+      examples: const [
+        r"""
         foo() async* { return 0; }
         main() => foo();
         """,
-      r"""
+        r"""
         foo() sync* { return 0; }
         main() => foo();
         """,
-    ]
-  ),  // Generated. Don't edit.
-  MessageKind.NOT_ASSIGNABLE: const MessageTemplate(
-    MessageKind.NOT_ASSIGNABLE,
-    "'#{fromType}' is not assignable to '#{toType}'."  ),  // Generated. Don't edit.
+      ]), // Generated. Don't edit.
+  MessageKind.NOT_ASSIGNABLE: const MessageTemplate(MessageKind.NOT_ASSIGNABLE,
+      "'#{fromType}' is not assignable to '#{toType}'."), // Generated. Don't edit.
   MessageKind.FORIN_NOT_ASSIGNABLE: const MessageTemplate(
-    MessageKind.FORIN_NOT_ASSIGNABLE,
-    "The element type '#{currentType}' of '#{expressionType}' is not assignable to '#{elementType}'.",
-    examples: const [
-      r"""
+      MessageKind.FORIN_NOT_ASSIGNABLE,
+      "The element type '#{currentType}' of '#{expressionType}' is not assignable to '#{elementType}'.",
+      examples: const [
+        r"""
         main() {
           List<int> list = <int>[1, 2];
           for (String x in list) x;
         }
         """,
-    ]
-  ),  // Generated. Don't edit.
-  MessageKind.CANNOT_RESOLVE: const MessageTemplate(
-    MessageKind.CANNOT_RESOLVE,
-    "Can't resolve '#{name}'."  ),  // Generated. Don't edit.
+      ]), // Generated. Don't edit.
+  MessageKind.CANNOT_RESOLVE: const MessageTemplate(MessageKind.CANNOT_RESOLVE,
+      "Can't resolve '#{name}'."), // Generated. Don't edit.
   MessageKind.UNDEFINED_METHOD: const MessageTemplate(
-    MessageKind.UNDEFINED_METHOD,
-    "The method '#{memberName}' is not defined for the class '#{className}'.",
-    examples: const [
-      r"""
+      MessageKind.UNDEFINED_METHOD,
+      "The method '#{memberName}' is not defined for the class '#{className}'.",
+      examples: const [
+        r"""
         class A {
           foo() { bar(); }
         }
         main() { new A().foo(); }
         """,
-    ]
-  ),  // Generated. Don't edit.
+      ]), // Generated. Don't edit.
   MessageKind.UNDEFINED_GETTER: const MessageTemplate(
-    MessageKind.UNDEFINED_GETTER,
-    "The getter '#{memberName}' is not defined for the class '#{className}'.",
-    examples: const [
-      "class A {} main() { new A().x; }",
-      "class A {} main() { A.x; }",
-    ]
-  ),  // Generated. Don't edit.
+      MessageKind.UNDEFINED_GETTER,
+      "The getter '#{memberName}' is not defined for the class '#{className}'.",
+      examples: const [
+        "class A {} main() { new A().x; }",
+        "class A {} main() { A.x; }",
+      ]), // Generated. Don't edit.
   MessageKind.UNDEFINED_INSTANCE_GETTER_BUT_SETTER: const MessageTemplate(
-    MessageKind.UNDEFINED_INSTANCE_GETTER_BUT_SETTER,
-    "The setter '#{memberName}' in class '#{className}' can not be used as a getter.",
-    examples: const [
-      "class A { set x(y) {} } main() { new A().x; }",
-    ]
-  ),  // Generated. Don't edit.
+      MessageKind.UNDEFINED_INSTANCE_GETTER_BUT_SETTER,
+      "The setter '#{memberName}' in class '#{className}' can not be used as a getter.",
+      examples: const [
+        "class A { set x(y) {} } main() { new A().x; }",
+      ]), // Generated. Don't edit.
   MessageKind.UNDEFINED_OPERATOR: const MessageTemplate(
-    MessageKind.UNDEFINED_OPERATOR,
-    "The operator '#{memberName}' is not defined for the class '#{className}'.",
-    examples: const [
-      "class A {} main() { new A() + 3; }",
-    ]
-  ),  // Generated. Don't edit.
+      MessageKind.UNDEFINED_OPERATOR,
+      "The operator '#{memberName}' is not defined for the class '#{className}'.",
+      examples: const [
+        "class A {} main() { new A() + 3; }",
+      ]), // Generated. Don't edit.
   MessageKind.UNDEFINED_SETTER: const MessageTemplate(
-    MessageKind.UNDEFINED_SETTER,
-    "The setter '#{memberName}' is not defined for the class '#{className}'.",
-    examples: const [
-      "class A {} main() { new A().x = 499; }",
-    ]
-  ),  // Generated. Don't edit.
+      MessageKind.UNDEFINED_SETTER,
+      "The setter '#{memberName}' is not defined for the class '#{className}'.",
+      examples: const [
+        "class A {} main() { new A().x = 499; }",
+      ]), // Generated. Don't edit.
   MessageKind.NO_SUCH_SUPER_MEMBER: const MessageTemplate(
-    MessageKind.NO_SUCH_SUPER_MEMBER,
-    "Can't resolve '#{memberName}' in a superclass of '#{className}'."  ),  // Generated. Don't edit.
+      MessageKind.NO_SUCH_SUPER_MEMBER,
+      "Can't resolve '#{memberName}' in a superclass of '#{className}'."), // Generated. Don't edit.
   MessageKind.UNDEFINED_SUPER_SETTER: const MessageTemplate(
-    MessageKind.UNDEFINED_SUPER_SETTER,
-    "The setter '#{memberName}' is not defined in a superclass of '#{className}'.",
-    examples: const [
-      r"""
+      MessageKind.UNDEFINED_SUPER_SETTER,
+      "The setter '#{memberName}' is not defined in a superclass of '#{className}'.",
+      examples: const [
+        r"""
         class A {}
         class B extends A {
           foo() { super.x = 499; }
         }
         main() { new B().foo(); }
         """,
-    ]
-  ),  // Generated. Don't edit.
+      ]), // Generated. Don't edit.
   MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER: const MessageTemplate(
-    MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER,
-    "Cannot resolve getter '#{name}'.",
-    examples: const [
-      "set foo(x) {}  main() { foo; }",
-    ]
-  ),  // Generated. Don't edit.
+      MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER,
+      "Cannot resolve getter '#{name}'.",
+      examples: const [
+        "set foo(x) {}  main() { foo; }",
+      ]), // Generated. Don't edit.
   MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER: const MessageTemplate(
-    MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
-    "Cannot resolve setter '#{name}'.",
-    examples: const [
-      r"""
+      MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
+      "Cannot resolve setter '#{name}'.",
+      examples: const [
+        r"""
         main() {
           final x = 1;
           x = 2;
         }""",
-      r"""
+        r"""
         main() {
           const x = 1;
           x = 2;
         }
         """,
-      r"""
+        r"""
         final x = 1;
         main() { x = 3; }
         """,
-      r"""
+        r"""
         const x = 1;
         main() { x = 3; }
         """,
-      "get foo => null  main() { foo = 5; }",
-      "const foo = 0  main() { foo = 5; }",
-    ]
-  ),  // Generated. Don't edit.
+        "get foo => null  main() { foo = 5; }",
+        "const foo = 0  main() { foo = 5; }",
+      ]), // Generated. Don't edit.
 };
diff --git a/pkg/compiler/lib/src/parser/element_listener.dart b/pkg/compiler/lib/src/parser/element_listener.dart
index 0925a1c..5c1a5e7 100644
--- a/pkg/compiler/lib/src/parser/element_listener.dart
+++ b/pkg/compiler/lib/src/parser/element_listener.dart
@@ -76,6 +76,9 @@
   LinkBuilder<MetadataAnnotation> metadata =
       new LinkBuilder<MetadataAnnotation>();
 
+  /// Indicates whether the parser is currently accepting a type variable.
+  bool inTypeVariable = false;
+
   /// Records a stack of booleans for each member parsed (a stack is used to
   /// support nested members which isn't currently possible, but it also serves
   /// as a simple way to tell we're currently parsing a member). In this case,
@@ -250,8 +253,13 @@
     if (periodBeforeName != null) {
       popNode(); // Discard name.
     }
-    popNode(); // Discard node (Send or Identifier).
-    pushMetadata(new PartialMetadataAnnotation(beginToken, endToken));
+    popNode(); // Discard type parameters
+    popNode(); // Discard identifier
+    // TODO(paulberry,ahe): type variable metadata should not be ignored.  See
+    // dartbug.com/5841.
+    if (!inTypeVariable) {
+      pushMetadata(new PartialMetadataAnnotation(beginToken, endToken));
+    }
   }
 
   @override
@@ -419,7 +427,13 @@
   }
 
   @override
+  void beginTypeVariable(Token token) {
+    inTypeVariable = true;
+  }
+
+  @override
   void endTypeVariable(Token token, Token extendsOrSuper) {
+    inTypeVariable = false;
     NominalTypeAnnotation bound = popNode();
     Identifier name = popNode();
     pushNode(new TypeVariable(name, extendsOrSuper, bound));
diff --git a/pkg/compiler/lib/src/parser/member_listener.dart b/pkg/compiler/lib/src/parser/member_listener.dart
index 202fba3..2346ebf 100644
--- a/pkg/compiler/lib/src/parser/member_listener.dart
+++ b/pkg/compiler/lib/src/parser/member_listener.dart
@@ -156,6 +156,10 @@
   @override
   void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
     super.endMetadata(beginToken, periodBeforeName, endToken);
-    pushMetadata(new PartialMetadataAnnotation(beginToken, endToken));
+    // TODO(paulberry,ahe): type variable metadata should not be ignored.  See
+    // dartbug.com/5841.
+    if (!inTypeVariable) {
+      pushMetadata(new PartialMetadataAnnotation(beginToken, endToken));
+    }
   }
 }
diff --git a/pkg/compiler/lib/src/parser/node_listener.dart b/pkg/compiler/lib/src/parser/node_listener.dart
index e8074a5..664afb1 100644
--- a/pkg/compiler/lib/src/parser/node_listener.dart
+++ b/pkg/compiler/lib/src/parser/node_listener.dart
@@ -541,13 +541,13 @@
   }
 
   @override
-  void endForStatement(
-      int updateExpressionCount, Token beginToken, Token endToken) {
+  void endForStatement(Token forKeyword, Token leftSeparator,
+      int updateExpressionCount, Token endToken) {
     Statement body = popNode();
     NodeList updates = makeNodeList(updateExpressionCount, null, null, ',');
     Statement condition = popNode();
     Node initializer = popNode();
-    pushNode(new For(initializer, condition, updates, body, beginToken));
+    pushNode(new For(initializer, condition, updates, body, forKeyword));
   }
 
   @override
@@ -1009,6 +1009,18 @@
   }
 
   @override
+  void endTypeVariable(Token token, Token extendsOrSuper) {
+    inTypeVariable = false;
+    NominalTypeAnnotation bound = popNode();
+    Identifier name = popNode();
+    // TODO(paulberry): type variable metadata should not be ignored.  See
+    // dartbug.com/5841.
+    popNode(); // Metadata
+    pushNode(new TypeVariable(name, extendsOrSuper, bound));
+    rejectBuiltInIdentifier(name);
+  }
+
+  @override
   void log(message) {
     reporter.log(message);
   }
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index 6dbf37b..137411b 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -41,6 +41,15 @@
     instruction.setUseGvn();
   }
 
+  Selector renameToOptimizedSelector(
+      String name, Selector selector, Compiler compiler) {
+    if (selector.name == name) return selector;
+    JavaScriptBackend backend = compiler.backend;
+    return new Selector.call(
+        new Name(name, backend.helpers.interceptorsLibrary),
+        new CallStructure(selector.argumentCount));
+  }
+
   Operation operation(ConstantSystem constantSystem) => null;
 
   static InvokeDynamicSpecializer lookupSpecializer(Selector selector) {
@@ -241,15 +250,6 @@
 
   HInstruction newBuiltinVariant(
       HInvokeDynamic instruction, Compiler compiler, ClosedWorld closedWorld);
-
-  Selector renameToOptimizedSelector(
-      String name, Selector selector, Compiler compiler) {
-    if (selector.name == name) return selector;
-    JavaScriptBackend backend = compiler.backend;
-    return new Selector.call(
-        new Name(name, backend.helpers.interceptorsLibrary),
-        new CallStructure(selector.argumentCount));
-  }
 }
 
 class AddSpecializer extends BinaryArithmeticSpecializer {
@@ -539,11 +539,23 @@
   }
 
   bool argumentLessThan32(HInstruction instruction) {
-    if (!instruction.isConstantInteger()) return false;
-    HConstant rightConstant = instruction;
-    IntConstantValue intConstant = rightConstant.constant;
-    int count = intConstant.primitiveValue;
-    return count >= 0 && count <= 31;
+    return argumentInRange(instruction, 0, 31);
+  }
+
+  bool argumentInRange(HInstruction instruction, int low, int high) {
+    if (instruction.isConstantInteger()) {
+      HConstant rightConstant = instruction;
+      IntConstantValue intConstant = rightConstant.constant;
+      int value = intConstant.primitiveValue;
+      return value >= low && value <= high;
+    }
+    // TODO(sra): Integrate with the bit-width analysis in codegen.dart.
+    if (instruction is HBitAnd) {
+      return low == 0 &&
+          (argumentInRange(instruction.inputs[0], low, high) ||
+              argumentInRange(instruction.inputs[1], low, high));
+    }
+    return false;
   }
 
   bool isPositive(HInstruction instruction, ClosedWorld closedWorld) {
@@ -854,6 +866,10 @@
       // String.codeUnitAt does not have any side effect (other than throwing),
       // and that it can be GVN'ed.
       clearAllSideEffects(instruction);
+      if (instruction.inputs.last.isPositiveInteger(closedWorld)) {
+        instruction.selector = renameToOptimizedSelector(
+            '_codeUnitAt', instruction.selector, compiler);
+      }
     }
     return null;
   }
diff --git a/pkg/compiler/tool/dart2js_stress.dart b/pkg/compiler/tool/dart2js_stress.dart
index d699e2b..8327964 100644
--- a/pkg/compiler/tool/dart2js_stress.dart
+++ b/pkg/compiler/tool/dart2js_stress.dart
@@ -21,9 +21,12 @@
         "Use '$ITERATIONS_FLAG_PREFIX<count>' to set a repetition count"
         " (as first flag).");
   }
-  args = ["--suppress-warnings", "--suppress-hints", "--library-root="
-      "${Platform.script.resolve('../../../sdk').toFilePath()}"]
-           ..addAll(args);
+  args = [
+    "--suppress-warnings",
+    "--suppress-hints",
+    "--library-root="
+        "${Platform.script.resolve('../../../sdk').toFilePath()}"
+  ]..addAll(args);
   void iterate() {
     count++;
     sw.reset();
diff --git a/pkg/compiler/tool/track_memory.dart b/pkg/compiler/tool/track_memory.dart
index c5f5d04..46891a4 100644
--- a/pkg/compiler/tool/track_memory.dart
+++ b/pkg/compiler/tool/track_memory.dart
@@ -66,8 +66,12 @@
 Future _sendMessage(String method, [Map args = const {}]) {
   var id = _requestId++;
   _pendingResponses[id] = new Completer();
-  socket.add(JSON.encode(
-      {'jsonrpc': '2.0', 'id': '$id', 'method': '$method', 'params': args,}));
+  socket.add(JSON.encode({
+    'jsonrpc': '2.0',
+    'id': '$id',
+    'method': '$method',
+    'params': args,
+  }));
   return _pendingResponses[id].future;
 }
 
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
index 322b5e6..f9d81e9 100644
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
@@ -2855,7 +2855,17 @@
       // For instance members, we add implicit-this.
       // For method tear-offs, we ensure it's a bound method.
       var tearOff = element is MethodElement && !inInvocationContext(node);
-      if (tearOff) return _callHelper('bind(this, #)', member);
+      if (tearOff) {
+        // To be safe always use the symbolized name when binding on a native
+        // class as bind assumes the name will match the name class sigatures
+        // which is symbolized for native classes.
+        var safeName = _emitMemberName(name,
+            isStatic: isStatic,
+            type: type,
+            element: element,
+            alwaysSymbolizeNative: true);
+        return _callHelper('bind(this, #)', safeName);
+      }
       return js.call('this.#', member);
     }
 
@@ -5022,13 +5032,22 @@
     JS.Expression result;
     if (member != null && member is MethodElement && !isStatic) {
       // Tear-off methods: explicitly bind it.
+      // To be safe always use the symbolized name when binding on a native
+      // class as bind assumes the name will match the name class sigatures
+      // which is symbolized for native classes.
+      var safeName = _emitMemberName(memberName,
+          type: getStaticType(target),
+          isStatic: isStatic,
+          element: member,
+          alwaysSymbolizeNative: true);
       if (isSuper) {
-        result = _callHelper('bind(this, #, #.#)', [name, jsTarget, name]);
+        result =
+            _callHelper('bind(this, #, #.#)', [safeName, jsTarget, safeName]);
       } else if (_isObjectMemberCall(target, memberName)) {
         result = _callHelper('bind(#, #, #.#)',
             [jsTarget, _propertyName(memberName), _runtimeModule, memberName]);
       } else {
-        result = _callHelper('bind(#, #)', [jsTarget, name]);
+        result = _callHelper('bind(#, #)', [jsTarget, safeName]);
       }
     } else if (_isObjectMemberCall(target, memberName)) {
       result = _callHelper('#(#)', [memberName, jsTarget]);
@@ -5625,6 +5644,7 @@
       bool isStatic: false,
       bool useExtension,
       bool useDisplayName: false,
+      bool alwaysSymbolizeNative: false,
       Element element}) {
     // Static members skip the rename steps and may require JS interop renames.
     if (isStatic) {
@@ -5663,8 +5683,8 @@
       while (baseType is TypeParameterType) {
         baseType = (baseType.element as TypeParameterElement).bound;
       }
-      useExtension =
-          baseType is InterfaceType && _isSymbolizedMember(baseType, name);
+      useExtension = baseType is InterfaceType &&
+          _isSymbolizedMember(baseType, name, alwaysSymbolizeNative);
     }
 
     return useExtension
@@ -5701,7 +5721,8 @@
   /// Note, this is an underlying assumption here that, if another native type
   /// subtypes this one, it also forwards this member to its underlying native
   /// one without renaming.
-  bool _isSymbolizedMember(InterfaceType type, String name) {
+  bool _isSymbolizedMember(
+      InterfaceType type, String name, bool alwaysSymbolizeNative) {
     // Object members are handled separately.
     if (isObjectMember(name)) {
       return false;
@@ -5716,7 +5737,7 @@
       if (member is FieldElement ||
           member is ExecutableElement && member.isExternal) {
         var jsName = getAnnotationName(member, isJsName);
-        return jsName != null && jsName != name;
+        return alwaysSymbolizeNative || (jsName != null && jsName != name);
       } else {
         // Non-external members must be symbolized.
         return true;
diff --git a/pkg/dev_compiler/lib/src/js_ast/builder.dart b/pkg/dev_compiler/lib/src/js_ast/builder.dart
index 8b5f58a..9239aea 100644
--- a/pkg/dev_compiler/lib/src/js_ast/builder.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/builder.dart
@@ -7,7 +7,6 @@
 
 part of js_ast;
 
-
 /**
  * Global template manager.  We should aim to have a fixed number of
  * templates. This implies that we do not use js('xxx') to parse text that is
@@ -18,7 +17,6 @@
  */
 TemplateManager templateManager = new TemplateManager();
 
-
 /**
 
 [js] is a singleton instace of JsBuilder.  JsBuilder is a set of conveniences
@@ -192,7 +190,6 @@
 */
 const JsBuilder js = const JsBuilder();
 
-
 class JsBuilder {
   const JsBuilder();
 
@@ -267,8 +264,8 @@
   Template uncachedExpressionTemplate(String source) {
     MiniJsParser parser = new MiniJsParser(source);
     Expression expression = parser.expression();
-    return new Template(
-        source, expression, isExpression: true, forceCopy: false);
+    return new Template(source, expression,
+        isExpression: true, forceCopy: false);
   }
 
   /**
@@ -277,8 +274,8 @@
   Template uncachedStatementTemplate(String source) {
     MiniJsParser parser = new MiniJsParser(source);
     Statement statement = parser.statement();
-    return new Template(
-        source, statement, isExpression: false, forceCopy: false);
+    return new Template(source, statement,
+        isExpression: false, forceCopy: false);
   }
 
   /**
@@ -296,10 +293,9 @@
 
   /// Creates a literal js string from [value].
   LiteralString escapedString(String value, [String quote = '"']) {
-   // Start by escaping the backslashes.
+    // Start by escaping the backslashes.
     String escaped = value.replaceAll('\\', '\\\\');
 
-
     // Replace $ in template strings:
     // http://www.ecma-international.org/ecma-262/6.0/#sec-template-literal-lexical-components
     var quoteReplace = quote == '`' ? r'`$' : quote;
@@ -312,22 +308,34 @@
     var re = new RegExp('[\n\r$quoteReplace\b\f\t\v\u2028\u2029]');
     escaped = escaped.replaceAllMapped(re, (m) {
       switch (m.group(0)) {
-        case "\n" : return r"\n";
-        case "\r" : return r"\r";
-        case "\u2028": return r"\u2028";
-        case "\u2029": return r"\u2029";
+        case "\n":
+          return r"\n";
+        case "\r":
+          return r"\r";
+        case "\u2028":
+          return r"\u2028";
+        case "\u2029":
+          return r"\u2029";
         // Quotes and $ are only replaced if they conflict with the containing
         // quote, see regex above.
-        case '"': return r'\"';
-        case "'": return r"\'";
-        case "`": return r"\`";
-        case r"$": return r"\$";
+        case '"':
+          return r'\"';
+        case "'":
+          return r"\'";
+        case "`":
+          return r"\`";
+        case r"$":
+          return r"\$";
         // TODO(jmesserly): these don't need to be escaped for correctness,
         // but they are conventionally escaped.
-        case "\b": return r"\b";
-        case "\t": return r"\t";
-        case "\f": return r"\f";
-        case "\v": return r"\v";
+        case "\b":
+          return r"\b";
+        case "\t":
+          return r"\t";
+        case "\f":
+          return r"\f";
+        case "\v":
+          return r"\v";
       }
     });
     LiteralString result = new LiteralString('$quote$escaped$quote');
@@ -360,9 +368,8 @@
   CommentExpression commentExpression(String text, Expression expression) =>
       new CommentExpression(text, expression);
 
-  Call propertyCall(Expression receiver,
-                      String fieldName,
-                      List<Expression> arguments) {
+  Call propertyCall(
+      Expression receiver, String fieldName, List<Expression> arguments) {
     return new Call(new PropertyAccess.field(receiver, fieldName), arguments);
   }
 }
@@ -371,14 +378,13 @@
 LiteralNumber number(num value) => js.number(value);
 ArrayInitializer numArray(Iterable<int> list) => js.numArray(list);
 ArrayInitializer stringArray(Iterable<String> list) => js.stringArray(list);
-Call propertyCall(Expression receiver,
-                  String fieldName,
-                  List<Expression> arguments) {
+Call propertyCall(
+    Expression receiver, String fieldName, List<Expression> arguments) {
   return js.propertyCall(receiver, fieldName, arguments);
 }
 
 class MiniJsParserError {
-  MiniJsParserError(this.parser, this.message) { }
+  MiniJsParserError(this.parser, this.message) {}
 
   final MiniJsParser parser;
   final String message;
@@ -440,7 +446,7 @@
   String lastToken = null;
   int lastPosition = 0;
   int position = 0;
-  bool skippedNewline = false;  // skipped newline in last getToken?
+  bool skippedNewline = false; // skipped newline in last getToken?
   final String src;
 
   final List<InterpolatedNode> interpolatedValues = <InterpolatedNode>[];
@@ -480,51 +486,74 @@
 
   static String categoryToString(int cat) {
     switch (cat) {
-      case NONE: return "NONE";
-      case ALPHA: return "ALPHA";
-      case NUMERIC: return "NUMERIC";
-      case SYMBOL: return "SYMBOL";
-      case ASSIGNMENT: return "ASSIGNMENT";
-      case DOT: return "DOT";
-      case LPAREN: return "LPAREN";
-      case RPAREN: return "RPAREN";
-      case LBRACE: return "LBRACE";
-      case RBRACE: return "RBRACE";
-      case LSQUARE: return "LSQUARE";
-      case RSQUARE: return "RSQUARE";
-      case STRING: return "STRING";
-      case COMMA: return "COMMA";
-      case QUERY: return "QUERY";
-      case COLON: return "COLON";
-      case SEMICOLON: return "SEMICOLON";
-      case ARROW: return "ARROW";
-      case ELLIPSIS: return "ELLIPSIS";
-      case HASH: return "HASH";
-      case WHITESPACE: return "WHITESPACE";
-      case OTHER: return "OTHER";
+      case NONE:
+        return "NONE";
+      case ALPHA:
+        return "ALPHA";
+      case NUMERIC:
+        return "NUMERIC";
+      case SYMBOL:
+        return "SYMBOL";
+      case ASSIGNMENT:
+        return "ASSIGNMENT";
+      case DOT:
+        return "DOT";
+      case LPAREN:
+        return "LPAREN";
+      case RPAREN:
+        return "RPAREN";
+      case LBRACE:
+        return "LBRACE";
+      case RBRACE:
+        return "RBRACE";
+      case LSQUARE:
+        return "LSQUARE";
+      case RSQUARE:
+        return "RSQUARE";
+      case STRING:
+        return "STRING";
+      case COMMA:
+        return "COMMA";
+      case QUERY:
+        return "QUERY";
+      case COLON:
+        return "COLON";
+      case SEMICOLON:
+        return "SEMICOLON";
+      case ARROW:
+        return "ARROW";
+      case ELLIPSIS:
+        return "ELLIPSIS";
+      case HASH:
+        return "HASH";
+      case WHITESPACE:
+        return "WHITESPACE";
+      case OTHER:
+        return "OTHER";
     }
     return "Unknown: $cat";
   }
 
   static const CATEGORIES = const <int>[
-      OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,       // 0-7
-      OTHER, WHITESPACE, WHITESPACE, OTHER, OTHER, WHITESPACE,      // 8-13
-      OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,       // 14-21
-      OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,       // 22-29
-      OTHER, OTHER, WHITESPACE,                                     // 30-32
-      SYMBOL, OTHER, HASH, ALPHA, SYMBOL, SYMBOL, OTHER,            // !"#$%&´
-      LPAREN, RPAREN, SYMBOL, SYMBOL, COMMA, SYMBOL, DOT, SYMBOL,   // ()*+,-./
-      NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC,                  // 01234
-      NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC,                  // 56789
-      COLON, SEMICOLON, SYMBOL, SYMBOL, SYMBOL, QUERY, OTHER,       // :;<=>?@
-      ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // ABCDEFGH
-      ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // IJKLMNOP
-      ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // QRSTUVWX
-      ALPHA, ALPHA, LSQUARE, OTHER, RSQUARE, SYMBOL, ALPHA, OTHER,  // YZ[\]^_'
-      ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // abcdefgh
-      ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // ijklmnop
-      ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // qrstuvwx
-      ALPHA, ALPHA, LBRACE, SYMBOL, RBRACE, SYMBOL];                // yz{|}~
+    OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 0-7
+    OTHER, WHITESPACE, WHITESPACE, OTHER, OTHER, WHITESPACE, // 8-13
+    OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 14-21
+    OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 22-29
+    OTHER, OTHER, WHITESPACE, // 30-32
+    SYMBOL, OTHER, HASH, ALPHA, SYMBOL, SYMBOL, OTHER, // !"#$%&´
+    LPAREN, RPAREN, SYMBOL, SYMBOL, COMMA, SYMBOL, DOT, SYMBOL, // ()*+,-./
+    NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC, // 01234
+    NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC, // 56789
+    COLON, SEMICOLON, SYMBOL, SYMBOL, SYMBOL, QUERY, OTHER, // :;<=>?@
+    ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // ABCDEFGH
+    ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // IJKLMNOP
+    ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // QRSTUVWX
+    ALPHA, ALPHA, LSQUARE, OTHER, RSQUARE, SYMBOL, ALPHA, OTHER, // YZ[\]^_'
+    ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // abcdefgh
+    ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // ijklmnop
+    ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // qrstuvwx
+    ALPHA, ALPHA, LBRACE, SYMBOL, RBRACE, SYMBOL
+  ]; // yz{|}~
 
   // This must be a >= the highest precedence number handled by parseBinary.
   static var HIGHEST_PARSE_BINARY_PRECEDENCE = 16;
@@ -532,22 +561,54 @@
 
   // From https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence
   static final BINARY_PRECEDENCE = {
-      '+=': 17, '-=': 17, '*=': 17, '/=': 17, '%=': 17, '^=': 17, '|=': 17,
-      '&=': 17, '<<=': 17, '>>=': 17, '>>>=': 17, '=': 17,
-      '||': 14,
-      '&&': 13,
-      '|': 12,
-      '^': 11,
-      '&': 10,
-      '!=': 9, '==': 9, '!==': 9, '===': 9,
-      '<': 8, '<=': 8, '>=': 8, '>': 8, 'in': 8, 'instanceof': 8,
-      '<<': 7, '>>': 7, '>>>': 7,
-      '+': 6, '-': 6,
-      '*': 5, '/': 5, '%': 5
+    '+=': 17,
+    '-=': 17,
+    '*=': 17,
+    '/=': 17,
+    '%=': 17,
+    '^=': 17,
+    '|=': 17,
+    '&=': 17,
+    '<<=': 17,
+    '>>=': 17,
+    '>>>=': 17,
+    '=': 17,
+    '||': 14,
+    '&&': 13,
+    '|': 12,
+    '^': 11,
+    '&': 10,
+    '!=': 9,
+    '==': 9,
+    '!==': 9,
+    '===': 9,
+    '<': 8,
+    '<=': 8,
+    '>=': 8,
+    '>': 8,
+    'in': 8,
+    'instanceof': 8,
+    '<<': 7,
+    '>>': 7,
+    '>>>': 7,
+    '+': 6,
+    '-': 6,
+    '*': 5,
+    '/': 5,
+    '%': 5
   };
-  static final UNARY_OPERATORS =
-      ['++', '--', '+', '-', '~', '!', 'typeof', 'void', 'delete', 'await']
-        .toSet();
+  static final UNARY_OPERATORS = [
+    '++',
+    '--',
+    '+',
+    '-',
+    '~',
+    '!',
+    'typeof',
+    'void',
+    'delete',
+    'await'
+  ].toSet();
 
   static final ARROW_TOKEN = '=>';
   static final ELLIPSIS_TOKEN = '...';
@@ -572,8 +633,10 @@
       if (currentCode == charCodes.$BACKSLASH) {
         if (++position >= src.length) error("Unterminated literal");
         int escaped = src.codeUnitAt(position);
-        if (escaped == charCodes.$x || escaped == charCodes.$X ||
-            escaped == charCodes.$u || escaped == charCodes.$U ||
+        if (escaped == charCodes.$x ||
+            escaped == charCodes.$X ||
+            escaped == charCodes.$u ||
+            escaped == charCodes.$U ||
             category(escaped) == NUMERIC) {
           error('Numeric and hex escapes are not allowed in literals');
         }
@@ -589,8 +652,7 @@
       if (position >= src.length) break;
       int code = src.codeUnitAt(position);
       //  Skip '//' and '/*' style comments.
-      if (code == charCodes.$SLASH &&
-          position + 1 < src.length) {
+      if (code == charCodes.$SLASH && position + 1 < src.length) {
         if (src.codeUnitAt(position + 1) == charCodes.$SLASH) {
           int nextPosition = src.indexOf('\n', position);
           if (nextPosition == -1) nextPosition = src.length;
@@ -621,8 +683,8 @@
       lastCategory = STRING;
       lastToken = getDelimited(position);
     } else if (code == charCodes.$0 &&
-               position + 2 < src.length &&
-               src.codeUnitAt(position + 1) == charCodes.$x) {
+        position + 2 < src.length &&
+        src.codeUnitAt(position + 1) == charCodes.$x) {
       // Hex literal.
       for (position += 2; position < src.length; position++) {
         int cat = category(src.codeUnitAt(position));
@@ -653,12 +715,12 @@
         // that !! parses as two tokens and != parses as one, while =/ parses
         // as a an equals token followed by a regexp literal start.
         newCat = (code == charCodes.$BANG || code == charCodes.$SLASH)
-            ?  NONE
+            ? NONE
             : category(code);
       } while (!singleCharCategory(cat) &&
-               (cat == newCat ||
-                (cat == ALPHA && newCat == NUMERIC) ||    // eg. level42.
-                (cat == NUMERIC && newCat == DOT)));      // eg. 3.1415
+          (cat == newCat ||
+              (cat == ALPHA && newCat == NUMERIC) || // eg. level42.
+              (cat == NUMERIC && newCat == DOT))); // eg. 3.1415
       lastCategory = cat;
       lastToken = src.substring(lastPosition, position);
       if (cat == NUMERIC) {
@@ -676,7 +738,8 @@
           lastCategory = ARROW;
         } else {
           int binaryPrecendence = BINARY_PRECEDENCE[lastToken];
-          if (binaryPrecendence == null && !UNARY_OPERATORS.contains(lastToken)) {
+          if (binaryPrecendence == null &&
+              !UNARY_OPERATORS.contains(lastToken)) {
             error("Unknown operator");
           }
           if (isAssignment(lastToken)) lastCategory = ASSIGNMENT;
@@ -711,7 +774,7 @@
     // Accept semicolon or automatically inserted semicolon before close brace.
     // Miniparser forbids other kinds of semicolon insertion.
     if (RBRACE == lastCategory) return true;
-    if (NONE == lastCategory) return true;  // end of input
+    if (NONE == lastCategory) return true; // end of input
     if (skippedNewline) {
       error('No automatic semicolon insertion at preceding newline');
     }
@@ -902,8 +965,7 @@
     String last = lastToken;
     if (acceptCategory(ALPHA)) {
       String functionName = last;
-      return new NamedFunction(new Identifier(functionName),
-          parseFun());
+      return new NamedFunction(new Identifier(functionName), parseFun());
     }
     return parseFun();
   }
@@ -1011,9 +1073,9 @@
             expectCategory(COMMA);
           }
         }
-        receiver = constructor ?
-               new New(receiver, arguments) :
-               new Call(receiver, arguments);
+        receiver = constructor
+            ? new New(receiver, arguments)
+            : new Call(receiver, arguments);
         constructor = false;
       } else if (!constructor && acceptCategory(LSQUARE)) {
         Expression inBraces = parseExpression();
@@ -1068,7 +1130,8 @@
 
   Expression parseUnaryHigh() {
     String operator = lastToken;
-    if (lastCategory == SYMBOL && UNARY_OPERATORS.contains(operator) &&
+    if (lastCategory == SYMBOL &&
+        UNARY_OPERATORS.contains(operator) &&
         (acceptString("++") || acceptString("--") || acceptString('await'))) {
       if (operator == "await") return new Await(parsePostfix());
       return new Prefix(operator, parsePostfix());
@@ -1078,8 +1141,10 @@
 
   Expression parseUnaryLow() {
     String operator = lastToken;
-    if (lastCategory == SYMBOL && UNARY_OPERATORS.contains(operator) &&
-        operator != "++" && operator != "--") {
+    if (lastCategory == SYMBOL &&
+        UNARY_OPERATORS.contains(operator) &&
+        operator != "++" &&
+        operator != "--") {
       expectCategory(SYMBOL);
       if (operator == "await") return new Await(parsePostfix());
       return new Prefix(operator, parseUnaryLow());
@@ -1091,7 +1156,7 @@
     Expression lhs = parseUnaryLow();
     int minPrecedence;
     String lastSymbol;
-    Expression rhs;  // This is null first time around.
+    Expression rhs; // This is null first time around.
     while (true) {
       String symbol = lastToken;
       if (lastCategory != SYMBOL ||
@@ -1132,7 +1197,7 @@
       Expression rhs = parseAssignment();
       if (assignmentOperator == "=") {
         return new Assignment(lhs, rhs);
-      } else  {
+      } else {
         // Handle +=, -=, etc.
         String operator =
             assignmentOperator.substring(0, assignmentOperator.length - 1);
@@ -1152,8 +1217,8 @@
   }
 
   /** Parse a variable declaration list, with `var` or `let` [keyword] */
-  VariableDeclarationList parseVariableDeclarationList(
-      String keyword, [String firstIdentifier])  {
+  VariableDeclarationList parseVariableDeclarationList(String keyword,
+      [String firstIdentifier]) {
     var initialization = <VariableInitialization>[];
 
     do {
@@ -1209,9 +1274,12 @@
       var defaultValue;
 
       var declarator = parseVariableBinding();
-      if (declarator is Identifier) name = declarator;
-      else if (declarator is BindingPattern) structure = declarator;
-      else error("Unexpected LHS: $declarator");
+      if (declarator is Identifier)
+        name = declarator;
+      else if (declarator is BindingPattern)
+        structure = declarator;
+      else
+        error("Unexpected LHS: $declarator");
 
       if (acceptString("=")) {
         defaultValue = parseExpression();
@@ -1338,7 +1406,6 @@
       if (lastToken == 'with') {
         error('Not implemented in mini parser');
       }
-
     }
 
     bool checkForInterpolatedStatement = lastCategory == HASH;
@@ -1451,18 +1518,14 @@
         Expression objectExpression = parseExpression();
         expectCategory(RPAREN);
         Statement body = parseStatement();
-        return new ForIn(
-            _createVariableDeclarationList(keyword, identifier),
-            objectExpression,
-            body);
+        return new ForIn(_createVariableDeclarationList(keyword, identifier),
+            objectExpression, body);
       } else if (acceptString('of')) {
         Expression iterableExpression = parseAssignment();
         expectCategory(RPAREN);
         Statement body = parseStatement();
-        return new ForOf(
-            _createVariableDeclarationList(keyword, identifier),
-            iterableExpression,
-            body);
+        return new ForOf(_createVariableDeclarationList(keyword, identifier),
+            iterableExpression, body);
       }
       var declarations = parseVariableDeclarationList(keyword, identifier);
       expectCategory(SEMICOLON);
@@ -1476,9 +1539,8 @@
 
   static VariableDeclarationList _createVariableDeclarationList(
       String keyword, String identifier) {
-    return new VariableDeclarationList(keyword, [
-        new VariableInitialization(
-            new Identifier(identifier), null)]);
+    return new VariableDeclarationList(keyword,
+        [new VariableInitialization(new Identifier(identifier), null)]);
   }
 
   Statement parseFunctionDeclaration() {
@@ -1516,8 +1578,8 @@
     }
     var statements = <Statement>[];
     while (lastCategory != RBRACE &&
-           lastToken != 'case' &&
-           lastToken != 'default') {
+        lastToken != 'case' &&
+        lastToken != 'default') {
       statements.add(parseStatement());
     }
     return expression == null
@@ -1550,7 +1612,7 @@
     expectCategory(RPAREN);
     expectCategory(LBRACE);
     List<SwitchClause> clauses = new List<SwitchClause>();
-    while(lastCategory != RBRACE) {
+    while (lastCategory != RBRACE) {
       clauses.add(parseSwitchClause());
     }
     expectCategory(RBRACE);
diff --git a/pkg/dev_compiler/lib/src/js_ast/characters.dart b/pkg/dev_compiler/lib/src/js_ast/characters.dart
index e044078..e3382c3 100644
--- a/pkg/dev_compiler/lib/src/js_ast/characters.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/characters.dart
@@ -4,7 +4,7 @@
 
 const int $EOF = 0;
 const int $STX = 2;
-const int $BS  = 8;
+const int $BS = 8;
 const int $TAB = 9;
 const int $LF = 10;
 const int $VTAB = 11;
diff --git a/pkg/dev_compiler/lib/src/js_ast/js_types.dart b/pkg/dev_compiler/lib/src/js_ast/js_types.dart
index 526d19a..a3d1971 100644
--- a/pkg/dev_compiler/lib/src/js_ast/js_types.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/js_types.dart
@@ -20,7 +20,6 @@
 /// handled by the type printers (for instance, the knowledge that
 /// `number|null` is just `number` in TypeScript, and is `number?` in Closure).
 abstract class TypeRef extends Expression {
-
   int get precedenceLevel => PRIMARY;
 
   TypeRef();
@@ -38,8 +37,7 @@
     return new GenericTypeRef(rawType, typeArgs.toList());
   }
 
-  factory TypeRef.array([TypeRef elementType]) =>
-      new ArrayTypeRef(elementType);
+  factory TypeRef.array([TypeRef elementType]) => new ArrayTypeRef(elementType);
 
   factory TypeRef.object([TypeRef keyType, TypeRef valueType]) {
     // TODO(ochafik): Roll out a dedicated ObjectTypeRef?
@@ -50,8 +48,8 @@
   }
 
   factory TypeRef.function(
-      [TypeRef returnType, Map<Identifier, TypeRef> paramTypes]) =>
-          new FunctionTypeRef(returnType, paramTypes);
+          [TypeRef returnType, Map<Identifier, TypeRef> paramTypes]) =>
+      new FunctionTypeRef(returnType, paramTypes);
 
   factory TypeRef.record(Map<Identifier, TypeRef> types) =>
       new RecordTypeRef(types);
@@ -79,8 +77,7 @@
   TypeRef orUndefined() => or(new TypeRef.undefined());
   TypeRef orNull() => or(_null);
 
-  TypeRef toOptional() =>
-      new OptionalTypeRef(this);
+  TypeRef toOptional() => new OptionalTypeRef(this);
 }
 
 class AnyTypeRef extends TypeRef {
@@ -123,6 +120,7 @@
   void visitChildren(NodeVisitor visitor) {
     elementType.accept(visitor);
   }
+
   _clone() => new ArrayTypeRef(elementType);
 }
 
@@ -136,6 +134,7 @@
     rawType.accept(visitor);
     typeArgs.forEach((p) => p.accept(visitor));
   }
+
   _clone() => new GenericTypeRef(rawType, typeArgs);
 }
 
@@ -147,12 +146,15 @@
   void visitChildren(NodeVisitor visitor) {
     types.forEach((p) => p.accept(visitor));
   }
+
   _clone() => new UnionTypeRef(types);
 
   @override
   TypeRef or(TypeRef other) {
     if (types.contains(other)) return this;
-    return new UnionTypeRef([]..addAll(types)..add(other));
+    return new UnionTypeRef([]
+      ..addAll(types)
+      ..add(other));
   }
 }
 
@@ -164,6 +166,7 @@
   void visitChildren(NodeVisitor visitor) {
     type.accept(visitor);
   }
+
   _clone() => new OptionalTypeRef(type);
 
   @override
@@ -178,6 +181,7 @@
   void visitChildren(NodeVisitor visitor) {
     types.values.forEach((p) => p.accept(visitor));
   }
+
   _clone() => new RecordTypeRef(types);
 }
 
@@ -194,5 +198,6 @@
       t.accept(visitor);
     });
   }
+
   _clone() => new FunctionTypeRef(returnType, paramTypes);
 }
diff --git a/pkg/dev_compiler/lib/src/js_ast/nodes.dart b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
index 7f4e127..3d339ff 100644
--- a/pkg/dev_compiler/lib/src/js_ast/nodes.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
@@ -120,8 +120,7 @@
   T visitJump(Statement node) => visitStatement(node);
 
   T visitBlock(Block node) => visitStatement(node);
-  T visitExpressionStatement(ExpressionStatement node)
-      => visitStatement(node);
+  T visitExpressionStatement(ExpressionStatement node) => visitStatement(node);
   T visitEmptyStatement(EmptyStatement node) => visitStatement(node);
   T visitIf(If node) => visitStatement(node);
   T visitFor(For node) => visitLoop(node);
@@ -135,8 +134,7 @@
   T visitThrow(Throw node) => visitJump(node);
   T visitTry(Try node) => visitStatement(node);
   T visitSwitch(Switch node) => visitStatement(node);
-  T visitFunctionDeclaration(FunctionDeclaration node)
-      => visitStatement(node);
+  T visitFunctionDeclaration(FunctionDeclaration node) => visitStatement(node);
   T visitLabeledStatement(LabeledStatement node) => visitStatement(node);
   T visitLiteralStatement(LiteralStatement node) => visitStatement(node);
 
@@ -147,8 +145,8 @@
   T visitExpression(Expression node) => visitNode(node);
 
   T visitLiteralExpression(LiteralExpression node) => visitExpression(node);
-  T visitVariableDeclarationList(VariableDeclarationList node)
-      => visitExpression(node);
+  T visitVariableDeclarationList(VariableDeclarationList node) =>
+      visitExpression(node);
   T visitAssignment(Assignment node) => visitExpression(node);
   T visitVariableInitialization(VariableInitialization node) {
     if (node.value != null) {
@@ -157,6 +155,7 @@
       return visitExpression(node);
     }
   }
+
   T visitConditional(Conditional node) => visitExpression(node);
   T visitNew(New node) => visitExpression(node);
   T visitCall(Call node) => visitExpression(node);
@@ -206,20 +205,20 @@
 
   T visitInterpolatedNode(InterpolatedNode node) => visitNode(node);
 
-  T visitInterpolatedExpression(InterpolatedExpression node)
-      => visitInterpolatedNode(node);
-  T visitInterpolatedLiteral(InterpolatedLiteral node)
-      => visitInterpolatedNode(node);
-  T visitInterpolatedParameter(InterpolatedParameter node)
-      => visitInterpolatedNode(node);
-  T visitInterpolatedSelector(InterpolatedSelector node)
-      => visitInterpolatedNode(node);
-  T visitInterpolatedStatement(InterpolatedStatement node)
-      => visitInterpolatedNode(node);
-  T visitInterpolatedMethod(InterpolatedMethod node)
-      => visitInterpolatedNode(node);
-  T visitInterpolatedIdentifier(InterpolatedIdentifier node)
-      => visitInterpolatedNode(node);
+  T visitInterpolatedExpression(InterpolatedExpression node) =>
+      visitInterpolatedNode(node);
+  T visitInterpolatedLiteral(InterpolatedLiteral node) =>
+      visitInterpolatedNode(node);
+  T visitInterpolatedParameter(InterpolatedParameter node) =>
+      visitInterpolatedNode(node);
+  T visitInterpolatedSelector(InterpolatedSelector node) =>
+      visitInterpolatedNode(node);
+  T visitInterpolatedStatement(InterpolatedStatement node) =>
+      visitInterpolatedNode(node);
+  T visitInterpolatedMethod(InterpolatedMethod node) =>
+      visitInterpolatedNode(node);
+  T visitInterpolatedIdentifier(InterpolatedIdentifier node) =>
+      visitInterpolatedNode(node);
 
   // Ignore comments by default.
   T visitComment(Comment node) => null;
@@ -229,10 +228,10 @@
   T visitDartYield(DartYield node) => visitStatement(node);
 
   T visitBindingPattern(BindingPattern node) => visitNode(node);
-  T visitArrayBindingPattern(ArrayBindingPattern node)
-      => visitBindingPattern(node);
-  T visitObjectBindingPattern(ObjectBindingPattern node)
-      => visitBindingPattern(node);
+  T visitArrayBindingPattern(ArrayBindingPattern node) =>
+      visitBindingPattern(node);
+  T visitObjectBindingPattern(ObjectBindingPattern node) =>
+      visitBindingPattern(node);
   T visitDestructuredVariable(DestructuredVariable node) => visitNode(node);
   T visitSimpleBindingPattern(SimpleBindingPattern node) => visitNode(node);
 
@@ -254,6 +253,7 @@
   Object sourceInformation;
 
   ClosureAnnotation _closureAnnotation;
+
   /// Closure annotation of this node.
   ClosureAnnotation get closureAnnotation => _closureAnnotation;
 
@@ -268,9 +268,10 @@
     if (this.closureAnnotation == closureAnnotation) return this;
 
     return _clone()
-        ..sourceInformation = sourceInformation
-        .._closureAnnotation = closureAnnotation;
+      ..sourceInformation = sourceInformation
+      .._closureAnnotation = closureAnnotation;
   }
+
   // Returns a node equivalent to [this], but with new source position and end
   // source position.
   Node withSourceInformation(sourceInformation) {
@@ -289,6 +290,7 @@
   Statement toStatement() {
     throw new UnsupportedError('toStatement');
   }
+
   Statement toReturn() {
     throw new UnsupportedError('toReturn');
   }
@@ -323,6 +325,7 @@
   void visitChildren(NodeVisitor visitor) {
     for (ModuleItem statement in body) statement.accept(visitor);
   }
+
   Program _clone() => new Program(body);
 }
 
@@ -340,12 +343,15 @@
   Block(this.statements, {this.isScope: false}) {
     assert(!statements.any((s) => s is! Statement));
   }
-  Block.empty() : statements = <Statement>[], isScope = false;
+  Block.empty()
+      : statements = <Statement>[],
+        isScope = false;
 
   accept(NodeVisitor visitor) => visitor.visitBlock(this);
   void visitChildren(NodeVisitor visitor) {
     for (Statement statement in statements) statement.accept(visitor);
   }
+
   Block _clone() => new Block(statements);
 }
 
@@ -354,7 +360,10 @@
   ExpressionStatement(this.expression);
 
   accept(NodeVisitor visitor) => visitor.visitExpressionStatement(this);
-  void visitChildren(NodeVisitor visitor) { expression.accept(visitor); }
+  void visitChildren(NodeVisitor visitor) {
+    expression.accept(visitor);
+  }
+
   ExpressionStatement _clone() => new ExpressionStatement(expression);
 }
 
@@ -480,7 +489,7 @@
 }
 
 class Continue extends Statement {
-  final String targetLabel;  // Can be null.
+  final String targetLabel; // Can be null.
 
   Continue(this.targetLabel);
 
@@ -491,7 +500,7 @@
 }
 
 class Break extends Statement {
-  final String targetLabel;  // Can be null.
+  final String targetLabel; // Can be null.
 
   Break(this.targetLabel);
 
@@ -502,7 +511,7 @@
 }
 
 class Return extends Statement {
-  final Expression value;  // Can be null.
+  final Expression value; // Can be null.
 
   Return([this.value = null]);
 
@@ -524,17 +533,18 @@
 }
 
 final _returnFinder = new _ReturnFinder();
+
 class _ReturnFinder extends BaseVisitor {
   bool found = false;
   visitReturn(Return node) {
     found = true;
   }
+
   visitNode(Node node) {
     if (!found) super.visitNode(node);
   }
 }
 
-
 class Throw extends Statement {
   final Expression expression;
 
@@ -551,8 +561,8 @@
 
 class Try extends Statement {
   final Block body;
-  final Catch catchPart;  // Can be null if [finallyPart] is non-null.
-  final Block finallyPart;  // Can be null if [catchPart] is non-null.
+  final Catch catchPart; // Can be null if [finallyPart] is non-null.
+  final Block finallyPart; // Can be null if [catchPart] is non-null.
 
   Try(this.body, this.catchPart, this.finallyPart) {
     assert(catchPart != null || finallyPart != null);
@@ -671,7 +681,7 @@
   LiteralStatement(this.code);
 
   accept(NodeVisitor visitor) => visitor.visitLiteralStatement(this);
-  void visitChildren(NodeVisitor visitor) { }
+  void visitChildren(NodeVisitor visitor) {}
 
   LiteralStatement _clone() => new LiteralStatement(code);
 }
@@ -715,8 +725,8 @@
   Expression toVoidExpression() => this;
   Expression toAssignExpression(Expression left) => new Assignment(left, this);
   Statement toVariableDeclaration(Identifier name) =>
-      new VariableDeclarationList('let',
-          [new VariableInitialization(name, this)]).toStatement();
+      new VariableDeclarationList(
+          'let', [new VariableInitialization(name, this)]).toStatement();
 }
 
 class LiteralExpression extends Expression {
@@ -772,11 +782,10 @@
 
 class Assignment extends Expression {
   final Expression leftHandSide;
-  final String op;         // Null, if the assignment is not compound.
-  final Expression value;  // May be null, for [VariableInitialization]s.
+  final String op; // Null, if the assignment is not compound.
+  final Expression value; // May be null, for [VariableInitialization]s.
 
-  Assignment(leftHandSide, value)
-      : this.compound(leftHandSide, null, value);
+  Assignment(leftHandSide, value) : this.compound(leftHandSide, null, value);
   Assignment.compound(this.leftHandSide, this.op, this.value);
 
   int get precedenceLevel => ASSIGNMENT;
@@ -790,8 +799,7 @@
     if (value != null) value.accept(visitor);
   }
 
-  Assignment _clone() =>
-      new Assignment.compound(leftHandSide, op, value);
+  Assignment _clone() => new Assignment.compound(leftHandSide, op, value);
 }
 
 class VariableInitialization extends Assignment {
@@ -807,8 +815,7 @@
       new VariableInitialization(declaration, value);
 }
 
-abstract class VariableBinding extends Expression {
-}
+abstract class VariableBinding extends Expression {}
 
 class DestructuredVariable extends Expression implements Parameter {
   /// [LiteralString] or [Identifier].
@@ -816,7 +823,8 @@
   final BindingPattern structure;
   final Expression defaultValue;
   final TypeRef type;
-  DestructuredVariable({this.name, this.structure, this.defaultValue, this.type}) {
+  DestructuredVariable(
+      {this.name, this.structure, this.defaultValue, this.type}) {
     assert(name != null || structure != null);
   }
 
@@ -828,10 +836,11 @@
   }
 
   /// Avoid parenthesis when pretty-printing.
-  @override int get precedenceLevel => PRIMARY;
-  @override Node _clone() =>
-      new DestructuredVariable(
-          name: name, structure: structure, defaultValue: defaultValue);
+  @override
+  int get precedenceLevel => PRIMARY;
+  @override
+  Node _clone() => new DestructuredVariable(
+      name: name, structure: structure, defaultValue: defaultValue);
 }
 
 abstract class BindingPattern extends Expression implements VariableBinding {
@@ -852,28 +861,32 @@
   accept(NodeVisitor visitor) => visitor.visitSimpleBindingPattern(this);
 
   /// Avoid parenthesis when pretty-printing.
-  @override int get precedenceLevel => PRIMARY;
-  @override Node _clone() => new SimpleBindingPattern(name);
+  @override
+  int get precedenceLevel => PRIMARY;
+  @override
+  Node _clone() => new SimpleBindingPattern(name);
 }
 
 class ObjectBindingPattern extends BindingPattern {
-  ObjectBindingPattern(List<DestructuredVariable> variables)
-      : super(variables);
+  ObjectBindingPattern(List<DestructuredVariable> variables) : super(variables);
   accept(NodeVisitor visitor) => visitor.visitObjectBindingPattern(this);
 
   /// Avoid parenthesis when pretty-printing.
-  @override int get precedenceLevel => PRIMARY;
-  @override Node _clone() => new ObjectBindingPattern(variables);
+  @override
+  int get precedenceLevel => PRIMARY;
+  @override
+  Node _clone() => new ObjectBindingPattern(variables);
 }
 
 class ArrayBindingPattern extends BindingPattern {
-  ArrayBindingPattern(List<DestructuredVariable> variables)
-      : super(variables);
+  ArrayBindingPattern(List<DestructuredVariable> variables) : super(variables);
   accept(NodeVisitor visitor) => visitor.visitArrayBindingPattern(this);
 
   /// Avoid parenthesis when pretty-printing.
-  @override int get precedenceLevel => PRIMARY;
-  @override Node _clone() => new ObjectBindingPattern(variables);
+  @override
+  int get precedenceLevel => PRIMARY;
+  @override
+  Node _clone() => new ObjectBindingPattern(variables);
 }
 
 class Conditional extends Expression {
@@ -1087,8 +1100,7 @@
   }
   static RegExp _identifierRE = new RegExp(r'^[A-Za-z_$][A-Za-z_$0-9]*$');
 
-  Identifier _clone() =>
-      new Identifier(name, allowRename: allowRename);
+  Identifier _clone() => new Identifier(name, allowRename: allowRename);
   accept(NodeVisitor visitor) => visitor.visitIdentifier(this);
   int get precedenceLevel => PRIMARY;
   void visitChildren(NodeVisitor visitor) {}
@@ -1106,6 +1118,7 @@
   void visitChildren(NodeVisitor visitor) {
     parameter.accept(visitor);
   }
+
   int get precedenceLevel => PRIMARY;
 }
 
@@ -1123,17 +1136,18 @@
 }
 
 final _thisFinder = new _ThisFinder();
+
 class _ThisFinder extends BaseVisitor {
   bool found = false;
   visitThis(This node) {
     found = true;
   }
+
   visitNode(Node node) {
     if (!found) super.visitNode(node);
   }
 }
 
-
 // `super` is more restricted in the ES6 spec, but for simplicity we accept
 // it anywhere that `this` is accepted.
 class Super extends Expression {
@@ -1159,9 +1173,12 @@
     name.accept(visitor);
     function.accept(visitor);
   }
-  NamedFunction _clone() => new NamedFunction(name, function, immediatelyInvoked);
 
-  int get precedenceLevel => immediatelyInvoked ? EXPRESSION : PRIMARY_LOW_PRECEDENCE;
+  NamedFunction _clone() =>
+      new NamedFunction(name, function, immediatelyInvoked);
+
+  int get precedenceLevel =>
+      immediatelyInvoked ? EXPRESSION : PRIMARY_LOW_PRECEDENCE;
 }
 
 abstract class FunctionExpression extends Expression {
@@ -1171,6 +1188,7 @@
   /// Type parameters passed to this generic function, if any. `null` otherwise.
   // TODO(ochafik): Support type bounds.
   List<Identifier> get typeParams;
+
   /// Return type of this function, if any. `null` otherwise.
   TypeRef get returnType;
 }
@@ -1178,17 +1196,21 @@
 class Fun extends FunctionExpression {
   final List<Parameter> params;
   final Block body;
-  @override final List<Identifier> typeParams;
-  @override final TypeRef returnType;
+  @override
+  final List<Identifier> typeParams;
+  @override
+  final TypeRef returnType;
 
   /** Whether this is a JS generator (`function*`) that may contain `yield`. */
   final bool isGenerator;
 
   final AsyncModifier asyncModifier;
 
-  Fun(this.params, this.body, {this.isGenerator: false,
+  Fun(this.params, this.body,
+      {this.isGenerator: false,
       this.asyncModifier: const AsyncModifier.sync(),
-      this.typeParams, this.returnType});
+      this.typeParams,
+      this.returnType});
 
   accept(NodeVisitor visitor) => visitor.visitFun(this);
 
@@ -1206,8 +1228,10 @@
 class ArrowFun extends FunctionExpression {
   final List<Parameter> params;
   final body; // Expression or Block
-  @override final List<Identifier> typeParams;
-  @override final TypeRef returnType;
+  @override
+  final List<Identifier> typeParams;
+  @override
+  final TypeRef returnType;
 
   ArrowFun(this.params, this.body, {this.typeParams, this.returnType});
 
@@ -1321,7 +1345,7 @@
 }
 
 class LiteralNumber extends Literal {
-  final String value;  // Must be a valid JavaScript number literal.
+  final String value; // Must be a valid JavaScript number literal.
 
   LiteralNumber(this.value);
 
@@ -1496,9 +1520,11 @@
   final Identifier name;
   final Expression heritage; // Can be null.
   final List<Method> methods;
+
   /// Type parameters of this class, if any. `null` otherwise.
   // TODO(ochafik): Support type bounds.
   final List<Identifier> typeParams;
+
   /// Field declarations of this class (TypeScript / ES6_TYPED).
   final List<VariableDeclarationList> fields;
 
@@ -1523,8 +1549,8 @@
     }
   }
 
-  ClassExpression _clone() => new ClassExpression(
-      name, heritage, methods, typeParams: typeParams, fields: fields);
+  ClassExpression _clone() => new ClassExpression(name, heritage, methods,
+      typeParams: typeParams, fields: fields);
 
   int get precedenceLevel => PRIMARY_LOW_PRECEDENCE;
 }
@@ -1570,8 +1596,7 @@
 
   accept(NodeVisitor visitor) => visitor.visitInterpolatedExpression(this);
   void visitChildren(NodeVisitor visitor) {}
-  InterpolatedExpression _clone() =>
-      new InterpolatedExpression(nameOrPosition);
+  InterpolatedExpression _clone() => new InterpolatedExpression(nameOrPosition);
 
   int get precedenceLevel => PRIMARY;
 }
@@ -1586,12 +1611,16 @@
   InterpolatedLiteral _clone() => new InterpolatedLiteral(nameOrPosition);
 }
 
-class InterpolatedParameter extends Expression with InterpolatedNode
+class InterpolatedParameter extends Expression
+    with InterpolatedNode
     implements Identifier {
   final nameOrPosition;
   TypeRef get type => null;
 
-  String get name { throw "InterpolatedParameter.name must not be invoked"; }
+  String get name {
+    throw "InterpolatedParameter.name must not be invoked";
+  }
+
   bool get allowRename => false;
 
   InterpolatedParameter(this.nameOrPosition);
@@ -1626,7 +1655,8 @@
 }
 
 // TODO(jmesserly): generalize this to InterpolatedProperty?
-class InterpolatedMethod extends Expression with InterpolatedNode
+class InterpolatedMethod extends Expression
+    with InterpolatedNode
     implements Method {
   final nameOrPosition;
 
@@ -1646,15 +1676,15 @@
   get _unsupported => throw '$runtimeType does not support this member.';
 }
 
-class InterpolatedIdentifier extends Expression with InterpolatedNode
+class InterpolatedIdentifier extends Expression
+    with InterpolatedNode
     implements Identifier {
   final nameOrPosition;
   TypeRef get type => null;
 
   InterpolatedIdentifier(this.nameOrPosition);
 
-  accept(NodeVisitor visitor) =>
-      visitor.visitInterpolatedIdentifier(this);
+  accept(NodeVisitor visitor) => visitor.visitInterpolatedIdentifier(this);
   void visitChildren(NodeVisitor visitor) {}
   InterpolatedIdentifier _clone() => new InterpolatedIdentifier(nameOrPosition);
 
@@ -1758,7 +1788,8 @@
 
   /** If this import has `* as name` returns the name, otherwise null. */
   Identifier get importStarAs {
-    if (namedImports != null && namedImports.length == 1 &&
+    if (namedImports != null &&
+        namedImports.length == 1 &&
         namedImports[0].isStar) {
       return namedImports[0].asName;
     }
@@ -1772,6 +1803,7 @@
     }
     from.accept(visitor);
   }
+
   ImportDeclaration _clone() => new ImportDeclaration(
       defaultBinding: defaultBinding, namedImports: namedImports, from: from);
 }
@@ -1791,11 +1823,10 @@
 
   ExportDeclaration(this.exported, {this.isDefault: false}) {
     assert(exported is ClassDeclaration ||
-        exported is FunctionDeclaration ||
-        isDefault
-            ? exported is Expression
-            : exported is VariableDeclarationList ||
-              exported is ExportClause);
+            exported is FunctionDeclaration ||
+            isDefault
+        ? exported is Expression
+        : exported is VariableDeclarationList || exported is ExportClause);
   }
 
   /// Gets the list of names exported by this export declaration, or `null`
@@ -1842,6 +1873,7 @@
     for (NameSpecifier name in exports) name.accept(visitor);
     if (from != null) from.accept(visitor);
   }
+
   ExportClause _clone() => new ExportClause(exports, from: from);
 }
 
@@ -1875,5 +1907,6 @@
   void visitChildren(NodeVisitor visitor) {
     for (ModuleItem item in body) item.accept(visitor);
   }
+
   Module _clone() => new Module(body);
 }
diff --git a/pkg/dev_compiler/lib/src/js_ast/printer.dart b/pkg/dev_compiler/lib/src/js_ast/printer.dart
index 9e764af..72d5f63 100644
--- a/pkg/dev_compiler/lib/src/js_ast/printer.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/printer.dart
@@ -4,7 +4,6 @@
 
 part of js_ast;
 
-
 class JavaScriptPrintingOptions {
   final bool shouldCompressOutput;
   final bool minifyLocalVariables;
@@ -18,19 +17,20 @@
 
   JavaScriptPrintingOptions(
       {this.shouldCompressOutput: false,
-       this.minifyLocalVariables: false,
-       this.preferSemicolonToNewlineInMinifiedOutput: false,
-       this.emitTypes: false,
-       this.allowKeywordsInProperties: false,
-       this.allowSingleLineIfStatements: false});
+      this.minifyLocalVariables: false,
+      this.preferSemicolonToNewlineInMinifiedOutput: false,
+      this.emitTypes: false,
+      this.allowKeywordsInProperties: false,
+      this.allowSingleLineIfStatements: false});
 }
 
-
 /// An environment in which JavaScript printing is done.  Provides emitting of
 /// text and pre- and post-visit callbacks.
 abstract class JavaScriptPrintingContext {
   /// Signals an error.  This should happen only for serious internal errors.
-  void error(String message) { throw message; }
+  void error(String message) {
+    throw message;
+  }
 
   /// Adds [string] to the output.
   void emit(String string);
@@ -38,6 +38,7 @@
   /// Callback immediately before printing [node].  Whitespace may be printed
   /// after this callback before the first non-whitespace character for [node].
   void enterNode(Node node) {}
+
   /// Callback after printing the last character representing [node].
   void exitNode(Node node) {}
 }
@@ -72,29 +73,29 @@
   int _indentLevel = 0;
   // A cache of all indentation strings used so far.
   List<String> _indentList = <String>[""];
+
   /// Whether the next call to [indent] should just be a no-op.
   bool _skipNextIndent = false;
 
   static final identifierCharacterRegExp = new RegExp(r'^[a-zA-Z_0-9$]');
   static final expressionContinuationRegExp = new RegExp(r'^[-+([]');
 
-  Printer(JavaScriptPrintingOptions options,
-          JavaScriptPrintingContext context,
-          {LocalNamer localNamer})
+  Printer(JavaScriptPrintingOptions options, JavaScriptPrintingContext context,
+      {LocalNamer localNamer})
       : options = options,
         context = context,
         shouldCompressOutput = options.shouldCompressOutput,
         danglingElseVisitor = new DanglingElseVisitor(context),
         localNamer = determineRenamer(localNamer, options);
 
-  static LocalNamer determineRenamer(LocalNamer localNamer,
-                                     JavaScriptPrintingOptions options) {
+  static LocalNamer determineRenamer(
+      LocalNamer localNamer, JavaScriptPrintingOptions options) {
     if (localNamer != null) return localNamer;
     return (options.shouldCompressOutput && options.minifyLocalVariables)
-        ? new MinifyRenamer() : new IdentityNamer();
+        ? new MinifyRenamer()
+        : new IdentityNamer();
   }
 
-
   // The current indentation string.
   String get indentation {
     // Lazily add new indentation strings as required.
@@ -112,15 +113,16 @@
     _indentLevel--;
   }
 
-
   /// Always emit a newline, even under `enableMinification`.
   void forceLine() {
     out("\n");
   }
+
   /// Emits a newline for readability.
   void lineOut() {
     if (!shouldCompressOutput) forceLine();
   }
+
   void spaceOut() {
     if (!shouldCompressOutput) out(" ");
   }
@@ -182,8 +184,15 @@
     }
   }
 
-  void outIndent(String str) { indent(); out(str); }
-  void outIndentLn(String str) { indent(); outLn(str); }
+  void outIndent(String str) {
+    indent();
+    out(str);
+  }
+
+  void outIndentLn(String str) {
+    indent();
+    outLn(str);
+  }
 
   void skipNextIndent() {
     _skipNextIndent = true;
@@ -206,7 +215,7 @@
   }
 
   visitCommaSeparated(List<Node> nodes, int hasRequiredType,
-                      {bool newInForInit, bool newAtStatementBegin}) {
+      {bool newInForInit, bool newAtStatementBegin}) {
     for (int i = 0; i < nodes.length; i++) {
       if (i != 0) {
         atStatementBegin = false;
@@ -214,8 +223,7 @@
         spaceOut();
       }
       visitNestedExpression(nodes[i], hasRequiredType,
-                            newInForInit: newInForInit,
-                            newAtStatementBegin: newAtStatementBegin);
+          newInForInit: newInForInit, newAtStatementBegin: newAtStatementBegin);
     }
   }
 
@@ -282,7 +290,7 @@
     indent();
     outClosureAnnotation(expressionStatement);
     visitNestedExpression(expressionStatement.expression, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: true);
+        newInForInit: false, newAtStatementBegin: true);
     outSemicolonLn();
   }
 
@@ -309,7 +317,7 @@
     spaceOut();
     out("(");
     visitNestedExpression(node.condition, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
     bool thenWasBlock;
     if (options.allowSingleLineIfStatements && !hasElse && then is! Block) {
@@ -347,19 +355,19 @@
     out("(");
     if (loop.init != null) {
       visitNestedExpression(loop.init, EXPRESSION,
-                            newInForInit: true, newAtStatementBegin: false);
+          newInForInit: true, newAtStatementBegin: false);
     }
     out(";");
     if (loop.condition != null) {
       spaceOut();
       visitNestedExpression(loop.condition, EXPRESSION,
-                            newInForInit: false, newAtStatementBegin: false);
+          newInForInit: false, newAtStatementBegin: false);
     }
     out(";");
     if (loop.update != null) {
       spaceOut();
       visitNestedExpression(loop.update, EXPRESSION,
-                            newInForInit: false, newAtStatementBegin: false);
+          newInForInit: false, newAtStatementBegin: false);
     }
     out(")");
     blockBody(loop.body, needsSeparation: false, needsNewline: true);
@@ -370,11 +378,11 @@
     spaceOut();
     out("(");
     visitNestedExpression(loop.leftHandSide, EXPRESSION,
-                          newInForInit: true, newAtStatementBegin: false);
+        newInForInit: true, newAtStatementBegin: false);
     out(" in");
     pendingSpace = true;
     visitNestedExpression(loop.object, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
     blockBody(loop.body, needsSeparation: false, needsNewline: true);
   }
@@ -384,11 +392,11 @@
     spaceOut();
     out("(");
     visitNestedExpression(loop.leftHandSide, EXPRESSION,
-    newInForInit: true, newAtStatementBegin: false);
+        newInForInit: true, newAtStatementBegin: false);
     out(" of");
     pendingSpace = true;
     visitNestedExpression(loop.iterable, EXPRESSION,
-    newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
     blockBody(loop.body, needsSeparation: false, needsNewline: true);
   }
@@ -398,7 +406,7 @@
     spaceOut();
     out("(");
     visitNestedExpression(loop.condition, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
     blockBody(loop.body, needsSeparation: false, needsNewline: true);
   }
@@ -414,7 +422,7 @@
     spaceOut();
     out("(");
     visitNestedExpression(loop.condition, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
     outSemicolonLn();
   }
@@ -444,7 +452,7 @@
       outIndent("return");
       pendingSpace = true;
       visitNestedExpression(node.value, EXPRESSION,
-                            newInForInit: false, newAtStatementBegin: false);
+          newInForInit: false, newAtStatementBegin: false);
     }
     outSemicolonLn();
   }
@@ -457,16 +465,15 @@
     }
     pendingSpace = true;
     visitNestedExpression(node.expression, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     outSemicolonLn();
   }
 
-
   visitThrow(Throw node) {
     outIndent("throw");
     pendingSpace = true;
     visitNestedExpression(node.expression, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     outSemicolonLn();
   }
 
@@ -491,7 +498,7 @@
     spaceOut();
     out("(");
     visitNestedExpression(node.declaration, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
     blockBody(node.body, needsSeparation: false, needsNewline: true);
   }
@@ -501,7 +508,7 @@
     spaceOut();
     out("(");
     visitNestedExpression(node.key, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
     spaceOut();
     outLn("{");
@@ -515,7 +522,7 @@
     outIndent("case");
     pendingSpace = true;
     visitNestedExpression(node.expression, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     outLn(":");
     if (!node.body.statements.isEmpty) {
       blockOut(node.body, true, true);
@@ -541,14 +548,14 @@
       out(" ");
       // Name must be a [Decl]. Therefore only test for primary expressions.
       visitNestedExpression(name, PRIMARY,
-                            newInForInit: false, newAtStatementBegin: false);
+          newInForInit: false, newAtStatementBegin: false);
     }
     localNamer.enterScope(fun);
     outTypeParams(fun.typeParams);
     out("(");
     if (fun.params != null) {
       visitCommaSeparated(fun.params, PRIMARY,
-                          newInForInit: false, newAtStatementBegin: false);
+          newInForInit: false, newAtStatementBegin: false);
     }
     out(")");
     outTypeAnnotation(fun.returnType);
@@ -577,19 +584,20 @@
   }
 
   visitNestedExpression(Expression node, int requiredPrecedence,
-                        {bool newInForInit, bool newAtStatementBegin}) {
+      {bool newInForInit, bool newAtStatementBegin}) {
     int nodePrecedence = node.precedenceLevel;
     bool needsParentheses =
         // a - (b + c).
         (requiredPrecedence != EXPRESSION &&
-         nodePrecedence < requiredPrecedence) ||
-        // for (a = (x in o); ... ; ... ) { ... }
-        (newInForInit && node is Binary && node.op == "in") ||
-        // (function() { ... })().
-        // ({a: 2, b: 3}.toString()).
-        (newAtStatementBegin && (node is NamedFunction ||
-                                 node is FunctionExpression ||
-                                 node is ObjectInitializer));
+                nodePrecedence < requiredPrecedence) ||
+            // for (a = (x in o); ... ; ... ) { ... }
+            (newInForInit && node is Binary && node.op == "in") ||
+            // (function() { ... })().
+            // ({a: 2, b: 3}.toString()).
+            (newAtStatementBegin &&
+                (node is NamedFunction ||
+                    node is FunctionExpression ||
+                    node is ObjectInitializer));
     if (needsParentheses) {
       inForInit = false;
       atStatementBegin = false;
@@ -612,19 +620,20 @@
       out(" ");
     }
     visitCommaSeparated(list.declarations, ASSIGNMENT,
-                        newInForInit: inForInit, newAtStatementBegin: false);
+        newInForInit: inForInit, newAtStatementBegin: false);
   }
 
   visitArrayBindingPattern(ArrayBindingPattern node) {
     out("[");
     visitCommaSeparated(node.variables, EXPRESSION,
-                        newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out("]");
   }
+
   visitObjectBindingPattern(ObjectBindingPattern node) {
     out("{");
     visitCommaSeparated(node.variables, EXPRESSION,
-                        newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out("}");
   }
 
@@ -653,7 +662,7 @@
       out("=");
       spaceOut();
       visitNestedExpression(node.defaultValue, EXPRESSION,
-                            newInForInit: false, newAtStatementBegin: false);
+          newInForInit: false, newAtStatementBegin: false);
     }
   }
 
@@ -663,8 +672,7 @@
 
   visitAssignment(Assignment assignment) {
     visitNestedExpression(assignment.leftHandSide, LEFT_HAND_SIDE,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: atStatementBegin);
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
     if (assignment.value != null) {
       spaceOut();
       String op = assignment.op;
@@ -672,8 +680,7 @@
       out("=");
       spaceOut();
       visitNestedExpression(assignment.value, ASSIGNMENT,
-                            newInForInit: inForInit,
-                            newAtStatementBegin: false);
+          newInForInit: inForInit, newAtStatementBegin: false);
     }
   }
 
@@ -684,40 +691,38 @@
 
   visitConditional(Conditional cond) {
     visitNestedExpression(cond.condition, LOGICAL_OR,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: atStatementBegin);
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
     spaceOut();
     out("?");
     spaceOut();
     // The then part is allowed to have an 'in'.
     visitNestedExpression(cond.then, ASSIGNMENT,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     spaceOut();
     out(":");
     spaceOut();
     visitNestedExpression(cond.otherwise, ASSIGNMENT,
-                          newInForInit: inForInit, newAtStatementBegin: false);
+        newInForInit: inForInit, newAtStatementBegin: false);
   }
 
   visitNew(New node) {
     out("new ");
     inNewTarget = true;
     visitNestedExpression(node.target, ACCESS,
-                          newInForInit: inForInit, newAtStatementBegin: false);
+        newInForInit: inForInit, newAtStatementBegin: false);
     inNewTarget = false;
     out("(");
     visitCommaSeparated(node.arguments, SPREAD,
-                        newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
   }
 
   visitCall(Call call) {
     visitNestedExpression(call.target, LEFT_HAND_SIDE,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: atStatementBegin);
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
     out("(");
     visitCommaSeparated(call.arguments, SPREAD,
-                        newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
   }
 
@@ -727,7 +732,7 @@
     String op = binary.op;
     int leftPrecedenceRequirement;
     int rightPrecedenceRequirement;
-    bool leftSpace = true;   // left<HERE>op right
+    bool leftSpace = true; // left<HERE>op right
     switch (op) {
       case ',':
         //  x, (y, z) <=> (x, y), z.
@@ -804,8 +809,7 @@
     }
 
     visitNestedExpression(left, leftPrecedenceRequirement,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: atStatementBegin);
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
 
     if (op == "in" || op == "instanceof") {
       // There are cases where the space is not required but without further
@@ -819,8 +823,7 @@
       spaceOut();
     }
     visitNestedExpression(right, rightPrecedenceRequirement,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: false);
+        newInForInit: inForInit, newAtStatementBegin: false);
   }
 
   visitPrefix(Prefix unary) {
@@ -848,7 +851,7 @@
         out(op);
     }
     visitNestedExpression(unary.argument, unary.precedenceLevel,
-                          newInForInit: inForInit, newAtStatementBegin: false);
+        newInForInit: inForInit, newAtStatementBegin: false);
   }
 
   visitSpread(Spread unary) => visitPrefix(unary);
@@ -863,8 +866,7 @@
 
   visitPostfix(Postfix postfix) {
     visitNestedExpression(postfix.argument, LEFT_HAND_SIDE,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: atStatementBegin);
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
     out(postfix.op);
   }
 
@@ -897,10 +899,10 @@
       // TODO(floitsch): allow more characters.
       int charCode = field.codeUnitAt(i);
       if (!(charCodes.$a <= charCode && charCode <= charCodes.$z ||
-            charCodes.$A <= charCode && charCode <= charCodes.$Z ||
-            charCode == charCodes.$$ ||
-            charCode == charCodes.$_ ||
-            i != 1 && isDigit(charCode))) {
+          charCodes.$A <= charCode && charCode <= charCodes.$Z ||
+          charCode == charCodes.$$ ||
+          charCode == charCodes.$_ ||
+          i != 1 && isDigit(charCode))) {
         return false;
       }
     }
@@ -929,8 +931,7 @@
     int precedence = inNewTarget ? ACCESS : CALL;
 
     visitNestedExpression(access.receiver, precedence,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: atStatementBegin);
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
     propertyNameOut(access.selector, inAccess: true);
   }
 
@@ -1015,7 +1016,7 @@
         indent();
       }
       visitNestedExpression(element, ASSIGNMENT,
-                            newInForInit: false, newAtStatementBegin: false);
+          newInForInit: false, newAtStatementBegin: false);
       // We can skip the trailing "," for the last element (since it's not
       // an array hole).
       if (i != elements.length - 1) out(",");
@@ -1062,7 +1063,7 @@
     out(":");
     spaceOut();
     visitNestedExpression(node.value, ASSIGNMENT,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
   }
 
   visitRegExpLiteral(RegExpLiteral node) {
@@ -1184,9 +1185,8 @@
     }
   }
 
-  void propertyNameOut(Expression node, {bool inMethod: false,
-      bool inAccess: false}) {
-
+  void propertyNameOut(Expression node,
+      {bool inMethod: false, bool inAccess: false}) {
     if (node is LiteralNumber) {
       LiteralNumber nameNumber = node;
       if (inAccess) out('[');
@@ -1206,7 +1206,7 @@
         // ComputedPropertyName
         out("[");
         visitNestedExpression(node, EXPRESSION,
-                              newInForInit: false, newAtStatementBegin: false);
+            newInForInit: false, newAtStatementBegin: false);
         out("]");
       }
     }
@@ -1395,9 +1395,10 @@
   final Set<String> vars;
   final Set<String> params;
 
-  VarCollector() : nested = false,
-                   vars = new Set<String>(),
-                   params = new Set<String>();
+  VarCollector()
+      : nested = false,
+        vars = new Set<String>(),
+        params = new Set<String>();
 
   void forEachVar(void fn(String v)) => vars.forEach(fn);
   void forEachParam(void fn(String p)) => params.forEach(fn);
@@ -1460,7 +1461,6 @@
   }
 }
 
-
 /**
  * Returns true, if the given node must be wrapped into braces when used
  * as then-statement in an [If] that has an else branch.
@@ -1484,6 +1484,7 @@
     if (!node.hasElse) return true;
     return node.otherwise.accept(this);
   }
+
   bool visitFor(For node) => node.body.accept(this);
   bool visitForIn(ForIn node) => node.body.accept(this);
   bool visitForOf(ForOf node) => node.body.accept(this);
@@ -1500,34 +1501,31 @@
       return node.catchPart.accept(this);
     }
   }
+
   bool visitCatch(Catch node) => node.body.accept(this);
   bool visitSwitch(Switch node) => false;
   bool visitCase(Case node) => false;
   bool visitDefault(Default node) => false;
   bool visitFunctionDeclaration(FunctionDeclaration node) => false;
-  bool visitLabeledStatement(LabeledStatement node)
-      => node.body.accept(this);
+  bool visitLabeledStatement(LabeledStatement node) => node.body.accept(this);
   bool visitLiteralStatement(LiteralStatement node) => true;
   bool visitClassDeclaration(ClassDeclaration node) => false;
 
   bool visitExpression(Expression node) => false;
 }
 
-
 abstract class LocalNamer {
   String getName(Identifier node);
   void enterScope(FunctionExpression node);
   void leaveScope();
 }
 
-
 class IdentityNamer implements LocalNamer {
   String getName(Identifier node) => node.name;
   void enterScope(FunctionExpression node) {}
   void leaveScope() {}
 }
 
-
 class MinifyRenamer implements LocalNamer {
   final List<Map<String, String>> maps = [];
   final List<int> parameterNumberStack = [];
@@ -1567,9 +1565,9 @@
   static const DIGITS = 10;
 
   static int nthLetter(int n) {
-    return (n < LOWER_CASE_LETTERS) ?
-           charCodes.$a + n :
-           charCodes.$A + n - LOWER_CASE_LETTERS;
+    return (n < LOWER_CASE_LETTERS)
+        ? charCodes.$a + n
+        : charCodes.$A + n - LOWER_CASE_LETTERS;
   }
 
   // Parameters go from a to z and variables go from z to a.  This makes each
@@ -1661,8 +1659,10 @@
   }
 
   _scanVariableBinding(VariableBinding d) {
-    if (d is Identifier) declare(d);
-    else d.accept(this);
+    if (d is Identifier)
+      declare(d);
+    else
+      d.accept(this);
   }
 
   visitRestParameter(RestParameter node) {
diff --git a/pkg/dev_compiler/lib/src/js_ast/template.dart b/pkg/dev_compiler/lib/src/js_ast/template.dart
index 929f621..efac3f4 100644
--- a/pkg/dev_compiler/lib/src/js_ast/template.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/template.dart
@@ -200,6 +200,7 @@
           return error('Interpolated value #$nameOrPosition is not '
               'an Expression or List of Expressions: $value');
         }
+
         if (value is Iterable) return value.map(toExpression);
         return toExpression(value);
       };
@@ -227,6 +228,7 @@
         return error('Interpolated value #$nameOrPosition is not an Identifier'
             ' or List of Identifiers: $value');
       }
+
       if (value is Iterable) return value.map(toIdentifier);
       return toIdentifier(value);
     };
@@ -263,6 +265,7 @@
         return error('Interpolated value #$nameOrPosition is not a Method '
             'or List of Methods: $value');
       }
+
       if (value is Iterable) return value.map(toMethod);
       return toMethod(value);
     };
@@ -291,6 +294,7 @@
           return error('Interpolated value #$nameOrPosition is not '
               'a Statement or List of Statements: $value');
         }
+
         if (value is Iterable) return value.map(toStatement);
         return toStatement(value);
       };
@@ -310,6 +314,7 @@
           statements.add(node.toStatement());
         }
       }
+
       for (Instantiator instantiator in instantiators) {
         add(instantiator(arguments));
       }
@@ -331,6 +336,7 @@
           statements.add(node.toStatement());
         }
       }
+
       for (Instantiator instantiator in instantiators) {
         add(instantiator(arguments));
       }
@@ -369,6 +375,7 @@
             'is not an Expression: $value');
       };
     }
+
     var makeCondition = compileCondition(node.condition);
     Instantiator makeThen = visit(node.then);
     Instantiator makeOtherwise = visit(node.otherwise);
@@ -567,13 +574,11 @@
         makeThen(arguments), makeOtherwise(arguments));
   }
 
-  Instantiator visitNew(New node) =>
-      handleCallOrNew(node, (target, arguments) =>
-          new New(target, arguments as List<Expression>));
+  Instantiator visitNew(New node) => handleCallOrNew(node,
+      (target, arguments) => new New(target, arguments as List<Expression>));
 
-  Instantiator visitCall(Call node) =>
-      handleCallOrNew(node, (target, arguments) =>
-          new Call(target, arguments as List<Expression>));
+  Instantiator visitCall(Call node) => handleCallOrNew(node,
+      (target, arguments) => new Call(target, arguments as List<Expression>));
 
   Instantiator handleCallOrNew(Call node, finish(target, arguments)) {
     Instantiator makeTarget = visit(node.target);
diff --git a/pkg/dev_compiler/lib/src/js_ast/type_printer.dart b/pkg/dev_compiler/lib/src/js_ast/type_printer.dart
index db720ba..35e7be6 100644
--- a/pkg/dev_compiler/lib/src/js_ast/type_printer.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/type_printer.dart
@@ -38,7 +38,6 @@
 }
 
 abstract class TypeScriptTypePrinter extends _TypePrinterBase {
-
   void _outTypeAnnotation(TypeRef type) {
     if (type is OptionalTypeRef) {
       out("?: ");
@@ -158,7 +157,8 @@
     }
   }
 
-  @override toString() => _buffer.toString();
+  @override
+  toString() => _buffer.toString();
 
   @override
   visitArrayTypeRef(ArrayTypeRef node) {
diff --git a/pkg/dev_compiler/test/closure/closure_annotation_test.dart b/pkg/dev_compiler/test/closure/closure_annotation_test.dart
index cf4ae6a..7c3ae32 100644
--- a/pkg/dev_compiler/test/closure/closure_annotation_test.dart
+++ b/pkg/dev_compiler/test/closure/closure_annotation_test.dart
@@ -16,8 +16,8 @@
     var numberType = new TypeRef.number();
     var stringType = new TypeRef.string();
     var booleanType = new TypeRef.boolean();
-    var fooType = new TypeRef.qualified(
-        [new Identifier("foo"), new Identifier("Foo")]);
+    var fooType =
+        new TypeRef.qualified([new Identifier("foo"), new Identifier("Foo")]);
     var barType = new TypeRef.named("Bar");
     var bazType = new TypeRef.named("Baz");
     var bamType = new TypeRef.named("Bam");
@@ -39,9 +39,10 @@
     });
 
     test('gives multiple line comment when it it does not fit on one line', () {
-      expect(new ClosureAnnotation(
-                  returnType: stringType, paramTypes: {'foo': numberType})
-              .toString(),
+      expect(
+          new ClosureAnnotation(
+              returnType: stringType,
+              paramTypes: {'foo': numberType}).toString(),
           "/**\n"
           " * @param {number} foo\n"
           " * @return {string}\n"
@@ -49,9 +50,10 @@
     });
 
     test('inserts indentation', () {
-      expect(new ClosureAnnotation(
-                  returnType: stringType, paramTypes: {'foo': numberType})
-              .toString("  "),
+      expect(
+          new ClosureAnnotation(
+              returnType: stringType,
+              paramTypes: {'foo': numberType}).toString("  "),
           "/**\n" // No indent on first line.
           "   * @param {number} foo\n"
           "   * @return {string}\n"
@@ -75,18 +77,21 @@
       expect(
           new ClosureAnnotation(type: stringType, isProtected: true).toString(),
           "/** @protected {string} */");
-      expect(new ClosureAnnotation(
-              type: stringType,
-              isPrivate: true,
-              isConst: true,
-              isFinal: true,
-              isProtected: true,
-              isTypedef: true).toString(),
+      expect(
+          new ClosureAnnotation(
+                  type: stringType,
+                  isPrivate: true,
+                  isConst: true,
+                  isFinal: true,
+                  isProtected: true,
+                  isTypedef: true)
+              .toString(),
           "/** @private @protected @final @const @typedef {string} */");
     });
 
     test('supports a full constructor annotation', () {
-      expect(new ClosureAnnotation(
+      expect(
+          new ClosureAnnotation(
               returnType: booleanType,
               throwsType: bamType,
               thisType: fooType,
diff --git a/pkg/dev_compiler/test/closure/closure_type_test.dart b/pkg/dev_compiler/test/closure/closure_type_test.dart
index 93a9e3d..b21d9d2 100644
--- a/pkg/dev_compiler/test/closure/closure_type_test.dart
+++ b/pkg/dev_compiler/test/closure/closure_type_test.dart
@@ -41,10 +41,12 @@
     });
 
     test('supports map types', () {
-      expectToString(new ClosureType.map(
+      expectToString(
+          new ClosureType.map(
               new ClosureType.type("Foo"), new ClosureType.type("Bar")),
           "Object<Foo, Bar>",
-          nullable: "Object<Foo, Bar>", nonNullable: "!Object<Foo, Bar>");
+          nullable: "Object<Foo, Bar>",
+          nonNullable: "!Object<Foo, Bar>");
       expectToString(new ClosureType.map(), "Object<*, *>",
           nullable: "Object<*, *>", nonNullable: "!Object<*, *>");
     });
@@ -56,10 +58,11 @@
           "function(number)");
       expectToString(new ClosureType.function(null, new ClosureType.number()),
           "function(...*):number");
-      expectToString(new ClosureType.function([
-        new ClosureType.number(),
-        new ClosureType.string()
-      ], new ClosureType.boolean()), "function(number, string):boolean");
+      expectToString(
+          new ClosureType.function(
+              [new ClosureType.number(), new ClosureType.string()],
+              new ClosureType.boolean()),
+          "function(number, string):boolean");
     });
 
     test('supports union types', () {
@@ -70,7 +73,8 @@
     });
 
     test('supports record types', () {
-      expectToString(new ClosureType.record(
+      expectToString(
+          new ClosureType.record(
               {'x': new ClosureType.number(), 'y': new ClosureType.boolean()}),
           "{x: number, y: boolean}");
     });
diff --git a/pkg/dev_compiler/test/codegen/async_helper.dart b/pkg/dev_compiler/test/codegen/async_helper.dart
index be5014f..bfde1a4 100644
--- a/pkg/dev_compiler/test/codegen/async_helper.dart
+++ b/pkg/dev_compiler/test/codegen/async_helper.dart
@@ -50,7 +50,7 @@
 void asyncStart() {
   if (_initialized && _asyncLevel == 0) {
     throw _buildException('asyncStart() was called even though we are done '
-                          'with testing.');
+        'with testing.');
   }
   if (!_initialized) {
     if (_onAsyncEnd == null) {
@@ -60,7 +60,6 @@
 
     print('unittest-suite-wait-for-done');
     _initialized = true;
-
   }
   _asyncLevel++;
 }
@@ -72,7 +71,7 @@
       throw _buildException('asyncEnd() was called before asyncStart().');
     } else {
       throw _buildException('asyncEnd() was called more often than '
-                            'asyncStart().');
+          'asyncStart().');
     }
   }
   _asyncLevel--;
diff --git a/pkg/dev_compiler/test/codegen/closure.dart b/pkg/dev_compiler/test/codegen/closure.dart
index ad2e3ab..9e70097 100644
--- a/pkg/dev_compiler/test/codegen/closure.dart
+++ b/pkg/dev_compiler/test/codegen/closure.dart
@@ -1,5 +1,6 @@
 // compile options: --closure-experimental --destructure-named-params --modules=es6
 library test;
+
 import 'dart:js';
 
 List/*<T>*/ generic_function/*<T>*/(List/*<T>*/ items, dynamic/*=T*/ seed) {
@@ -23,10 +24,8 @@
 
   T pass(T t) => t;
 
-  String typed_method(
-      Foo foo, List list,
-      int i, num n, double d, bool b, String s,
-      JsArray a, JsObject o, JsFunction f) {
+  String typed_method(Foo foo, List list, int i, num n, double d, bool b,
+      String s, JsArray a, JsObject o, JsFunction f) {
     return '';
   }
 
@@ -40,7 +39,8 @@
     cb(i: i);
   }
 
-  run(List a, String b, List c(String d), List<int> e(f(g)), {Map<Map, Map> h}) {}
+  run(List a, String b, List c(String d), List<int> e(f(g)),
+      {Map<Map, Map> h}) {}
 
   String get prop => null;
   set prop(String value) {}
@@ -61,7 +61,9 @@
 
 void main(args) {}
 
-var closure = () { return; };
+var closure = () {
+  return;
+};
 
 const String some_top_level_constant = "abc";
 final String some_top_level_final = "abc";
diff --git a/pkg/dev_compiler/test/codegen/destructuring.dart b/pkg/dev_compiler/test/codegen/destructuring.dart
index 3c6bd62..60cbe62 100644
--- a/pkg/dev_compiler/test/codegen/destructuring.dart
+++ b/pkg/dev_compiler/test/codegen/destructuring.dart
@@ -5,22 +5,25 @@
 f(int a, b, [c = 1]) {
   f(a, b, c);
 }
+
 external f_ext(int a, b, [c = 1]);
 f_nat(int a, b, [c = 1]) native "f_nat";
 f_sync(int a, b, [c = 1]) sync* {}
 f_async(int a, b, [c = 1]) async* {}
 
-g(int a, b, {c : 1}) {
+g(int a, b, {c: 1}) {
   f(a, b, c);
 }
-external g_ext(int a, b, {c : 1});
-g_nat(int a, b, {c : 1}) native "g_nat";
-g_sync(int a, b, {c : 1}) sync* {}
-g_async(int a, b, {c : 1}) async* {}
+
+external g_ext(int a, b, {c: 1});
+g_nat(int a, b, {c: 1}) native "g_nat";
+g_sync(int a, b, {c: 1}) sync* {}
+g_async(int a, b, {c: 1}) async* {}
 
 r(int a, @rest others) {
   r(a, spread(others));
 }
+
 external r_ext(int a, @rest others);
 r_nat(int a, @rest others) native "r_nat";
 r_sync(int a, @rest others) sync* {}
@@ -29,13 +32,16 @@
 invalid_names1(int let, function, arguments) {
   f(let, function, arguments);
 }
+
 invalid_names2([int let, function = 1, arguments]) {
   f(let, function, arguments);
 }
-invalid_names3({int let, function, arguments : 2}) {
+
+invalid_names3({int let, function, arguments: 2}) {
   f(let, function, arguments);
 }
 
-names_clashing_with_object_props({int constructor, valueOf, hasOwnProperty : 2}) {
+names_clashing_with_object_props(
+    {int constructor, valueOf, hasOwnProperty: 2}) {
   f(constructor, valueOf, hasOwnProperty);
 }
diff --git a/pkg/dev_compiler/test/codegen/es6_modules.dart b/pkg/dev_compiler/test/codegen/es6_modules.dart
index aeae6a1..10472b7 100644
--- a/pkg/dev_compiler/test/codegen/es6_modules.dart
+++ b/pkg/dev_compiler/test/codegen/es6_modules.dart
@@ -4,8 +4,11 @@
 typedef void Callback({int i});
 
 class A {}
+
 class _A {}
+
 class B<T> {}
+
 class _B<T> {}
 
 f() {}
diff --git a/pkg/dev_compiler/test/codegen/js_test.dart b/pkg/dev_compiler/test/codegen/js_test.dart
index 2c862d0..71e0f5d5 100644
--- a/pkg/dev_compiler/test/codegen/js_test.dart
+++ b/pkg/dev_compiler/test/codegen/js_test.dart
@@ -37,7 +37,6 @@
 
 main() {
   group('identity', () {
-
     test('context instances should be identical', () {
       var c1 = context;
       var c2 = context;
@@ -82,11 +81,9 @@
         expect(obj['role'], 'object');
       });
     });
-
   });
 
   group('context', () {
-
     test('read global field', () {
       expect(context['x'], 42);
       expect(context['y'], null);
@@ -101,11 +98,9 @@
       context['y'] = 42;
       expect(context['y'], 42);
     });
-
   });
 
   group('new JsObject()', () {
-
     test('new Foo()', () {
       var foo = new JsObject(context['Foo'], [42]);
       expect(foo['a'], 42);
@@ -147,8 +142,8 @@
     });
 
     test('new Date("December 17, 1995 03:24:00 GMT")', () {
-      final a = new JsObject(context['Date'],
-          ["December 17, 1995 03:24:00 GMT"]);
+      final a =
+          new JsObject(context['Date'], ["December 17, 1995 03:24:00 GMT"]);
       expect(a.callMethod('getTime'), 819170640000);
     });
 
@@ -161,8 +156,7 @@
 
     test('new Date(1995,11,17,3,24,0)', () {
       // Note: JS Date counts months from 0 while Dart counts from 1.
-      final a = new JsObject(context['Date'],
-          [1995, 11, 17, 3, 24, 0]);
+      final a = new JsObject(context['Date'], [1995, 11, 17, 3, 24, 0]);
       final b = new DateTime(1995, 12, 17, 3, 24, 0);
       expect(a.callMethod('getTime'), b.millisecondsSinceEpoch);
     });
@@ -201,7 +195,8 @@
     });
 
     test('>10 parameters', () {
-      final o = new JsObject(context['Baz'], [1,2,3,4,5,6,7,8,9,10,11]);
+      final o =
+          new JsObject(context['Baz'], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
       for (var i = 1; i <= 11; i++) {
         expect(o["f$i"], i);
       }
@@ -210,7 +205,6 @@
   });
 
   group('JsFunction and callMethod', () {
-
     test('new JsObject can return a JsFunction', () {
       var f = new JsObject(context['Function']);
       expect(f, (a) => a is JsFunction);
@@ -231,19 +225,17 @@
     });
 
     test('callMethod with many arguments', () {
-      expect(context.callMethod('varArgs', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),
-        55);
+      expect(
+          context.callMethod('varArgs', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), 55);
     });
 
     test('access a property of a function', () {
       expect(context.callMethod('Bar'), "ret_value");
       expect(context['Bar']['foo'], "property_value");
     });
-
   });
 
   group('JsArray', () {
-
     test('new JsArray()', () {
       var array = new JsArray();
       var arrayType = context['Array'];
@@ -263,8 +255,9 @@
 
     test('get Array from JS', () {
       context['a'] = new JsObject(context['Array'], [1, 2, 3]);
-      expect(context.callMethod('isPropertyInstanceOf',
-          ['a', context['Array']]), true);
+      expect(
+          context.callMethod('isPropertyInstanceOf', ['a', context['Array']]),
+          true);
       var a = context['a'];
       expect(a, (a) => a is JsArray);
       expect(a, [1, 2, 3]);
@@ -273,8 +266,9 @@
 
     test('pass Array to JS', () {
       context['a'] = [1, 2, 3];
-      expect(context.callMethod('isPropertyInstanceOf',
-          ['a', context['Array']]), false);
+      expect(
+          context.callMethod('isPropertyInstanceOf', ['a', context['Array']]),
+          false);
       var a = context['a'];
       expect(a, (a) => a is List);
       expect(a, isNot((a) => a is JsArray));
@@ -290,7 +284,7 @@
       expect(() => array[2], throwsA(isRangeError));
     });
 
-   test('[]=', () {
+    test('[]=', () {
       var array = new JsArray.from([1, 2]);
       array[0] = 'd';
       array[1] = 'e';
@@ -309,8 +303,8 @@
       array.length = 3;
       expect(array, [1, 2, null]);
     });
- 
-     test('add', () {
+
+    test('add', () {
       var array = new JsArray();
       array.add('a');
       expect(array, ['a']);
@@ -383,11 +377,9 @@
       array.sort((a, b) => -(a.compareTo(b)));
       expect(array, ['c', 'b', 'a']);
     });
-
   });
 
   group('JsObject.fromBrowserObject()', () {
-
     test('Nodes are proxied', () {
       var node = new JsObject.fromBrowserObject(document.createElement('div'));
       context.callMethod('addTestProperty', [node]);
@@ -402,7 +394,6 @@
             throwsA((a) => a is ArgumentError));
       }
     });
-
   });
 
   group('Dart functions', () {
@@ -416,8 +407,7 @@
     });
 
     test('callback as parameter', () {
-      expect(context.callMethod('getTypeOf', [context['razzle']]),
-          "function");
+      expect(context.callMethod('getTypeOf', [context['razzle']]), "function");
     });
 
     test('invoke Dart callback from JS with this', () {
@@ -430,15 +420,16 @@
     });
 
     test('invoke Dart callback from JS with 11 parameters', () {
-      context['callbackWith11params'] = (p1, p2, p3, p4, p5, p6, p7,
-          p8, p9, p10, p11) => '$p1$p2$p3$p4$p5$p6$p7$p8$p9$p10$p11';
-      expect(context.callMethod('invokeCallbackWith11params'),
-          '1234567891011');
+      context['callbackWith11params'] =
+          (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) =>
+              '$p1$p2$p3$p4$p5$p6$p7$p8$p9$p10$p11';
+      expect(context.callMethod('invokeCallbackWith11params'), '1234567891011');
     });
 
     test('return a JS proxy to JavaScript', () {
-      var result = context.callMethod('testJsMap',
-          [() => new JsObject.jsify({'value': 42})]);
+      var result = context.callMethod('testJsMap', [
+        () => new JsObject.jsify({'value': 42})
+      ]);
       expect(result, 42);
     });
 
@@ -448,17 +439,15 @@
       expect(result, 'called');
       context.deleteProperty('callable');
     });
-
   });
 
   group('JsObject.jsify()', () {
-
     test('convert a List', () {
       final list = [1, 2, 3, 4, 5, 6, 7, 8];
       var array = new JsObject.jsify(list);
       expect(context.callMethod('isArray', [array]), true);
       expect(array['length'], list.length);
-      for (var i = 0; i < list.length ; i++) {
+      for (var i = 0; i < list.length; i++) {
         expect(array[i], list[i]);
       }
     });
@@ -468,7 +457,7 @@
       var array = new JsObject.jsify(set);
       expect(context.callMethod('isArray', [array]), true);
       expect(array['length'], set.length);
-      for (var i = 0; i < array['length'] ; i++) {
+      for (var i = 0; i < array['length']; i++) {
         expect(set.contains(array[i]), true);
       }
     });
@@ -484,7 +473,10 @@
 
     test('deep convert a complex object', () {
       final object = {
-        'a': [1, [2, 3]],
+        'a': [
+          1,
+          [2, 3]
+        ],
         'b': {
           'c': 3,
           'd': new JsObject(context['Foo'], [42])
@@ -502,13 +494,11 @@
     });
 
     test('throws if object is not a Map or Iterable', () {
-      expect(() => new JsObject.jsify('a'),
-          throwsA((a) => a is ArgumentError));
+      expect(() => new JsObject.jsify('a'), throwsA((a) => a is ArgumentError));
     });
   });
 
   group('JsObject methods', () {
-
     test('hashCode and ==', () {
       final o1 = context['Object'];
       final o2 = context['Object'];
@@ -566,13 +556,10 @@
       foo["getAge"] = () => 10;
       expect(foo.callMethod('getAge'), 10);
     });
-
   });
 
   group('transferrables', () {
-
     group('JS->Dart', () {
-
       test('DateTime', () {
         var date = context.callMethod('getNewDate');
         expect(date is DateTime, true);
@@ -633,16 +620,14 @@
         var node = context.callMethod('getNewImageData');
         expect(node is ImageData, true);
       });
-
     });
 
     group('Dart->JS', () {
-
       test('Date', () {
         context['o'] = new DateTime(1995, 12, 17);
         var dateType = context['Date'];
-        expect(context.callMethod('isPropertyInstanceOf', ['o', dateType]),
-            true);
+        expect(
+            context.callMethod('isPropertyInstanceOf', ['o', dateType]), true);
         context.deleteProperty('o');
       });
 
@@ -666,24 +651,24 @@
         var fileParts = ['<a id="a"><b id="b">hey!</b></a>'];
         context['o'] = new Blob(fileParts, type: 'text/html');
         var blobType = context['Blob'];
-        expect(context.callMethod('isPropertyInstanceOf', ['o', blobType]),
-            true);
+        expect(
+            context.callMethod('isPropertyInstanceOf', ['o', blobType]), true);
         context.deleteProperty('o');
       });
 
       test('unattached DivElement', () {
         context['o'] = document.createElement('div');
         var divType = context['HTMLDivElement'];
-        expect(context.callMethod('isPropertyInstanceOf', ['o', divType]),
-            true);
+        expect(
+            context.callMethod('isPropertyInstanceOf', ['o', divType]), true);
         context.deleteProperty('o');
       });
 
       test('Event', () {
         context['o'] = new CustomEvent('test');
         var eventType = context['Event'];
-        expect(context.callMethod('isPropertyInstanceOf', ['o', eventType]),
-            true);
+        expect(
+            context.callMethod('isPropertyInstanceOf', ['o', eventType]), true);
         context.deleteProperty('o');
       });
 
@@ -699,7 +684,6 @@
             true);
         context.deleteProperty('o');
       });
-
     });
   });
 }
diff --git a/pkg/dev_compiler/test/codegen/map_keys.dart b/pkg/dev_compiler/test/codegen/map_keys.dart
index 4cb59fb..0bb6e00 100644
--- a/pkg/dev_compiler/test/codegen/map_keys.dart
+++ b/pkg/dev_compiler/test/codegen/map_keys.dart
@@ -3,16 +3,17 @@
 // (this is used so we're covering it in at least one test)
 
 import 'dart:math' show Random;
+
 main() {
   // Uses a JS object literal
-  print({ '1': 2, '3': 4, '5': 6 });
+  print({'1': 2, '3': 4, '5': 6});
   // Uses array literal
-  print({ 1: 2, 3: 4, 5: 6 });
+  print({1: 2, 3: 4, 5: 6});
   // Uses ES6 enhanced object literal
-  print({ '1': 2, '${new Random().nextInt(2) + 2}': 4, '5': 6 });
+  print({'1': 2, '${new Random().nextInt(2) + 2}': 4, '5': 6});
   String x = '3';
   // Could use enhanced object literal if we knew `x` was not null
-  print({ '1': 2, x: 4, '5': 6 });
+  print({'1': 2, x: 4, '5': 6});
   // Array literal
-  print({ '1': 2, null: 4, '5': 6 });
+  print({'1': 2, null: 4, '5': 6});
 }
diff --git a/pkg/dev_compiler/test/codegen/node_modules.dart b/pkg/dev_compiler/test/codegen/node_modules.dart
index 74fdaf1..dad8613 100644
--- a/pkg/dev_compiler/test/codegen/node_modules.dart
+++ b/pkg/dev_compiler/test/codegen/node_modules.dart
@@ -6,8 +6,11 @@
 typedef void Callback({int i});
 
 class A {}
+
 class _A {}
+
 class B<T> {}
+
 class _B<T> {}
 
 f() {}
diff --git a/pkg/dev_compiler/test/codegen/script.dart b/pkg/dev_compiler/test/codegen/script.dart
index 709ed67..c84e012 100755
--- a/pkg/dev_compiler/test/codegen/script.dart
+++ b/pkg/dev_compiler/test/codegen/script.dart
@@ -1,4 +1,5 @@
 #!/usr/bin/env dart
+
 void main(List<String> args) {
   String name = args.join(' ');
   if (name == '') name = 'world';
diff --git a/pkg/dev_compiler/test/codegen/sunflower/sunflower.dart b/pkg/dev_compiler/test/codegen/sunflower/sunflower.dart
index 5f78946..d74dfce 100644
--- a/pkg/dev_compiler/test/codegen/sunflower/sunflower.dart
+++ b/pkg/dev_compiler/test/codegen/sunflower/sunflower.dart
@@ -47,7 +47,7 @@
 // This example was modified to use classes and mixins.
 class SunflowerSeed extends Circle with CirclePainter {
   SunflowerSeed(num x, num y, num radius, [String color])
-  : super(x, y, radius) {
+      : super(x, y, radius) {
     if (color != null) this.color = color;
   }
 }
diff --git a/pkg/dev_compiler/test/js/builder_test.dart b/pkg/dev_compiler/test/js/builder_test.dart
index 0defe06..c02909c 100644
--- a/pkg/dev_compiler/test/js/builder_test.dart
+++ b/pkg/dev_compiler/test/js/builder_test.dart
@@ -9,18 +9,15 @@
 _check(Node node, String expected) =>
     expect(node.toString(), 'js_ast `$expected`');
 
-_checkStatement(String src) =>
-    _check(_parser(src).parseStatement(), src);
+_checkStatement(String src) => _check(_parser(src).parseStatement(), src);
 
-_checkExpression(String src) =>
-    _check(_parser(src).parseExpression(), src);
+_checkExpression(String src) => _check(_parser(src).parseExpression(), src);
 
 main() {
   group('MiniJsParser', () {
     // TODO(ochafik): Add more coverage.
     test('parses classes with complex members', () {
-      _checkExpression(
-          'class Foo {\n'
+      _checkExpression('class Foo {\n'
           '  [foo](...args) {}\n'
           '  [#0](x) {}\n'
           '  static [foo](...args) {}\n'
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/html/dart2js/html_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/html/dart2js/html_dart2js.dart
index 670e039..41f690a 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/html/dart2js/html_dart2js.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/html/dart2js/html_dart2js.dart
@@ -51,26 +51,31 @@
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:html library.
 
-
 // Not actually used, but imported since dart:html can generate these objects.
-import 'dart:_js_helper' show
-    convertDartClosureToJS, Creates, JavaScriptIndexingBehavior,
-    JSName, Native, Returns, ForceInline,
-    findDispatchTagForInterceptorClass, setNativeSubclassDispatchRecord,
-    makeLeafDispatchRecord;
-import 'dart:_interceptors' show
-    Interceptor, JSExtendableArray, JSUInt31,
-    findInterceptorConstructorForType,
-    findConstructorForNativeSubclassType,
-    getNativeInterceptor,
-    setDispatchProperty;
+import 'dart:_js_helper'
+    show
+        convertDartClosureToJS,
+        Creates,
+        JavaScriptIndexingBehavior,
+        JSName,
+        Native,
+        Returns,
+        ForceInline,
+        findDispatchTagForInterceptorClass,
+        setNativeSubclassDispatchRecord,
+        makeLeafDispatchRecord;
+import 'dart:_interceptors'
+    show
+        Interceptor,
+        JSExtendableArray,
+        JSUInt31,
+        findInterceptorConstructorForType,
+        findConstructorForNativeSubclassType,
+        getNativeInterceptor,
+        setDispatchProperty;
 
 export 'dart:math' show Rectangle, Point;
 
-
-
-
-
 /**
  * Top-level container for a web page, which is usually a browser tab or window.
  *
@@ -95,7 +100,9 @@
 // Dart issue 1990.
 @Native("HTMLElement")
 class HtmlElement extends Element {
-  factory HtmlElement() { throw new UnsupportedError("Not supported"); }
+  factory HtmlElement() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -128,12 +135,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.
 
-
 @DocsEditable()
 @DomName('AbstractWorker')
 abstract class AbstractWorker extends Interceptor implements EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory AbstractWorker._() { throw new UnsupportedError("Not supported"); }
+  factory AbstractWorker._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `error` events to event
@@ -143,7 +151,8 @@
    */
   @DomName('AbstractWorker.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /// Stream of `error` events handled by this [AbstractWorker].
   @DomName('AbstractWorker.onerror')
@@ -154,13 +163,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.
 
-
 @DocsEditable()
 @DomName('HTMLAnchorElement')
 @Native("HTMLAnchorElement")
 class AnchorElement extends HtmlElement implements UrlUtils {
   // To suppress missing implicit constructor warnings.
-  factory AnchorElement._() { throw new UnsupportedError("Not supported"); }
+  factory AnchorElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLAnchorElement.HTMLAnchorElement')
   @DocsEditable()
@@ -246,7 +256,6 @@
   @Experimental() // untriaged
   String username;
 
-
   @DomName('HTMLAnchorElement.toString')
   @DocsEditable()
   String toString() => JS('String', 'String(#)', this);
@@ -255,14 +264,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.
 
-
 @DocsEditable()
 @DomName('Animation')
 @Experimental() // untriaged
 @Native("Animation")
 class Animation extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory Animation._() { throw new UnsupportedError("Not supported"); }
+  factory Animation._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(document.body.animate)');
@@ -315,45 +325,47 @@
   @DomName('Animation.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  void cancel() native;
+  void cancel() native ;
 
   @DomName('Animation.finish')
   @DocsEditable()
   @Experimental() // untriaged
-  void finish() native;
+  void finish() native ;
 
   @DomName('Animation.pause')
   @DocsEditable()
   @Experimental() // untriaged
-  void pause() native;
+  void pause() native ;
 
   @DomName('Animation.play')
   @DocsEditable()
   @Experimental() // untriaged
-  void play() native;
+  void play() native ;
 
   @DomName('Animation.reverse')
   @DocsEditable()
   @Experimental() // untriaged
-  void reverse() native;
+  void reverse() 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.
 
-
 @DocsEditable()
 @DomName('AnimationEffectReadOnly')
 @Experimental() // untriaged
 @Native("AnimationEffectReadOnly")
 class AnimationEffectReadOnly extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimationEffectReadOnly._() { throw new UnsupportedError("Not supported"); }
+  factory AnimationEffectReadOnly._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AnimationEffectReadOnly.computedTiming')
   @DocsEditable()
   @Experimental() // untriaged
-  Map get computedTiming => convertNativeToDart_Dictionary(this._get_computedTiming);
+  Map get computedTiming =>
+      convertNativeToDart_Dictionary(this._get_computedTiming);
   @JSName('computedTiming')
   @DomName('AnimationEffectReadOnly.computedTiming')
   @DocsEditable()
@@ -369,14 +381,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.
 
-
 @DocsEditable()
 @DomName('AnimationEffectTiming')
 @Experimental() // untriaged
 @Native("AnimationEffectTiming")
 class AnimationEffectTiming extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimationEffectTiming._() { throw new UnsupportedError("Not supported"); }
+  factory AnimationEffectTiming._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AnimationEffectTiming.delay')
   @DocsEditable()
@@ -429,14 +442,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.
 
-
 @DocsEditable()
 @DomName('AnimationEvent')
 @Experimental() // untriaged
 @Native("AnimationEvent")
 class AnimationEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory AnimationEvent._() { throw new UnsupportedError("Not supported"); }
+  factory AnimationEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AnimationEvent.AnimationEvent')
   @DocsEditable()
@@ -447,8 +461,10 @@
     }
     return AnimationEvent._create_2(type);
   }
-  static AnimationEvent _create_1(type, eventInitDict) => JS('AnimationEvent', 'new AnimationEvent(#,#)', type, eventInitDict);
-  static AnimationEvent _create_2(type) => JS('AnimationEvent', 'new AnimationEvent(#)', type);
+  static AnimationEvent _create_1(type, eventInitDict) =>
+      JS('AnimationEvent', 'new AnimationEvent(#,#)', type, eventInitDict);
+  static AnimationEvent _create_2(type) =>
+      JS('AnimationEvent', 'new AnimationEvent(#)', type);
 
   @DomName('AnimationEvent.animationName')
   @DocsEditable()
@@ -464,14 +480,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.
 
-
 @DocsEditable()
 @DomName('AnimationPlayerEvent')
 @Experimental() // untriaged
 @Native("AnimationPlayerEvent")
 class AnimationPlayerEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory AnimationPlayerEvent._() { throw new UnsupportedError("Not supported"); }
+  factory AnimationPlayerEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AnimationPlayerEvent.AnimationPlayerEvent')
   @DocsEditable()
@@ -482,8 +499,13 @@
     }
     return AnimationPlayerEvent._create_2(type);
   }
-  static AnimationPlayerEvent _create_1(type, eventInitDict) => JS('AnimationPlayerEvent', 'new AnimationPlayerEvent(#,#)', type, eventInitDict);
-  static AnimationPlayerEvent _create_2(type) => JS('AnimationPlayerEvent', 'new AnimationPlayerEvent(#)', type);
+  static AnimationPlayerEvent _create_1(type, eventInitDict) => JS(
+      'AnimationPlayerEvent',
+      'new AnimationPlayerEvent(#,#)',
+      type,
+      eventInitDict);
+  static AnimationPlayerEvent _create_2(type) =>
+      JS('AnimationPlayerEvent', 'new AnimationPlayerEvent(#)', type);
 
   @DomName('AnimationPlayerEvent.currentTime')
   @DocsEditable()
@@ -499,14 +521,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.
 
-
 @DocsEditable()
 @DomName('AnimationTimeline')
 @Experimental() // untriaged
 @Native("AnimationTimeline")
 class AnimationTimeline extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimationTimeline._() { throw new UnsupportedError("Not supported"); }
+  factory AnimationTimeline._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AnimationTimeline.currentTime')
   @DocsEditable()
@@ -521,25 +544,26 @@
   @DomName('AnimationTimeline.getAnimations')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Animation> getAnimations() native;
+  List<Animation> getAnimations() native ;
 
   @DomName('AnimationTimeline.play')
   @DocsEditable()
   @Experimental() // untriaged
-  Animation play(AnimationEffectReadOnly source) native;
+  Animation play(AnimationEffectReadOnly source) 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.
 
-
 @DocsEditable()
 @DomName('AppBannerPromptResult')
 @Experimental() // untriaged
 @Native("AppBannerPromptResult")
 class AppBannerPromptResult extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AppBannerPromptResult._() { throw new UnsupportedError("Not supported"); }
+  factory AppBannerPromptResult._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AppBannerPromptResult.outcome')
   @DocsEditable()
@@ -555,7 +579,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.
 
-
 @DocsEditable()
 /**
  * ApplicationCache is accessed via [Window.applicationCache].
@@ -570,7 +593,9 @@
 @Native("ApplicationCache,DOMApplicationCache,OfflineResourceList")
 class ApplicationCache extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory ApplicationCache._() { throw new UnsupportedError("Not supported"); }
+  factory ApplicationCache._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `cached` events to event
@@ -580,7 +605,8 @@
    */
   @DomName('ApplicationCache.cachedEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> cachedEvent = const EventStreamProvider<Event>('cached');
+  static const EventStreamProvider<Event> cachedEvent =
+      const EventStreamProvider<Event>('cached');
 
   /**
    * Static factory designed to expose `checking` events to event
@@ -590,7 +616,8 @@
    */
   @DomName('ApplicationCache.checkingEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> checkingEvent = const EventStreamProvider<Event>('checking');
+  static const EventStreamProvider<Event> checkingEvent =
+      const EventStreamProvider<Event>('checking');
 
   /**
    * Static factory designed to expose `downloading` events to event
@@ -600,7 +627,8 @@
    */
   @DomName('ApplicationCache.downloadingEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> downloadingEvent = const EventStreamProvider<Event>('downloading');
+  static const EventStreamProvider<Event> downloadingEvent =
+      const EventStreamProvider<Event>('downloading');
 
   /**
    * Static factory designed to expose `error` events to event
@@ -610,7 +638,8 @@
    */
   @DomName('ApplicationCache.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /**
    * Static factory designed to expose `noupdate` events to event
@@ -620,7 +649,8 @@
    */
   @DomName('ApplicationCache.noupdateEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> noUpdateEvent = const EventStreamProvider<Event>('noupdate');
+  static const EventStreamProvider<Event> noUpdateEvent =
+      const EventStreamProvider<Event>('noupdate');
 
   /**
    * Static factory designed to expose `obsolete` events to event
@@ -630,7 +660,8 @@
    */
   @DomName('ApplicationCache.obsoleteEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> obsoleteEvent = const EventStreamProvider<Event>('obsolete');
+  static const EventStreamProvider<Event> obsoleteEvent =
+      const EventStreamProvider<Event>('obsolete');
 
   /**
    * Static factory designed to expose `progress` events to event
@@ -640,7 +671,8 @@
    */
   @DomName('ApplicationCache.progressEvent')
   @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
+  static const EventStreamProvider<ProgressEvent> progressEvent =
+      const EventStreamProvider<ProgressEvent>('progress');
 
   /**
    * Static factory designed to expose `updateready` events to event
@@ -650,7 +682,8 @@
    */
   @DomName('ApplicationCache.updatereadyEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> updateReadyEvent = const EventStreamProvider<Event>('updateready');
+  static const EventStreamProvider<Event> updateReadyEvent =
+      const EventStreamProvider<Event>('updateready');
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.applicationCache)');
@@ -685,15 +718,15 @@
 
   @DomName('ApplicationCache.abort')
   @DocsEditable()
-  void abort() native;
+  void abort() native ;
 
   @DomName('ApplicationCache.swapCache')
   @DocsEditable()
-  void swapCache() native;
+  void swapCache() native ;
 
   @DomName('ApplicationCache.update')
   @DocsEditable()
-  void update() native;
+  void update() native ;
 
   /// Stream of `cached` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.oncached')
@@ -739,14 +772,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.
 
-
 @DocsEditable()
 @DomName('ApplicationCacheErrorEvent')
 @Experimental() // untriaged
 @Native("ApplicationCacheErrorEvent")
 class ApplicationCacheErrorEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory ApplicationCacheErrorEvent._() { throw new UnsupportedError("Not supported"); }
+  factory ApplicationCacheErrorEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ApplicationCacheErrorEvent.ApplicationCacheErrorEvent')
   @DocsEditable()
@@ -757,8 +791,13 @@
     }
     return ApplicationCacheErrorEvent._create_2(type);
   }
-  static ApplicationCacheErrorEvent _create_1(type, eventInitDict) => JS('ApplicationCacheErrorEvent', 'new ApplicationCacheErrorEvent(#,#)', type, eventInitDict);
-  static ApplicationCacheErrorEvent _create_2(type) => JS('ApplicationCacheErrorEvent', 'new ApplicationCacheErrorEvent(#)', type);
+  static ApplicationCacheErrorEvent _create_1(type, eventInitDict) => JS(
+      'ApplicationCacheErrorEvent',
+      'new ApplicationCacheErrorEvent(#,#)',
+      type,
+      eventInitDict);
+  static ApplicationCacheErrorEvent _create_2(type) => JS(
+      'ApplicationCacheErrorEvent', 'new ApplicationCacheErrorEvent(#)', type);
 
   @DomName('ApplicationCacheErrorEvent.message')
   @DocsEditable()
@@ -784,7 +823,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.
 
-
 @DocsEditable()
 /**
  * DOM Area Element, which links regions of an image map with a hyperlink.
@@ -800,7 +838,9 @@
 @Native("HTMLAreaElement")
 class AreaElement extends HtmlElement implements UrlUtils {
   // To suppress missing implicit constructor warnings.
-  factory AreaElement._() { throw new UnsupportedError("Not supported"); }
+  factory AreaElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLAreaElement.HTMLAreaElement')
   @DocsEditable()
@@ -877,7 +917,6 @@
   @Experimental() // untriaged
   String username;
 
-
   @DomName('HTMLAreaElement.toString')
   @DocsEditable()
   String toString() => JS('String', 'String(#)', this);
@@ -886,12 +925,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.
 
-
 @DocsEditable()
 @DomName('HTMLAudioElement')
 @Native("HTMLAudioElement")
 class AudioElement extends MediaElement {
-
   @DomName('HTMLAudioElement.HTMLAudioElement')
   @DocsEditable()
   factory AudioElement._([String src]) {
@@ -915,14 +952,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.
 
-
 @DocsEditable()
 @DomName('AudioTrack')
 @Experimental() // untriaged
 @Native("AudioTrack")
 class AudioTrack extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AudioTrack._() { throw new UnsupportedError("Not supported"); }
+  factory AudioTrack._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AudioTrack.enabled')
   @DocsEditable()
@@ -953,19 +991,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.
 
-
 @DocsEditable()
 @DomName('AudioTrackList')
 @Experimental() // untriaged
 @Native("AudioTrackList")
 class AudioTrackList extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory AudioTrackList._() { throw new UnsupportedError("Not supported"); }
+  factory AudioTrackList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AudioTrackList.changeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+  static const EventStreamProvider<Event> changeEvent =
+      const EventStreamProvider<Event>('change');
 
   @DomName('AudioTrackList.length')
   @DocsEditable()
@@ -975,12 +1015,12 @@
   @DomName('AudioTrackList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  AudioTrack __getter__(int index) native;
+  AudioTrack __getter__(int index) native ;
 
   @DomName('AudioTrackList.getTrackById')
   @DocsEditable()
   @Experimental() // untriaged
-  AudioTrack getTrackById(String id) native;
+  AudioTrack getTrackById(String id) native ;
 
   @DomName('AudioTrackList.onchange')
   @DocsEditable()
@@ -991,7 +1031,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.
 
-
 @DocsEditable()
 @DomName('AutocompleteErrorEvent')
 // http://wiki.whatwg.org/wiki/RequestAutocomplete
@@ -999,7 +1038,9 @@
 @Native("AutocompleteErrorEvent")
 class AutocompleteErrorEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory AutocompleteErrorEvent._() { throw new UnsupportedError("Not supported"); }
+  factory AutocompleteErrorEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AutocompleteErrorEvent.AutocompleteErrorEvent')
   @DocsEditable()
@@ -1010,8 +1051,13 @@
     }
     return AutocompleteErrorEvent._create_2(type);
   }
-  static AutocompleteErrorEvent _create_1(type, eventInitDict) => JS('AutocompleteErrorEvent', 'new AutocompleteErrorEvent(#,#)', type, eventInitDict);
-  static AutocompleteErrorEvent _create_2(type) => JS('AutocompleteErrorEvent', 'new AutocompleteErrorEvent(#)', type);
+  static AutocompleteErrorEvent _create_1(type, eventInitDict) => JS(
+      'AutocompleteErrorEvent',
+      'new AutocompleteErrorEvent(#,#)',
+      type,
+      eventInitDict);
+  static AutocompleteErrorEvent _create_2(type) =>
+      JS('AutocompleteErrorEvent', 'new AutocompleteErrorEvent(#)', type);
 
   @DomName('AutocompleteErrorEvent.reason')
   @DocsEditable()
@@ -1021,13 +1067,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.
 
-
 @DocsEditable()
 @DomName('HTMLBRElement')
 @Native("HTMLBRElement")
 class BRElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory BRElement._() { throw new UnsupportedError("Not supported"); }
+  factory BRElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLBRElement.HTMLBRElement')
   @DocsEditable()
@@ -1043,7 +1090,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.
 
-
 @DocsEditable()
 @DomName('BarProp')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#barprop
@@ -1051,7 +1097,9 @@
 @Native("BarProp")
 class BarProp extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory BarProp._() { throw new UnsupportedError("Not supported"); }
+  factory BarProp._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('BarProp.visible')
   @DocsEditable()
@@ -1061,13 +1109,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.
 
-
 @DocsEditable()
 @DomName('HTMLBaseElement')
 @Native("HTMLBaseElement")
 class BaseElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory BaseElement._() { throw new UnsupportedError("Not supported"); }
+  factory BaseElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLBaseElement.HTMLBaseElement')
   @DocsEditable()
@@ -1091,7 +1140,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.
 
-
 @DocsEditable()
 @DomName('BatteryManager')
 // https://dvcs.w3.org/hg/dap/raw-file/default/battery/Overview.html#batterymanager-interface
@@ -1099,7 +1147,9 @@
 @Native("BatteryManager")
 class BatteryManager extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory BatteryManager._() { throw new UnsupportedError("Not supported"); }
+  factory BatteryManager._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('BatteryManager.charging')
   @DocsEditable()
@@ -1121,14 +1171,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.
 
-
 @DocsEditable()
 @DomName('BeforeInstallPromptEvent')
 @Experimental() // untriaged
 @Native("BeforeInstallPromptEvent")
 class BeforeInstallPromptEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory BeforeInstallPromptEvent._() { throw new UnsupportedError("Not supported"); }
+  factory BeforeInstallPromptEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('BeforeInstallPromptEvent.BeforeInstallPromptEvent')
   @DocsEditable()
@@ -1139,8 +1190,13 @@
     }
     return BeforeInstallPromptEvent._create_2(type);
   }
-  static BeforeInstallPromptEvent _create_1(type, eventInitDict) => JS('BeforeInstallPromptEvent', 'new BeforeInstallPromptEvent(#,#)', type, eventInitDict);
-  static BeforeInstallPromptEvent _create_2(type) => JS('BeforeInstallPromptEvent', 'new BeforeInstallPromptEvent(#)', type);
+  static BeforeInstallPromptEvent _create_1(type, eventInitDict) => JS(
+      'BeforeInstallPromptEvent',
+      'new BeforeInstallPromptEvent(#,#)',
+      type,
+      eventInitDict);
+  static BeforeInstallPromptEvent _create_2(type) =>
+      JS('BeforeInstallPromptEvent', 'new BeforeInstallPromptEvent(#)', type);
 
   List<String> get platforms => JS("List<String>", "#.platforms", this);
 
@@ -1152,19 +1208,20 @@
   @DomName('BeforeInstallPromptEvent.prompt')
   @DocsEditable()
   @Experimental() // untriaged
-  Future prompt() native;
+  Future prompt() 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.
 
-
 @DocsEditable()
 @DomName('BeforeUnloadEvent')
 @Native("BeforeUnloadEvent")
 class BeforeUnloadEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory BeforeUnloadEvent._() { throw new UnsupportedError("Not supported"); }
+  factory BeforeUnloadEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   // Shadowing definition.
   String get returnValue => JS("String", "#.returnValue", this);
@@ -1177,12 +1234,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.
 
-
 @DomName('Blob')
 @Native("Blob")
 class Blob extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Blob._() { throw new UnsupportedError("Not supported"); }
+  factory Blob._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Blob.size')
   @DocsEditable()
@@ -1195,11 +1253,11 @@
   @DomName('Blob.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() native;
+  void close() native ;
 
   @DomName('Blob.slice')
   @DocsEditable()
-  Blob slice([int start, int end, String contentType]) native;
+  Blob slice([int start, int end, String contentType]) native ;
 
   factory Blob(List blobParts, [String type, String endings]) {
     // TODO: validate that blobParts is a JS Array and convert if not.
@@ -1218,20 +1276,23 @@
   static _create_2(parts, bag) => JS('Blob', 'new self.Blob(#, #)', parts, bag);
 
   static _create_bag() => JS('var', '{}');
-  static _bag_set(bag, key, value) { JS('void', '#[#] = #', bag, key, value); }
+  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.
 
-
 @DocsEditable()
 @DomName('Bluetooth')
 @Experimental() // untriaged
 @Native("Bluetooth")
 class Bluetooth extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Bluetooth._() { throw new UnsupportedError("Not supported"); }
+  factory Bluetooth._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Bluetooth.requestDevice')
   @DocsEditable()
@@ -1240,24 +1301,26 @@
     var options_1 = convertDartToNative_Dictionary(options);
     return _requestDevice_1(options_1);
   }
+
   @JSName('requestDevice')
   @DomName('Bluetooth.requestDevice')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _requestDevice_1(options) native;
+  Future _requestDevice_1(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.
 
-
 @DocsEditable()
 @DomName('BluetoothDevice')
 @Experimental() // untriaged
 @Native("BluetoothDevice")
 class BluetoothDevice extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory BluetoothDevice._() { throw new UnsupportedError("Not supported"); }
+  factory BluetoothDevice._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('BluetoothDevice.deviceClass')
   @DocsEditable()
@@ -1303,20 +1366,21 @@
   @DomName('BluetoothDevice.connectGATT')
   @DocsEditable()
   @Experimental() // untriaged
-  Future connectGatt() native;
+  Future connectGatt() 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.
 
-
 @DocsEditable()
 @DomName('BluetoothGATTCharacteristic')
 @Experimental() // untriaged
 @Native("BluetoothGATTCharacteristic")
 class BluetoothGattCharacteristic extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory BluetoothGattCharacteristic._() { throw new UnsupportedError("Not supported"); }
+  factory BluetoothGattCharacteristic._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('BluetoothGATTCharacteristic.uuid')
   @DocsEditable()
@@ -1326,25 +1390,26 @@
   @DomName('BluetoothGATTCharacteristic.readValue')
   @DocsEditable()
   @Experimental() // untriaged
-  Future readValue() native;
+  Future readValue() native ;
 
   @DomName('BluetoothGATTCharacteristic.writeValue')
   @DocsEditable()
   @Experimental() // untriaged
-  Future writeValue(/*BufferSource*/ value) native;
+  Future writeValue(/*BufferSource*/ 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.
 
-
 @DocsEditable()
 @DomName('BluetoothGATTRemoteServer')
 @Experimental() // untriaged
 @Native("BluetoothGATTRemoteServer")
 class BluetoothGattRemoteServer extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory BluetoothGattRemoteServer._() { throw new UnsupportedError("Not supported"); }
+  factory BluetoothGattRemoteServer._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('BluetoothGATTRemoteServer.connected')
   @DocsEditable()
@@ -1354,20 +1419,21 @@
   @DomName('BluetoothGATTRemoteServer.getPrimaryService')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getPrimaryService(/*BluetoothServiceUUID*/ service) native;
+  Future getPrimaryService(/*BluetoothServiceUUID*/ service) 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.
 
-
 @DocsEditable()
 @DomName('BluetoothGATTService')
 @Experimental() // untriaged
 @Native("BluetoothGATTService")
 class BluetoothGattService extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory BluetoothGattService._() { throw new UnsupportedError("Not supported"); }
+  factory BluetoothGattService._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('BluetoothGATTService.isPrimary')
   @DocsEditable()
@@ -1382,54 +1448,57 @@
   @DomName('BluetoothGATTService.getCharacteristic')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getCharacteristic(/*BluetoothCharacteristicUUID*/ characteristic) native;
+  Future getCharacteristic(/*BluetoothCharacteristicUUID*/ characteristic)
+      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.
 
-
 @DocsEditable()
 @DomName('BluetoothUUID')
 @Experimental() // untriaged
 @Native("BluetoothUUID")
 class BluetoothUuid extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory BluetoothUuid._() { throw new UnsupportedError("Not supported"); }
+  factory BluetoothUuid._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('canonicalUUID')
   @DomName('BluetoothUUID.canonicalUUID')
   @DocsEditable()
   @Experimental() // untriaged
-  static String canonicalUuid(int alias) native;
+  static String canonicalUuid(int alias) native ;
 
   @DomName('BluetoothUUID.getCharacteristic')
   @DocsEditable()
   @Experimental() // untriaged
-  static String getCharacteristic(Object name) native;
+  static String getCharacteristic(Object name) native ;
 
   @DomName('BluetoothUUID.getDescriptor')
   @DocsEditable()
   @Experimental() // untriaged
-  static String getDescriptor(Object name) native;
+  static String getDescriptor(Object name) native ;
 
   @DomName('BluetoothUUID.getService')
   @DocsEditable()
   @Experimental() // untriaged
-  static String getService(Object name) native;
+  static String getService(Object 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.
 
-
 @DocsEditable()
 @DomName('Body')
 @Experimental() // untriaged
 @Native("Body")
 class Body extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Body._() { throw new UnsupportedError("Not supported"); }
+  factory Body._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Body.bodyUsed')
   @DocsEditable()
@@ -1439,34 +1508,35 @@
   @DomName('Body.arrayBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  Future arrayBuffer() native;
+  Future arrayBuffer() native ;
 
   @DomName('Body.blob')
   @DocsEditable()
   @Experimental() // untriaged
-  Future blob() native;
+  Future blob() native ;
 
   @DomName('Body.json')
   @DocsEditable()
   @Experimental() // untriaged
-  Future json() native;
+  Future json() native ;
 
   @DomName('Body.text')
   @DocsEditable()
   @Experimental() // untriaged
-  Future text() native;
+  Future text() 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.
 
-
 @DocsEditable()
 @DomName('HTMLBodyElement')
 @Native("HTMLBodyElement")
 class BodyElement extends HtmlElement implements WindowEventHandlers {
   // To suppress missing implicit constructor warnings.
-  factory BodyElement._() { throw new UnsupportedError("Not supported"); }
+  factory BodyElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `blur` events to event
@@ -1476,7 +1546,8 @@
    */
   @DomName('HTMLBodyElement.blurEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
+  static const EventStreamProvider<Event> blurEvent =
+      const EventStreamProvider<Event>('blur');
 
   /**
    * Static factory designed to expose `error` events to event
@@ -1486,7 +1557,8 @@
    */
   @DomName('HTMLBodyElement.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /**
    * Static factory designed to expose `focus` events to event
@@ -1496,7 +1568,8 @@
    */
   @DomName('HTMLBodyElement.focusEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
+  static const EventStreamProvider<Event> focusEvent =
+      const EventStreamProvider<Event>('focus');
 
   /**
    * Static factory designed to expose `hashchange` events to event
@@ -1506,7 +1579,8 @@
    */
   @DomName('HTMLBodyElement.hashchangeEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');
+  static const EventStreamProvider<Event> hashChangeEvent =
+      const EventStreamProvider<Event>('hashchange');
 
   /**
    * Static factory designed to expose `load` events to event
@@ -1516,7 +1590,8 @@
    */
   @DomName('HTMLBodyElement.loadEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
+  static const EventStreamProvider<Event> loadEvent =
+      const EventStreamProvider<Event>('load');
 
   /**
    * Static factory designed to expose `message` events to event
@@ -1526,7 +1601,8 @@
    */
   @DomName('HTMLBodyElement.messageEvent')
   @DocsEditable()
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   /**
    * Static factory designed to expose `offline` events to event
@@ -1536,7 +1612,8 @@
    */
   @DomName('HTMLBodyElement.offlineEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
+  static const EventStreamProvider<Event> offlineEvent =
+      const EventStreamProvider<Event>('offline');
 
   /**
    * Static factory designed to expose `online` events to event
@@ -1546,7 +1623,8 @@
    */
   @DomName('HTMLBodyElement.onlineEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
+  static const EventStreamProvider<Event> onlineEvent =
+      const EventStreamProvider<Event>('online');
 
   /**
    * Static factory designed to expose `popstate` events to event
@@ -1556,7 +1634,8 @@
    */
   @DomName('HTMLBodyElement.popstateEvent')
   @DocsEditable()
-  static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
+  static const EventStreamProvider<PopStateEvent> popStateEvent =
+      const EventStreamProvider<PopStateEvent>('popstate');
 
   /**
    * Static factory designed to expose `resize` events to event
@@ -1566,12 +1645,14 @@
    */
   @DomName('HTMLBodyElement.resizeEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
+  static const EventStreamProvider<Event> resizeEvent =
+      const EventStreamProvider<Event>('resize');
 
   @DomName('HTMLBodyElement.scrollEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
+  static const EventStreamProvider<Event> scrollEvent =
+      const EventStreamProvider<Event>('scroll');
 
   /**
    * Static factory designed to expose `storage` events to event
@@ -1581,7 +1662,8 @@
    */
   @DomName('HTMLBodyElement.storageEvent')
   @DocsEditable()
-  static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
+  static const EventStreamProvider<StorageEvent> storageEvent =
+      const EventStreamProvider<StorageEvent>('storage');
 
   /**
    * Static factory designed to expose `unload` events to event
@@ -1591,7 +1673,8 @@
    */
   @DomName('HTMLBodyElement.unloadEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
+  static const EventStreamProvider<Event> unloadEvent =
+      const EventStreamProvider<Event>('unload');
 
   @DomName('HTMLBodyElement.HTMLBodyElement')
   @DocsEditable()
@@ -1672,13 +1755,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.
 
-
 @DocsEditable()
 @DomName('HTMLButtonElement')
 @Native("HTMLButtonElement")
 class ButtonElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory ButtonElement._() { throw new UnsupportedError("Not supported"); }
+  factory ButtonElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLButtonElement.HTMLButtonElement')
   @DocsEditable()
@@ -1755,22 +1839,21 @@
 
   @DomName('HTMLButtonElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native;
+  bool checkValidity() native ;
 
   @DomName('HTMLButtonElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() native;
+  bool reportValidity() native ;
 
   @DomName('HTMLButtonElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) 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.
 
-
 @DocsEditable()
 @DomName('CDATASection')
 // http://dom.spec.whatwg.org/#cdatasection
@@ -1778,35 +1861,38 @@
 @Native("CDATASection")
 class CDataSection extends Text {
   // To suppress missing implicit constructor warnings.
-  factory CDataSection._() { throw new UnsupportedError("Not supported"); }
+  factory CDataSection._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('CacheStorage')
 @Experimental() // untriaged
 @Native("CacheStorage")
 class CacheStorage extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory CacheStorage._() { throw new UnsupportedError("Not supported"); }
+  factory CacheStorage._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CacheStorage.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  Future delete(String cacheName) native;
+  Future delete(String cacheName) native ;
 
   @DomName('CacheStorage.has')
   @DocsEditable()
   @Experimental() // untriaged
-  Future has(String cacheName) native;
+  Future has(String cacheName) native ;
 
   @DomName('CacheStorage.keys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future keys() native;
+  Future keys() native ;
 
   @DomName('CacheStorage.match')
   @DocsEditable()
@@ -1818,32 +1904,34 @@
     }
     return _match_2(request);
   }
+
   @JSName('match')
   @DomName('CacheStorage.match')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _match_1(request, options) native;
+  Future _match_1(request, options) native ;
   @JSName('match')
   @DomName('CacheStorage.match')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _match_2(request) native;
+  Future _match_2(request) native ;
 
   @DomName('CacheStorage.open')
   @DocsEditable()
   @Experimental() // untriaged
-  Future open(String cacheName) native;
+  Future open(String cacheName) 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('HTMLCanvasElement')
 @Native("HTMLCanvasElement")
 class CanvasElement extends HtmlElement implements CanvasImageSource {
   // To suppress missing implicit constructor warnings.
-  factory CanvasElement._() { throw new UnsupportedError("Not supported"); }
+  factory CanvasElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `webglcontextlost` events to event
@@ -1853,7 +1941,8 @@
    */
   @DomName('HTMLCanvasElement.webglcontextlostEvent')
   @DocsEditable()
-  static const EventStreamProvider<gl.ContextEvent> webGlContextLostEvent = const EventStreamProvider<gl.ContextEvent>('webglcontextlost');
+  static const EventStreamProvider<gl.ContextEvent> webGlContextLostEvent =
+      const EventStreamProvider<gl.ContextEvent>('webglcontextlost');
 
   /**
    * Static factory designed to expose `webglcontextrestored` events to event
@@ -1863,7 +1952,8 @@
    */
   @DomName('HTMLCanvasElement.webglcontextrestoredEvent')
   @DocsEditable()
-  static const EventStreamProvider<gl.ContextEvent> webGlContextRestoredEvent = const EventStreamProvider<gl.ContextEvent>('webglcontextrestored');
+  static const EventStreamProvider<gl.ContextEvent> webGlContextRestoredEvent =
+      const EventStreamProvider<gl.ContextEvent>('webglcontextrestored');
 
   @DomName('HTMLCanvasElement.HTMLCanvasElement')
   @DocsEditable()
@@ -1901,33 +1991,36 @@
     }
     return _getContext_2(contextId);
   }
+
   @JSName('getContext')
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
   @Creates('CanvasRenderingContext2D|RenderingContext')
   @Returns('CanvasRenderingContext2D|RenderingContext|Null')
-  Object _getContext_1(contextId, attributes) native;
+  Object _getContext_1(contextId, attributes) native ;
   @JSName('getContext')
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
   @Creates('CanvasRenderingContext2D|RenderingContext')
   @Returns('CanvasRenderingContext2D|RenderingContext|Null')
-  Object _getContext_2(contextId) native;
+  Object _getContext_2(contextId) native ;
 
   @JSName('toDataURL')
   @DomName('HTMLCanvasElement.toDataURL')
   @DocsEditable()
-  String _toDataUrl(String type, [arguments_OR_quality]) native;
+  String _toDataUrl(String type, [arguments_OR_quality]) native ;
 
   /// Stream of `webglcontextlost` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextlost')
   @DocsEditable()
-  ElementStream<gl.ContextEvent> get onWebGlContextLost => webGlContextLostEvent.forElement(this);
+  ElementStream<gl.ContextEvent> get onWebGlContextLost =>
+      webGlContextLostEvent.forElement(this);
 
   /// Stream of `webglcontextrestored` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextrestored')
   @DocsEditable()
-  ElementStream<gl.ContextEvent> get onWebGlContextRestored => webGlContextRestoredEvent.forElement(this);
+  ElementStream<gl.ContextEvent> get onWebGlContextRestored =>
+      webGlContextRestoredEvent.forElement(this);
 
   /** An API for drawing on this canvas. */
   CanvasRenderingContext2D get context2D =>
@@ -1945,9 +2038,13 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @Experimental()
-  gl.RenderingContext getContext3d({alpha: true, depth: true, stencil: false,
-    antialias: true, premultipliedAlpha: true, preserveDrawingBuffer: false}) {
-
+  gl.RenderingContext getContext3d(
+      {alpha: true,
+      depth: true,
+      stencil: false,
+      antialias: true,
+      premultipliedAlpha: true,
+      preserveDrawingBuffer: false}) {
     var options = {
       'alpha': alpha,
       'depth': depth,
@@ -2011,7 +2108,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.
 
-
 @DocsEditable()
 /**
  * An opaque canvas object representing a gradient.
@@ -2047,7 +2143,9 @@
 @Native("CanvasGradient")
 class CanvasGradient extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory CanvasGradient._() { throw new UnsupportedError("Not supported"); }
+  factory CanvasGradient._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Adds a color stop to this gradient at the offset.
@@ -2060,13 +2158,12 @@
    */
   @DomName('CanvasGradient.addColorStop')
   @DocsEditable()
-  void addColorStop(num offset, String color) native;
+  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.
 
-
 @DocsEditable()
 /**
  * An opaque object representing a pattern of image, canvas, or video.
@@ -2100,27 +2197,31 @@
 @Native("CanvasPattern")
 class CanvasPattern extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory CanvasPattern._() { throw new UnsupportedError("Not supported"); }
+  factory CanvasPattern._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CanvasPattern.setTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  void setTransform(Matrix transform) native;
+  void setTransform(Matrix transform) 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.
 
-
 abstract class CanvasRenderingContext {
   CanvasElement get canvas;
 }
 
 @DomName('CanvasRenderingContext2D')
 @Native("CanvasRenderingContext2D")
-class CanvasRenderingContext2D extends Interceptor implements CanvasRenderingContext {
+class CanvasRenderingContext2D extends Interceptor
+    implements CanvasRenderingContext {
   // To suppress missing implicit constructor warnings.
-  factory CanvasRenderingContext2D._() { throw new UnsupportedError("Not supported"); }
+  factory CanvasRenderingContext2D._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CanvasRenderingContext2D.canvas')
   @DocsEditable()
@@ -2233,33 +2334,34 @@
     _addHitRegion_2();
     return;
   }
+
   @JSName('addHitRegion')
   @DomName('CanvasRenderingContext2D.addHitRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void _addHitRegion_1(options) native;
+  void _addHitRegion_1(options) native ;
   @JSName('addHitRegion')
   @DomName('CanvasRenderingContext2D.addHitRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void _addHitRegion_2() native;
+  void _addHitRegion_2() native ;
 
   @DomName('CanvasRenderingContext2D.beginPath')
   @DocsEditable()
-  void beginPath() native;
+  void beginPath() native ;
 
   @DomName('CanvasRenderingContext2D.clearHitRegions')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearHitRegions() native;
+  void clearHitRegions() native ;
 
   @DomName('CanvasRenderingContext2D.clearRect')
   @DocsEditable()
-  void clearRect(num x, num y, num width, num height) native;
+  void clearRect(num x, num y, num width, num height) native ;
 
   @DomName('CanvasRenderingContext2D.clip')
   @DocsEditable()
-  void clip([path_OR_winding, String winding]) native;
+  void clip([path_OR_winding, String winding]) native ;
 
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
@@ -2270,41 +2372,44 @@
       return convertNativeToDart_ImageData(_createImageData_1(imagedata_1));
     }
     if (sh != null && (imagedata_OR_sw is num)) {
-      return convertNativeToDart_ImageData(_createImageData_2(imagedata_OR_sw, sh));
+      return convertNativeToDart_ImageData(
+          _createImageData_2(imagedata_OR_sw, sh));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+
   @JSName('createImageData')
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
   @Creates('ImageData|=Object')
-  _createImageData_1(imagedata) native;
+  _createImageData_1(imagedata) native ;
   @JSName('createImageData')
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
   @Creates('ImageData|=Object')
-  _createImageData_2(num sw, sh) native;
+  _createImageData_2(num sw, sh) native ;
 
   @DomName('CanvasRenderingContext2D.createLinearGradient')
   @DocsEditable()
-  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
+  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native ;
 
   @DomName('CanvasRenderingContext2D.createPattern')
   @DocsEditable()
-  CanvasPattern createPattern(Object image, String repetitionType) native;
+  CanvasPattern createPattern(Object image, String repetitionType) native ;
 
   @DomName('CanvasRenderingContext2D.createRadialGradient')
   @DocsEditable()
-  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native;
+  CanvasGradient createRadialGradient(
+      num x0, num y0, num r0, num x1, num y1, num r1) native ;
 
   @DomName('CanvasRenderingContext2D.drawFocusIfNeeded')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawFocusIfNeeded(element_OR_path, [Element element]) native;
+  void drawFocusIfNeeded(element_OR_path, [Element element]) native ;
 
   @DomName('CanvasRenderingContext2D.fillRect')
   @DocsEditable()
-  void fillRect(num x, num y, num width, num height) native;
+  void fillRect(num x, num y, num width, num height) native ;
 
   @DomName('CanvasRenderingContext2D.getContextAttributes')
   @DocsEditable()
@@ -2313,12 +2418,13 @@
   Map getContextAttributes() {
     return convertNativeToDart_Dictionary(_getContextAttributes_1());
   }
+
   @JSName('getContextAttributes')
   @DomName('CanvasRenderingContext2D.getContextAttributes')
   @DocsEditable()
   // http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
   @Experimental()
-  _getContextAttributes_1() native;
+  _getContextAttributes_1() native ;
 
   @DomName('CanvasRenderingContext2D.getImageData')
   @DocsEditable()
@@ -2326,158 +2432,172 @@
   ImageData getImageData(num sx, num sy, num sw, num sh) {
     return convertNativeToDart_ImageData(_getImageData_1(sx, sy, sw, sh));
   }
+
   @JSName('getImageData')
   @DomName('CanvasRenderingContext2D.getImageData')
   @DocsEditable()
   @Creates('ImageData|=Object')
-  _getImageData_1(sx, sy, sw, sh) native;
+  _getImageData_1(sx, sy, sw, sh) native ;
 
   @JSName('getLineDash')
   @DomName('CanvasRenderingContext2D.getLineDash')
   @DocsEditable()
-  List<num> _getLineDash() native;
+  List<num> _getLineDash() native ;
 
   @DomName('CanvasRenderingContext2D.isContextLost')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isContextLost() native;
+  bool isContextLost() native ;
 
   @DomName('CanvasRenderingContext2D.isPointInPath')
   @DocsEditable()
-  bool isPointInPath(path_OR_x, num x_OR_y, [winding_OR_y, String winding]) native;
+  bool isPointInPath(path_OR_x, num x_OR_y, [winding_OR_y, String winding])
+      native ;
 
   @DomName('CanvasRenderingContext2D.isPointInStroke')
   @DocsEditable()
-  bool isPointInStroke(path_OR_x, num x_OR_y, [num y]) native;
+  bool isPointInStroke(path_OR_x, num x_OR_y, [num y]) native ;
 
   @DomName('CanvasRenderingContext2D.measureText')
   @DocsEditable()
-  TextMetrics measureText(String text) native;
+  TextMetrics measureText(String text) native ;
 
   @DomName('CanvasRenderingContext2D.putImageData')
   @DocsEditable()
-  void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
-    if (dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
+  void putImageData(ImageData imagedata, num dx, num dy,
+      [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
+    if (dirtyX == null &&
+        dirtyY == null &&
+        dirtyWidth == null &&
+        dirtyHeight == null) {
       var imagedata_1 = convertDartToNative_ImageData(imagedata);
       _putImageData_1(imagedata_1, dx, dy);
       return;
     }
-    if (dirtyHeight != null && dirtyWidth != null && dirtyY != null && dirtyX != null) {
+    if (dirtyHeight != null &&
+        dirtyWidth != null &&
+        dirtyY != null &&
+        dirtyX != null) {
       var imagedata_1 = convertDartToNative_ImageData(imagedata);
-      _putImageData_2(imagedata_1, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+      _putImageData_2(
+          imagedata_1, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+
   @JSName('putImageData')
   @DomName('CanvasRenderingContext2D.putImageData')
   @DocsEditable()
-  void _putImageData_1(imagedata, dx, dy) native;
+  void _putImageData_1(imagedata, dx, dy) native ;
   @JSName('putImageData')
   @DomName('CanvasRenderingContext2D.putImageData')
   @DocsEditable()
-  void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native;
+  void _putImageData_2(
+      imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native ;
 
   @DomName('CanvasRenderingContext2D.removeHitRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeHitRegion(String id) native;
+  void removeHitRegion(String id) native ;
 
   @DomName('CanvasRenderingContext2D.resetTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  void resetTransform() native;
+  void resetTransform() native ;
 
   @DomName('CanvasRenderingContext2D.restore')
   @DocsEditable()
-  void restore() native;
+  void restore() native ;
 
   @DomName('CanvasRenderingContext2D.rotate')
   @DocsEditable()
-  void rotate(num angle) native;
+  void rotate(num angle) native ;
 
   @DomName('CanvasRenderingContext2D.save')
   @DocsEditable()
-  void save() native;
+  void save() native ;
 
   @DomName('CanvasRenderingContext2D.scale')
   @DocsEditable()
-  void scale(num x, num y) native;
+  void scale(num x, num y) native ;
 
   @DomName('CanvasRenderingContext2D.scrollPathIntoView')
   @DocsEditable()
   @Experimental() // untriaged
-  void scrollPathIntoView([Path2D path]) native;
+  void scrollPathIntoView([Path2D path]) native ;
 
   @DomName('CanvasRenderingContext2D.setTransform')
   @DocsEditable()
-  void setTransform(num a, num b, num c, num d, num e, num f) native;
+  void setTransform(num a, num b, num c, num d, num e, num f) native ;
 
   @DomName('CanvasRenderingContext2D.stroke')
   @DocsEditable()
-  void stroke([Path2D path]) native;
+  void stroke([Path2D path]) native ;
 
   @DomName('CanvasRenderingContext2D.strokeRect')
   @DocsEditable()
-  void strokeRect(num x, num y, num width, num height) native;
+  void strokeRect(num x, num y, num width, num height) native ;
 
   @DomName('CanvasRenderingContext2D.strokeText')
   @DocsEditable()
-  void strokeText(String text, num x, num y, [num maxWidth]) native;
+  void strokeText(String text, num x, num y, [num maxWidth]) native ;
 
   @DomName('CanvasRenderingContext2D.transform')
   @DocsEditable()
-  void transform(num a, num b, num c, num d, num e, num f) native;
+  void transform(num a, num b, num c, num d, num e, num f) native ;
 
   @DomName('CanvasRenderingContext2D.translate')
   @DocsEditable()
-  void translate(num x, num y) native;
+  void translate(num x, num y) native ;
 
   // From CanvasPathMethods
 
   @JSName('arc')
   @DomName('CanvasRenderingContext2D.arc')
   @DocsEditable()
-  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native;
+  void _arc(num x, num y, num radius, num startAngle, num endAngle,
+      bool anticlockwise) native ;
 
   @DomName('CanvasRenderingContext2D.arcTo')
   @DocsEditable()
-  void arcTo(num x1, num y1, num x2, num y2, num radius) native;
+  void arcTo(num x1, num y1, num x2, num y2, num radius) native ;
 
   @DomName('CanvasRenderingContext2D.bezierCurveTo')
   @DocsEditable()
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native;
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y)
+      native ;
 
   @DomName('CanvasRenderingContext2D.closePath')
   @DocsEditable()
-  void closePath() native;
+  void closePath() native ;
 
   @DomName('CanvasRenderingContext2D.ellipse')
   @DocsEditable()
   @Experimental() // untriaged
-  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) native;
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation,
+      num startAngle, num endAngle, bool anticlockwise) native ;
 
   @DomName('CanvasRenderingContext2D.lineTo')
   @DocsEditable()
-  void lineTo(num x, num y) native;
+  void lineTo(num x, num y) native ;
 
   @DomName('CanvasRenderingContext2D.moveTo')
   @DocsEditable()
-  void moveTo(num x, num y) native;
+  void moveTo(num x, num y) native ;
 
   @DomName('CanvasRenderingContext2D.quadraticCurveTo')
   @DocsEditable()
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) native ;
 
   @DomName('CanvasRenderingContext2D.rect')
   @DocsEditable()
-  void rect(num x, num y, num width, num height) native;
-
+  void rect(num x, num y, num width, num height) native ;
 
   @DomName('CanvasRenderingContext2D.createImageDataFromImageData')
   @DocsEditable()
   ImageData createImageDataFromImageData(ImageData imagedata) =>
-    JS('ImageData', '#.createImageData(#)', this, imagedata);
+      JS('ImageData', '#.createImageData(#)', this, imagedata);
 
   /**
    * Sets the color used inside shapes.
@@ -2516,16 +2636,17 @@
   }
 
   @DomName('CanvasRenderingContext2D.arc')
-  void arc(num x,  num y,  num radius,  num startAngle, num endAngle,
+  void arc(num x, num y, num radius, num startAngle, num endAngle,
       [bool anticlockwise = false]) {
     // TODO(terry): This should not be needed: dartbug.com/20939.
     JS('void', '#.arc(#, #, #, #, #, #)', this, x, y, radius, startAngle,
-       endAngle, anticlockwise);
+        endAngle, anticlockwise);
   }
 
   @DomName('CanvasRenderingContext2D.createPatternFromImage')
-  CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) =>
-    JS('CanvasPattern', '#.createPattern(#, #)', this, image, repetitionType);
+  CanvasPattern createPatternFromImage(
+          ImageElement image, String repetitionType) =>
+      JS('CanvasPattern', '#.createPattern(#, #)', this, image, repetitionType);
 
   /**
    * Draws an image from a CanvasImageSource to an area of this canvas.
@@ -2571,13 +2692,11 @@
   void drawImageToRect(CanvasImageSource source, Rectangle destRect,
       {Rectangle sourceRect}) {
     if (sourceRect == null) {
-      drawImageScaled(source,
-          destRect.left,
-          destRect.top,
-          destRect.width,
-          destRect.height);
+      drawImageScaled(
+          source, destRect.left, destRect.top, destRect.width, destRect.height);
     } else {
-      drawImageScaledFromSource(source,
+      drawImageScaledFromSource(
+          source,
           sourceRect.left,
           sourceRect.top,
           sourceRect.width,
@@ -2620,7 +2739,7 @@
    */
   @DomName('CanvasRenderingContext2D.drawImage')
   @JSName('drawImage')
-  void drawImage(CanvasImageSource source, num destX, num destY) native;
+  void drawImage(CanvasImageSource source, num destX, num destY) native ;
 
   /**
    * Draws an image from a CanvasImageSource to an area of this canvas.
@@ -2650,8 +2769,8 @@
    */
   @DomName('CanvasRenderingContext2D.drawImage')
   @JSName('drawImage')
-  void drawImageScaled(CanvasImageSource source,
-      num destX, num destY, num destWidth, num destHeight) native;
+  void drawImageScaled(CanvasImageSource source, num destX, num destY,
+      num destWidth, num destHeight) native ;
 
   /**
    * Draws an image from a CanvasImageSource to an area of this canvas.
@@ -2684,9 +2803,16 @@
    */
   @DomName('CanvasRenderingContext2D.drawImage')
   @JSName('drawImage')
-  void drawImageScaledFromSource(CanvasImageSource source,
-      num sourceX, num sourceY, num sourceWidth, num sourceHeight,
-      num destX, num destY, num destWidth, num destHeight) native;
+  void drawImageScaledFromSource(
+      CanvasImageSource source,
+      num sourceX,
+      num sourceY,
+      num sourceWidth,
+      num sourceHeight,
+      num destX,
+      num destY,
+      num destWidth,
+      num destHeight) native ;
 
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -2695,8 +2821,8 @@
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   // TODO(14316): Firefox has this functionality with mozDashOffset, but it
   // needs to be polyfilled.
-  num get lineDashOffset => JS('num',
-      '#.lineDashOffset || #.webkitLineDashOffset', this, this);
+  num get lineDashOffset =>
+      JS('num', '#.lineDashOffset || #.webkitLineDashOffset', this, this);
 
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -2706,9 +2832,15 @@
   // TODO(14316): Firefox has this functionality with mozDashOffset, but it
   // needs to be polyfilled.
   set lineDashOffset(num value) {
-    JS('void',
-       'typeof #.lineDashOffset != "undefined" ? #.lineDashOffset = # : '
-       '#.webkitLineDashOffset = #', this, this, value, this, value);
+    JS(
+        'void',
+        'typeof #.lineDashOffset != "undefined" ? #.lineDashOffset = # : '
+        '#.webkitLineDashOffset = #',
+        this,
+        this,
+        value,
+        this,
+        value);
   }
 
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -2723,7 +2855,7 @@
       return JS('List<num>', '#.getLineDash()', this);
     } else if (JS('bool', '!!#.webkitLineDash', this)) {
       return JS('List<num>', '#.webkitLineDash', this);
-    } 
+    }
   }
 
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -2741,7 +2873,6 @@
     }
   }
 
-
   /**
    * Draws text to the canvas.
    *
@@ -2780,13 +2911,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.
 
-
 @DocsEditable()
 @DomName('CharacterData')
 @Native("CharacterData")
-class CharacterData extends Node implements NonDocumentTypeChildNode, ChildNode {
+class CharacterData extends Node
+    implements NonDocumentTypeChildNode, ChildNode {
   // To suppress missing implicit constructor warnings.
-  factory CharacterData._() { throw new UnsupportedError("Not supported"); }
+  factory CharacterData._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CharacterData.data')
   @DocsEditable()
@@ -2798,35 +2931,35 @@
 
   @DomName('CharacterData.appendData')
   @DocsEditable()
-  void appendData(String data) native;
+  void appendData(String data) native ;
 
   @DomName('CharacterData.deleteData')
   @DocsEditable()
-  void deleteData(int offset, int count) native;
+  void deleteData(int offset, int count) native ;
 
   @DomName('CharacterData.insertData')
   @DocsEditable()
-  void insertData(int offset, String data) native;
+  void insertData(int offset, String data) native ;
 
   @DomName('CharacterData.replaceData')
   @DocsEditable()
-  void replaceData(int offset, int count, String data) native;
+  void replaceData(int offset, int count, String data) native ;
 
   @DomName('CharacterData.substringData')
   @DocsEditable()
-  String substringData(int offset, int count) native;
+  String substringData(int offset, int count) native ;
 
   // From ChildNode
 
   @DomName('CharacterData.after')
   @DocsEditable()
   @Experimental() // untriaged
-  void after(Object nodes) native;
+  void after(Object nodes) native ;
 
   @DomName('CharacterData.before')
   @DocsEditable()
   @Experimental() // untriaged
-  void before(Object nodes) native;
+  void before(Object nodes) native ;
 
   // From NonDocumentTypeChildNode
 
@@ -2842,13 +2975,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.
 
-
 @DocsEditable()
 @DomName('ChildNode')
 @Experimental() // untriaged
 abstract class ChildNode extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ChildNode._() { throw new UnsupportedError("Not supported"); }
+  factory ChildNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   void after(Object nodes);
 
@@ -2860,27 +2994,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('CHROMIUMValuebuffer')
 @Experimental() // untriaged
 @Native("CHROMIUMValuebuffer")
 class ChromiumValuebuffer extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ChromiumValuebuffer._() { throw new UnsupportedError("Not supported"); }
+  factory ChromiumValuebuffer._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('CircularGeofencingRegion')
 @Experimental() // untriaged
 @Native("CircularGeofencingRegion")
 class CircularGeofencingRegion extends GeofencingRegion {
   // To suppress missing implicit constructor warnings.
-  factory CircularGeofencingRegion._() { throw new UnsupportedError("Not supported"); }
+  factory CircularGeofencingRegion._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CircularGeofencingRegion.CircularGeofencingRegion')
   @DocsEditable()
@@ -2888,7 +3024,8 @@
     var init_1 = convertDartToNative_Dictionary(init);
     return CircularGeofencingRegion._create_1(init_1);
   }
-  static CircularGeofencingRegion _create_1(init) => JS('CircularGeofencingRegion', 'new CircularGeofencingRegion(#)', init);
+  static CircularGeofencingRegion _create_1(init) =>
+      JS('CircularGeofencingRegion', 'new CircularGeofencingRegion(#)', init);
 
   @DomName('CircularGeofencingRegion.MAX_RADIUS')
   @DocsEditable()
@@ -2919,14 +3056,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.
 
-
 @DocsEditable()
 @DomName('Client')
 @Experimental() // untriaged
 @Native("Client")
 class Client extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Client._() { throw new UnsupportedError("Not supported"); }
+  factory Client._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Client.frameType')
   @DocsEditable()
@@ -2946,7 +3084,8 @@
   @DomName('Client.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
+  void postMessage(/*SerializedScriptValue*/ message,
+      [List<MessagePort> transfer]) {
     if (transfer != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
       _postMessage_1(message_1, transfer);
@@ -2956,34 +3095,36 @@
     _postMessage_2(message_1);
     return;
   }
+
   @JSName('postMessage')
   @DomName('Client.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_1(message, List<MessagePort> transfer) native;
+  void _postMessage_1(message, List<MessagePort> transfer) native ;
   @JSName('postMessage')
   @DomName('Client.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_2(message) native;
+  void _postMessage_2(message) 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.
 
-
 @DocsEditable()
 @DomName('Clients')
 @Experimental() // untriaged
 @Native("Clients")
 class Clients extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Clients._() { throw new UnsupportedError("Not supported"); }
+  factory Clients._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Clients.claim')
   @DocsEditable()
   @Experimental() // untriaged
-  Future claim() native;
+  Future claim() native ;
 
   @DomName('Clients.matchAll')
   @DocsEditable()
@@ -2995,34 +3136,36 @@
     }
     return _matchAll_2();
   }
+
   @JSName('matchAll')
   @DomName('Clients.matchAll')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _matchAll_1(options) native;
+  Future _matchAll_1(options) native ;
   @JSName('matchAll')
   @DomName('Clients.matchAll')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _matchAll_2() native;
+  Future _matchAll_2() native ;
 
   @DomName('Clients.openWindow')
   @DocsEditable()
   @Experimental() // untriaged
-  Future openWindow(String url) native;
+  Future openWindow(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.
 
-
 @DocsEditable()
 @DomName('ClipboardEvent')
 @Experimental() // untriaged
 @Native("ClipboardEvent")
 class ClipboardEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory ClipboardEvent._() { throw new UnsupportedError("Not supported"); }
+  factory ClipboardEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ClipboardEvent.clipboardData')
   @DocsEditable()
@@ -3033,13 +3176,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.
 
-
 @DocsEditable()
 @DomName('CloseEvent')
 @Native("CloseEvent")
 class CloseEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory CloseEvent._() { throw new UnsupportedError("Not supported"); }
+  factory CloseEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CloseEvent.CloseEvent')
   @DocsEditable()
@@ -3050,8 +3194,10 @@
     }
     return CloseEvent._create_2(type);
   }
-  static CloseEvent _create_1(type, eventInitDict) => JS('CloseEvent', 'new CloseEvent(#,#)', type, eventInitDict);
-  static CloseEvent _create_2(type) => JS('CloseEvent', 'new CloseEvent(#)', type);
+  static CloseEvent _create_1(type, eventInitDict) =>
+      JS('CloseEvent', 'new CloseEvent(#,#)', type, eventInitDict);
+  static CloseEvent _create_2(type) =>
+      JS('CloseEvent', 'new CloseEvent(#)', type);
 
   @DomName('CloseEvent.code')
   @DocsEditable()
@@ -3069,7 +3215,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.
 
-
 @DocsEditable()
 @DomName('Comment')
 @Native("Comment")
@@ -3081,7 +3226,9 @@
     return JS('Comment', '#.createComment("")', document);
   }
   // To suppress missing implicit constructor warnings.
-  factory Comment._() { throw new UnsupportedError("Not supported"); }
+  factory Comment._() {
+    throw new UnsupportedError("Not supported");
+  }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -3089,13 +3236,15 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('CompositionEvent')
 @Native("CompositionEvent")
 class CompositionEvent extends UIEvent {
   factory CompositionEvent(String type,
-      {bool canBubble: false, bool cancelable: false, Window view,
-      String data, String locale}) {
+      {bool canBubble: false,
+      bool cancelable: false,
+      Window view,
+      String data,
+      String locale}) {
     if (view == null) {
       view = window;
     }
@@ -3103,8 +3252,8 @@
 
     if (Device.isFirefox) {
       // Firefox requires the locale parameter that isn't supported elsewhere.
-      JS('void', '#.initCompositionEvent(#, #, #, #, #, #)',
-          e, type, canBubble, cancelable, view, data, locale);
+      JS('void', '#.initCompositionEvent(#, #, #, #, #, #)', e, type, canBubble,
+          cancelable, view, data, locale);
     } else {
       e._initCompositionEvent(type, canBubble, cancelable, view, data);
     }
@@ -3112,7 +3261,6 @@
     return e;
   }
 
-
   @DomName('CompositionEvent.CompositionEvent')
   @DocsEditable()
   factory CompositionEvent._(String type, [Map eventInitDict]) {
@@ -3122,8 +3270,10 @@
     }
     return CompositionEvent._create_2(type);
   }
-  static CompositionEvent _create_1(type, eventInitDict) => JS('CompositionEvent', 'new CompositionEvent(#,#)', type, eventInitDict);
-  static CompositionEvent _create_2(type) => JS('CompositionEvent', 'new CompositionEvent(#)', type);
+  static CompositionEvent _create_1(type, eventInitDict) =>
+      JS('CompositionEvent', 'new CompositionEvent(#,#)', type, eventInitDict);
+  static CompositionEvent _create_2(type) =>
+      JS('CompositionEvent', 'new CompositionEvent(#)', type);
 
   @DomName('CompositionEvent.data')
   @DocsEditable()
@@ -3132,28 +3282,30 @@
   @JSName('initCompositionEvent')
   @DomName('CompositionEvent.initCompositionEvent')
   @DocsEditable()
-  void _initCompositionEvent(String type, bool bubbles, bool cancelable, Window view, String data) native;
-
+  void _initCompositionEvent(String type, bool bubbles, bool cancelable,
+      Window view, String 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.
 
-
 @DocsEditable()
 @DomName('CompositorProxy')
 @Experimental() // untriaged
 @Native("CompositorProxy")
 class CompositorProxy extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory CompositorProxy._() { throw new UnsupportedError("Not supported"); }
+  factory CompositorProxy._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CompositorProxy.CompositorProxy')
   @DocsEditable()
   factory CompositorProxy(Element element, List<String> attributeArray) {
     return CompositorProxy._create_1(element, attributeArray);
   }
-  static CompositorProxy _create_1(element, attributeArray) => JS('CompositorProxy', 'new CompositorProxy(#,#)', element, attributeArray);
+  static CompositorProxy _create_1(element, attributeArray) => JS(
+      'CompositorProxy', 'new CompositorProxy(#,#)', element, attributeArray);
 
   @DomName('CompositorProxy.opacity')
   @DocsEditable()
@@ -3178,47 +3330,52 @@
   @DomName('CompositorProxy.disconnect')
   @DocsEditable()
   @Experimental() // untriaged
-  void disconnect() native;
+  void disconnect() native ;
 
   @DomName('CompositorProxy.supports')
   @DocsEditable()
   @Experimental() // untriaged
-  bool supports(String attribute) native;
+  bool supports(String attribute) 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.
 
-
 @DocsEditable()
 @DomName('CompositorWorker')
 @Experimental() // untriaged
 @Native("CompositorWorker")
 class CompositorWorker extends EventTarget implements AbstractWorker {
   // To suppress missing implicit constructor warnings.
-  factory CompositorWorker._() { throw new UnsupportedError("Not supported"); }
+  factory CompositorWorker._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CompositorWorker.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   @DomName('CompositorWorker.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   @DomName('CompositorWorker.CompositorWorker')
   @DocsEditable()
   factory CompositorWorker(String scriptUrl) {
     return CompositorWorker._create_1(scriptUrl);
   }
-  static CompositorWorker _create_1(scriptUrl) => JS('CompositorWorker', 'new CompositorWorker(#)', scriptUrl);
+  static CompositorWorker _create_1(scriptUrl) =>
+      JS('CompositorWorker', 'new CompositorWorker(#)', scriptUrl);
 
   @DomName('CompositorWorker.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
+  void postMessage(/*SerializedScriptValue*/ message,
+      [List<MessagePort> transfer]) {
     if (transfer != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
       _postMessage_1(message_1, transfer);
@@ -3228,21 +3385,22 @@
     _postMessage_2(message_1);
     return;
   }
+
   @JSName('postMessage')
   @DomName('CompositorWorker.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_1(message, List<MessagePort> transfer) native;
+  void _postMessage_1(message, List<MessagePort> transfer) native ;
   @JSName('postMessage')
   @DomName('CompositorWorker.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_2(message) native;
+  void _postMessage_2(message) native ;
 
   @DomName('CompositorWorker.terminate')
   @DocsEditable()
   @Experimental() // untriaged
-  void terminate() native;
+  void terminate() native ;
 
   @DomName('CompositorWorker.onerror')
   @DocsEditable()
@@ -3258,24 +3416,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.
 
-
 @DocsEditable()
 @DomName('CompositorWorkerGlobalScope')
 @Experimental() // untriaged
 @Native("CompositorWorkerGlobalScope")
 class CompositorWorkerGlobalScope extends WorkerGlobalScope {
   // To suppress missing implicit constructor warnings.
-  factory CompositorWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+  factory CompositorWorkerGlobalScope._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CompositorWorkerGlobalScope.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   @DomName('CompositorWorkerGlobalScope.cancelAnimationFrame')
   @DocsEditable()
   @Experimental() // untriaged
-  void cancelAnimationFrame(int handle) native;
+  void cancelAnimationFrame(int handle) native ;
 
   @DomName('CompositorWorkerGlobalScope.postMessage')
   @DocsEditable()
@@ -3290,21 +3450,22 @@
     _postMessage_2(message_1);
     return;
   }
+
   @JSName('postMessage')
   @DomName('CompositorWorkerGlobalScope.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_1(message, List<MessagePort> transfer) native;
+  void _postMessage_1(message, List<MessagePort> transfer) native ;
   @JSName('postMessage')
   @DomName('CompositorWorkerGlobalScope.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_2(message) native;
+  void _postMessage_2(message) native ;
 
   @DomName('CompositorWorkerGlobalScope.requestAnimationFrame')
   @DocsEditable()
   @Experimental() // untriaged
-  int requestAnimationFrame(FrameRequestCallback callback) native;
+  int requestAnimationFrame(FrameRequestCallback callback) native ;
 
   @DomName('CompositorWorkerGlobalScope.onmessage')
   @DocsEditable()
@@ -3315,10 +3476,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.
 
-
 @DomName('Console')
 class Console {
-
   const Console._safe();
 
   static const Console _safeConsole = const Console._safe();
@@ -3326,130 +3485,132 @@
   bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
 
   @DomName('Console.memory')
-  MemoryInfo get memory => _isConsoleDefined ?
-      JS('MemoryInfo', 'console.memory') : null;
+  MemoryInfo get memory =>
+      _isConsoleDefined ? JS('MemoryInfo', 'console.memory') : null;
 
   @DomName('Console.assertCondition')
-  void assertCondition(bool condition, Object arg) => _isConsoleDefined ?
-      JS('void', 'console.assertCondition(#, #)', condition, arg) : null;
+  void assertCondition(bool condition, Object arg) => _isConsoleDefined
+      ? JS('void', 'console.assertCondition(#, #)', condition, arg)
+      : null;
 
   @DomName('Console.clear')
-  void clear(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.clear(#)', arg) : null;
+  void clear(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.clear(#)', arg) : null;
 
   @DomName('Console.count')
-  void count(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.count(#)', arg) : null;
+  void count(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.count(#)', arg) : null;
 
   @DomName('Console.debug')
-  void debug(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.debug(#)', arg) : null;
+  void debug(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.debug(#)', arg) : null;
 
   @DomName('Console.dir')
-  void dir(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.dir(#)', arg) : null;
+  void dir(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.dir(#)', arg) : null;
 
   @DomName('Console.dirxml')
-  void dirxml(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.dirxml(#)', arg) : null;
+  void dirxml(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.dirxml(#)', arg) : null;
 
   @DomName('Console.error')
-  void error(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.error(#)', arg) : null;
+  void error(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.error(#)', arg) : null;
 
   @DomName('Console.group')
-  void group(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.group(#)', arg) : null;
+  void group(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.group(#)', arg) : null;
 
   @DomName('Console.groupCollapsed')
-  void groupCollapsed(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.groupCollapsed(#)', arg) : null;
+  void groupCollapsed(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.groupCollapsed(#)', arg) : null;
 
   @DomName('Console.groupEnd')
-  void groupEnd() => _isConsoleDefined ?
-      JS('void', 'console.groupEnd()') : null;
+  void groupEnd() =>
+      _isConsoleDefined ? JS('void', 'console.groupEnd()') : null;
 
   @DomName('Console.info')
-  void info(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.info(#)', arg) : null;
+  void info(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.info(#)', arg) : null;
 
   @DomName('Console.log')
-  void log(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.log(#)', arg) : null;
+  void log(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.log(#)', arg) : null;
 
   @DomName('Console.markTimeline')
-  void markTimeline(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.markTimeline(#)', arg) : null;
+  void markTimeline(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.markTimeline(#)', arg) : null;
 
   @DomName('Console.profile')
-  void profile(String title) => _isConsoleDefined ?
-      JS('void', 'console.profile(#)', title) : null;
+  void profile(String title) =>
+      _isConsoleDefined ? JS('void', 'console.profile(#)', title) : null;
 
   @DomName('Console.profileEnd')
-  void profileEnd(String title) => _isConsoleDefined ?
-      JS('void', 'console.profileEnd(#)', title) : null;
+  void profileEnd(String title) =>
+      _isConsoleDefined ? JS('void', 'console.profileEnd(#)', title) : null;
 
   @DomName('Console.table')
-  void table(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.table(#)', arg) : null;
+  void table(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.table(#)', arg) : null;
 
   @DomName('Console.time')
-  void time(String title) => _isConsoleDefined ?
-      JS('void', 'console.time(#)', title) : null;
+  void time(String title) =>
+      _isConsoleDefined ? JS('void', 'console.time(#)', title) : null;
 
   @DomName('Console.timeEnd')
-  void timeEnd(String title) => _isConsoleDefined ?
-      JS('void', 'console.timeEnd(#)', title) : null;
+  void timeEnd(String title) =>
+      _isConsoleDefined ? JS('void', 'console.timeEnd(#)', title) : null;
 
   @DomName('Console.timeStamp')
-  void timeStamp(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.timeStamp(#)', arg) : null;
+  void timeStamp(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.timeStamp(#)', arg) : null;
 
   @DomName('Console.trace')
-  void trace(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.trace(#)', arg) : null;
+  void trace(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.trace(#)', arg) : null;
 
   @DomName('Console.warn')
-  void warn(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.warn(#)', arg) : null;
+  void warn(Object arg) =>
+      _isConsoleDefined ? JS('void', 'console.warn(#)', arg) : null;
   // To suppress missing implicit constructor warnings.
-  factory Console._() { throw new UnsupportedError("Not supported"); }
-
+  factory Console._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('ConsoleBase')
 @Experimental() // untriaged
 @Native("ConsoleBase")
 class ConsoleBase extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ConsoleBase._() { throw new UnsupportedError("Not supported"); }
+  factory ConsoleBase._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('assert')
   @DomName('ConsoleBase.assert')
   @DocsEditable()
   @Experimental() // untriaged
-  void assertCondition(bool condition, Object arg) native;
+  void assertCondition(bool condition, Object arg) native ;
 
   @DomName('ConsoleBase.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeline(String title) native;
+  void timeline(String title) native ;
 
   @DomName('ConsoleBase.timelineEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void timelineEnd(String title) native;
+  void timelineEnd(String title) 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.
 
-
 @DocsEditable()
 @DomName('HTMLContentElement')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
@@ -3458,7 +3619,9 @@
 @Native("HTMLContentElement")
 class ContentElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory ContentElement._() { throw new UnsupportedError("Not supported"); }
+  factory ContentElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLContentElement.HTMLContentElement')
   @DocsEditable()
@@ -3481,19 +3644,20 @@
   @DocsEditable()
   @Returns('NodeList')
   @Creates('NodeList')
-  List<Node> getDistributedNodes() native;
+  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.
 
-
 @DocsEditable()
 @DomName('Coordinates')
 @Native("Coordinates")
 class Coordinates extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Coordinates._() { throw new UnsupportedError("Not supported"); }
+  factory Coordinates._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Coordinates.accuracy')
   @DocsEditable()
@@ -3527,14 +3691,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.
 
-
 @DocsEditable()
 @DomName('Credential')
 @Experimental() // untriaged
 @Native("Credential")
 class Credential extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Credential._() { throw new UnsupportedError("Not supported"); }
+  factory Credential._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('iconURL')
   @DomName('Credential.iconURL')
@@ -3561,19 +3726,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.
 
-
 @DocsEditable()
 @DomName('CredentialsContainer')
 @Experimental() // untriaged
 @Native("CredentialsContainer")
 class CredentialsContainer extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory CredentialsContainer._() { throw new UnsupportedError("Not supported"); }
+  factory CredentialsContainer._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CredentialsContainer.notifySignedIn')
   @DocsEditable()
   @Experimental() // untriaged
-  Future notifySignedIn(Credential credential) native;
+  Future notifySignedIn(Credential credential) native ;
 
   @DomName('CredentialsContainer.request')
   @DocsEditable()
@@ -3585,34 +3751,36 @@
     }
     return _request_2();
   }
+
   @JSName('request')
   @DomName('CredentialsContainer.request')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _request_1(options) native;
+  Future _request_1(options) native ;
   @JSName('request')
   @DomName('CredentialsContainer.request')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _request_2() native;
+  Future _request_2() native ;
 
   @DomName('CredentialsContainer.requireUserMediation')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requireUserMediation() native;
+  Future requireUserMediation() 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.
 
-
 @DocsEditable()
 @DomName('CrossOriginConnectEvent')
 @Experimental() // untriaged
 @Native("CrossOriginConnectEvent")
 class CrossOriginConnectEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory CrossOriginConnectEvent._() { throw new UnsupportedError("Not supported"); }
+  factory CrossOriginConnectEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CrossOriginConnectEvent.client')
   @DocsEditable()
@@ -3622,20 +3790,21 @@
   @DomName('CrossOriginConnectEvent.acceptConnection')
   @DocsEditable()
   @Experimental() // untriaged
-  void acceptConnection(Future shouldAccept) native;
+  void acceptConnection(Future shouldAccept) 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.
 
-
 @DocsEditable()
 @DomName('CrossOriginServiceWorkerClient')
 @Experimental() // untriaged
 @Native("CrossOriginServiceWorkerClient")
 class CrossOriginServiceWorkerClient extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory CrossOriginServiceWorkerClient._() { throw new UnsupportedError("Not supported"); }
+  factory CrossOriginServiceWorkerClient._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CrossOriginServiceWorkerClient.origin')
   @DocsEditable()
@@ -3650,7 +3819,8 @@
   @DomName('CrossOriginServiceWorkerClient.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
+  void postMessage(/*SerializedScriptValue*/ message,
+      [List<MessagePort> transfer]) {
     if (transfer != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
       _postMessage_1(message_1, transfer);
@@ -3660,22 +3830,22 @@
     _postMessage_2(message_1);
     return;
   }
+
   @JSName('postMessage')
   @DomName('CrossOriginServiceWorkerClient.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_1(message, List<MessagePort> transfer) native;
+  void _postMessage_1(message, List<MessagePort> transfer) native ;
   @JSName('postMessage')
   @DomName('CrossOriginServiceWorkerClient.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_2(message) native;
+  void _postMessage_2(message) native ;
 }
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for 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('Crypto')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -3683,16 +3853,18 @@
 // http://www.w3.org/TR/WebCryptoAPI/
 @Native("Crypto")
 class Crypto extends Interceptor {
-
   TypedData getRandomValues(TypedData array) {
     return _getRandomValues(array);
   }
 
   // To suppress missing implicit constructor warnings.
-  factory Crypto._() { throw new UnsupportedError("Not supported"); }
+  factory Crypto._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => JS('bool', '!!(window.crypto && window.crypto.getRandomValues)');
+  static bool get supported =>
+      JS('bool', '!!(window.crypto && window.crypto.getRandomValues)');
 
   @DomName('Crypto.subtle')
   @DocsEditable()
@@ -3704,21 +3876,21 @@
   @DocsEditable()
   @Creates('TypedData')
   @Returns('TypedData|Null')
-  TypedData _getRandomValues(TypedData array) native;
-
+  TypedData _getRandomValues(TypedData 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.
 
-
 @DocsEditable()
 @DomName('CryptoKey')
 @Experimental() // untriaged
 @Native("CryptoKey")
 class CryptoKey extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory CryptoKey._() { throw new UnsupportedError("Not supported"); }
+  factory CryptoKey._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CryptoKey.algorithm')
   @DocsEditable()
@@ -3745,7 +3917,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.
 
-
 @DocsEditable()
 @DomName('CSS')
 // http://www.w3.org/TR/css3-conditional/#the-css-interface
@@ -3753,22 +3924,23 @@
 @Native("CSS")
 class Css extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Css._() { throw new UnsupportedError("Not supported"); }
+  factory Css._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSS.supports')
   @DocsEditable()
-  static bool supports(String property, String value) native;
+  static bool supports(String property, String value) native ;
 
   @JSName('supports')
   @DomName('CSS.supports')
   @DocsEditable()
-  static bool supportsCondition(String conditionText) native;
+  static bool supportsCondition(String conditionText) 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.
 
-
 @DocsEditable()
 @DomName('CSSCharsetRule')
 // http://dev.w3.org/csswg/cssom/#the-csscharsetrule-interface
@@ -3776,7 +3948,9 @@
 @Native("CSSCharsetRule")
 class CssCharsetRule extends CssRule {
   // To suppress missing implicit constructor warnings.
-  factory CssCharsetRule._() { throw new UnsupportedError("Not supported"); }
+  factory CssCharsetRule._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSCharsetRule.encoding')
   @DocsEditable()
@@ -3786,13 +3960,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.
 
-
 @DocsEditable()
 @DomName('CSSFontFaceRule')
 @Native("CSSFontFaceRule")
 class CssFontFaceRule extends CssRule {
   // To suppress missing implicit constructor warnings.
-  factory CssFontFaceRule._() { throw new UnsupportedError("Not supported"); }
+  factory CssFontFaceRule._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSFontFaceRule.style')
   @DocsEditable()
@@ -3802,14 +3977,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.
 
-
 @DocsEditable()
 @DomName('CSSGroupingRule')
 @Experimental() // untriaged
 @Native("CSSGroupingRule")
 class CssGroupingRule extends CssRule {
   // To suppress missing implicit constructor warnings.
-  factory CssGroupingRule._() { throw new UnsupportedError("Not supported"); }
+  factory CssGroupingRule._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSGroupingRule.cssRules')
   @DocsEditable()
@@ -3821,24 +3997,25 @@
   @DomName('CSSGroupingRule.deleteRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteRule(int index) native;
+  void deleteRule(int index) native ;
 
   @DomName('CSSGroupingRule.insertRule')
   @DocsEditable()
   @Experimental() // untriaged
-  int insertRule(String rule, 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.
 
-
 @DocsEditable()
 @DomName('CSSImportRule')
 @Native("CSSImportRule")
 class CssImportRule extends CssRule {
   // To suppress missing implicit constructor warnings.
-  factory CssImportRule._() { throw new UnsupportedError("Not supported"); }
+  factory CssImportRule._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSImportRule.href')
   @DocsEditable()
@@ -3856,14 +4033,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.
 
-
 @DocsEditable()
 @DomName('CSSKeyframeRule')
 @Experimental() // untriaged
 @Native("CSSKeyframeRule,MozCSSKeyframeRule,WebKitCSSKeyframeRule")
 class CssKeyframeRule extends CssRule {
   // To suppress missing implicit constructor warnings.
-  factory CssKeyframeRule._() { throw new UnsupportedError("Not supported"); }
+  factory CssKeyframeRule._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
@@ -3879,14 +4057,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.
 
-
 @DocsEditable()
 @DomName('CSSKeyframesRule')
 @Experimental() // untriaged
 @Native("CSSKeyframesRule,MozCSSKeyframesRule,WebKitCSSKeyframesRule")
 class CssKeyframesRule extends CssRule {
   // To suppress missing implicit constructor warnings.
-  factory CssKeyframesRule._() { throw new UnsupportedError("Not supported"); }
+  factory CssKeyframesRule._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSKeyframesRule.cssRules')
   @DocsEditable()
@@ -3903,34 +4082,35 @@
   @DomName('CSSKeyframesRule.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule __getter__(int index) native;
+  CssKeyframeRule __getter__(int index) native ;
 
   @DomName('CSSKeyframesRule.appendRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendRule(String rule) native;
+  void appendRule(String rule) native ;
 
   @DomName('CSSKeyframesRule.deleteRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteRule(String select) native;
+  void deleteRule(String select) native ;
 
   @DomName('CSSKeyframesRule.findRule')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule findRule(String select) native;
+  CssKeyframeRule findRule(String select) 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.
 
-
 @DocsEditable()
 @DomName('CSSMediaRule')
 @Native("CSSMediaRule")
 class CssMediaRule extends CssGroupingRule {
   // To suppress missing implicit constructor warnings.
-  factory CssMediaRule._() { throw new UnsupportedError("Not supported"); }
+  factory CssMediaRule._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSMediaRule.media')
   @DocsEditable()
@@ -3940,13 +4120,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.
 
-
 @DocsEditable()
 @DomName('CSSPageRule')
 @Native("CSSPageRule")
 class CssPageRule extends CssRule {
   // To suppress missing implicit constructor warnings.
-  factory CssPageRule._() { throw new UnsupportedError("Not supported"); }
+  factory CssPageRule._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSPageRule.selectorText')
   @DocsEditable()
@@ -3960,13 +4141,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.
 
-
 @DocsEditable()
 @DomName('CSSRule')
 @Native("CSSRule")
 class CssRule extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory CssRule._() { throw new UnsupportedError("Not supported"); }
+  factory CssRule._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSRule.CHARSET_RULE')
   @DocsEditable()
@@ -4050,11 +4232,9 @@
 // Source of CSS properties:
 //   CSSPropertyNames.in
 
-
 @DomName('CSSStyleDeclaration')
 @Native("CSSStyleDeclaration,MSStyleCSSProperties,CSS2Properties")
-class CssStyleDeclaration  extends Interceptor with
-    CssStyleDeclarationBase  {
+class CssStyleDeclaration extends Interceptor with CssStyleDeclarationBase {
   factory CssStyleDeclaration() => new CssStyleDeclaration.css('');
 
   factory CssStyleDeclaration.css(String css) {
@@ -4093,11 +4273,10 @@
     return JS('bool', '# in #', propertyName, this);
   }
 
-
   @DomName('CSSStyleDeclaration.setProperty')
   void setProperty(String propertyName, String value, [String priority]) {
-    return _setPropertyHelper(_browserPropertyName(propertyName),
-      value, priority);
+    return _setPropertyHelper(
+        _browserPropertyName(propertyName), value, priority);
   }
 
   String _browserPropertyName(String propertyName) {
@@ -4114,19 +4293,21 @@
 
   static final _propertyCache = JS('', '{}');
   static String _readCache(String key) =>
-    JS('String|Null', '#[#]', _propertyCache, key);
+      JS('String|Null', '#[#]', _propertyCache, key);
   static void _writeCache(String key, String value) {
     JS('void', '#[#] = #', _propertyCache, key, value);
   }
 
   static String _camelCase(String hyphenated) {
     var replacedMs = JS('String', r'#.replace(/^-ms-/, "ms-")', hyphenated);
-    return JS('String',
+    return JS(
+        'String',
         r'#.replace(/-([\da-z])/ig, (_, letter) => letter.toUpperCase())',
         replacedMs);
   }
 
-  void _setPropertyHelper(String propertyName, String value, [String priority]) {
+  void _setPropertyHelper(String propertyName, String value,
+      [String priority]) {
     if (value == null) value = '';
     if (priority == null) priority = '';
     JS('void', '#.setProperty(#, #, #)', this, propertyName, value, priority);
@@ -4138,8 +4319,11 @@
   static bool get supportsTransitions {
     return document.body.style.supportsProperty('transition');
   }
+
   // To suppress missing implicit constructor warnings.
-  factory CssStyleDeclaration._() { throw new UnsupportedError("Not supported"); }
+  factory CssStyleDeclaration._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSStyleDeclaration.cssText')
   @DocsEditable()
@@ -4155,21 +4339,20 @@
 
   @DomName('CSSStyleDeclaration.getPropertyPriority')
   @DocsEditable()
-  String getPropertyPriority(String property) native;
+  String getPropertyPriority(String property) native ;
 
   @JSName('getPropertyValue')
   @DomName('CSSStyleDeclaration.getPropertyValue')
   @DocsEditable()
-  String _getPropertyValue(String property) native;
+  String _getPropertyValue(String property) native ;
 
   @DomName('CSSStyleDeclaration.item')
   @DocsEditable()
-  String item(int index) native;
+  String item(int index) native ;
 
   @DomName('CSSStyleDeclaration.removeProperty')
   @DocsEditable()
-  String removeProperty(String property) native;
-
+  String removeProperty(String property) native ;
 
   /** Gets the value of "background" */
   String get background => this._background;
@@ -4178,10 +4361,11 @@
   set background(String value) {
     _background = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('background')
   String _background;
-    
+
   /** Gets the value of "background-attachment" */
   String get backgroundAttachment => this._backgroundAttachment;
 
@@ -4189,10 +4373,11 @@
   set backgroundAttachment(String value) {
     _backgroundAttachment = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('backgroundAttachment')
   String _backgroundAttachment;
-    
+
   /** Gets the value of "background-color" */
   String get backgroundColor => this._backgroundColor;
 
@@ -4200,10 +4385,11 @@
   set backgroundColor(String value) {
     _backgroundColor = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('backgroundColor')
   String _backgroundColor;
-    
+
   /** Gets the value of "background-image" */
   String get backgroundImage => this._backgroundImage;
 
@@ -4211,10 +4397,11 @@
   set backgroundImage(String value) {
     _backgroundImage = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('backgroundImage')
   String _backgroundImage;
-    
+
   /** Gets the value of "background-position" */
   String get backgroundPosition => this._backgroundPosition;
 
@@ -4222,10 +4409,11 @@
   set backgroundPosition(String value) {
     _backgroundPosition = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('backgroundPosition')
   String _backgroundPosition;
-    
+
   /** Gets the value of "background-repeat" */
   String get backgroundRepeat => this._backgroundRepeat;
 
@@ -4233,10 +4421,11 @@
   set backgroundRepeat(String value) {
     _backgroundRepeat = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('backgroundRepeat')
   String _backgroundRepeat;
-    
+
   /** Gets the value of "border" */
   String get border => this._border;
 
@@ -4244,10 +4433,11 @@
   set border(String value) {
     _border = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('border')
   String _border;
-    
+
   /** Gets the value of "border-bottom" */
   String get borderBottom => this._borderBottom;
 
@@ -4255,10 +4445,11 @@
   set borderBottom(String value) {
     _borderBottom = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderBottom')
   String _borderBottom;
-    
+
   /** Gets the value of "border-bottom-color" */
   String get borderBottomColor => this._borderBottomColor;
 
@@ -4266,10 +4457,11 @@
   set borderBottomColor(String value) {
     _borderBottomColor = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderBottomColor')
   String _borderBottomColor;
-    
+
   /** Gets the value of "border-bottom-style" */
   String get borderBottomStyle => this._borderBottomStyle;
 
@@ -4277,10 +4469,11 @@
   set borderBottomStyle(String value) {
     _borderBottomStyle = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderBottomStyle')
   String _borderBottomStyle;
-    
+
   /** Gets the value of "border-bottom-width" */
   String get borderBottomWidth => this._borderBottomWidth;
 
@@ -4288,10 +4481,11 @@
   set borderBottomWidth(String value) {
     _borderBottomWidth = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderBottomWidth')
   String _borderBottomWidth;
-    
+
   /** Gets the value of "border-collapse" */
   String get borderCollapse => this._borderCollapse;
 
@@ -4299,10 +4493,11 @@
   set borderCollapse(String value) {
     _borderCollapse = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderCollapse')
   String _borderCollapse;
-    
+
   /** Gets the value of "border-color" */
   String get borderColor => this._borderColor;
 
@@ -4310,10 +4505,11 @@
   set borderColor(String value) {
     _borderColor = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderColor')
   String _borderColor;
-    
+
   /** Gets the value of "border-left" */
   String get borderLeft => this._borderLeft;
 
@@ -4321,10 +4517,11 @@
   set borderLeft(String value) {
     _borderLeft = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderLeft')
   String _borderLeft;
-    
+
   /** Gets the value of "border-left-color" */
   String get borderLeftColor => this._borderLeftColor;
 
@@ -4332,10 +4529,11 @@
   set borderLeftColor(String value) {
     _borderLeftColor = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderLeftColor')
   String _borderLeftColor;
-    
+
   /** Gets the value of "border-left-style" */
   String get borderLeftStyle => this._borderLeftStyle;
 
@@ -4343,10 +4541,11 @@
   set borderLeftStyle(String value) {
     _borderLeftStyle = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderLeftStyle')
   String _borderLeftStyle;
-    
+
   /** Gets the value of "border-left-width" */
   String get borderLeftWidth => this._borderLeftWidth;
 
@@ -4354,10 +4553,11 @@
   set borderLeftWidth(String value) {
     _borderLeftWidth = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderLeftWidth')
   String _borderLeftWidth;
-    
+
   /** Gets the value of "border-right" */
   String get borderRight => this._borderRight;
 
@@ -4365,10 +4565,11 @@
   set borderRight(String value) {
     _borderRight = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderRight')
   String _borderRight;
-    
+
   /** Gets the value of "border-right-color" */
   String get borderRightColor => this._borderRightColor;
 
@@ -4376,10 +4577,11 @@
   set borderRightColor(String value) {
     _borderRightColor = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderRightColor')
   String _borderRightColor;
-    
+
   /** Gets the value of "border-right-style" */
   String get borderRightStyle => this._borderRightStyle;
 
@@ -4387,10 +4589,11 @@
   set borderRightStyle(String value) {
     _borderRightStyle = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderRightStyle')
   String _borderRightStyle;
-    
+
   /** Gets the value of "border-right-width" */
   String get borderRightWidth => this._borderRightWidth;
 
@@ -4398,10 +4601,11 @@
   set borderRightWidth(String value) {
     _borderRightWidth = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderRightWidth')
   String _borderRightWidth;
-    
+
   /** Gets the value of "border-spacing" */
   String get borderSpacing => this._borderSpacing;
 
@@ -4409,10 +4613,11 @@
   set borderSpacing(String value) {
     _borderSpacing = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderSpacing')
   String _borderSpacing;
-    
+
   /** Gets the value of "border-style" */
   String get borderStyle => this._borderStyle;
 
@@ -4420,10 +4625,11 @@
   set borderStyle(String value) {
     _borderStyle = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderStyle')
   String _borderStyle;
-    
+
   /** Gets the value of "border-top" */
   String get borderTop => this._borderTop;
 
@@ -4431,10 +4637,11 @@
   set borderTop(String value) {
     _borderTop = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderTop')
   String _borderTop;
-    
+
   /** Gets the value of "border-top-color" */
   String get borderTopColor => this._borderTopColor;
 
@@ -4442,10 +4649,11 @@
   set borderTopColor(String value) {
     _borderTopColor = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderTopColor')
   String _borderTopColor;
-    
+
   /** Gets the value of "border-top-style" */
   String get borderTopStyle => this._borderTopStyle;
 
@@ -4453,10 +4661,11 @@
   set borderTopStyle(String value) {
     _borderTopStyle = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderTopStyle')
   String _borderTopStyle;
-    
+
   /** Gets the value of "border-top-width" */
   String get borderTopWidth => this._borderTopWidth;
 
@@ -4464,10 +4673,11 @@
   set borderTopWidth(String value) {
     _borderTopWidth = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderTopWidth')
   String _borderTopWidth;
-    
+
   /** Gets the value of "border-width" */
   String get borderWidth => this._borderWidth;
 
@@ -4475,10 +4685,11 @@
   set borderWidth(String value) {
     _borderWidth = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('borderWidth')
   String _borderWidth;
-    
+
   /** Gets the value of "bottom" */
   String get bottom => this._bottom;
 
@@ -4486,10 +4697,11 @@
   set bottom(String value) {
     _bottom = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('bottom')
   String _bottom;
-    
+
   /** Gets the value of "caption-side" */
   String get captionSide => this._captionSide;
 
@@ -4497,10 +4709,11 @@
   set captionSide(String value) {
     _captionSide = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('captionSide')
   String _captionSide;
-    
+
   /** Gets the value of "clear" */
   String get clear => this._clear;
 
@@ -4508,10 +4721,11 @@
   set clear(String value) {
     _clear = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('clear')
   String _clear;
-    
+
   /** Gets the value of "clip" */
   String get clip => this._clip;
 
@@ -4519,10 +4733,11 @@
   set clip(String value) {
     _clip = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('clip')
   String _clip;
-    
+
   /** Gets the value of "color" */
   String get color => this._color;
 
@@ -4530,10 +4745,11 @@
   set color(String value) {
     _color = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('color')
   String _color;
-    
+
   /** Gets the value of "content" */
   String get content => this._content;
 
@@ -4541,10 +4757,11 @@
   set content(String value) {
     _content = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('content')
   String _content;
-    
+
   /** Gets the value of "cursor" */
   String get cursor => this._cursor;
 
@@ -4552,10 +4769,11 @@
   set cursor(String value) {
     _cursor = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('cursor')
   String _cursor;
-    
+
   /** Gets the value of "direction" */
   String get direction => this._direction;
 
@@ -4563,10 +4781,11 @@
   set direction(String value) {
     _direction = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('direction')
   String _direction;
-    
+
   /** Gets the value of "display" */
   String get display => this._display;
 
@@ -4574,10 +4793,11 @@
   set display(String value) {
     _display = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('display')
   String _display;
-    
+
   /** Gets the value of "empty-cells" */
   String get emptyCells => this._emptyCells;
 
@@ -4585,10 +4805,11 @@
   set emptyCells(String value) {
     _emptyCells = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('emptyCells')
   String _emptyCells;
-    
+
   /** Gets the value of "font" */
   String get font => this._font;
 
@@ -4596,10 +4817,11 @@
   set font(String value) {
     _font = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('font')
   String _font;
-    
+
   /** Gets the value of "font-family" */
   String get fontFamily => this._fontFamily;
 
@@ -4607,10 +4829,11 @@
   set fontFamily(String value) {
     _fontFamily = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('fontFamily')
   String _fontFamily;
-    
+
   /** Gets the value of "font-size" */
   String get fontSize => this._fontSize;
 
@@ -4618,10 +4841,11 @@
   set fontSize(String value) {
     _fontSize = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('fontSize')
   String _fontSize;
-    
+
   /** Gets the value of "font-style" */
   String get fontStyle => this._fontStyle;
 
@@ -4629,10 +4853,11 @@
   set fontStyle(String value) {
     _fontStyle = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('fontStyle')
   String _fontStyle;
-    
+
   /** Gets the value of "font-variant" */
   String get fontVariant => this._fontVariant;
 
@@ -4640,10 +4865,11 @@
   set fontVariant(String value) {
     _fontVariant = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('fontVariant')
   String _fontVariant;
-    
+
   /** Gets the value of "font-weight" */
   String get fontWeight => this._fontWeight;
 
@@ -4651,10 +4877,11 @@
   set fontWeight(String value) {
     _fontWeight = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('fontWeight')
   String _fontWeight;
-    
+
   /** Gets the value of "height" */
   String get height => this._height;
 
@@ -4662,10 +4889,11 @@
   set height(String value) {
     _height = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('height')
   String _height;
-    
+
   /** Gets the value of "left" */
   String get left => this._left;
 
@@ -4673,10 +4901,11 @@
   set left(String value) {
     _left = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('left')
   String _left;
-    
+
   /** Gets the value of "letter-spacing" */
   String get letterSpacing => this._letterSpacing;
 
@@ -4684,10 +4913,11 @@
   set letterSpacing(String value) {
     _letterSpacing = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('letterSpacing')
   String _letterSpacing;
-    
+
   /** Gets the value of "line-height" */
   String get lineHeight => this._lineHeight;
 
@@ -4695,10 +4925,11 @@
   set lineHeight(String value) {
     _lineHeight = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('lineHeight')
   String _lineHeight;
-    
+
   /** Gets the value of "list-style" */
   String get listStyle => this._listStyle;
 
@@ -4706,10 +4937,11 @@
   set listStyle(String value) {
     _listStyle = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('listStyle')
   String _listStyle;
-    
+
   /** Gets the value of "list-style-image" */
   String get listStyleImage => this._listStyleImage;
 
@@ -4717,10 +4949,11 @@
   set listStyleImage(String value) {
     _listStyleImage = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('listStyleImage')
   String _listStyleImage;
-    
+
   /** Gets the value of "list-style-position" */
   String get listStylePosition => this._listStylePosition;
 
@@ -4728,10 +4961,11 @@
   set listStylePosition(String value) {
     _listStylePosition = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('listStylePosition')
   String _listStylePosition;
-    
+
   /** Gets the value of "list-style-type" */
   String get listStyleType => this._listStyleType;
 
@@ -4739,10 +4973,11 @@
   set listStyleType(String value) {
     _listStyleType = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('listStyleType')
   String _listStyleType;
-    
+
   /** Gets the value of "margin" */
   String get margin => this._margin;
 
@@ -4750,10 +4985,11 @@
   set margin(String value) {
     _margin = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('margin')
   String _margin;
-    
+
   /** Gets the value of "margin-bottom" */
   String get marginBottom => this._marginBottom;
 
@@ -4761,10 +4997,11 @@
   set marginBottom(String value) {
     _marginBottom = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('marginBottom')
   String _marginBottom;
-    
+
   /** Gets the value of "margin-left" */
   String get marginLeft => this._marginLeft;
 
@@ -4772,10 +5009,11 @@
   set marginLeft(String value) {
     _marginLeft = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('marginLeft')
   String _marginLeft;
-    
+
   /** Gets the value of "margin-right" */
   String get marginRight => this._marginRight;
 
@@ -4783,10 +5021,11 @@
   set marginRight(String value) {
     _marginRight = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('marginRight')
   String _marginRight;
-    
+
   /** Gets the value of "margin-top" */
   String get marginTop => this._marginTop;
 
@@ -4794,10 +5033,11 @@
   set marginTop(String value) {
     _marginTop = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('marginTop')
   String _marginTop;
-    
+
   /** Gets the value of "max-height" */
   String get maxHeight => this._maxHeight;
 
@@ -4805,10 +5045,11 @@
   set maxHeight(String value) {
     _maxHeight = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('maxHeight')
   String _maxHeight;
-    
+
   /** Gets the value of "max-width" */
   String get maxWidth => this._maxWidth;
 
@@ -4816,10 +5057,11 @@
   set maxWidth(String value) {
     _maxWidth = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('maxWidth')
   String _maxWidth;
-    
+
   /** Gets the value of "min-height" */
   String get minHeight => this._minHeight;
 
@@ -4827,10 +5069,11 @@
   set minHeight(String value) {
     _minHeight = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('minHeight')
   String _minHeight;
-    
+
   /** Gets the value of "min-width" */
   String get minWidth => this._minWidth;
 
@@ -4838,10 +5081,11 @@
   set minWidth(String value) {
     _minWidth = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('minWidth')
   String _minWidth;
-    
+
   /** Gets the value of "outline" */
   String get outline => this._outline;
 
@@ -4849,10 +5093,11 @@
   set outline(String value) {
     _outline = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('outline')
   String _outline;
-    
+
   /** Gets the value of "outline-color" */
   String get outlineColor => this._outlineColor;
 
@@ -4860,10 +5105,11 @@
   set outlineColor(String value) {
     _outlineColor = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('outlineColor')
   String _outlineColor;
-    
+
   /** Gets the value of "outline-style" */
   String get outlineStyle => this._outlineStyle;
 
@@ -4871,10 +5117,11 @@
   set outlineStyle(String value) {
     _outlineStyle = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('outlineStyle')
   String _outlineStyle;
-    
+
   /** Gets the value of "outline-width" */
   String get outlineWidth => this._outlineWidth;
 
@@ -4882,10 +5129,11 @@
   set outlineWidth(String value) {
     _outlineWidth = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('outlineWidth')
   String _outlineWidth;
-    
+
   /** Gets the value of "overflow" */
   String get overflow => this._overflow;
 
@@ -4893,10 +5141,11 @@
   set overflow(String value) {
     _overflow = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('overflow')
   String _overflow;
-    
+
   /** Gets the value of "padding" */
   String get padding => this._padding;
 
@@ -4904,10 +5153,11 @@
   set padding(String value) {
     _padding = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('padding')
   String _padding;
-    
+
   /** Gets the value of "padding-bottom" */
   String get paddingBottom => this._paddingBottom;
 
@@ -4915,10 +5165,11 @@
   set paddingBottom(String value) {
     _paddingBottom = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('paddingBottom')
   String _paddingBottom;
-    
+
   /** Gets the value of "padding-left" */
   String get paddingLeft => this._paddingLeft;
 
@@ -4926,10 +5177,11 @@
   set paddingLeft(String value) {
     _paddingLeft = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('paddingLeft')
   String _paddingLeft;
-    
+
   /** Gets the value of "padding-right" */
   String get paddingRight => this._paddingRight;
 
@@ -4937,10 +5189,11 @@
   set paddingRight(String value) {
     _paddingRight = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('paddingRight')
   String _paddingRight;
-    
+
   /** Gets the value of "padding-top" */
   String get paddingTop => this._paddingTop;
 
@@ -4948,10 +5201,11 @@
   set paddingTop(String value) {
     _paddingTop = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('paddingTop')
   String _paddingTop;
-    
+
   /** Gets the value of "page-break-after" */
   String get pageBreakAfter => this._pageBreakAfter;
 
@@ -4959,10 +5213,11 @@
   set pageBreakAfter(String value) {
     _pageBreakAfter = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('pageBreakAfter')
   String _pageBreakAfter;
-    
+
   /** Gets the value of "page-break-before" */
   String get pageBreakBefore => this._pageBreakBefore;
 
@@ -4970,10 +5225,11 @@
   set pageBreakBefore(String value) {
     _pageBreakBefore = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('pageBreakBefore')
   String _pageBreakBefore;
-    
+
   /** Gets the value of "page-break-inside" */
   String get pageBreakInside => this._pageBreakInside;
 
@@ -4981,10 +5237,11 @@
   set pageBreakInside(String value) {
     _pageBreakInside = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('pageBreakInside')
   String _pageBreakInside;
-    
+
   /** Gets the value of "position" */
   String get position => this._position;
 
@@ -4992,10 +5249,11 @@
   set position(String value) {
     _position = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('position')
   String _position;
-    
+
   /** Gets the value of "quotes" */
   String get quotes => this._quotes;
 
@@ -5003,10 +5261,11 @@
   set quotes(String value) {
     _quotes = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('quotes')
   String _quotes;
-    
+
   /** Gets the value of "right" */
   String get right => this._right;
 
@@ -5014,10 +5273,11 @@
   set right(String value) {
     _right = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('right')
   String _right;
-    
+
   /** Gets the value of "table-layout" */
   String get tableLayout => this._tableLayout;
 
@@ -5025,10 +5285,11 @@
   set tableLayout(String value) {
     _tableLayout = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('tableLayout')
   String _tableLayout;
-    
+
   /** Gets the value of "text-align" */
   String get textAlign => this._textAlign;
 
@@ -5036,10 +5297,11 @@
   set textAlign(String value) {
     _textAlign = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('textAlign')
   String _textAlign;
-    
+
   /** Gets the value of "text-decoration" */
   String get textDecoration => this._textDecoration;
 
@@ -5047,10 +5309,11 @@
   set textDecoration(String value) {
     _textDecoration = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('textDecoration')
   String _textDecoration;
-    
+
   /** Gets the value of "text-indent" */
   String get textIndent => this._textIndent;
 
@@ -5058,10 +5321,11 @@
   set textIndent(String value) {
     _textIndent = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('textIndent')
   String _textIndent;
-    
+
   /** Gets the value of "text-transform" */
   String get textTransform => this._textTransform;
 
@@ -5069,10 +5333,11 @@
   set textTransform(String value) {
     _textTransform = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('textTransform')
   String _textTransform;
-    
+
   /** Gets the value of "top" */
   String get top => this._top;
 
@@ -5080,10 +5345,11 @@
   set top(String value) {
     _top = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('top')
   String _top;
-    
+
   /** Gets the value of "unicode-bidi" */
   String get unicodeBidi => this._unicodeBidi;
 
@@ -5091,10 +5357,11 @@
   set unicodeBidi(String value) {
     _unicodeBidi = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('unicodeBidi')
   String _unicodeBidi;
-    
+
   /** Gets the value of "vertical-align" */
   String get verticalAlign => this._verticalAlign;
 
@@ -5102,10 +5369,11 @@
   set verticalAlign(String value) {
     _verticalAlign = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('verticalAlign')
   String _verticalAlign;
-    
+
   /** Gets the value of "visibility" */
   String get visibility => this._visibility;
 
@@ -5113,10 +5381,11 @@
   set visibility(String value) {
     _visibility = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('visibility')
   String _visibility;
-    
+
   /** Gets the value of "white-space" */
   String get whiteSpace => this._whiteSpace;
 
@@ -5124,10 +5393,11 @@
   set whiteSpace(String value) {
     _whiteSpace = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('whiteSpace')
   String _whiteSpace;
-    
+
   /** Gets the value of "width" */
   String get width => this._width;
 
@@ -5135,10 +5405,11 @@
   set width(String value) {
     _width = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('width')
   String _width;
-    
+
   /** Gets the value of "word-spacing" */
   String get wordSpacing => this._wordSpacing;
 
@@ -5146,10 +5417,11 @@
   set wordSpacing(String value) {
     _wordSpacing = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('wordSpacing')
   String _wordSpacing;
-    
+
   /** Gets the value of "z-index" */
   String get zIndex => this._zIndex;
 
@@ -5157,10 +5429,10 @@
   set zIndex(String value) {
     _zIndex = value == null ? '' : value;
   }
+
   @Returns('String')
   @JSName('zIndex')
   String _zIndex;
-    
 }
 
 class _CssStyleDeclarationSet extends Object with CssStyleDeclarationBase {
@@ -5168,20 +5440,19 @@
   Iterable<CssStyleDeclaration> _elementCssStyleDeclarationSetIterable;
 
   _CssStyleDeclarationSet(this._elementIterable) {
-    _elementCssStyleDeclarationSetIterable = new List.from(
-        _elementIterable).map((e) => e.style);
+    _elementCssStyleDeclarationSetIterable =
+        new List.from(_elementIterable).map((e) => e.style);
   }
 
   String getPropertyValue(String propertyName) =>
-      _elementCssStyleDeclarationSetIterable.first.getPropertyValue(
-          propertyName);
+      _elementCssStyleDeclarationSetIterable.first
+          .getPropertyValue(propertyName);
 
   void setProperty(String propertyName, String value, [String priority]) {
-    _elementCssStyleDeclarationSetIterable.forEach((e) =>
-        e.setProperty(propertyName, value, priority));
+    _elementCssStyleDeclarationSetIterable
+        .forEach((e) => e.setProperty(propertyName, value, priority));
   }
 
-
   void _setAll(String propertyName, String value) {
     value = value == null ? '' : value;
     for (Element element in _elementIterable) {
@@ -5193,452 +5464,451 @@
   set background(String value) {
     _setAll('background', value);
   }
-    
+
   /** Sets the value of "background-attachment" */
   set backgroundAttachment(String value) {
     _setAll('backgroundAttachment', value);
   }
-    
+
   /** Sets the value of "background-color" */
   set backgroundColor(String value) {
     _setAll('backgroundColor', value);
   }
-    
+
   /** Sets the value of "background-image" */
   set backgroundImage(String value) {
     _setAll('backgroundImage', value);
   }
-    
+
   /** Sets the value of "background-position" */
   set backgroundPosition(String value) {
     _setAll('backgroundPosition', value);
   }
-    
+
   /** Sets the value of "background-repeat" */
   set backgroundRepeat(String value) {
     _setAll('backgroundRepeat', value);
   }
-    
+
   /** Sets the value of "border" */
   set border(String value) {
     _setAll('border', value);
   }
-    
+
   /** Sets the value of "border-bottom" */
   set borderBottom(String value) {
     _setAll('borderBottom', value);
   }
-    
+
   /** Sets the value of "border-bottom-color" */
   set borderBottomColor(String value) {
     _setAll('borderBottomColor', value);
   }
-    
+
   /** Sets the value of "border-bottom-style" */
   set borderBottomStyle(String value) {
     _setAll('borderBottomStyle', value);
   }
-    
+
   /** Sets the value of "border-bottom-width" */
   set borderBottomWidth(String value) {
     _setAll('borderBottomWidth', value);
   }
-    
+
   /** Sets the value of "border-collapse" */
   set borderCollapse(String value) {
     _setAll('borderCollapse', value);
   }
-    
+
   /** Sets the value of "border-color" */
   set borderColor(String value) {
     _setAll('borderColor', value);
   }
-    
+
   /** Sets the value of "border-left" */
   set borderLeft(String value) {
     _setAll('borderLeft', value);
   }
-    
+
   /** Sets the value of "border-left-color" */
   set borderLeftColor(String value) {
     _setAll('borderLeftColor', value);
   }
-    
+
   /** Sets the value of "border-left-style" */
   set borderLeftStyle(String value) {
     _setAll('borderLeftStyle', value);
   }
-    
+
   /** Sets the value of "border-left-width" */
   set borderLeftWidth(String value) {
     _setAll('borderLeftWidth', value);
   }
-    
+
   /** Sets the value of "border-right" */
   set borderRight(String value) {
     _setAll('borderRight', value);
   }
-    
+
   /** Sets the value of "border-right-color" */
   set borderRightColor(String value) {
     _setAll('borderRightColor', value);
   }
-    
+
   /** Sets the value of "border-right-style" */
   set borderRightStyle(String value) {
     _setAll('borderRightStyle', value);
   }
-    
+
   /** Sets the value of "border-right-width" */
   set borderRightWidth(String value) {
     _setAll('borderRightWidth', value);
   }
-    
+
   /** Sets the value of "border-spacing" */
   set borderSpacing(String value) {
     _setAll('borderSpacing', value);
   }
-    
+
   /** Sets the value of "border-style" */
   set borderStyle(String value) {
     _setAll('borderStyle', value);
   }
-    
+
   /** Sets the value of "border-top" */
   set borderTop(String value) {
     _setAll('borderTop', value);
   }
-    
+
   /** Sets the value of "border-top-color" */
   set borderTopColor(String value) {
     _setAll('borderTopColor', value);
   }
-    
+
   /** Sets the value of "border-top-style" */
   set borderTopStyle(String value) {
     _setAll('borderTopStyle', value);
   }
-    
+
   /** Sets the value of "border-top-width" */
   set borderTopWidth(String value) {
     _setAll('borderTopWidth', value);
   }
-    
+
   /** Sets the value of "border-width" */
   set borderWidth(String value) {
     _setAll('borderWidth', value);
   }
-    
+
   /** Sets the value of "bottom" */
   set bottom(String value) {
     _setAll('bottom', value);
   }
-    
+
   /** Sets the value of "caption-side" */
   set captionSide(String value) {
     _setAll('captionSide', value);
   }
-    
+
   /** Sets the value of "clear" */
   set clear(String value) {
     _setAll('clear', value);
   }
-    
+
   /** Sets the value of "clip" */
   set clip(String value) {
     _setAll('clip', value);
   }
-    
+
   /** Sets the value of "color" */
   set color(String value) {
     _setAll('color', value);
   }
-    
+
   /** Sets the value of "content" */
   set content(String value) {
     _setAll('content', value);
   }
-    
+
   /** Sets the value of "cursor" */
   set cursor(String value) {
     _setAll('cursor', value);
   }
-    
+
   /** Sets the value of "direction" */
   set direction(String value) {
     _setAll('direction', value);
   }
-    
+
   /** Sets the value of "display" */
   set display(String value) {
     _setAll('display', value);
   }
-    
+
   /** Sets the value of "empty-cells" */
   set emptyCells(String value) {
     _setAll('emptyCells', value);
   }
-    
+
   /** Sets the value of "font" */
   set font(String value) {
     _setAll('font', value);
   }
-    
+
   /** Sets the value of "font-family" */
   set fontFamily(String value) {
     _setAll('fontFamily', value);
   }
-    
+
   /** Sets the value of "font-size" */
   set fontSize(String value) {
     _setAll('fontSize', value);
   }
-    
+
   /** Sets the value of "font-style" */
   set fontStyle(String value) {
     _setAll('fontStyle', value);
   }
-    
+
   /** Sets the value of "font-variant" */
   set fontVariant(String value) {
     _setAll('fontVariant', value);
   }
-    
+
   /** Sets the value of "font-weight" */
   set fontWeight(String value) {
     _setAll('fontWeight', value);
   }
-    
+
   /** Sets the value of "height" */
   set height(String value) {
     _setAll('height', value);
   }
-    
+
   /** Sets the value of "left" */
   set left(String value) {
     _setAll('left', value);
   }
-    
+
   /** Sets the value of "letter-spacing" */
   set letterSpacing(String value) {
     _setAll('letterSpacing', value);
   }
-    
+
   /** Sets the value of "line-height" */
   set lineHeight(String value) {
     _setAll('lineHeight', value);
   }
-    
+
   /** Sets the value of "list-style" */
   set listStyle(String value) {
     _setAll('listStyle', value);
   }
-    
+
   /** Sets the value of "list-style-image" */
   set listStyleImage(String value) {
     _setAll('listStyleImage', value);
   }
-    
+
   /** Sets the value of "list-style-position" */
   set listStylePosition(String value) {
     _setAll('listStylePosition', value);
   }
-    
+
   /** Sets the value of "list-style-type" */
   set listStyleType(String value) {
     _setAll('listStyleType', value);
   }
-    
+
   /** Sets the value of "margin" */
   set margin(String value) {
     _setAll('margin', value);
   }
-    
+
   /** Sets the value of "margin-bottom" */
   set marginBottom(String value) {
     _setAll('marginBottom', value);
   }
-    
+
   /** Sets the value of "margin-left" */
   set marginLeft(String value) {
     _setAll('marginLeft', value);
   }
-    
+
   /** Sets the value of "margin-right" */
   set marginRight(String value) {
     _setAll('marginRight', value);
   }
-    
+
   /** Sets the value of "margin-top" */
   set marginTop(String value) {
     _setAll('marginTop', value);
   }
-    
+
   /** Sets the value of "max-height" */
   set maxHeight(String value) {
     _setAll('maxHeight', value);
   }
-    
+
   /** Sets the value of "max-width" */
   set maxWidth(String value) {
     _setAll('maxWidth', value);
   }
-    
+
   /** Sets the value of "min-height" */
   set minHeight(String value) {
     _setAll('minHeight', value);
   }
-    
+
   /** Sets the value of "min-width" */
   set minWidth(String value) {
     _setAll('minWidth', value);
   }
-    
+
   /** Sets the value of "outline" */
   set outline(String value) {
     _setAll('outline', value);
   }
-    
+
   /** Sets the value of "outline-color" */
   set outlineColor(String value) {
     _setAll('outlineColor', value);
   }
-    
+
   /** Sets the value of "outline-style" */
   set outlineStyle(String value) {
     _setAll('outlineStyle', value);
   }
-    
+
   /** Sets the value of "outline-width" */
   set outlineWidth(String value) {
     _setAll('outlineWidth', value);
   }
-    
+
   /** Sets the value of "overflow" */
   set overflow(String value) {
     _setAll('overflow', value);
   }
-    
+
   /** Sets the value of "padding" */
   set padding(String value) {
     _setAll('padding', value);
   }
-    
+
   /** Sets the value of "padding-bottom" */
   set paddingBottom(String value) {
     _setAll('paddingBottom', value);
   }
-    
+
   /** Sets the value of "padding-left" */
   set paddingLeft(String value) {
     _setAll('paddingLeft', value);
   }
-    
+
   /** Sets the value of "padding-right" */
   set paddingRight(String value) {
     _setAll('paddingRight', value);
   }
-    
+
   /** Sets the value of "padding-top" */
   set paddingTop(String value) {
     _setAll('paddingTop', value);
   }
-    
+
   /** Sets the value of "page-break-after" */
   set pageBreakAfter(String value) {
     _setAll('pageBreakAfter', value);
   }
-    
+
   /** Sets the value of "page-break-before" */
   set pageBreakBefore(String value) {
     _setAll('pageBreakBefore', value);
   }
-    
+
   /** Sets the value of "page-break-inside" */
   set pageBreakInside(String value) {
     _setAll('pageBreakInside', value);
   }
-    
+
   /** Sets the value of "position" */
   set position(String value) {
     _setAll('position', value);
   }
-    
+
   /** Sets the value of "quotes" */
   set quotes(String value) {
     _setAll('quotes', value);
   }
-    
+
   /** Sets the value of "right" */
   set right(String value) {
     _setAll('right', value);
   }
-    
+
   /** Sets the value of "table-layout" */
   set tableLayout(String value) {
     _setAll('tableLayout', value);
   }
-    
+
   /** Sets the value of "text-align" */
   set textAlign(String value) {
     _setAll('textAlign', value);
   }
-    
+
   /** Sets the value of "text-decoration" */
   set textDecoration(String value) {
     _setAll('textDecoration', value);
   }
-    
+
   /** Sets the value of "text-indent" */
   set textIndent(String value) {
     _setAll('textIndent', value);
   }
-    
+
   /** Sets the value of "text-transform" */
   set textTransform(String value) {
     _setAll('textTransform', value);
   }
-    
+
   /** Sets the value of "top" */
   set top(String value) {
     _setAll('top', value);
   }
-    
+
   /** Sets the value of "unicode-bidi" */
   set unicodeBidi(String value) {
     _setAll('unicodeBidi', value);
   }
-    
+
   /** Sets the value of "vertical-align" */
   set verticalAlign(String value) {
     _setAll('verticalAlign', value);
   }
-    
+
   /** Sets the value of "visibility" */
   set visibility(String value) {
     _setAll('visibility', value);
   }
-    
+
   /** Sets the value of "white-space" */
   set whiteSpace(String value) {
     _setAll('whiteSpace', value);
   }
-    
+
   /** Sets the value of "width" */
   set width(String value) {
     _setAll('width', value);
   }
-    
+
   /** Sets the value of "word-spacing" */
   set wordSpacing(String value) {
     _setAll('wordSpacing', value);
   }
-    
+
   /** Sets the value of "z-index" */
   set zIndex(String value) {
     _setAll('zIndex', value);
   }
-    
 
   // Important note: CssStyleDeclarationSet does NOT implement every method
   // available in CssStyleDeclaration. Some of the methods don't make so much
@@ -5652,8 +5922,7 @@
   void setProperty(String propertyName, String value, [String priority]);
 
   /** Gets the value of "align-content" */
-  String get alignContent =>
-    getPropertyValue('align-content');
+  String get alignContent => getPropertyValue('align-content');
 
   /** Sets the value of "align-content" */
   set alignContent(String value) {
@@ -5661,8 +5930,7 @@
   }
 
   /** Gets the value of "align-items" */
-  String get alignItems =>
-    getPropertyValue('align-items');
+  String get alignItems => getPropertyValue('align-items');
 
   /** Sets the value of "align-items" */
   set alignItems(String value) {
@@ -5670,8 +5938,7 @@
   }
 
   /** Gets the value of "align-self" */
-  String get alignSelf =>
-    getPropertyValue('align-self');
+  String get alignSelf => getPropertyValue('align-self');
 
   /** Sets the value of "align-self" */
   set alignSelf(String value) {
@@ -5679,8 +5946,7 @@
   }
 
   /** Gets the value of "animation" */
-  String get animation =>
-    getPropertyValue('animation');
+  String get animation => getPropertyValue('animation');
 
   /** Sets the value of "animation" */
   set animation(String value) {
@@ -5688,8 +5954,7 @@
   }
 
   /** Gets the value of "animation-delay" */
-  String get animationDelay =>
-    getPropertyValue('animation-delay');
+  String get animationDelay => getPropertyValue('animation-delay');
 
   /** Sets the value of "animation-delay" */
   set animationDelay(String value) {
@@ -5697,8 +5962,7 @@
   }
 
   /** Gets the value of "animation-direction" */
-  String get animationDirection =>
-    getPropertyValue('animation-direction');
+  String get animationDirection => getPropertyValue('animation-direction');
 
   /** Sets the value of "animation-direction" */
   set animationDirection(String value) {
@@ -5706,8 +5970,7 @@
   }
 
   /** Gets the value of "animation-duration" */
-  String get animationDuration =>
-    getPropertyValue('animation-duration');
+  String get animationDuration => getPropertyValue('animation-duration');
 
   /** Sets the value of "animation-duration" */
   set animationDuration(String value) {
@@ -5715,8 +5978,7 @@
   }
 
   /** Gets the value of "animation-fill-mode" */
-  String get animationFillMode =>
-    getPropertyValue('animation-fill-mode');
+  String get animationFillMode => getPropertyValue('animation-fill-mode');
 
   /** Sets the value of "animation-fill-mode" */
   set animationFillMode(String value) {
@@ -5725,7 +5987,7 @@
 
   /** Gets the value of "animation-iteration-count" */
   String get animationIterationCount =>
-    getPropertyValue('animation-iteration-count');
+      getPropertyValue('animation-iteration-count');
 
   /** Sets the value of "animation-iteration-count" */
   set animationIterationCount(String value) {
@@ -5733,8 +5995,7 @@
   }
 
   /** Gets the value of "animation-name" */
-  String get animationName =>
-    getPropertyValue('animation-name');
+  String get animationName => getPropertyValue('animation-name');
 
   /** Sets the value of "animation-name" */
   set animationName(String value) {
@@ -5742,8 +6003,7 @@
   }
 
   /** Gets the value of "animation-play-state" */
-  String get animationPlayState =>
-    getPropertyValue('animation-play-state');
+  String get animationPlayState => getPropertyValue('animation-play-state');
 
   /** Sets the value of "animation-play-state" */
   set animationPlayState(String value) {
@@ -5752,7 +6012,7 @@
 
   /** Gets the value of "animation-timing-function" */
   String get animationTimingFunction =>
-    getPropertyValue('animation-timing-function');
+      getPropertyValue('animation-timing-function');
 
   /** Sets the value of "animation-timing-function" */
   set animationTimingFunction(String value) {
@@ -5760,8 +6020,7 @@
   }
 
   /** Gets the value of "app-region" */
-  String get appRegion =>
-    getPropertyValue('app-region');
+  String get appRegion => getPropertyValue('app-region');
 
   /** Sets the value of "app-region" */
   set appRegion(String value) {
@@ -5769,8 +6028,7 @@
   }
 
   /** Gets the value of "appearance" */
-  String get appearance =>
-    getPropertyValue('appearance');
+  String get appearance => getPropertyValue('appearance');
 
   /** Sets the value of "appearance" */
   set appearance(String value) {
@@ -5778,8 +6036,7 @@
   }
 
   /** Gets the value of "aspect-ratio" */
-  String get aspectRatio =>
-    getPropertyValue('aspect-ratio');
+  String get aspectRatio => getPropertyValue('aspect-ratio');
 
   /** Sets the value of "aspect-ratio" */
   set aspectRatio(String value) {
@@ -5787,8 +6044,7 @@
   }
 
   /** Gets the value of "backface-visibility" */
-  String get backfaceVisibility =>
-    getPropertyValue('backface-visibility');
+  String get backfaceVisibility => getPropertyValue('backface-visibility');
 
   /** Sets the value of "backface-visibility" */
   set backfaceVisibility(String value) {
@@ -5796,8 +6052,7 @@
   }
 
   /** Gets the value of "background" */
-  String get background =>
-    getPropertyValue('background');
+  String get background => getPropertyValue('background');
 
   /** Sets the value of "background" */
   set background(String value) {
@@ -5805,8 +6060,7 @@
   }
 
   /** Gets the value of "background-attachment" */
-  String get backgroundAttachment =>
-    getPropertyValue('background-attachment');
+  String get backgroundAttachment => getPropertyValue('background-attachment');
 
   /** Sets the value of "background-attachment" */
   set backgroundAttachment(String value) {
@@ -5814,8 +6068,7 @@
   }
 
   /** Gets the value of "background-blend-mode" */
-  String get backgroundBlendMode =>
-    getPropertyValue('background-blend-mode');
+  String get backgroundBlendMode => getPropertyValue('background-blend-mode');
 
   /** Sets the value of "background-blend-mode" */
   set backgroundBlendMode(String value) {
@@ -5823,8 +6076,7 @@
   }
 
   /** Gets the value of "background-clip" */
-  String get backgroundClip =>
-    getPropertyValue('background-clip');
+  String get backgroundClip => getPropertyValue('background-clip');
 
   /** Sets the value of "background-clip" */
   set backgroundClip(String value) {
@@ -5832,8 +6084,7 @@
   }
 
   /** Gets the value of "background-color" */
-  String get backgroundColor =>
-    getPropertyValue('background-color');
+  String get backgroundColor => getPropertyValue('background-color');
 
   /** Sets the value of "background-color" */
   set backgroundColor(String value) {
@@ -5841,8 +6092,7 @@
   }
 
   /** Gets the value of "background-composite" */
-  String get backgroundComposite =>
-    getPropertyValue('background-composite');
+  String get backgroundComposite => getPropertyValue('background-composite');
 
   /** Sets the value of "background-composite" */
   set backgroundComposite(String value) {
@@ -5850,8 +6100,7 @@
   }
 
   /** Gets the value of "background-image" */
-  String get backgroundImage =>
-    getPropertyValue('background-image');
+  String get backgroundImage => getPropertyValue('background-image');
 
   /** Sets the value of "background-image" */
   set backgroundImage(String value) {
@@ -5859,8 +6108,7 @@
   }
 
   /** Gets the value of "background-origin" */
-  String get backgroundOrigin =>
-    getPropertyValue('background-origin');
+  String get backgroundOrigin => getPropertyValue('background-origin');
 
   /** Sets the value of "background-origin" */
   set backgroundOrigin(String value) {
@@ -5868,8 +6116,7 @@
   }
 
   /** Gets the value of "background-position" */
-  String get backgroundPosition =>
-    getPropertyValue('background-position');
+  String get backgroundPosition => getPropertyValue('background-position');
 
   /** Sets the value of "background-position" */
   set backgroundPosition(String value) {
@@ -5877,8 +6124,7 @@
   }
 
   /** Gets the value of "background-position-x" */
-  String get backgroundPositionX =>
-    getPropertyValue('background-position-x');
+  String get backgroundPositionX => getPropertyValue('background-position-x');
 
   /** Sets the value of "background-position-x" */
   set backgroundPositionX(String value) {
@@ -5886,8 +6132,7 @@
   }
 
   /** Gets the value of "background-position-y" */
-  String get backgroundPositionY =>
-    getPropertyValue('background-position-y');
+  String get backgroundPositionY => getPropertyValue('background-position-y');
 
   /** Sets the value of "background-position-y" */
   set backgroundPositionY(String value) {
@@ -5895,8 +6140,7 @@
   }
 
   /** Gets the value of "background-repeat" */
-  String get backgroundRepeat =>
-    getPropertyValue('background-repeat');
+  String get backgroundRepeat => getPropertyValue('background-repeat');
 
   /** Sets the value of "background-repeat" */
   set backgroundRepeat(String value) {
@@ -5904,8 +6148,7 @@
   }
 
   /** Gets the value of "background-repeat-x" */
-  String get backgroundRepeatX =>
-    getPropertyValue('background-repeat-x');
+  String get backgroundRepeatX => getPropertyValue('background-repeat-x');
 
   /** Sets the value of "background-repeat-x" */
   set backgroundRepeatX(String value) {
@@ -5913,8 +6156,7 @@
   }
 
   /** Gets the value of "background-repeat-y" */
-  String get backgroundRepeatY =>
-    getPropertyValue('background-repeat-y');
+  String get backgroundRepeatY => getPropertyValue('background-repeat-y');
 
   /** Sets the value of "background-repeat-y" */
   set backgroundRepeatY(String value) {
@@ -5922,8 +6164,7 @@
   }
 
   /** Gets the value of "background-size" */
-  String get backgroundSize =>
-    getPropertyValue('background-size');
+  String get backgroundSize => getPropertyValue('background-size');
 
   /** Sets the value of "background-size" */
   set backgroundSize(String value) {
@@ -5931,8 +6172,7 @@
   }
 
   /** Gets the value of "border" */
-  String get border =>
-    getPropertyValue('border');
+  String get border => getPropertyValue('border');
 
   /** Sets the value of "border" */
   set border(String value) {
@@ -5940,8 +6180,7 @@
   }
 
   /** Gets the value of "border-after" */
-  String get borderAfter =>
-    getPropertyValue('border-after');
+  String get borderAfter => getPropertyValue('border-after');
 
   /** Sets the value of "border-after" */
   set borderAfter(String value) {
@@ -5949,8 +6188,7 @@
   }
 
   /** Gets the value of "border-after-color" */
-  String get borderAfterColor =>
-    getPropertyValue('border-after-color');
+  String get borderAfterColor => getPropertyValue('border-after-color');
 
   /** Sets the value of "border-after-color" */
   set borderAfterColor(String value) {
@@ -5958,8 +6196,7 @@
   }
 
   /** Gets the value of "border-after-style" */
-  String get borderAfterStyle =>
-    getPropertyValue('border-after-style');
+  String get borderAfterStyle => getPropertyValue('border-after-style');
 
   /** Sets the value of "border-after-style" */
   set borderAfterStyle(String value) {
@@ -5967,8 +6204,7 @@
   }
 
   /** Gets the value of "border-after-width" */
-  String get borderAfterWidth =>
-    getPropertyValue('border-after-width');
+  String get borderAfterWidth => getPropertyValue('border-after-width');
 
   /** Sets the value of "border-after-width" */
   set borderAfterWidth(String value) {
@@ -5976,8 +6212,7 @@
   }
 
   /** Gets the value of "border-before" */
-  String get borderBefore =>
-    getPropertyValue('border-before');
+  String get borderBefore => getPropertyValue('border-before');
 
   /** Sets the value of "border-before" */
   set borderBefore(String value) {
@@ -5985,8 +6220,7 @@
   }
 
   /** Gets the value of "border-before-color" */
-  String get borderBeforeColor =>
-    getPropertyValue('border-before-color');
+  String get borderBeforeColor => getPropertyValue('border-before-color');
 
   /** Sets the value of "border-before-color" */
   set borderBeforeColor(String value) {
@@ -5994,8 +6228,7 @@
   }
 
   /** Gets the value of "border-before-style" */
-  String get borderBeforeStyle =>
-    getPropertyValue('border-before-style');
+  String get borderBeforeStyle => getPropertyValue('border-before-style');
 
   /** Sets the value of "border-before-style" */
   set borderBeforeStyle(String value) {
@@ -6003,8 +6236,7 @@
   }
 
   /** Gets the value of "border-before-width" */
-  String get borderBeforeWidth =>
-    getPropertyValue('border-before-width');
+  String get borderBeforeWidth => getPropertyValue('border-before-width');
 
   /** Sets the value of "border-before-width" */
   set borderBeforeWidth(String value) {
@@ -6012,8 +6244,7 @@
   }
 
   /** Gets the value of "border-bottom" */
-  String get borderBottom =>
-    getPropertyValue('border-bottom');
+  String get borderBottom => getPropertyValue('border-bottom');
 
   /** Sets the value of "border-bottom" */
   set borderBottom(String value) {
@@ -6021,8 +6252,7 @@
   }
 
   /** Gets the value of "border-bottom-color" */
-  String get borderBottomColor =>
-    getPropertyValue('border-bottom-color');
+  String get borderBottomColor => getPropertyValue('border-bottom-color');
 
   /** Sets the value of "border-bottom-color" */
   set borderBottomColor(String value) {
@@ -6031,7 +6261,7 @@
 
   /** Gets the value of "border-bottom-left-radius" */
   String get borderBottomLeftRadius =>
-    getPropertyValue('border-bottom-left-radius');
+      getPropertyValue('border-bottom-left-radius');
 
   /** Sets the value of "border-bottom-left-radius" */
   set borderBottomLeftRadius(String value) {
@@ -6040,7 +6270,7 @@
 
   /** Gets the value of "border-bottom-right-radius" */
   String get borderBottomRightRadius =>
-    getPropertyValue('border-bottom-right-radius');
+      getPropertyValue('border-bottom-right-radius');
 
   /** Sets the value of "border-bottom-right-radius" */
   set borderBottomRightRadius(String value) {
@@ -6048,8 +6278,7 @@
   }
 
   /** Gets the value of "border-bottom-style" */
-  String get borderBottomStyle =>
-    getPropertyValue('border-bottom-style');
+  String get borderBottomStyle => getPropertyValue('border-bottom-style');
 
   /** Sets the value of "border-bottom-style" */
   set borderBottomStyle(String value) {
@@ -6057,8 +6286,7 @@
   }
 
   /** Gets the value of "border-bottom-width" */
-  String get borderBottomWidth =>
-    getPropertyValue('border-bottom-width');
+  String get borderBottomWidth => getPropertyValue('border-bottom-width');
 
   /** Sets the value of "border-bottom-width" */
   set borderBottomWidth(String value) {
@@ -6066,8 +6294,7 @@
   }
 
   /** Gets the value of "border-collapse" */
-  String get borderCollapse =>
-    getPropertyValue('border-collapse');
+  String get borderCollapse => getPropertyValue('border-collapse');
 
   /** Sets the value of "border-collapse" */
   set borderCollapse(String value) {
@@ -6075,8 +6302,7 @@
   }
 
   /** Gets the value of "border-color" */
-  String get borderColor =>
-    getPropertyValue('border-color');
+  String get borderColor => getPropertyValue('border-color');
 
   /** Sets the value of "border-color" */
   set borderColor(String value) {
@@ -6084,8 +6310,7 @@
   }
 
   /** Gets the value of "border-end" */
-  String get borderEnd =>
-    getPropertyValue('border-end');
+  String get borderEnd => getPropertyValue('border-end');
 
   /** Sets the value of "border-end" */
   set borderEnd(String value) {
@@ -6093,8 +6318,7 @@
   }
 
   /** Gets the value of "border-end-color" */
-  String get borderEndColor =>
-    getPropertyValue('border-end-color');
+  String get borderEndColor => getPropertyValue('border-end-color');
 
   /** Sets the value of "border-end-color" */
   set borderEndColor(String value) {
@@ -6102,8 +6326,7 @@
   }
 
   /** Gets the value of "border-end-style" */
-  String get borderEndStyle =>
-    getPropertyValue('border-end-style');
+  String get borderEndStyle => getPropertyValue('border-end-style');
 
   /** Sets the value of "border-end-style" */
   set borderEndStyle(String value) {
@@ -6111,8 +6334,7 @@
   }
 
   /** Gets the value of "border-end-width" */
-  String get borderEndWidth =>
-    getPropertyValue('border-end-width');
+  String get borderEndWidth => getPropertyValue('border-end-width');
 
   /** Sets the value of "border-end-width" */
   set borderEndWidth(String value) {
@@ -6120,8 +6342,7 @@
   }
 
   /** Gets the value of "border-fit" */
-  String get borderFit =>
-    getPropertyValue('border-fit');
+  String get borderFit => getPropertyValue('border-fit');
 
   /** Sets the value of "border-fit" */
   set borderFit(String value) {
@@ -6130,7 +6351,7 @@
 
   /** Gets the value of "border-horizontal-spacing" */
   String get borderHorizontalSpacing =>
-    getPropertyValue('border-horizontal-spacing');
+      getPropertyValue('border-horizontal-spacing');
 
   /** Sets the value of "border-horizontal-spacing" */
   set borderHorizontalSpacing(String value) {
@@ -6138,8 +6359,7 @@
   }
 
   /** Gets the value of "border-image" */
-  String get borderImage =>
-    getPropertyValue('border-image');
+  String get borderImage => getPropertyValue('border-image');
 
   /** Sets the value of "border-image" */
   set borderImage(String value) {
@@ -6147,8 +6367,7 @@
   }
 
   /** Gets the value of "border-image-outset" */
-  String get borderImageOutset =>
-    getPropertyValue('border-image-outset');
+  String get borderImageOutset => getPropertyValue('border-image-outset');
 
   /** Sets the value of "border-image-outset" */
   set borderImageOutset(String value) {
@@ -6156,8 +6375,7 @@
   }
 
   /** Gets the value of "border-image-repeat" */
-  String get borderImageRepeat =>
-    getPropertyValue('border-image-repeat');
+  String get borderImageRepeat => getPropertyValue('border-image-repeat');
 
   /** Sets the value of "border-image-repeat" */
   set borderImageRepeat(String value) {
@@ -6165,8 +6383,7 @@
   }
 
   /** Gets the value of "border-image-slice" */
-  String get borderImageSlice =>
-    getPropertyValue('border-image-slice');
+  String get borderImageSlice => getPropertyValue('border-image-slice');
 
   /** Sets the value of "border-image-slice" */
   set borderImageSlice(String value) {
@@ -6174,8 +6391,7 @@
   }
 
   /** Gets the value of "border-image-source" */
-  String get borderImageSource =>
-    getPropertyValue('border-image-source');
+  String get borderImageSource => getPropertyValue('border-image-source');
 
   /** Sets the value of "border-image-source" */
   set borderImageSource(String value) {
@@ -6183,8 +6399,7 @@
   }
 
   /** Gets the value of "border-image-width" */
-  String get borderImageWidth =>
-    getPropertyValue('border-image-width');
+  String get borderImageWidth => getPropertyValue('border-image-width');
 
   /** Sets the value of "border-image-width" */
   set borderImageWidth(String value) {
@@ -6192,8 +6407,7 @@
   }
 
   /** Gets the value of "border-left" */
-  String get borderLeft =>
-    getPropertyValue('border-left');
+  String get borderLeft => getPropertyValue('border-left');
 
   /** Sets the value of "border-left" */
   set borderLeft(String value) {
@@ -6201,8 +6415,7 @@
   }
 
   /** Gets the value of "border-left-color" */
-  String get borderLeftColor =>
-    getPropertyValue('border-left-color');
+  String get borderLeftColor => getPropertyValue('border-left-color');
 
   /** Sets the value of "border-left-color" */
   set borderLeftColor(String value) {
@@ -6210,8 +6423,7 @@
   }
 
   /** Gets the value of "border-left-style" */
-  String get borderLeftStyle =>
-    getPropertyValue('border-left-style');
+  String get borderLeftStyle => getPropertyValue('border-left-style');
 
   /** Sets the value of "border-left-style" */
   set borderLeftStyle(String value) {
@@ -6219,8 +6431,7 @@
   }
 
   /** Gets the value of "border-left-width" */
-  String get borderLeftWidth =>
-    getPropertyValue('border-left-width');
+  String get borderLeftWidth => getPropertyValue('border-left-width');
 
   /** Sets the value of "border-left-width" */
   set borderLeftWidth(String value) {
@@ -6228,8 +6439,7 @@
   }
 
   /** Gets the value of "border-radius" */
-  String get borderRadius =>
-    getPropertyValue('border-radius');
+  String get borderRadius => getPropertyValue('border-radius');
 
   /** Sets the value of "border-radius" */
   set borderRadius(String value) {
@@ -6237,8 +6447,7 @@
   }
 
   /** Gets the value of "border-right" */
-  String get borderRight =>
-    getPropertyValue('border-right');
+  String get borderRight => getPropertyValue('border-right');
 
   /** Sets the value of "border-right" */
   set borderRight(String value) {
@@ -6246,8 +6455,7 @@
   }
 
   /** Gets the value of "border-right-color" */
-  String get borderRightColor =>
-    getPropertyValue('border-right-color');
+  String get borderRightColor => getPropertyValue('border-right-color');
 
   /** Sets the value of "border-right-color" */
   set borderRightColor(String value) {
@@ -6255,8 +6463,7 @@
   }
 
   /** Gets the value of "border-right-style" */
-  String get borderRightStyle =>
-    getPropertyValue('border-right-style');
+  String get borderRightStyle => getPropertyValue('border-right-style');
 
   /** Sets the value of "border-right-style" */
   set borderRightStyle(String value) {
@@ -6264,8 +6471,7 @@
   }
 
   /** Gets the value of "border-right-width" */
-  String get borderRightWidth =>
-    getPropertyValue('border-right-width');
+  String get borderRightWidth => getPropertyValue('border-right-width');
 
   /** Sets the value of "border-right-width" */
   set borderRightWidth(String value) {
@@ -6273,8 +6479,7 @@
   }
 
   /** Gets the value of "border-spacing" */
-  String get borderSpacing =>
-    getPropertyValue('border-spacing');
+  String get borderSpacing => getPropertyValue('border-spacing');
 
   /** Sets the value of "border-spacing" */
   set borderSpacing(String value) {
@@ -6282,8 +6487,7 @@
   }
 
   /** Gets the value of "border-start" */
-  String get borderStart =>
-    getPropertyValue('border-start');
+  String get borderStart => getPropertyValue('border-start');
 
   /** Sets the value of "border-start" */
   set borderStart(String value) {
@@ -6291,8 +6495,7 @@
   }
 
   /** Gets the value of "border-start-color" */
-  String get borderStartColor =>
-    getPropertyValue('border-start-color');
+  String get borderStartColor => getPropertyValue('border-start-color');
 
   /** Sets the value of "border-start-color" */
   set borderStartColor(String value) {
@@ -6300,8 +6503,7 @@
   }
 
   /** Gets the value of "border-start-style" */
-  String get borderStartStyle =>
-    getPropertyValue('border-start-style');
+  String get borderStartStyle => getPropertyValue('border-start-style');
 
   /** Sets the value of "border-start-style" */
   set borderStartStyle(String value) {
@@ -6309,8 +6511,7 @@
   }
 
   /** Gets the value of "border-start-width" */
-  String get borderStartWidth =>
-    getPropertyValue('border-start-width');
+  String get borderStartWidth => getPropertyValue('border-start-width');
 
   /** Sets the value of "border-start-width" */
   set borderStartWidth(String value) {
@@ -6318,8 +6519,7 @@
   }
 
   /** Gets the value of "border-style" */
-  String get borderStyle =>
-    getPropertyValue('border-style');
+  String get borderStyle => getPropertyValue('border-style');
 
   /** Sets the value of "border-style" */
   set borderStyle(String value) {
@@ -6327,8 +6527,7 @@
   }
 
   /** Gets the value of "border-top" */
-  String get borderTop =>
-    getPropertyValue('border-top');
+  String get borderTop => getPropertyValue('border-top');
 
   /** Sets the value of "border-top" */
   set borderTop(String value) {
@@ -6336,8 +6535,7 @@
   }
 
   /** Gets the value of "border-top-color" */
-  String get borderTopColor =>
-    getPropertyValue('border-top-color');
+  String get borderTopColor => getPropertyValue('border-top-color');
 
   /** Sets the value of "border-top-color" */
   set borderTopColor(String value) {
@@ -6345,8 +6543,7 @@
   }
 
   /** Gets the value of "border-top-left-radius" */
-  String get borderTopLeftRadius =>
-    getPropertyValue('border-top-left-radius');
+  String get borderTopLeftRadius => getPropertyValue('border-top-left-radius');
 
   /** Sets the value of "border-top-left-radius" */
   set borderTopLeftRadius(String value) {
@@ -6355,7 +6552,7 @@
 
   /** Gets the value of "border-top-right-radius" */
   String get borderTopRightRadius =>
-    getPropertyValue('border-top-right-radius');
+      getPropertyValue('border-top-right-radius');
 
   /** Sets the value of "border-top-right-radius" */
   set borderTopRightRadius(String value) {
@@ -6363,8 +6560,7 @@
   }
 
   /** Gets the value of "border-top-style" */
-  String get borderTopStyle =>
-    getPropertyValue('border-top-style');
+  String get borderTopStyle => getPropertyValue('border-top-style');
 
   /** Sets the value of "border-top-style" */
   set borderTopStyle(String value) {
@@ -6372,8 +6568,7 @@
   }
 
   /** Gets the value of "border-top-width" */
-  String get borderTopWidth =>
-    getPropertyValue('border-top-width');
+  String get borderTopWidth => getPropertyValue('border-top-width');
 
   /** Sets the value of "border-top-width" */
   set borderTopWidth(String value) {
@@ -6382,7 +6577,7 @@
 
   /** Gets the value of "border-vertical-spacing" */
   String get borderVerticalSpacing =>
-    getPropertyValue('border-vertical-spacing');
+      getPropertyValue('border-vertical-spacing');
 
   /** Sets the value of "border-vertical-spacing" */
   set borderVerticalSpacing(String value) {
@@ -6390,8 +6585,7 @@
   }
 
   /** Gets the value of "border-width" */
-  String get borderWidth =>
-    getPropertyValue('border-width');
+  String get borderWidth => getPropertyValue('border-width');
 
   /** Sets the value of "border-width" */
   set borderWidth(String value) {
@@ -6399,8 +6593,7 @@
   }
 
   /** Gets the value of "bottom" */
-  String get bottom =>
-    getPropertyValue('bottom');
+  String get bottom => getPropertyValue('bottom');
 
   /** Sets the value of "bottom" */
   set bottom(String value) {
@@ -6408,8 +6601,7 @@
   }
 
   /** Gets the value of "box-align" */
-  String get boxAlign =>
-    getPropertyValue('box-align');
+  String get boxAlign => getPropertyValue('box-align');
 
   /** Sets the value of "box-align" */
   set boxAlign(String value) {
@@ -6417,8 +6609,7 @@
   }
 
   /** Gets the value of "box-decoration-break" */
-  String get boxDecorationBreak =>
-    getPropertyValue('box-decoration-break');
+  String get boxDecorationBreak => getPropertyValue('box-decoration-break');
 
   /** Sets the value of "box-decoration-break" */
   set boxDecorationBreak(String value) {
@@ -6426,8 +6617,7 @@
   }
 
   /** Gets the value of "box-direction" */
-  String get boxDirection =>
-    getPropertyValue('box-direction');
+  String get boxDirection => getPropertyValue('box-direction');
 
   /** Sets the value of "box-direction" */
   set boxDirection(String value) {
@@ -6435,8 +6625,7 @@
   }
 
   /** Gets the value of "box-flex" */
-  String get boxFlex =>
-    getPropertyValue('box-flex');
+  String get boxFlex => getPropertyValue('box-flex');
 
   /** Sets the value of "box-flex" */
   set boxFlex(String value) {
@@ -6444,8 +6633,7 @@
   }
 
   /** Gets the value of "box-flex-group" */
-  String get boxFlexGroup =>
-    getPropertyValue('box-flex-group');
+  String get boxFlexGroup => getPropertyValue('box-flex-group');
 
   /** Sets the value of "box-flex-group" */
   set boxFlexGroup(String value) {
@@ -6453,8 +6641,7 @@
   }
 
   /** Gets the value of "box-lines" */
-  String get boxLines =>
-    getPropertyValue('box-lines');
+  String get boxLines => getPropertyValue('box-lines');
 
   /** Sets the value of "box-lines" */
   set boxLines(String value) {
@@ -6462,8 +6649,7 @@
   }
 
   /** Gets the value of "box-ordinal-group" */
-  String get boxOrdinalGroup =>
-    getPropertyValue('box-ordinal-group');
+  String get boxOrdinalGroup => getPropertyValue('box-ordinal-group');
 
   /** Sets the value of "box-ordinal-group" */
   set boxOrdinalGroup(String value) {
@@ -6471,8 +6657,7 @@
   }
 
   /** Gets the value of "box-orient" */
-  String get boxOrient =>
-    getPropertyValue('box-orient');
+  String get boxOrient => getPropertyValue('box-orient');
 
   /** Sets the value of "box-orient" */
   set boxOrient(String value) {
@@ -6480,8 +6665,7 @@
   }
 
   /** Gets the value of "box-pack" */
-  String get boxPack =>
-    getPropertyValue('box-pack');
+  String get boxPack => getPropertyValue('box-pack');
 
   /** Sets the value of "box-pack" */
   set boxPack(String value) {
@@ -6489,8 +6673,7 @@
   }
 
   /** Gets the value of "box-reflect" */
-  String get boxReflect =>
-    getPropertyValue('box-reflect');
+  String get boxReflect => getPropertyValue('box-reflect');
 
   /** Sets the value of "box-reflect" */
   set boxReflect(String value) {
@@ -6498,8 +6681,7 @@
   }
 
   /** Gets the value of "box-shadow" */
-  String get boxShadow =>
-    getPropertyValue('box-shadow');
+  String get boxShadow => getPropertyValue('box-shadow');
 
   /** Sets the value of "box-shadow" */
   set boxShadow(String value) {
@@ -6507,8 +6689,7 @@
   }
 
   /** Gets the value of "box-sizing" */
-  String get boxSizing =>
-    getPropertyValue('box-sizing');
+  String get boxSizing => getPropertyValue('box-sizing');
 
   /** Sets the value of "box-sizing" */
   set boxSizing(String value) {
@@ -6516,8 +6697,7 @@
   }
 
   /** Gets the value of "caption-side" */
-  String get captionSide =>
-    getPropertyValue('caption-side');
+  String get captionSide => getPropertyValue('caption-side');
 
   /** Sets the value of "caption-side" */
   set captionSide(String value) {
@@ -6525,8 +6705,7 @@
   }
 
   /** Gets the value of "clear" */
-  String get clear =>
-    getPropertyValue('clear');
+  String get clear => getPropertyValue('clear');
 
   /** Sets the value of "clear" */
   set clear(String value) {
@@ -6534,8 +6713,7 @@
   }
 
   /** Gets the value of "clip" */
-  String get clip =>
-    getPropertyValue('clip');
+  String get clip => getPropertyValue('clip');
 
   /** Sets the value of "clip" */
   set clip(String value) {
@@ -6543,8 +6721,7 @@
   }
 
   /** Gets the value of "clip-path" */
-  String get clipPath =>
-    getPropertyValue('clip-path');
+  String get clipPath => getPropertyValue('clip-path');
 
   /** Sets the value of "clip-path" */
   set clipPath(String value) {
@@ -6552,8 +6729,7 @@
   }
 
   /** Gets the value of "color" */
-  String get color =>
-    getPropertyValue('color');
+  String get color => getPropertyValue('color');
 
   /** Sets the value of "color" */
   set color(String value) {
@@ -6561,8 +6737,7 @@
   }
 
   /** Gets the value of "column-break-after" */
-  String get columnBreakAfter =>
-    getPropertyValue('column-break-after');
+  String get columnBreakAfter => getPropertyValue('column-break-after');
 
   /** Sets the value of "column-break-after" */
   set columnBreakAfter(String value) {
@@ -6570,8 +6745,7 @@
   }
 
   /** Gets the value of "column-break-before" */
-  String get columnBreakBefore =>
-    getPropertyValue('column-break-before');
+  String get columnBreakBefore => getPropertyValue('column-break-before');
 
   /** Sets the value of "column-break-before" */
   set columnBreakBefore(String value) {
@@ -6579,8 +6753,7 @@
   }
 
   /** Gets the value of "column-break-inside" */
-  String get columnBreakInside =>
-    getPropertyValue('column-break-inside');
+  String get columnBreakInside => getPropertyValue('column-break-inside');
 
   /** Sets the value of "column-break-inside" */
   set columnBreakInside(String value) {
@@ -6588,8 +6761,7 @@
   }
 
   /** Gets the value of "column-count" */
-  String get columnCount =>
-    getPropertyValue('column-count');
+  String get columnCount => getPropertyValue('column-count');
 
   /** Sets the value of "column-count" */
   set columnCount(String value) {
@@ -6597,8 +6769,7 @@
   }
 
   /** Gets the value of "column-fill" */
-  String get columnFill =>
-    getPropertyValue('column-fill');
+  String get columnFill => getPropertyValue('column-fill');
 
   /** Sets the value of "column-fill" */
   set columnFill(String value) {
@@ -6606,8 +6777,7 @@
   }
 
   /** Gets the value of "column-gap" */
-  String get columnGap =>
-    getPropertyValue('column-gap');
+  String get columnGap => getPropertyValue('column-gap');
 
   /** Sets the value of "column-gap" */
   set columnGap(String value) {
@@ -6615,8 +6785,7 @@
   }
 
   /** Gets the value of "column-rule" */
-  String get columnRule =>
-    getPropertyValue('column-rule');
+  String get columnRule => getPropertyValue('column-rule');
 
   /** Sets the value of "column-rule" */
   set columnRule(String value) {
@@ -6624,8 +6793,7 @@
   }
 
   /** Gets the value of "column-rule-color" */
-  String get columnRuleColor =>
-    getPropertyValue('column-rule-color');
+  String get columnRuleColor => getPropertyValue('column-rule-color');
 
   /** Sets the value of "column-rule-color" */
   set columnRuleColor(String value) {
@@ -6633,8 +6801,7 @@
   }
 
   /** Gets the value of "column-rule-style" */
-  String get columnRuleStyle =>
-    getPropertyValue('column-rule-style');
+  String get columnRuleStyle => getPropertyValue('column-rule-style');
 
   /** Sets the value of "column-rule-style" */
   set columnRuleStyle(String value) {
@@ -6642,8 +6809,7 @@
   }
 
   /** Gets the value of "column-rule-width" */
-  String get columnRuleWidth =>
-    getPropertyValue('column-rule-width');
+  String get columnRuleWidth => getPropertyValue('column-rule-width');
 
   /** Sets the value of "column-rule-width" */
   set columnRuleWidth(String value) {
@@ -6651,8 +6817,7 @@
   }
 
   /** Gets the value of "column-span" */
-  String get columnSpan =>
-    getPropertyValue('column-span');
+  String get columnSpan => getPropertyValue('column-span');
 
   /** Sets the value of "column-span" */
   set columnSpan(String value) {
@@ -6660,8 +6825,7 @@
   }
 
   /** Gets the value of "column-width" */
-  String get columnWidth =>
-    getPropertyValue('column-width');
+  String get columnWidth => getPropertyValue('column-width');
 
   /** Sets the value of "column-width" */
   set columnWidth(String value) {
@@ -6669,8 +6833,7 @@
   }
 
   /** Gets the value of "columns" */
-  String get columns =>
-    getPropertyValue('columns');
+  String get columns => getPropertyValue('columns');
 
   /** Sets the value of "columns" */
   set columns(String value) {
@@ -6678,8 +6841,7 @@
   }
 
   /** Gets the value of "content" */
-  String get content =>
-    getPropertyValue('content');
+  String get content => getPropertyValue('content');
 
   /** Sets the value of "content" */
   set content(String value) {
@@ -6687,8 +6849,7 @@
   }
 
   /** Gets the value of "counter-increment" */
-  String get counterIncrement =>
-    getPropertyValue('counter-increment');
+  String get counterIncrement => getPropertyValue('counter-increment');
 
   /** Sets the value of "counter-increment" */
   set counterIncrement(String value) {
@@ -6696,8 +6857,7 @@
   }
 
   /** Gets the value of "counter-reset" */
-  String get counterReset =>
-    getPropertyValue('counter-reset');
+  String get counterReset => getPropertyValue('counter-reset');
 
   /** Sets the value of "counter-reset" */
   set counterReset(String value) {
@@ -6705,8 +6865,7 @@
   }
 
   /** Gets the value of "cursor" */
-  String get cursor =>
-    getPropertyValue('cursor');
+  String get cursor => getPropertyValue('cursor');
 
   /** Sets the value of "cursor" */
   set cursor(String value) {
@@ -6714,8 +6873,7 @@
   }
 
   /** Gets the value of "direction" */
-  String get direction =>
-    getPropertyValue('direction');
+  String get direction => getPropertyValue('direction');
 
   /** Sets the value of "direction" */
   set direction(String value) {
@@ -6723,8 +6881,7 @@
   }
 
   /** Gets the value of "display" */
-  String get display =>
-    getPropertyValue('display');
+  String get display => getPropertyValue('display');
 
   /** Sets the value of "display" */
   set display(String value) {
@@ -6732,8 +6889,7 @@
   }
 
   /** Gets the value of "empty-cells" */
-  String get emptyCells =>
-    getPropertyValue('empty-cells');
+  String get emptyCells => getPropertyValue('empty-cells');
 
   /** Sets the value of "empty-cells" */
   set emptyCells(String value) {
@@ -6741,8 +6897,7 @@
   }
 
   /** Gets the value of "filter" */
-  String get filter =>
-    getPropertyValue('filter');
+  String get filter => getPropertyValue('filter');
 
   /** Sets the value of "filter" */
   set filter(String value) {
@@ -6750,8 +6905,7 @@
   }
 
   /** Gets the value of "flex" */
-  String get flex =>
-    getPropertyValue('flex');
+  String get flex => getPropertyValue('flex');
 
   /** Sets the value of "flex" */
   set flex(String value) {
@@ -6759,8 +6913,7 @@
   }
 
   /** Gets the value of "flex-basis" */
-  String get flexBasis =>
-    getPropertyValue('flex-basis');
+  String get flexBasis => getPropertyValue('flex-basis');
 
   /** Sets the value of "flex-basis" */
   set flexBasis(String value) {
@@ -6768,8 +6921,7 @@
   }
 
   /** Gets the value of "flex-direction" */
-  String get flexDirection =>
-    getPropertyValue('flex-direction');
+  String get flexDirection => getPropertyValue('flex-direction');
 
   /** Sets the value of "flex-direction" */
   set flexDirection(String value) {
@@ -6777,8 +6929,7 @@
   }
 
   /** Gets the value of "flex-flow" */
-  String get flexFlow =>
-    getPropertyValue('flex-flow');
+  String get flexFlow => getPropertyValue('flex-flow');
 
   /** Sets the value of "flex-flow" */
   set flexFlow(String value) {
@@ -6786,8 +6937,7 @@
   }
 
   /** Gets the value of "flex-grow" */
-  String get flexGrow =>
-    getPropertyValue('flex-grow');
+  String get flexGrow => getPropertyValue('flex-grow');
 
   /** Sets the value of "flex-grow" */
   set flexGrow(String value) {
@@ -6795,8 +6945,7 @@
   }
 
   /** Gets the value of "flex-shrink" */
-  String get flexShrink =>
-    getPropertyValue('flex-shrink');
+  String get flexShrink => getPropertyValue('flex-shrink');
 
   /** Sets the value of "flex-shrink" */
   set flexShrink(String value) {
@@ -6804,8 +6953,7 @@
   }
 
   /** Gets the value of "flex-wrap" */
-  String get flexWrap =>
-    getPropertyValue('flex-wrap');
+  String get flexWrap => getPropertyValue('flex-wrap');
 
   /** Sets the value of "flex-wrap" */
   set flexWrap(String value) {
@@ -6813,8 +6961,7 @@
   }
 
   /** Gets the value of "float" */
-  String get float =>
-    getPropertyValue('float');
+  String get float => getPropertyValue('float');
 
   /** Sets the value of "float" */
   set float(String value) {
@@ -6822,8 +6969,7 @@
   }
 
   /** Gets the value of "font" */
-  String get font =>
-    getPropertyValue('font');
+  String get font => getPropertyValue('font');
 
   /** Sets the value of "font" */
   set font(String value) {
@@ -6831,8 +6977,7 @@
   }
 
   /** Gets the value of "font-family" */
-  String get fontFamily =>
-    getPropertyValue('font-family');
+  String get fontFamily => getPropertyValue('font-family');
 
   /** Sets the value of "font-family" */
   set fontFamily(String value) {
@@ -6840,8 +6985,7 @@
   }
 
   /** Gets the value of "font-feature-settings" */
-  String get fontFeatureSettings =>
-    getPropertyValue('font-feature-settings');
+  String get fontFeatureSettings => getPropertyValue('font-feature-settings');
 
   /** Sets the value of "font-feature-settings" */
   set fontFeatureSettings(String value) {
@@ -6849,8 +6993,7 @@
   }
 
   /** Gets the value of "font-kerning" */
-  String get fontKerning =>
-    getPropertyValue('font-kerning');
+  String get fontKerning => getPropertyValue('font-kerning');
 
   /** Sets the value of "font-kerning" */
   set fontKerning(String value) {
@@ -6858,8 +7001,7 @@
   }
 
   /** Gets the value of "font-size" */
-  String get fontSize =>
-    getPropertyValue('font-size');
+  String get fontSize => getPropertyValue('font-size');
 
   /** Sets the value of "font-size" */
   set fontSize(String value) {
@@ -6867,8 +7009,7 @@
   }
 
   /** Gets the value of "font-size-delta" */
-  String get fontSizeDelta =>
-    getPropertyValue('font-size-delta');
+  String get fontSizeDelta => getPropertyValue('font-size-delta');
 
   /** Sets the value of "font-size-delta" */
   set fontSizeDelta(String value) {
@@ -6876,8 +7017,7 @@
   }
 
   /** Gets the value of "font-smoothing" */
-  String get fontSmoothing =>
-    getPropertyValue('font-smoothing');
+  String get fontSmoothing => getPropertyValue('font-smoothing');
 
   /** Sets the value of "font-smoothing" */
   set fontSmoothing(String value) {
@@ -6885,8 +7025,7 @@
   }
 
   /** Gets the value of "font-stretch" */
-  String get fontStretch =>
-    getPropertyValue('font-stretch');
+  String get fontStretch => getPropertyValue('font-stretch');
 
   /** Sets the value of "font-stretch" */
   set fontStretch(String value) {
@@ -6894,8 +7033,7 @@
   }
 
   /** Gets the value of "font-style" */
-  String get fontStyle =>
-    getPropertyValue('font-style');
+  String get fontStyle => getPropertyValue('font-style');
 
   /** Sets the value of "font-style" */
   set fontStyle(String value) {
@@ -6903,8 +7041,7 @@
   }
 
   /** Gets the value of "font-variant" */
-  String get fontVariant =>
-    getPropertyValue('font-variant');
+  String get fontVariant => getPropertyValue('font-variant');
 
   /** Sets the value of "font-variant" */
   set fontVariant(String value) {
@@ -6912,8 +7049,7 @@
   }
 
   /** Gets the value of "font-variant-ligatures" */
-  String get fontVariantLigatures =>
-    getPropertyValue('font-variant-ligatures');
+  String get fontVariantLigatures => getPropertyValue('font-variant-ligatures');
 
   /** Sets the value of "font-variant-ligatures" */
   set fontVariantLigatures(String value) {
@@ -6921,8 +7057,7 @@
   }
 
   /** Gets the value of "font-weight" */
-  String get fontWeight =>
-    getPropertyValue('font-weight');
+  String get fontWeight => getPropertyValue('font-weight');
 
   /** Sets the value of "font-weight" */
   set fontWeight(String value) {
@@ -6930,8 +7065,7 @@
   }
 
   /** Gets the value of "grid" */
-  String get grid =>
-    getPropertyValue('grid');
+  String get grid => getPropertyValue('grid');
 
   /** Sets the value of "grid" */
   set grid(String value) {
@@ -6939,8 +7073,7 @@
   }
 
   /** Gets the value of "grid-area" */
-  String get gridArea =>
-    getPropertyValue('grid-area');
+  String get gridArea => getPropertyValue('grid-area');
 
   /** Sets the value of "grid-area" */
   set gridArea(String value) {
@@ -6948,8 +7081,7 @@
   }
 
   /** Gets the value of "grid-auto-columns" */
-  String get gridAutoColumns =>
-    getPropertyValue('grid-auto-columns');
+  String get gridAutoColumns => getPropertyValue('grid-auto-columns');
 
   /** Sets the value of "grid-auto-columns" */
   set gridAutoColumns(String value) {
@@ -6957,8 +7089,7 @@
   }
 
   /** Gets the value of "grid-auto-flow" */
-  String get gridAutoFlow =>
-    getPropertyValue('grid-auto-flow');
+  String get gridAutoFlow => getPropertyValue('grid-auto-flow');
 
   /** Sets the value of "grid-auto-flow" */
   set gridAutoFlow(String value) {
@@ -6966,8 +7097,7 @@
   }
 
   /** Gets the value of "grid-auto-rows" */
-  String get gridAutoRows =>
-    getPropertyValue('grid-auto-rows');
+  String get gridAutoRows => getPropertyValue('grid-auto-rows');
 
   /** Sets the value of "grid-auto-rows" */
   set gridAutoRows(String value) {
@@ -6975,8 +7105,7 @@
   }
 
   /** Gets the value of "grid-column" */
-  String get gridColumn =>
-    getPropertyValue('grid-column');
+  String get gridColumn => getPropertyValue('grid-column');
 
   /** Sets the value of "grid-column" */
   set gridColumn(String value) {
@@ -6984,8 +7113,7 @@
   }
 
   /** Gets the value of "grid-column-end" */
-  String get gridColumnEnd =>
-    getPropertyValue('grid-column-end');
+  String get gridColumnEnd => getPropertyValue('grid-column-end');
 
   /** Sets the value of "grid-column-end" */
   set gridColumnEnd(String value) {
@@ -6993,8 +7121,7 @@
   }
 
   /** Gets the value of "grid-column-start" */
-  String get gridColumnStart =>
-    getPropertyValue('grid-column-start');
+  String get gridColumnStart => getPropertyValue('grid-column-start');
 
   /** Sets the value of "grid-column-start" */
   set gridColumnStart(String value) {
@@ -7002,8 +7129,7 @@
   }
 
   /** Gets the value of "grid-row" */
-  String get gridRow =>
-    getPropertyValue('grid-row');
+  String get gridRow => getPropertyValue('grid-row');
 
   /** Sets the value of "grid-row" */
   set gridRow(String value) {
@@ -7011,8 +7137,7 @@
   }
 
   /** Gets the value of "grid-row-end" */
-  String get gridRowEnd =>
-    getPropertyValue('grid-row-end');
+  String get gridRowEnd => getPropertyValue('grid-row-end');
 
   /** Sets the value of "grid-row-end" */
   set gridRowEnd(String value) {
@@ -7020,8 +7145,7 @@
   }
 
   /** Gets the value of "grid-row-start" */
-  String get gridRowStart =>
-    getPropertyValue('grid-row-start');
+  String get gridRowStart => getPropertyValue('grid-row-start');
 
   /** Sets the value of "grid-row-start" */
   set gridRowStart(String value) {
@@ -7029,8 +7153,7 @@
   }
 
   /** Gets the value of "grid-template" */
-  String get gridTemplate =>
-    getPropertyValue('grid-template');
+  String get gridTemplate => getPropertyValue('grid-template');
 
   /** Sets the value of "grid-template" */
   set gridTemplate(String value) {
@@ -7038,8 +7161,7 @@
   }
 
   /** Gets the value of "grid-template-areas" */
-  String get gridTemplateAreas =>
-    getPropertyValue('grid-template-areas');
+  String get gridTemplateAreas => getPropertyValue('grid-template-areas');
 
   /** Sets the value of "grid-template-areas" */
   set gridTemplateAreas(String value) {
@@ -7047,8 +7169,7 @@
   }
 
   /** Gets the value of "grid-template-columns" */
-  String get gridTemplateColumns =>
-    getPropertyValue('grid-template-columns');
+  String get gridTemplateColumns => getPropertyValue('grid-template-columns');
 
   /** Sets the value of "grid-template-columns" */
   set gridTemplateColumns(String value) {
@@ -7056,8 +7177,7 @@
   }
 
   /** Gets the value of "grid-template-rows" */
-  String get gridTemplateRows =>
-    getPropertyValue('grid-template-rows');
+  String get gridTemplateRows => getPropertyValue('grid-template-rows');
 
   /** Sets the value of "grid-template-rows" */
   set gridTemplateRows(String value) {
@@ -7065,8 +7185,7 @@
   }
 
   /** Gets the value of "height" */
-  String get height =>
-    getPropertyValue('height');
+  String get height => getPropertyValue('height');
 
   /** Sets the value of "height" */
   set height(String value) {
@@ -7074,8 +7193,7 @@
   }
 
   /** Gets the value of "highlight" */
-  String get highlight =>
-    getPropertyValue('highlight');
+  String get highlight => getPropertyValue('highlight');
 
   /** Sets the value of "highlight" */
   set highlight(String value) {
@@ -7083,8 +7201,7 @@
   }
 
   /** Gets the value of "hyphenate-character" */
-  String get hyphenateCharacter =>
-    getPropertyValue('hyphenate-character');
+  String get hyphenateCharacter => getPropertyValue('hyphenate-character');
 
   /** Sets the value of "hyphenate-character" */
   set hyphenateCharacter(String value) {
@@ -7092,8 +7209,7 @@
   }
 
   /** Gets the value of "image-rendering" */
-  String get imageRendering =>
-    getPropertyValue('image-rendering');
+  String get imageRendering => getPropertyValue('image-rendering');
 
   /** Sets the value of "image-rendering" */
   set imageRendering(String value) {
@@ -7101,8 +7217,7 @@
   }
 
   /** Gets the value of "isolation" */
-  String get isolation =>
-    getPropertyValue('isolation');
+  String get isolation => getPropertyValue('isolation');
 
   /** Sets the value of "isolation" */
   set isolation(String value) {
@@ -7110,8 +7225,7 @@
   }
 
   /** Gets the value of "justify-content" */
-  String get justifyContent =>
-    getPropertyValue('justify-content');
+  String get justifyContent => getPropertyValue('justify-content');
 
   /** Sets the value of "justify-content" */
   set justifyContent(String value) {
@@ -7119,8 +7233,7 @@
   }
 
   /** Gets the value of "justify-self" */
-  String get justifySelf =>
-    getPropertyValue('justify-self');
+  String get justifySelf => getPropertyValue('justify-self');
 
   /** Sets the value of "justify-self" */
   set justifySelf(String value) {
@@ -7128,8 +7241,7 @@
   }
 
   /** Gets the value of "left" */
-  String get left =>
-    getPropertyValue('left');
+  String get left => getPropertyValue('left');
 
   /** Sets the value of "left" */
   set left(String value) {
@@ -7137,8 +7249,7 @@
   }
 
   /** Gets the value of "letter-spacing" */
-  String get letterSpacing =>
-    getPropertyValue('letter-spacing');
+  String get letterSpacing => getPropertyValue('letter-spacing');
 
   /** Sets the value of "letter-spacing" */
   set letterSpacing(String value) {
@@ -7146,8 +7257,7 @@
   }
 
   /** Gets the value of "line-box-contain" */
-  String get lineBoxContain =>
-    getPropertyValue('line-box-contain');
+  String get lineBoxContain => getPropertyValue('line-box-contain');
 
   /** Sets the value of "line-box-contain" */
   set lineBoxContain(String value) {
@@ -7155,8 +7265,7 @@
   }
 
   /** Gets the value of "line-break" */
-  String get lineBreak =>
-    getPropertyValue('line-break');
+  String get lineBreak => getPropertyValue('line-break');
 
   /** Sets the value of "line-break" */
   set lineBreak(String value) {
@@ -7164,8 +7273,7 @@
   }
 
   /** Gets the value of "line-clamp" */
-  String get lineClamp =>
-    getPropertyValue('line-clamp');
+  String get lineClamp => getPropertyValue('line-clamp');
 
   /** Sets the value of "line-clamp" */
   set lineClamp(String value) {
@@ -7173,8 +7281,7 @@
   }
 
   /** Gets the value of "line-height" */
-  String get lineHeight =>
-    getPropertyValue('line-height');
+  String get lineHeight => getPropertyValue('line-height');
 
   /** Sets the value of "line-height" */
   set lineHeight(String value) {
@@ -7182,8 +7289,7 @@
   }
 
   /** Gets the value of "list-style" */
-  String get listStyle =>
-    getPropertyValue('list-style');
+  String get listStyle => getPropertyValue('list-style');
 
   /** Sets the value of "list-style" */
   set listStyle(String value) {
@@ -7191,8 +7297,7 @@
   }
 
   /** Gets the value of "list-style-image" */
-  String get listStyleImage =>
-    getPropertyValue('list-style-image');
+  String get listStyleImage => getPropertyValue('list-style-image');
 
   /** Sets the value of "list-style-image" */
   set listStyleImage(String value) {
@@ -7200,8 +7305,7 @@
   }
 
   /** Gets the value of "list-style-position" */
-  String get listStylePosition =>
-    getPropertyValue('list-style-position');
+  String get listStylePosition => getPropertyValue('list-style-position');
 
   /** Sets the value of "list-style-position" */
   set listStylePosition(String value) {
@@ -7209,8 +7313,7 @@
   }
 
   /** Gets the value of "list-style-type" */
-  String get listStyleType =>
-    getPropertyValue('list-style-type');
+  String get listStyleType => getPropertyValue('list-style-type');
 
   /** Sets the value of "list-style-type" */
   set listStyleType(String value) {
@@ -7218,8 +7321,7 @@
   }
 
   /** Gets the value of "locale" */
-  String get locale =>
-    getPropertyValue('locale');
+  String get locale => getPropertyValue('locale');
 
   /** Sets the value of "locale" */
   set locale(String value) {
@@ -7227,8 +7329,7 @@
   }
 
   /** Gets the value of "logical-height" */
-  String get logicalHeight =>
-    getPropertyValue('logical-height');
+  String get logicalHeight => getPropertyValue('logical-height');
 
   /** Sets the value of "logical-height" */
   set logicalHeight(String value) {
@@ -7236,8 +7337,7 @@
   }
 
   /** Gets the value of "logical-width" */
-  String get logicalWidth =>
-    getPropertyValue('logical-width');
+  String get logicalWidth => getPropertyValue('logical-width');
 
   /** Sets the value of "logical-width" */
   set logicalWidth(String value) {
@@ -7245,8 +7345,7 @@
   }
 
   /** Gets the value of "margin" */
-  String get margin =>
-    getPropertyValue('margin');
+  String get margin => getPropertyValue('margin');
 
   /** Sets the value of "margin" */
   set margin(String value) {
@@ -7254,8 +7353,7 @@
   }
 
   /** Gets the value of "margin-after" */
-  String get marginAfter =>
-    getPropertyValue('margin-after');
+  String get marginAfter => getPropertyValue('margin-after');
 
   /** Sets the value of "margin-after" */
   set marginAfter(String value) {
@@ -7263,8 +7361,7 @@
   }
 
   /** Gets the value of "margin-after-collapse" */
-  String get marginAfterCollapse =>
-    getPropertyValue('margin-after-collapse');
+  String get marginAfterCollapse => getPropertyValue('margin-after-collapse');
 
   /** Sets the value of "margin-after-collapse" */
   set marginAfterCollapse(String value) {
@@ -7272,8 +7369,7 @@
   }
 
   /** Gets the value of "margin-before" */
-  String get marginBefore =>
-    getPropertyValue('margin-before');
+  String get marginBefore => getPropertyValue('margin-before');
 
   /** Sets the value of "margin-before" */
   set marginBefore(String value) {
@@ -7281,8 +7377,7 @@
   }
 
   /** Gets the value of "margin-before-collapse" */
-  String get marginBeforeCollapse =>
-    getPropertyValue('margin-before-collapse');
+  String get marginBeforeCollapse => getPropertyValue('margin-before-collapse');
 
   /** Sets the value of "margin-before-collapse" */
   set marginBeforeCollapse(String value) {
@@ -7290,8 +7385,7 @@
   }
 
   /** Gets the value of "margin-bottom" */
-  String get marginBottom =>
-    getPropertyValue('margin-bottom');
+  String get marginBottom => getPropertyValue('margin-bottom');
 
   /** Sets the value of "margin-bottom" */
   set marginBottom(String value) {
@@ -7299,8 +7393,7 @@
   }
 
   /** Gets the value of "margin-bottom-collapse" */
-  String get marginBottomCollapse =>
-    getPropertyValue('margin-bottom-collapse');
+  String get marginBottomCollapse => getPropertyValue('margin-bottom-collapse');
 
   /** Sets the value of "margin-bottom-collapse" */
   set marginBottomCollapse(String value) {
@@ -7308,8 +7401,7 @@
   }
 
   /** Gets the value of "margin-collapse" */
-  String get marginCollapse =>
-    getPropertyValue('margin-collapse');
+  String get marginCollapse => getPropertyValue('margin-collapse');
 
   /** Sets the value of "margin-collapse" */
   set marginCollapse(String value) {
@@ -7317,8 +7409,7 @@
   }
 
   /** Gets the value of "margin-end" */
-  String get marginEnd =>
-    getPropertyValue('margin-end');
+  String get marginEnd => getPropertyValue('margin-end');
 
   /** Sets the value of "margin-end" */
   set marginEnd(String value) {
@@ -7326,8 +7417,7 @@
   }
 
   /** Gets the value of "margin-left" */
-  String get marginLeft =>
-    getPropertyValue('margin-left');
+  String get marginLeft => getPropertyValue('margin-left');
 
   /** Sets the value of "margin-left" */
   set marginLeft(String value) {
@@ -7335,8 +7425,7 @@
   }
 
   /** Gets the value of "margin-right" */
-  String get marginRight =>
-    getPropertyValue('margin-right');
+  String get marginRight => getPropertyValue('margin-right');
 
   /** Sets the value of "margin-right" */
   set marginRight(String value) {
@@ -7344,8 +7433,7 @@
   }
 
   /** Gets the value of "margin-start" */
-  String get marginStart =>
-    getPropertyValue('margin-start');
+  String get marginStart => getPropertyValue('margin-start');
 
   /** Sets the value of "margin-start" */
   set marginStart(String value) {
@@ -7353,8 +7441,7 @@
   }
 
   /** Gets the value of "margin-top" */
-  String get marginTop =>
-    getPropertyValue('margin-top');
+  String get marginTop => getPropertyValue('margin-top');
 
   /** Sets the value of "margin-top" */
   set marginTop(String value) {
@@ -7362,8 +7449,7 @@
   }
 
   /** Gets the value of "margin-top-collapse" */
-  String get marginTopCollapse =>
-    getPropertyValue('margin-top-collapse');
+  String get marginTopCollapse => getPropertyValue('margin-top-collapse');
 
   /** Sets the value of "margin-top-collapse" */
   set marginTopCollapse(String value) {
@@ -7371,8 +7457,7 @@
   }
 
   /** Gets the value of "mask" */
-  String get mask =>
-    getPropertyValue('mask');
+  String get mask => getPropertyValue('mask');
 
   /** Sets the value of "mask" */
   set mask(String value) {
@@ -7380,8 +7465,7 @@
   }
 
   /** Gets the value of "mask-box-image" */
-  String get maskBoxImage =>
-    getPropertyValue('mask-box-image');
+  String get maskBoxImage => getPropertyValue('mask-box-image');
 
   /** Sets the value of "mask-box-image" */
   set maskBoxImage(String value) {
@@ -7389,8 +7473,7 @@
   }
 
   /** Gets the value of "mask-box-image-outset" */
-  String get maskBoxImageOutset =>
-    getPropertyValue('mask-box-image-outset');
+  String get maskBoxImageOutset => getPropertyValue('mask-box-image-outset');
 
   /** Sets the value of "mask-box-image-outset" */
   set maskBoxImageOutset(String value) {
@@ -7398,8 +7481,7 @@
   }
 
   /** Gets the value of "mask-box-image-repeat" */
-  String get maskBoxImageRepeat =>
-    getPropertyValue('mask-box-image-repeat');
+  String get maskBoxImageRepeat => getPropertyValue('mask-box-image-repeat');
 
   /** Sets the value of "mask-box-image-repeat" */
   set maskBoxImageRepeat(String value) {
@@ -7407,8 +7489,7 @@
   }
 
   /** Gets the value of "mask-box-image-slice" */
-  String get maskBoxImageSlice =>
-    getPropertyValue('mask-box-image-slice');
+  String get maskBoxImageSlice => getPropertyValue('mask-box-image-slice');
 
   /** Sets the value of "mask-box-image-slice" */
   set maskBoxImageSlice(String value) {
@@ -7416,8 +7497,7 @@
   }
 
   /** Gets the value of "mask-box-image-source" */
-  String get maskBoxImageSource =>
-    getPropertyValue('mask-box-image-source');
+  String get maskBoxImageSource => getPropertyValue('mask-box-image-source');
 
   /** Sets the value of "mask-box-image-source" */
   set maskBoxImageSource(String value) {
@@ -7425,8 +7505,7 @@
   }
 
   /** Gets the value of "mask-box-image-width" */
-  String get maskBoxImageWidth =>
-    getPropertyValue('mask-box-image-width');
+  String get maskBoxImageWidth => getPropertyValue('mask-box-image-width');
 
   /** Sets the value of "mask-box-image-width" */
   set maskBoxImageWidth(String value) {
@@ -7434,8 +7513,7 @@
   }
 
   /** Gets the value of "mask-clip" */
-  String get maskClip =>
-    getPropertyValue('mask-clip');
+  String get maskClip => getPropertyValue('mask-clip');
 
   /** Sets the value of "mask-clip" */
   set maskClip(String value) {
@@ -7443,8 +7521,7 @@
   }
 
   /** Gets the value of "mask-composite" */
-  String get maskComposite =>
-    getPropertyValue('mask-composite');
+  String get maskComposite => getPropertyValue('mask-composite');
 
   /** Sets the value of "mask-composite" */
   set maskComposite(String value) {
@@ -7452,8 +7529,7 @@
   }
 
   /** Gets the value of "mask-image" */
-  String get maskImage =>
-    getPropertyValue('mask-image');
+  String get maskImage => getPropertyValue('mask-image');
 
   /** Sets the value of "mask-image" */
   set maskImage(String value) {
@@ -7461,8 +7537,7 @@
   }
 
   /** Gets the value of "mask-origin" */
-  String get maskOrigin =>
-    getPropertyValue('mask-origin');
+  String get maskOrigin => getPropertyValue('mask-origin');
 
   /** Sets the value of "mask-origin" */
   set maskOrigin(String value) {
@@ -7470,8 +7545,7 @@
   }
 
   /** Gets the value of "mask-position" */
-  String get maskPosition =>
-    getPropertyValue('mask-position');
+  String get maskPosition => getPropertyValue('mask-position');
 
   /** Sets the value of "mask-position" */
   set maskPosition(String value) {
@@ -7479,8 +7553,7 @@
   }
 
   /** Gets the value of "mask-position-x" */
-  String get maskPositionX =>
-    getPropertyValue('mask-position-x');
+  String get maskPositionX => getPropertyValue('mask-position-x');
 
   /** Sets the value of "mask-position-x" */
   set maskPositionX(String value) {
@@ -7488,8 +7561,7 @@
   }
 
   /** Gets the value of "mask-position-y" */
-  String get maskPositionY =>
-    getPropertyValue('mask-position-y');
+  String get maskPositionY => getPropertyValue('mask-position-y');
 
   /** Sets the value of "mask-position-y" */
   set maskPositionY(String value) {
@@ -7497,8 +7569,7 @@
   }
 
   /** Gets the value of "mask-repeat" */
-  String get maskRepeat =>
-    getPropertyValue('mask-repeat');
+  String get maskRepeat => getPropertyValue('mask-repeat');
 
   /** Sets the value of "mask-repeat" */
   set maskRepeat(String value) {
@@ -7506,8 +7577,7 @@
   }
 
   /** Gets the value of "mask-repeat-x" */
-  String get maskRepeatX =>
-    getPropertyValue('mask-repeat-x');
+  String get maskRepeatX => getPropertyValue('mask-repeat-x');
 
   /** Sets the value of "mask-repeat-x" */
   set maskRepeatX(String value) {
@@ -7515,8 +7585,7 @@
   }
 
   /** Gets the value of "mask-repeat-y" */
-  String get maskRepeatY =>
-    getPropertyValue('mask-repeat-y');
+  String get maskRepeatY => getPropertyValue('mask-repeat-y');
 
   /** Sets the value of "mask-repeat-y" */
   set maskRepeatY(String value) {
@@ -7524,8 +7593,7 @@
   }
 
   /** Gets the value of "mask-size" */
-  String get maskSize =>
-    getPropertyValue('mask-size');
+  String get maskSize => getPropertyValue('mask-size');
 
   /** Sets the value of "mask-size" */
   set maskSize(String value) {
@@ -7533,8 +7601,7 @@
   }
 
   /** Gets the value of "mask-source-type" */
-  String get maskSourceType =>
-    getPropertyValue('mask-source-type');
+  String get maskSourceType => getPropertyValue('mask-source-type');
 
   /** Sets the value of "mask-source-type" */
   set maskSourceType(String value) {
@@ -7542,8 +7609,7 @@
   }
 
   /** Gets the value of "max-height" */
-  String get maxHeight =>
-    getPropertyValue('max-height');
+  String get maxHeight => getPropertyValue('max-height');
 
   /** Sets the value of "max-height" */
   set maxHeight(String value) {
@@ -7551,8 +7617,7 @@
   }
 
   /** Gets the value of "max-logical-height" */
-  String get maxLogicalHeight =>
-    getPropertyValue('max-logical-height');
+  String get maxLogicalHeight => getPropertyValue('max-logical-height');
 
   /** Sets the value of "max-logical-height" */
   set maxLogicalHeight(String value) {
@@ -7560,8 +7625,7 @@
   }
 
   /** Gets the value of "max-logical-width" */
-  String get maxLogicalWidth =>
-    getPropertyValue('max-logical-width');
+  String get maxLogicalWidth => getPropertyValue('max-logical-width');
 
   /** Sets the value of "max-logical-width" */
   set maxLogicalWidth(String value) {
@@ -7569,8 +7633,7 @@
   }
 
   /** Gets the value of "max-width" */
-  String get maxWidth =>
-    getPropertyValue('max-width');
+  String get maxWidth => getPropertyValue('max-width');
 
   /** Sets the value of "max-width" */
   set maxWidth(String value) {
@@ -7578,8 +7641,7 @@
   }
 
   /** Gets the value of "max-zoom" */
-  String get maxZoom =>
-    getPropertyValue('max-zoom');
+  String get maxZoom => getPropertyValue('max-zoom');
 
   /** Sets the value of "max-zoom" */
   set maxZoom(String value) {
@@ -7587,8 +7649,7 @@
   }
 
   /** Gets the value of "min-height" */
-  String get minHeight =>
-    getPropertyValue('min-height');
+  String get minHeight => getPropertyValue('min-height');
 
   /** Sets the value of "min-height" */
   set minHeight(String value) {
@@ -7596,8 +7657,7 @@
   }
 
   /** Gets the value of "min-logical-height" */
-  String get minLogicalHeight =>
-    getPropertyValue('min-logical-height');
+  String get minLogicalHeight => getPropertyValue('min-logical-height');
 
   /** Sets the value of "min-logical-height" */
   set minLogicalHeight(String value) {
@@ -7605,8 +7665,7 @@
   }
 
   /** Gets the value of "min-logical-width" */
-  String get minLogicalWidth =>
-    getPropertyValue('min-logical-width');
+  String get minLogicalWidth => getPropertyValue('min-logical-width');
 
   /** Sets the value of "min-logical-width" */
   set minLogicalWidth(String value) {
@@ -7614,8 +7673,7 @@
   }
 
   /** Gets the value of "min-width" */
-  String get minWidth =>
-    getPropertyValue('min-width');
+  String get minWidth => getPropertyValue('min-width');
 
   /** Sets the value of "min-width" */
   set minWidth(String value) {
@@ -7623,8 +7681,7 @@
   }
 
   /** Gets the value of "min-zoom" */
-  String get minZoom =>
-    getPropertyValue('min-zoom');
+  String get minZoom => getPropertyValue('min-zoom');
 
   /** Sets the value of "min-zoom" */
   set minZoom(String value) {
@@ -7632,8 +7689,7 @@
   }
 
   /** Gets the value of "mix-blend-mode" */
-  String get mixBlendMode =>
-    getPropertyValue('mix-blend-mode');
+  String get mixBlendMode => getPropertyValue('mix-blend-mode');
 
   /** Sets the value of "mix-blend-mode" */
   set mixBlendMode(String value) {
@@ -7641,8 +7697,7 @@
   }
 
   /** Gets the value of "object-fit" */
-  String get objectFit =>
-    getPropertyValue('object-fit');
+  String get objectFit => getPropertyValue('object-fit');
 
   /** Sets the value of "object-fit" */
   set objectFit(String value) {
@@ -7650,8 +7705,7 @@
   }
 
   /** Gets the value of "object-position" */
-  String get objectPosition =>
-    getPropertyValue('object-position');
+  String get objectPosition => getPropertyValue('object-position');
 
   /** Sets the value of "object-position" */
   set objectPosition(String value) {
@@ -7659,8 +7713,7 @@
   }
 
   /** Gets the value of "opacity" */
-  String get opacity =>
-    getPropertyValue('opacity');
+  String get opacity => getPropertyValue('opacity');
 
   /** Sets the value of "opacity" */
   set opacity(String value) {
@@ -7668,8 +7721,7 @@
   }
 
   /** Gets the value of "order" */
-  String get order =>
-    getPropertyValue('order');
+  String get order => getPropertyValue('order');
 
   /** Sets the value of "order" */
   set order(String value) {
@@ -7677,8 +7729,7 @@
   }
 
   /** Gets the value of "orientation" */
-  String get orientation =>
-    getPropertyValue('orientation');
+  String get orientation => getPropertyValue('orientation');
 
   /** Sets the value of "orientation" */
   set orientation(String value) {
@@ -7686,8 +7737,7 @@
   }
 
   /** Gets the value of "orphans" */
-  String get orphans =>
-    getPropertyValue('orphans');
+  String get orphans => getPropertyValue('orphans');
 
   /** Sets the value of "orphans" */
   set orphans(String value) {
@@ -7695,8 +7745,7 @@
   }
 
   /** Gets the value of "outline" */
-  String get outline =>
-    getPropertyValue('outline');
+  String get outline => getPropertyValue('outline');
 
   /** Sets the value of "outline" */
   set outline(String value) {
@@ -7704,8 +7753,7 @@
   }
 
   /** Gets the value of "outline-color" */
-  String get outlineColor =>
-    getPropertyValue('outline-color');
+  String get outlineColor => getPropertyValue('outline-color');
 
   /** Sets the value of "outline-color" */
   set outlineColor(String value) {
@@ -7713,8 +7761,7 @@
   }
 
   /** Gets the value of "outline-offset" */
-  String get outlineOffset =>
-    getPropertyValue('outline-offset');
+  String get outlineOffset => getPropertyValue('outline-offset');
 
   /** Sets the value of "outline-offset" */
   set outlineOffset(String value) {
@@ -7722,8 +7769,7 @@
   }
 
   /** Gets the value of "outline-style" */
-  String get outlineStyle =>
-    getPropertyValue('outline-style');
+  String get outlineStyle => getPropertyValue('outline-style');
 
   /** Sets the value of "outline-style" */
   set outlineStyle(String value) {
@@ -7731,8 +7777,7 @@
   }
 
   /** Gets the value of "outline-width" */
-  String get outlineWidth =>
-    getPropertyValue('outline-width');
+  String get outlineWidth => getPropertyValue('outline-width');
 
   /** Sets the value of "outline-width" */
   set outlineWidth(String value) {
@@ -7740,8 +7785,7 @@
   }
 
   /** Gets the value of "overflow" */
-  String get overflow =>
-    getPropertyValue('overflow');
+  String get overflow => getPropertyValue('overflow');
 
   /** Sets the value of "overflow" */
   set overflow(String value) {
@@ -7749,8 +7793,7 @@
   }
 
   /** Gets the value of "overflow-wrap" */
-  String get overflowWrap =>
-    getPropertyValue('overflow-wrap');
+  String get overflowWrap => getPropertyValue('overflow-wrap');
 
   /** Sets the value of "overflow-wrap" */
   set overflowWrap(String value) {
@@ -7758,8 +7801,7 @@
   }
 
   /** Gets the value of "overflow-x" */
-  String get overflowX =>
-    getPropertyValue('overflow-x');
+  String get overflowX => getPropertyValue('overflow-x');
 
   /** Sets the value of "overflow-x" */
   set overflowX(String value) {
@@ -7767,8 +7809,7 @@
   }
 
   /** Gets the value of "overflow-y" */
-  String get overflowY =>
-    getPropertyValue('overflow-y');
+  String get overflowY => getPropertyValue('overflow-y');
 
   /** Sets the value of "overflow-y" */
   set overflowY(String value) {
@@ -7776,8 +7817,7 @@
   }
 
   /** Gets the value of "padding" */
-  String get padding =>
-    getPropertyValue('padding');
+  String get padding => getPropertyValue('padding');
 
   /** Sets the value of "padding" */
   set padding(String value) {
@@ -7785,8 +7825,7 @@
   }
 
   /** Gets the value of "padding-after" */
-  String get paddingAfter =>
-    getPropertyValue('padding-after');
+  String get paddingAfter => getPropertyValue('padding-after');
 
   /** Sets the value of "padding-after" */
   set paddingAfter(String value) {
@@ -7794,8 +7833,7 @@
   }
 
   /** Gets the value of "padding-before" */
-  String get paddingBefore =>
-    getPropertyValue('padding-before');
+  String get paddingBefore => getPropertyValue('padding-before');
 
   /** Sets the value of "padding-before" */
   set paddingBefore(String value) {
@@ -7803,8 +7841,7 @@
   }
 
   /** Gets the value of "padding-bottom" */
-  String get paddingBottom =>
-    getPropertyValue('padding-bottom');
+  String get paddingBottom => getPropertyValue('padding-bottom');
 
   /** Sets the value of "padding-bottom" */
   set paddingBottom(String value) {
@@ -7812,8 +7849,7 @@
   }
 
   /** Gets the value of "padding-end" */
-  String get paddingEnd =>
-    getPropertyValue('padding-end');
+  String get paddingEnd => getPropertyValue('padding-end');
 
   /** Sets the value of "padding-end" */
   set paddingEnd(String value) {
@@ -7821,8 +7857,7 @@
   }
 
   /** Gets the value of "padding-left" */
-  String get paddingLeft =>
-    getPropertyValue('padding-left');
+  String get paddingLeft => getPropertyValue('padding-left');
 
   /** Sets the value of "padding-left" */
   set paddingLeft(String value) {
@@ -7830,8 +7865,7 @@
   }
 
   /** Gets the value of "padding-right" */
-  String get paddingRight =>
-    getPropertyValue('padding-right');
+  String get paddingRight => getPropertyValue('padding-right');
 
   /** Sets the value of "padding-right" */
   set paddingRight(String value) {
@@ -7839,8 +7873,7 @@
   }
 
   /** Gets the value of "padding-start" */
-  String get paddingStart =>
-    getPropertyValue('padding-start');
+  String get paddingStart => getPropertyValue('padding-start');
 
   /** Sets the value of "padding-start" */
   set paddingStart(String value) {
@@ -7848,8 +7881,7 @@
   }
 
   /** Gets the value of "padding-top" */
-  String get paddingTop =>
-    getPropertyValue('padding-top');
+  String get paddingTop => getPropertyValue('padding-top');
 
   /** Sets the value of "padding-top" */
   set paddingTop(String value) {
@@ -7857,8 +7889,7 @@
   }
 
   /** Gets the value of "page" */
-  String get page =>
-    getPropertyValue('page');
+  String get page => getPropertyValue('page');
 
   /** Sets the value of "page" */
   set page(String value) {
@@ -7866,8 +7897,7 @@
   }
 
   /** Gets the value of "page-break-after" */
-  String get pageBreakAfter =>
-    getPropertyValue('page-break-after');
+  String get pageBreakAfter => getPropertyValue('page-break-after');
 
   /** Sets the value of "page-break-after" */
   set pageBreakAfter(String value) {
@@ -7875,8 +7905,7 @@
   }
 
   /** Gets the value of "page-break-before" */
-  String get pageBreakBefore =>
-    getPropertyValue('page-break-before');
+  String get pageBreakBefore => getPropertyValue('page-break-before');
 
   /** Sets the value of "page-break-before" */
   set pageBreakBefore(String value) {
@@ -7884,8 +7913,7 @@
   }
 
   /** Gets the value of "page-break-inside" */
-  String get pageBreakInside =>
-    getPropertyValue('page-break-inside');
+  String get pageBreakInside => getPropertyValue('page-break-inside');
 
   /** Sets the value of "page-break-inside" */
   set pageBreakInside(String value) {
@@ -7893,8 +7921,7 @@
   }
 
   /** Gets the value of "perspective" */
-  String get perspective =>
-    getPropertyValue('perspective');
+  String get perspective => getPropertyValue('perspective');
 
   /** Sets the value of "perspective" */
   set perspective(String value) {
@@ -7902,8 +7929,7 @@
   }
 
   /** Gets the value of "perspective-origin" */
-  String get perspectiveOrigin =>
-    getPropertyValue('perspective-origin');
+  String get perspectiveOrigin => getPropertyValue('perspective-origin');
 
   /** Sets the value of "perspective-origin" */
   set perspectiveOrigin(String value) {
@@ -7911,8 +7937,7 @@
   }
 
   /** Gets the value of "perspective-origin-x" */
-  String get perspectiveOriginX =>
-    getPropertyValue('perspective-origin-x');
+  String get perspectiveOriginX => getPropertyValue('perspective-origin-x');
 
   /** Sets the value of "perspective-origin-x" */
   set perspectiveOriginX(String value) {
@@ -7920,8 +7945,7 @@
   }
 
   /** Gets the value of "perspective-origin-y" */
-  String get perspectiveOriginY =>
-    getPropertyValue('perspective-origin-y');
+  String get perspectiveOriginY => getPropertyValue('perspective-origin-y');
 
   /** Sets the value of "perspective-origin-y" */
   set perspectiveOriginY(String value) {
@@ -7929,8 +7953,7 @@
   }
 
   /** Gets the value of "pointer-events" */
-  String get pointerEvents =>
-    getPropertyValue('pointer-events');
+  String get pointerEvents => getPropertyValue('pointer-events');
 
   /** Sets the value of "pointer-events" */
   set pointerEvents(String value) {
@@ -7938,8 +7961,7 @@
   }
 
   /** Gets the value of "position" */
-  String get position =>
-    getPropertyValue('position');
+  String get position => getPropertyValue('position');
 
   /** Sets the value of "position" */
   set position(String value) {
@@ -7947,8 +7969,7 @@
   }
 
   /** Gets the value of "print-color-adjust" */
-  String get printColorAdjust =>
-    getPropertyValue('print-color-adjust');
+  String get printColorAdjust => getPropertyValue('print-color-adjust');
 
   /** Sets the value of "print-color-adjust" */
   set printColorAdjust(String value) {
@@ -7956,8 +7977,7 @@
   }
 
   /** Gets the value of "quotes" */
-  String get quotes =>
-    getPropertyValue('quotes');
+  String get quotes => getPropertyValue('quotes');
 
   /** Sets the value of "quotes" */
   set quotes(String value) {
@@ -7965,8 +7985,7 @@
   }
 
   /** Gets the value of "resize" */
-  String get resize =>
-    getPropertyValue('resize');
+  String get resize => getPropertyValue('resize');
 
   /** Sets the value of "resize" */
   set resize(String value) {
@@ -7974,8 +7993,7 @@
   }
 
   /** Gets the value of "right" */
-  String get right =>
-    getPropertyValue('right');
+  String get right => getPropertyValue('right');
 
   /** Sets the value of "right" */
   set right(String value) {
@@ -7983,8 +8001,7 @@
   }
 
   /** Gets the value of "rtl-ordering" */
-  String get rtlOrdering =>
-    getPropertyValue('rtl-ordering');
+  String get rtlOrdering => getPropertyValue('rtl-ordering');
 
   /** Sets the value of "rtl-ordering" */
   set rtlOrdering(String value) {
@@ -7992,8 +8009,7 @@
   }
 
   /** Gets the value of "ruby-position" */
-  String get rubyPosition =>
-    getPropertyValue('ruby-position');
+  String get rubyPosition => getPropertyValue('ruby-position');
 
   /** Sets the value of "ruby-position" */
   set rubyPosition(String value) {
@@ -8001,8 +8017,7 @@
   }
 
   /** Gets the value of "scroll-behavior" */
-  String get scrollBehavior =>
-    getPropertyValue('scroll-behavior');
+  String get scrollBehavior => getPropertyValue('scroll-behavior');
 
   /** Sets the value of "scroll-behavior" */
   set scrollBehavior(String value) {
@@ -8010,8 +8025,7 @@
   }
 
   /** Gets the value of "shape-image-threshold" */
-  String get shapeImageThreshold =>
-    getPropertyValue('shape-image-threshold');
+  String get shapeImageThreshold => getPropertyValue('shape-image-threshold');
 
   /** Sets the value of "shape-image-threshold" */
   set shapeImageThreshold(String value) {
@@ -8019,8 +8033,7 @@
   }
 
   /** Gets the value of "shape-margin" */
-  String get shapeMargin =>
-    getPropertyValue('shape-margin');
+  String get shapeMargin => getPropertyValue('shape-margin');
 
   /** Sets the value of "shape-margin" */
   set shapeMargin(String value) {
@@ -8028,8 +8041,7 @@
   }
 
   /** Gets the value of "shape-outside" */
-  String get shapeOutside =>
-    getPropertyValue('shape-outside');
+  String get shapeOutside => getPropertyValue('shape-outside');
 
   /** Sets the value of "shape-outside" */
   set shapeOutside(String value) {
@@ -8037,8 +8049,7 @@
   }
 
   /** Gets the value of "size" */
-  String get size =>
-    getPropertyValue('size');
+  String get size => getPropertyValue('size');
 
   /** Sets the value of "size" */
   set size(String value) {
@@ -8046,8 +8057,7 @@
   }
 
   /** Gets the value of "speak" */
-  String get speak =>
-    getPropertyValue('speak');
+  String get speak => getPropertyValue('speak');
 
   /** Sets the value of "speak" */
   set speak(String value) {
@@ -8055,8 +8065,7 @@
   }
 
   /** Gets the value of "src" */
-  String get src =>
-    getPropertyValue('src');
+  String get src => getPropertyValue('src');
 
   /** Sets the value of "src" */
   set src(String value) {
@@ -8064,8 +8073,7 @@
   }
 
   /** Gets the value of "tab-size" */
-  String get tabSize =>
-    getPropertyValue('tab-size');
+  String get tabSize => getPropertyValue('tab-size');
 
   /** Sets the value of "tab-size" */
   set tabSize(String value) {
@@ -8073,8 +8081,7 @@
   }
 
   /** Gets the value of "table-layout" */
-  String get tableLayout =>
-    getPropertyValue('table-layout');
+  String get tableLayout => getPropertyValue('table-layout');
 
   /** Sets the value of "table-layout" */
   set tableLayout(String value) {
@@ -8082,8 +8089,7 @@
   }
 
   /** Gets the value of "tap-highlight-color" */
-  String get tapHighlightColor =>
-    getPropertyValue('tap-highlight-color');
+  String get tapHighlightColor => getPropertyValue('tap-highlight-color');
 
   /** Sets the value of "tap-highlight-color" */
   set tapHighlightColor(String value) {
@@ -8091,8 +8097,7 @@
   }
 
   /** Gets the value of "text-align" */
-  String get textAlign =>
-    getPropertyValue('text-align');
+  String get textAlign => getPropertyValue('text-align');
 
   /** Sets the value of "text-align" */
   set textAlign(String value) {
@@ -8100,8 +8105,7 @@
   }
 
   /** Gets the value of "text-align-last" */
-  String get textAlignLast =>
-    getPropertyValue('text-align-last');
+  String get textAlignLast => getPropertyValue('text-align-last');
 
   /** Sets the value of "text-align-last" */
   set textAlignLast(String value) {
@@ -8109,8 +8113,7 @@
   }
 
   /** Gets the value of "text-combine" */
-  String get textCombine =>
-    getPropertyValue('text-combine');
+  String get textCombine => getPropertyValue('text-combine');
 
   /** Sets the value of "text-combine" */
   set textCombine(String value) {
@@ -8118,8 +8121,7 @@
   }
 
   /** Gets the value of "text-decoration" */
-  String get textDecoration =>
-    getPropertyValue('text-decoration');
+  String get textDecoration => getPropertyValue('text-decoration');
 
   /** Sets the value of "text-decoration" */
   set textDecoration(String value) {
@@ -8127,8 +8129,7 @@
   }
 
   /** Gets the value of "text-decoration-color" */
-  String get textDecorationColor =>
-    getPropertyValue('text-decoration-color');
+  String get textDecorationColor => getPropertyValue('text-decoration-color');
 
   /** Sets the value of "text-decoration-color" */
   set textDecorationColor(String value) {
@@ -8136,8 +8137,7 @@
   }
 
   /** Gets the value of "text-decoration-line" */
-  String get textDecorationLine =>
-    getPropertyValue('text-decoration-line');
+  String get textDecorationLine => getPropertyValue('text-decoration-line');
 
   /** Sets the value of "text-decoration-line" */
   set textDecorationLine(String value) {
@@ -8145,8 +8145,7 @@
   }
 
   /** Gets the value of "text-decoration-style" */
-  String get textDecorationStyle =>
-    getPropertyValue('text-decoration-style');
+  String get textDecorationStyle => getPropertyValue('text-decoration-style');
 
   /** Sets the value of "text-decoration-style" */
   set textDecorationStyle(String value) {
@@ -8155,7 +8154,7 @@
 
   /** Gets the value of "text-decorations-in-effect" */
   String get textDecorationsInEffect =>
-    getPropertyValue('text-decorations-in-effect');
+      getPropertyValue('text-decorations-in-effect');
 
   /** Sets the value of "text-decorations-in-effect" */
   set textDecorationsInEffect(String value) {
@@ -8163,8 +8162,7 @@
   }
 
   /** Gets the value of "text-emphasis" */
-  String get textEmphasis =>
-    getPropertyValue('text-emphasis');
+  String get textEmphasis => getPropertyValue('text-emphasis');
 
   /** Sets the value of "text-emphasis" */
   set textEmphasis(String value) {
@@ -8172,8 +8170,7 @@
   }
 
   /** Gets the value of "text-emphasis-color" */
-  String get textEmphasisColor =>
-    getPropertyValue('text-emphasis-color');
+  String get textEmphasisColor => getPropertyValue('text-emphasis-color');
 
   /** Sets the value of "text-emphasis-color" */
   set textEmphasisColor(String value) {
@@ -8181,8 +8178,7 @@
   }
 
   /** Gets the value of "text-emphasis-position" */
-  String get textEmphasisPosition =>
-    getPropertyValue('text-emphasis-position');
+  String get textEmphasisPosition => getPropertyValue('text-emphasis-position');
 
   /** Sets the value of "text-emphasis-position" */
   set textEmphasisPosition(String value) {
@@ -8190,8 +8186,7 @@
   }
 
   /** Gets the value of "text-emphasis-style" */
-  String get textEmphasisStyle =>
-    getPropertyValue('text-emphasis-style');
+  String get textEmphasisStyle => getPropertyValue('text-emphasis-style');
 
   /** Sets the value of "text-emphasis-style" */
   set textEmphasisStyle(String value) {
@@ -8199,8 +8194,7 @@
   }
 
   /** Gets the value of "text-fill-color" */
-  String get textFillColor =>
-    getPropertyValue('text-fill-color');
+  String get textFillColor => getPropertyValue('text-fill-color');
 
   /** Sets the value of "text-fill-color" */
   set textFillColor(String value) {
@@ -8208,8 +8202,7 @@
   }
 
   /** Gets the value of "text-indent" */
-  String get textIndent =>
-    getPropertyValue('text-indent');
+  String get textIndent => getPropertyValue('text-indent');
 
   /** Sets the value of "text-indent" */
   set textIndent(String value) {
@@ -8217,8 +8210,7 @@
   }
 
   /** Gets the value of "text-justify" */
-  String get textJustify =>
-    getPropertyValue('text-justify');
+  String get textJustify => getPropertyValue('text-justify');
 
   /** Sets the value of "text-justify" */
   set textJustify(String value) {
@@ -8227,7 +8219,7 @@
 
   /** Gets the value of "text-line-through-color" */
   String get textLineThroughColor =>
-    getPropertyValue('text-line-through-color');
+      getPropertyValue('text-line-through-color');
 
   /** Sets the value of "text-line-through-color" */
   set textLineThroughColor(String value) {
@@ -8235,8 +8227,7 @@
   }
 
   /** Gets the value of "text-line-through-mode" */
-  String get textLineThroughMode =>
-    getPropertyValue('text-line-through-mode');
+  String get textLineThroughMode => getPropertyValue('text-line-through-mode');
 
   /** Sets the value of "text-line-through-mode" */
   set textLineThroughMode(String value) {
@@ -8245,7 +8236,7 @@
 
   /** Gets the value of "text-line-through-style" */
   String get textLineThroughStyle =>
-    getPropertyValue('text-line-through-style');
+      getPropertyValue('text-line-through-style');
 
   /** Sets the value of "text-line-through-style" */
   set textLineThroughStyle(String value) {
@@ -8254,7 +8245,7 @@
 
   /** Gets the value of "text-line-through-width" */
   String get textLineThroughWidth =>
-    getPropertyValue('text-line-through-width');
+      getPropertyValue('text-line-through-width');
 
   /** Sets the value of "text-line-through-width" */
   set textLineThroughWidth(String value) {
@@ -8262,8 +8253,7 @@
   }
 
   /** Gets the value of "text-orientation" */
-  String get textOrientation =>
-    getPropertyValue('text-orientation');
+  String get textOrientation => getPropertyValue('text-orientation');
 
   /** Sets the value of "text-orientation" */
   set textOrientation(String value) {
@@ -8271,8 +8261,7 @@
   }
 
   /** Gets the value of "text-overflow" */
-  String get textOverflow =>
-    getPropertyValue('text-overflow');
+  String get textOverflow => getPropertyValue('text-overflow');
 
   /** Sets the value of "text-overflow" */
   set textOverflow(String value) {
@@ -8280,8 +8269,7 @@
   }
 
   /** Gets the value of "text-overline-color" */
-  String get textOverlineColor =>
-    getPropertyValue('text-overline-color');
+  String get textOverlineColor => getPropertyValue('text-overline-color');
 
   /** Sets the value of "text-overline-color" */
   set textOverlineColor(String value) {
@@ -8289,8 +8277,7 @@
   }
 
   /** Gets the value of "text-overline-mode" */
-  String get textOverlineMode =>
-    getPropertyValue('text-overline-mode');
+  String get textOverlineMode => getPropertyValue('text-overline-mode');
 
   /** Sets the value of "text-overline-mode" */
   set textOverlineMode(String value) {
@@ -8298,8 +8285,7 @@
   }
 
   /** Gets the value of "text-overline-style" */
-  String get textOverlineStyle =>
-    getPropertyValue('text-overline-style');
+  String get textOverlineStyle => getPropertyValue('text-overline-style');
 
   /** Sets the value of "text-overline-style" */
   set textOverlineStyle(String value) {
@@ -8307,8 +8293,7 @@
   }
 
   /** Gets the value of "text-overline-width" */
-  String get textOverlineWidth =>
-    getPropertyValue('text-overline-width');
+  String get textOverlineWidth => getPropertyValue('text-overline-width');
 
   /** Sets the value of "text-overline-width" */
   set textOverlineWidth(String value) {
@@ -8316,8 +8301,7 @@
   }
 
   /** Gets the value of "text-rendering" */
-  String get textRendering =>
-    getPropertyValue('text-rendering');
+  String get textRendering => getPropertyValue('text-rendering');
 
   /** Sets the value of "text-rendering" */
   set textRendering(String value) {
@@ -8325,8 +8309,7 @@
   }
 
   /** Gets the value of "text-security" */
-  String get textSecurity =>
-    getPropertyValue('text-security');
+  String get textSecurity => getPropertyValue('text-security');
 
   /** Sets the value of "text-security" */
   set textSecurity(String value) {
@@ -8334,8 +8317,7 @@
   }
 
   /** Gets the value of "text-shadow" */
-  String get textShadow =>
-    getPropertyValue('text-shadow');
+  String get textShadow => getPropertyValue('text-shadow');
 
   /** Sets the value of "text-shadow" */
   set textShadow(String value) {
@@ -8343,8 +8325,7 @@
   }
 
   /** Gets the value of "text-stroke" */
-  String get textStroke =>
-    getPropertyValue('text-stroke');
+  String get textStroke => getPropertyValue('text-stroke');
 
   /** Sets the value of "text-stroke" */
   set textStroke(String value) {
@@ -8352,8 +8333,7 @@
   }
 
   /** Gets the value of "text-stroke-color" */
-  String get textStrokeColor =>
-    getPropertyValue('text-stroke-color');
+  String get textStrokeColor => getPropertyValue('text-stroke-color');
 
   /** Sets the value of "text-stroke-color" */
   set textStrokeColor(String value) {
@@ -8361,8 +8341,7 @@
   }
 
   /** Gets the value of "text-stroke-width" */
-  String get textStrokeWidth =>
-    getPropertyValue('text-stroke-width');
+  String get textStrokeWidth => getPropertyValue('text-stroke-width');
 
   /** Sets the value of "text-stroke-width" */
   set textStrokeWidth(String value) {
@@ -8370,8 +8349,7 @@
   }
 
   /** Gets the value of "text-transform" */
-  String get textTransform =>
-    getPropertyValue('text-transform');
+  String get textTransform => getPropertyValue('text-transform');
 
   /** Sets the value of "text-transform" */
   set textTransform(String value) {
@@ -8379,8 +8357,7 @@
   }
 
   /** Gets the value of "text-underline-color" */
-  String get textUnderlineColor =>
-    getPropertyValue('text-underline-color');
+  String get textUnderlineColor => getPropertyValue('text-underline-color');
 
   /** Sets the value of "text-underline-color" */
   set textUnderlineColor(String value) {
@@ -8388,8 +8365,7 @@
   }
 
   /** Gets the value of "text-underline-mode" */
-  String get textUnderlineMode =>
-    getPropertyValue('text-underline-mode');
+  String get textUnderlineMode => getPropertyValue('text-underline-mode');
 
   /** Sets the value of "text-underline-mode" */
   set textUnderlineMode(String value) {
@@ -8398,7 +8374,7 @@
 
   /** Gets the value of "text-underline-position" */
   String get textUnderlinePosition =>
-    getPropertyValue('text-underline-position');
+      getPropertyValue('text-underline-position');
 
   /** Sets the value of "text-underline-position" */
   set textUnderlinePosition(String value) {
@@ -8406,8 +8382,7 @@
   }
 
   /** Gets the value of "text-underline-style" */
-  String get textUnderlineStyle =>
-    getPropertyValue('text-underline-style');
+  String get textUnderlineStyle => getPropertyValue('text-underline-style');
 
   /** Sets the value of "text-underline-style" */
   set textUnderlineStyle(String value) {
@@ -8415,8 +8390,7 @@
   }
 
   /** Gets the value of "text-underline-width" */
-  String get textUnderlineWidth =>
-    getPropertyValue('text-underline-width');
+  String get textUnderlineWidth => getPropertyValue('text-underline-width');
 
   /** Sets the value of "text-underline-width" */
   set textUnderlineWidth(String value) {
@@ -8424,8 +8398,7 @@
   }
 
   /** Gets the value of "top" */
-  String get top =>
-    getPropertyValue('top');
+  String get top => getPropertyValue('top');
 
   /** Sets the value of "top" */
   set top(String value) {
@@ -8433,8 +8406,7 @@
   }
 
   /** Gets the value of "touch-action" */
-  String get touchAction =>
-    getPropertyValue('touch-action');
+  String get touchAction => getPropertyValue('touch-action');
 
   /** Sets the value of "touch-action" */
   set touchAction(String value) {
@@ -8442,8 +8414,7 @@
   }
 
   /** Gets the value of "touch-action-delay" */
-  String get touchActionDelay =>
-    getPropertyValue('touch-action-delay');
+  String get touchActionDelay => getPropertyValue('touch-action-delay');
 
   /** Sets the value of "touch-action-delay" */
   set touchActionDelay(String value) {
@@ -8451,8 +8422,7 @@
   }
 
   /** Gets the value of "transform" */
-  String get transform =>
-    getPropertyValue('transform');
+  String get transform => getPropertyValue('transform');
 
   /** Sets the value of "transform" */
   set transform(String value) {
@@ -8460,8 +8430,7 @@
   }
 
   /** Gets the value of "transform-origin" */
-  String get transformOrigin =>
-    getPropertyValue('transform-origin');
+  String get transformOrigin => getPropertyValue('transform-origin');
 
   /** Sets the value of "transform-origin" */
   set transformOrigin(String value) {
@@ -8469,8 +8438,7 @@
   }
 
   /** Gets the value of "transform-origin-x" */
-  String get transformOriginX =>
-    getPropertyValue('transform-origin-x');
+  String get transformOriginX => getPropertyValue('transform-origin-x');
 
   /** Sets the value of "transform-origin-x" */
   set transformOriginX(String value) {
@@ -8478,8 +8446,7 @@
   }
 
   /** Gets the value of "transform-origin-y" */
-  String get transformOriginY =>
-    getPropertyValue('transform-origin-y');
+  String get transformOriginY => getPropertyValue('transform-origin-y');
 
   /** Sets the value of "transform-origin-y" */
   set transformOriginY(String value) {
@@ -8487,8 +8454,7 @@
   }
 
   /** Gets the value of "transform-origin-z" */
-  String get transformOriginZ =>
-    getPropertyValue('transform-origin-z');
+  String get transformOriginZ => getPropertyValue('transform-origin-z');
 
   /** Sets the value of "transform-origin-z" */
   set transformOriginZ(String value) {
@@ -8496,22 +8462,22 @@
   }
 
   /** Gets the value of "transform-style" */
-  String get transformStyle =>
-    getPropertyValue('transform-style');
+  String get transformStyle => getPropertyValue('transform-style');
 
   /** Sets the value of "transform-style" */
   set transformStyle(String value) {
     setProperty('transform-style', value, '');
   }
 
-  /** Gets the value of "transition" */@SupportedBrowser(SupportedBrowser.CHROME)
+  /** Gets the value of "transition" */ @SupportedBrowser(
+      SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  String get transition =>
-    getPropertyValue('transition');
+  String get transition => getPropertyValue('transition');
 
-  /** Sets the value of "transition" */@SupportedBrowser(SupportedBrowser.CHROME)
+  /** Sets the value of "transition" */ @SupportedBrowser(
+      SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -8520,8 +8486,7 @@
   }
 
   /** Gets the value of "transition-delay" */
-  String get transitionDelay =>
-    getPropertyValue('transition-delay');
+  String get transitionDelay => getPropertyValue('transition-delay');
 
   /** Sets the value of "transition-delay" */
   set transitionDelay(String value) {
@@ -8529,8 +8494,7 @@
   }
 
   /** Gets the value of "transition-duration" */
-  String get transitionDuration =>
-    getPropertyValue('transition-duration');
+  String get transitionDuration => getPropertyValue('transition-duration');
 
   /** Sets the value of "transition-duration" */
   set transitionDuration(String value) {
@@ -8538,8 +8502,7 @@
   }
 
   /** Gets the value of "transition-property" */
-  String get transitionProperty =>
-    getPropertyValue('transition-property');
+  String get transitionProperty => getPropertyValue('transition-property');
 
   /** Sets the value of "transition-property" */
   set transitionProperty(String value) {
@@ -8548,7 +8511,7 @@
 
   /** Gets the value of "transition-timing-function" */
   String get transitionTimingFunction =>
-    getPropertyValue('transition-timing-function');
+      getPropertyValue('transition-timing-function');
 
   /** Sets the value of "transition-timing-function" */
   set transitionTimingFunction(String value) {
@@ -8556,8 +8519,7 @@
   }
 
   /** Gets the value of "unicode-bidi" */
-  String get unicodeBidi =>
-    getPropertyValue('unicode-bidi');
+  String get unicodeBidi => getPropertyValue('unicode-bidi');
 
   /** Sets the value of "unicode-bidi" */
   set unicodeBidi(String value) {
@@ -8565,8 +8527,7 @@
   }
 
   /** Gets the value of "unicode-range" */
-  String get unicodeRange =>
-    getPropertyValue('unicode-range');
+  String get unicodeRange => getPropertyValue('unicode-range');
 
   /** Sets the value of "unicode-range" */
   set unicodeRange(String value) {
@@ -8574,8 +8535,7 @@
   }
 
   /** Gets the value of "user-drag" */
-  String get userDrag =>
-    getPropertyValue('user-drag');
+  String get userDrag => getPropertyValue('user-drag');
 
   /** Sets the value of "user-drag" */
   set userDrag(String value) {
@@ -8583,8 +8543,7 @@
   }
 
   /** Gets the value of "user-modify" */
-  String get userModify =>
-    getPropertyValue('user-modify');
+  String get userModify => getPropertyValue('user-modify');
 
   /** Sets the value of "user-modify" */
   set userModify(String value) {
@@ -8592,8 +8551,7 @@
   }
 
   /** Gets the value of "user-select" */
-  String get userSelect =>
-    getPropertyValue('user-select');
+  String get userSelect => getPropertyValue('user-select');
 
   /** Sets the value of "user-select" */
   set userSelect(String value) {
@@ -8601,8 +8559,7 @@
   }
 
   /** Gets the value of "user-zoom" */
-  String get userZoom =>
-    getPropertyValue('user-zoom');
+  String get userZoom => getPropertyValue('user-zoom');
 
   /** Sets the value of "user-zoom" */
   set userZoom(String value) {
@@ -8610,8 +8567,7 @@
   }
 
   /** Gets the value of "vertical-align" */
-  String get verticalAlign =>
-    getPropertyValue('vertical-align');
+  String get verticalAlign => getPropertyValue('vertical-align');
 
   /** Sets the value of "vertical-align" */
   set verticalAlign(String value) {
@@ -8619,8 +8575,7 @@
   }
 
   /** Gets the value of "visibility" */
-  String get visibility =>
-    getPropertyValue('visibility');
+  String get visibility => getPropertyValue('visibility');
 
   /** Sets the value of "visibility" */
   set visibility(String value) {
@@ -8628,8 +8583,7 @@
   }
 
   /** Gets the value of "white-space" */
-  String get whiteSpace =>
-    getPropertyValue('white-space');
+  String get whiteSpace => getPropertyValue('white-space');
 
   /** Sets the value of "white-space" */
   set whiteSpace(String value) {
@@ -8637,8 +8591,7 @@
   }
 
   /** Gets the value of "widows" */
-  String get widows =>
-    getPropertyValue('widows');
+  String get widows => getPropertyValue('widows');
 
   /** Sets the value of "widows" */
   set widows(String value) {
@@ -8646,8 +8599,7 @@
   }
 
   /** Gets the value of "width" */
-  String get width =>
-    getPropertyValue('width');
+  String get width => getPropertyValue('width');
 
   /** Sets the value of "width" */
   set width(String value) {
@@ -8655,8 +8607,7 @@
   }
 
   /** Gets the value of "will-change" */
-  String get willChange =>
-    getPropertyValue('will-change');
+  String get willChange => getPropertyValue('will-change');
 
   /** Sets the value of "will-change" */
   set willChange(String value) {
@@ -8664,8 +8615,7 @@
   }
 
   /** Gets the value of "word-break" */
-  String get wordBreak =>
-    getPropertyValue('word-break');
+  String get wordBreak => getPropertyValue('word-break');
 
   /** Sets the value of "word-break" */
   set wordBreak(String value) {
@@ -8673,8 +8623,7 @@
   }
 
   /** Gets the value of "word-spacing" */
-  String get wordSpacing =>
-    getPropertyValue('word-spacing');
+  String get wordSpacing => getPropertyValue('word-spacing');
 
   /** Sets the value of "word-spacing" */
   set wordSpacing(String value) {
@@ -8682,8 +8631,7 @@
   }
 
   /** Gets the value of "word-wrap" */
-  String get wordWrap =>
-    getPropertyValue('word-wrap');
+  String get wordWrap => getPropertyValue('word-wrap');
 
   /** Sets the value of "word-wrap" */
   set wordWrap(String value) {
@@ -8691,8 +8639,7 @@
   }
 
   /** Gets the value of "wrap-flow" */
-  String get wrapFlow =>
-    getPropertyValue('wrap-flow');
+  String get wrapFlow => getPropertyValue('wrap-flow');
 
   /** Sets the value of "wrap-flow" */
   set wrapFlow(String value) {
@@ -8700,8 +8647,7 @@
   }
 
   /** Gets the value of "wrap-through" */
-  String get wrapThrough =>
-    getPropertyValue('wrap-through');
+  String get wrapThrough => getPropertyValue('wrap-through');
 
   /** Sets the value of "wrap-through" */
   set wrapThrough(String value) {
@@ -8709,8 +8655,7 @@
   }
 
   /** Gets the value of "writing-mode" */
-  String get writingMode =>
-    getPropertyValue('writing-mode');
+  String get writingMode => getPropertyValue('writing-mode');
 
   /** Sets the value of "writing-mode" */
   set writingMode(String value) {
@@ -8718,8 +8663,7 @@
   }
 
   /** Gets the value of "z-index" */
-  String get zIndex =>
-    getPropertyValue('z-index');
+  String get zIndex => getPropertyValue('z-index');
 
   /** Sets the value of "z-index" */
   set zIndex(String value) {
@@ -8727,8 +8671,7 @@
   }
 
   /** Gets the value of "zoom" */
-  String get zoom =>
-    getPropertyValue('zoom');
+  String get zoom => getPropertyValue('zoom');
 
   /** Sets the value of "zoom" */
   set zoom(String value) {
@@ -8739,13 +8682,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.
 
-
 @DocsEditable()
 @DomName('CSSStyleRule')
 @Native("CSSStyleRule")
 class CssStyleRule extends CssRule {
   // To suppress missing implicit constructor warnings.
-  factory CssStyleRule._() { throw new UnsupportedError("Not supported"); }
+  factory CssStyleRule._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSStyleRule.selectorText')
   @DocsEditable()
@@ -8759,13 +8703,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.
 
-
 @DocsEditable()
 @DomName('CSSStyleSheet')
 @Native("CSSStyleSheet")
 class CssStyleSheet extends StyleSheet {
   // To suppress missing implicit constructor warnings.
-  factory CssStyleSheet._() { throw new UnsupportedError("Not supported"); }
+  factory CssStyleSheet._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSStyleSheet.cssRules')
   @DocsEditable()
@@ -8787,32 +8732,33 @@
   @DomName('CSSStyleSheet.addRule')
   @DocsEditable()
   @Experimental() // non-standard
-  int addRule(String selector, String style, [int index]) native;
+  int addRule(String selector, String style, [int index]) native ;
 
   @DomName('CSSStyleSheet.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) native;
+  void deleteRule(int index) native ;
 
   @DomName('CSSStyleSheet.insertRule')
   @DocsEditable()
-  int insertRule(String rule, [int index]) native;
+  int insertRule(String rule, [int index]) native ;
 
   @DomName('CSSStyleSheet.removeRule')
   @DocsEditable()
   @Experimental() // non-standard
-  void removeRule(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.
 
-
 @DocsEditable()
 @DomName('CSSSupportsRule')
 @Native("CSSSupportsRule")
 class CssSupportsRule extends CssRule {
   // To suppress missing implicit constructor warnings.
-  factory CssSupportsRule._() { throw new UnsupportedError("Not supported"); }
+  factory CssSupportsRule._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSSupportsRule.conditionText')
   @DocsEditable()
@@ -8826,24 +8772,25 @@
 
   @DomName('CSSSupportsRule.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) native;
+  void deleteRule(int index) native ;
 
   @DomName('CSSSupportsRule.insertRule')
   @DocsEditable()
-  int insertRule(String rule, 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.
 
-
 @DocsEditable()
 @DomName('CSSViewportRule')
 @Experimental() // untriaged
 @Native("CSSViewportRule")
 class CssViewportRule extends CssRule {
   // To suppress missing implicit constructor warnings.
-  factory CssViewportRule._() { throw new UnsupportedError("Not supported"); }
+  factory CssViewportRule._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSViewportRule.style')
   @DocsEditable()
@@ -8856,16 +8803,14 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('CustomEvent')
 @Native("CustomEvent")
 class CustomEvent extends Event {
-    @Creates('Null')  // Set from Dart code; does not instantiate a native type.
+  @Creates('Null') // Set from Dart code; does not instantiate a native type.
   var _dartDetail;
 
   factory CustomEvent(String type,
       {bool canBubble: true, bool cancelable: true, Object detail}) {
-
     final CustomEvent e = document._createEvent('CustomEvent');
 
     e._dartDetail = detail;
@@ -8876,7 +8821,7 @@
       try {
         detail = convertDartToNative_SerializedScriptValue(detail);
         e._initCustomEvent(type, canBubble, cancelable, detail);
-      } catch(_) {
+      } catch (_) {
         e._initCustomEvent(type, canBubble, cancelable, null);
       }
     } else {
@@ -8903,13 +8848,16 @@
     }
     return CustomEvent._create_2(type);
   }
-  static CustomEvent _create_1(type, eventInitDict) => JS('CustomEvent', 'new CustomEvent(#,#)', type, eventInitDict);
-  static CustomEvent _create_2(type) => JS('CustomEvent', 'new CustomEvent(#)', type);
+  static CustomEvent _create_1(type, eventInitDict) =>
+      JS('CustomEvent', 'new CustomEvent(#,#)', type, eventInitDict);
+  static CustomEvent _create_2(type) =>
+      JS('CustomEvent', 'new CustomEvent(#)', type);
 
   @DomName('CustomEvent._detail')
   @DocsEditable()
   @Experimental() // untriaged
-  dynamic get _detail => convertNativeToDart_SerializedScriptValue(this._get__detail);
+  dynamic get _detail =>
+      convertNativeToDart_SerializedScriptValue(this._get__detail);
   @JSName('detail')
   @DomName('CustomEvent._detail')
   @DocsEditable()
@@ -8920,20 +8868,21 @@
   @JSName('initCustomEvent')
   @DomName('CustomEvent.initCustomEvent')
   @DocsEditable()
-  void _initCustomEvent(String type, bool bubbles, bool cancelable, Object detail) native;
-
+  void _initCustomEvent(
+      String type, bool bubbles, bool cancelable, Object 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.
 
-
 @DocsEditable()
 @DomName('HTMLDListElement')
 @Native("HTMLDListElement")
 class DListElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory DListElement._() { throw new UnsupportedError("Not supported"); }
+  factory DListElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLDListElement.HTMLDListElement')
   @DocsEditable()
@@ -8949,7 +8898,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.
 
-
 @DocsEditable()
 @DomName('HTMLDataListElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -8959,7 +8907,9 @@
 @Native("HTMLDataListElement")
 class DataListElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory DataListElement._() { throw new UnsupportedError("Not supported"); }
+  factory DataListElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLDataListElement.HTMLDataListElement')
   @DocsEditable()
@@ -8984,14 +8934,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.
 
-
 @DocsEditable()
 @DomName('DataTransfer')
 @Experimental() // untriaged
 @Native("DataTransfer")
 class DataTransfer extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DataTransfer._() { throw new UnsupportedError("Not supported"); }
+  factory DataTransfer._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DataTransfer.dropEffect')
   @DocsEditable()
@@ -9023,28 +8974,27 @@
   @DomName('DataTransfer.clearData')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearData([String format]) native;
+  void clearData([String format]) native ;
 
   @DomName('DataTransfer.getData')
   @DocsEditable()
   @Experimental() // untriaged
-  String getData(String format) native;
+  String getData(String format) native ;
 
   @DomName('DataTransfer.setData')
   @DocsEditable()
   @Experimental() // untriaged
-  void setData(String format, String data) native;
+  void setData(String format, String data) native ;
 
   @DomName('DataTransfer.setDragImage')
   @DocsEditable()
   @Experimental() // untriaged
-  void setDragImage(Element image, int x, int y) native;
+  void setDragImage(Element 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.
 
-
 @DocsEditable()
 @DomName('DataTransferItem')
 // http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html#the-datatransferitem-interface
@@ -9052,7 +9002,9 @@
 @Native("DataTransferItem")
 class DataTransferItem extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DataTransferItem._() { throw new UnsupportedError("Not supported"); }
+  factory DataTransferItem._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DataTransferItem.kind')
   @DocsEditable()
@@ -9064,20 +9016,21 @@
 
   @DomName('DataTransferItem.getAsFile')
   @DocsEditable()
-  Blob getAsFile() native;
+  Blob getAsFile() native ;
 
   @JSName('getAsString')
   @DomName('DataTransferItem.getAsString')
   @DocsEditable()
-  void _getAsString(_StringCallback callback) native;
+  void _getAsString(_StringCallback callback) native ;
 
   @JSName('getAsString')
   @DomName('DataTransferItem.getAsString')
   @DocsEditable()
   Future<String> getAsString() {
     var completer = new Completer<String>();
-    _getAsString(
-        (value) { completer.complete(value); });
+    _getAsString((value) {
+      completer.complete(value);
+    });
     return completer.future;
   }
 
@@ -9087,13 +9040,12 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  Entry getAsEntry() native;
+  Entry getAsEntry() native ;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('DataTransferItemList')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-datatransferitemlist-interface
@@ -9101,7 +9053,9 @@
 @Native("DataTransferItemList")
 class DataTransferItemList extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DataTransferItemList._() { throw new UnsupportedError("Not supported"); }
+  factory DataTransferItemList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DataTransferItemList.length')
   @DocsEditable()
@@ -9109,36 +9063,34 @@
 
   @DomName('DataTransferItemList.add')
   @DocsEditable()
-  DataTransferItem add(data_OR_file, [String type]) native;
+  DataTransferItem add(data_OR_file, [String type]) native ;
 
   @JSName('add')
   @DomName('DataTransferItemList.add')
   @DocsEditable()
-  DataTransferItem addData(String data, String type) native;
+  DataTransferItem addData(String data, String type) native ;
 
   @JSName('add')
   @DomName('DataTransferItemList.add')
   @DocsEditable()
-  DataTransferItem addFile(File file) native;
+  DataTransferItem addFile(File file) native ;
 
   @DomName('DataTransferItemList.clear')
   @DocsEditable()
-  void clear() native;
+  void clear() native ;
 
   @DomName('DataTransferItemList.item')
   @DocsEditable()
-  DataTransferItem item(int index) native;
+  DataTransferItem item(int index) native ;
 
   @DomName('DataTransferItemList.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(int index) native;
+  void remove(int index) native ;
 
-
-  DataTransferItem operator[] (int index) {
+  DataTransferItem operator [](int index) {
     return JS('DataTransferItem', '#[#]', this, 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
@@ -9146,7 +9098,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('DatabaseCallback')
 // http://www.w3.org/TR/webdatabase/#databasecallback
 @Experimental() // deprecated
@@ -9155,14 +9106,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.
 
-
 @DocsEditable()
 @DomName('DedicatedWorkerGlobalScope')
 @Experimental() // untriaged
 @Native("DedicatedWorkerGlobalScope")
 class DedicatedWorkerGlobalScope extends WorkerGlobalScope {
   // To suppress missing implicit constructor warnings.
-  factory DedicatedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+  factory DedicatedWorkerGlobalScope._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `message` events to event
@@ -9173,7 +9125,8 @@
   @DomName('DedicatedWorkerGlobalScope.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   @DomName('DedicatedWorkerGlobalScope.postMessage')
   @DocsEditable()
@@ -9188,16 +9141,17 @@
     _postMessage_2(message_1);
     return;
   }
+
   @JSName('postMessage')
   @DomName('DedicatedWorkerGlobalScope.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_1(message, List<MessagePort> transfer) native;
+  void _postMessage_1(message, List<MessagePort> transfer) native ;
   @JSName('postMessage')
   @DomName('DedicatedWorkerGlobalScope.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_2(message) native;
+  void _postMessage_2(message) native ;
 
   /// Stream of `message` events handled by this [DedicatedWorkerGlobalScope].
   @DomName('DedicatedWorkerGlobalScope.onmessage')
@@ -9209,14 +9163,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.
 
-
 @DocsEditable()
 @DomName('DefaultSessionStartEvent')
 @Experimental() // untriaged
 @Native("DefaultSessionStartEvent")
 class DefaultSessionStartEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory DefaultSessionStartEvent._() { throw new UnsupportedError("Not supported"); }
+  factory DefaultSessionStartEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DefaultSessionStartEvent.DefaultSessionStartEvent')
   @DocsEditable()
@@ -9227,8 +9182,13 @@
     }
     return DefaultSessionStartEvent._create_2(type);
   }
-  static DefaultSessionStartEvent _create_1(type, eventInitDict) => JS('DefaultSessionStartEvent', 'new DefaultSessionStartEvent(#,#)', type, eventInitDict);
-  static DefaultSessionStartEvent _create_2(type) => JS('DefaultSessionStartEvent', 'new DefaultSessionStartEvent(#)', type);
+  static DefaultSessionStartEvent _create_1(type, eventInitDict) => JS(
+      'DefaultSessionStartEvent',
+      'new DefaultSessionStartEvent(#,#)',
+      type,
+      eventInitDict);
+  static DefaultSessionStartEvent _create_2(type) =>
+      JS('DefaultSessionStartEvent', 'new DefaultSessionStartEvent(#)', type);
 
   @DomName('DefaultSessionStartEvent.session')
   @DocsEditable()
@@ -9239,14 +9199,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.
 
-
 @DocsEditable()
 @DomName('DeprecatedStorageInfo')
 @Experimental() // untriaged
 @Native("DeprecatedStorageInfo")
 class DeprecatedStorageInfo extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DeprecatedStorageInfo._() { throw new UnsupportedError("Not supported"); }
+  factory DeprecatedStorageInfo._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DeprecatedStorageInfo.PERSISTENT')
   @DocsEditable()
@@ -9261,41 +9222,48 @@
   @DomName('DeprecatedStorageInfo.queryUsageAndQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void queryUsageAndQuota(int storageType, [StorageUsageCallback usageCallback, StorageErrorCallback errorCallback]) native;
+  void queryUsageAndQuota(int storageType,
+      [StorageUsageCallback usageCallback,
+      StorageErrorCallback errorCallback]) native ;
 
   @DomName('DeprecatedStorageInfo.requestQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestQuota(int storageType, int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) native;
+  void requestQuota(int storageType, int newQuotaInBytes,
+      [StorageQuotaCallback quotaCallback,
+      StorageErrorCallback 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.
 
-
 @DocsEditable()
 @DomName('DeprecatedStorageQuota')
 @Experimental() // untriaged
 @Native("DeprecatedStorageQuota")
 class DeprecatedStorageQuota extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DeprecatedStorageQuota._() { throw new UnsupportedError("Not supported"); }
+  factory DeprecatedStorageQuota._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DeprecatedStorageQuota.queryUsageAndQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void queryUsageAndQuota(StorageUsageCallback usageCallback, [StorageErrorCallback errorCallback]) native;
+  void queryUsageAndQuota(StorageUsageCallback usageCallback,
+      [StorageErrorCallback errorCallback]) native ;
 
   @DomName('DeprecatedStorageQuota.requestQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestQuota(int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) native;
+  void requestQuota(int newQuotaInBytes,
+      [StorageQuotaCallback quotaCallback,
+      StorageErrorCallback 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.
 
-
 @DocsEditable()
 @DomName('HTMLDetailsElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -9304,7 +9272,9 @@
 @Native("HTMLDetailsElement")
 class DetailsElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory DetailsElement._() { throw new UnsupportedError("Not supported"); }
+  factory DetailsElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLDetailsElement.HTMLDetailsElement')
   @DocsEditable()
@@ -9327,7 +9297,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.
 
-
 @DocsEditable()
 @DomName('DeviceAcceleration')
 // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
@@ -9335,7 +9304,9 @@
 @Native("DeviceAcceleration")
 class DeviceAcceleration extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DeviceAcceleration._() { throw new UnsupportedError("Not supported"); }
+  factory DeviceAcceleration._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DeviceAcceleration.x')
   @DocsEditable()
@@ -9353,14 +9324,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.
 
-
 @DocsEditable()
 @DomName('DeviceLightEvent')
 @Experimental() // untriaged
 @Native("DeviceLightEvent")
 class DeviceLightEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory DeviceLightEvent._() { throw new UnsupportedError("Not supported"); }
+  factory DeviceLightEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DeviceLightEvent.DeviceLightEvent')
   @DocsEditable()
@@ -9371,8 +9343,10 @@
     }
     return DeviceLightEvent._create_2(type);
   }
-  static DeviceLightEvent _create_1(type, eventInitDict) => JS('DeviceLightEvent', 'new DeviceLightEvent(#,#)', type, eventInitDict);
-  static DeviceLightEvent _create_2(type) => JS('DeviceLightEvent', 'new DeviceLightEvent(#)', type);
+  static DeviceLightEvent _create_1(type, eventInitDict) =>
+      JS('DeviceLightEvent', 'new DeviceLightEvent(#,#)', type, eventInitDict);
+  static DeviceLightEvent _create_2(type) =>
+      JS('DeviceLightEvent', 'new DeviceLightEvent(#)', type);
 
   @DomName('DeviceLightEvent.value')
   @DocsEditable()
@@ -9383,7 +9357,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.
 
-
 @DocsEditable()
 @DomName('DeviceMotionEvent')
 // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
@@ -9391,7 +9364,9 @@
 @Native("DeviceMotionEvent")
 class DeviceMotionEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory DeviceMotionEvent._() { throw new UnsupportedError("Not supported"); }
+  factory DeviceMotionEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DeviceMotionEvent.acceleration')
   @DocsEditable()
@@ -9412,7 +9387,14 @@
   @DomName('DeviceMotionEvent.initDeviceMotionEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  void initDeviceMotionEvent(String type, bool bubbles, bool cancelable, DeviceAcceleration acceleration, DeviceAcceleration accelerationIncludingGravity, DeviceRotationRate rotationRate, num interval) native;
+  void initDeviceMotionEvent(
+      String type,
+      bool bubbles,
+      bool cancelable,
+      DeviceAcceleration acceleration,
+      DeviceAcceleration accelerationIncludingGravity,
+      DeviceRotationRate rotationRate,
+      num interval) native ;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -9426,15 +9408,21 @@
 @Native("DeviceOrientationEvent")
 class DeviceOrientationEvent extends Event {
   factory DeviceOrientationEvent(String type,
-      {bool canBubble: true, bool cancelable: true, num alpha: 0, num beta: 0,
-      num gamma: 0, bool absolute: false}) {
+      {bool canBubble: true,
+      bool cancelable: true,
+      num alpha: 0,
+      num beta: 0,
+      num gamma: 0,
+      bool absolute: false}) {
     DeviceOrientationEvent e = document._createEvent("DeviceOrientationEvent");
-    e._initDeviceOrientationEvent(type, canBubble, cancelable, alpha, beta,
-        gamma, absolute);
+    e._initDeviceOrientationEvent(
+        type, canBubble, cancelable, alpha, beta, gamma, absolute);
     return e;
   }
   // To suppress missing implicit constructor warnings.
-  factory DeviceOrientationEvent._() { throw new UnsupportedError("Not supported"); }
+  factory DeviceOrientationEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DeviceOrientationEvent.absolute')
   @DocsEditable()
@@ -9455,14 +9443,13 @@
   @JSName('initDeviceOrientationEvent')
   @DomName('DeviceOrientationEvent.initDeviceOrientationEvent')
   @DocsEditable()
-  void _initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) native;
-
+  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.
 
-
 @DocsEditable()
 @DomName('DeviceRotationRate')
 // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
@@ -9470,7 +9457,9 @@
 @Native("DeviceRotationRate")
 class DeviceRotationRate extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DeviceRotationRate._() { throw new UnsupportedError("Not supported"); }
+  factory DeviceRotationRate._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DeviceRotationRate.alpha')
   @DocsEditable()
@@ -9488,14 +9477,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.
 
-
 @DocsEditable()
 @DomName('HTMLDialogElement')
 @Unstable()
 @Native("HTMLDialogElement")
 class DialogElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory DialogElement._() { throw new UnsupportedError("Not supported"); }
+  factory DialogElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -9514,35 +9504,33 @@
 
   @DomName('HTMLDialogElement.close')
   @DocsEditable()
-  void close(String returnValue) native;
+  void close(String returnValue) native ;
 
   @DomName('HTMLDialogElement.show')
   @DocsEditable()
-  void show() native;
+  void show() native ;
 
   @DomName('HTMLDialogElement.showModal')
   @DocsEditable()
-  void showModal() native;
+  void showModal() native ;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for 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('DirectoryEntry')
 // http://www.w3.org/TR/file-system-api/#the-directoryentry-interface
 @Experimental()
 @Native("DirectoryEntry")
 class DirectoryEntry extends Entry {
-
   /**
    * Create a new directory with the specified `path`. If `exclusive` is true,
    * the returned Future will complete with an error if a directory already
    * exists with the specified `path`.
    */
   Future<Entry> createDirectory(String path, {bool exclusive: false}) {
-    return _getDirectory(path, options:
-        {'create': true, 'exclusive': exclusive});
+    return _getDirectory(path,
+        options: {'create': true, 'exclusive': exclusive});
   }
 
   /**
@@ -9571,16 +9559,22 @@
   Future<Entry> getFile(String path) {
     return _getFile(path);
   }
+
   // To suppress missing implicit constructor warnings.
-  factory DirectoryEntry._() { throw new UnsupportedError("Not supported"); }
+  factory DirectoryEntry._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DirectoryEntry.createReader')
   @DocsEditable()
-  DirectoryReader createReader() native;
+  DirectoryReader createReader() native ;
 
   @DomName('DirectoryEntry.getDirectory')
   @DocsEditable()
-  void __getDirectory(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
+  void __getDirectory(String path,
+      {Map options,
+      _EntryCallback successCallback,
+      _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
       var options_1 = convertDartToNative_Dictionary(options);
       __getDirectory_1(path, options_1, successCallback, errorCallback);
@@ -9599,37 +9593,44 @@
     __getDirectory_4(path);
     return;
   }
+
   @JSName('getDirectory')
   @DomName('DirectoryEntry.getDirectory')
   @DocsEditable()
-  void __getDirectory_1(path, options, _EntryCallback successCallback, _ErrorCallback errorCallback) native;
+  void __getDirectory_1(path, options, _EntryCallback successCallback,
+      _ErrorCallback errorCallback) native ;
   @JSName('getDirectory')
   @DomName('DirectoryEntry.getDirectory')
   @DocsEditable()
-  void __getDirectory_2(path, options, _EntryCallback successCallback) native;
+  void __getDirectory_2(path, options, _EntryCallback successCallback) native ;
   @JSName('getDirectory')
   @DomName('DirectoryEntry.getDirectory')
   @DocsEditable()
-  void __getDirectory_3(path, options) native;
+  void __getDirectory_3(path, options) native ;
   @JSName('getDirectory')
   @DomName('DirectoryEntry.getDirectory')
   @DocsEditable()
-  void __getDirectory_4(path) native;
+  void __getDirectory_4(path) native ;
 
   @JSName('getDirectory')
   @DomName('DirectoryEntry.getDirectory')
   @DocsEditable()
   Future<Entry> _getDirectory(String path, {Map options}) {
     var completer = new Completer<Entry>();
-    __getDirectory(path, options : options,
-        successCallback : (value) { completer.complete(value); },
-        errorCallback : (error) { completer.completeError(error); });
+    __getDirectory(path, options: options, successCallback: (value) {
+      completer.complete(value);
+    }, errorCallback: (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
   @DomName('DirectoryEntry.getFile')
   @DocsEditable()
-  void __getFile(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
+  void __getFile(String path,
+      {Map options,
+      _EntryCallback successCallback,
+      _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
       var options_1 = convertDartToNative_Dictionary(options);
       __getFile_1(path, options_1, successCallback, errorCallback);
@@ -9648,56 +9649,61 @@
     __getFile_4(path);
     return;
   }
+
   @JSName('getFile')
   @DomName('DirectoryEntry.getFile')
   @DocsEditable()
-  void __getFile_1(path, options, _EntryCallback successCallback, _ErrorCallback errorCallback) native;
+  void __getFile_1(path, options, _EntryCallback successCallback,
+      _ErrorCallback errorCallback) native ;
   @JSName('getFile')
   @DomName('DirectoryEntry.getFile')
   @DocsEditable()
-  void __getFile_2(path, options, _EntryCallback successCallback) native;
+  void __getFile_2(path, options, _EntryCallback successCallback) native ;
   @JSName('getFile')
   @DomName('DirectoryEntry.getFile')
   @DocsEditable()
-  void __getFile_3(path, options) native;
+  void __getFile_3(path, options) native ;
   @JSName('getFile')
   @DomName('DirectoryEntry.getFile')
   @DocsEditable()
-  void __getFile_4(path) native;
+  void __getFile_4(path) native ;
 
   @JSName('getFile')
   @DomName('DirectoryEntry.getFile')
   @DocsEditable()
   Future<Entry> _getFile(String path, {Map options}) {
     var completer = new Completer<Entry>();
-    __getFile(path, options : options,
-        successCallback : (value) { completer.complete(value); },
-        errorCallback : (error) { completer.completeError(error); });
+    __getFile(path, options: options, successCallback: (value) {
+      completer.complete(value);
+    }, errorCallback: (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
   @JSName('removeRecursively')
   @DomName('DirectoryEntry.removeRecursively')
   @DocsEditable()
-  void _removeRecursively(VoidCallback successCallback, [_ErrorCallback errorCallback]) native;
+  void _removeRecursively(VoidCallback successCallback,
+      [_ErrorCallback errorCallback]) native ;
 
   @JSName('removeRecursively')
   @DomName('DirectoryEntry.removeRecursively')
   @DocsEditable()
   Future removeRecursively() {
     var completer = new Completer();
-    _removeRecursively(
-        () { completer.complete(); },
-        (error) { completer.completeError(error); });
+    _removeRecursively(() {
+      completer.complete();
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('DirectoryReader')
 // http://www.w3.org/TR/file-system-api/#the-directoryreader-interface
@@ -9705,21 +9711,26 @@
 @Native("DirectoryReader")
 class DirectoryReader extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DirectoryReader._() { throw new UnsupportedError("Not supported"); }
+  factory DirectoryReader._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('readEntries')
   @DomName('DirectoryReader.readEntries')
   @DocsEditable()
-  void _readEntries(_EntriesCallback successCallback, [_ErrorCallback errorCallback]) native;
+  void _readEntries(_EntriesCallback successCallback,
+      [_ErrorCallback errorCallback]) native ;
 
   @JSName('readEntries')
   @DomName('DirectoryReader.readEntries')
   @DocsEditable()
   Future<List<Entry>> readEntries() {
     var completer = new Completer<List<Entry>>();
-    _readEntries(
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
+    _readEntries((value) {
+      completer.complete(value);
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 }
@@ -9727,7 +9738,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.
 
-
 @DocsEditable()
 /**
  * A generic container for content on an HTML page;
@@ -9755,7 +9765,9 @@
 @Native("HTMLDivElement")
 class DivElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory DivElement._() { throw new UnsupportedError("Not supported"); }
+  factory DivElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLDivElement.HTMLDivElement')
   @DocsEditable()
@@ -9771,7 +9783,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.
 
-
 @DocsEditable()
 /**
  * The base class for all documents.
@@ -9784,21 +9795,23 @@
  */
 @DomName('Document')
 @Native("Document")
-class Document extends Node
-{
-
+class Document extends Node {
   // To suppress missing implicit constructor warnings.
-  factory Document._() { throw new UnsupportedError("Not supported"); }
+  factory Document._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Document.pointerlockchangeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> pointerLockChangeEvent = const EventStreamProvider<Event>('pointerlockchange');
+  static const EventStreamProvider<Event> pointerLockChangeEvent =
+      const EventStreamProvider<Event>('pointerlockchange');
 
   @DomName('Document.pointerlockerrorEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> pointerLockErrorEvent = const EventStreamProvider<Event>('pointerlockerror');
+  static const EventStreamProvider<Event> pointerLockErrorEvent =
+      const EventStreamProvider<Event>('pointerlockerror');
 
   /**
    * Static factory designed to expose `readystatechange` events to event
@@ -9808,7 +9821,8 @@
    */
   @DomName('Document.readystatechangeEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> readyStateChangeEvent = const EventStreamProvider<Event>('readystatechange');
+  static const EventStreamProvider<Event> readyStateChangeEvent =
+      const EventStreamProvider<Event>('readystatechange');
 
   /**
    * Static factory designed to expose `securitypolicyviolation` events to event
@@ -9820,7 +9834,10 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
   @Experimental()
-  static const EventStreamProvider<SecurityPolicyViolationEvent> securityPolicyViolationEvent = const EventStreamProvider<SecurityPolicyViolationEvent>('securitypolicyviolation');
+  static const EventStreamProvider<SecurityPolicyViolationEvent>
+      securityPolicyViolationEvent =
+      const EventStreamProvider<SecurityPolicyViolationEvent>(
+          'securitypolicyviolation');
 
   /**
    * Static factory designed to expose `selectionchange` events to event
@@ -9830,7 +9847,8 @@
    */
   @DomName('Document.selectionchangeEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> selectionChangeEvent = const EventStreamProvider<Event>('selectionchange');
+  static const EventStreamProvider<Event> selectionChangeEvent =
+      const EventStreamProvider<Event>('selectionchange');
 
   @DomName('Document.activeElement')
   @DocsEditable()
@@ -10012,142 +10030,159 @@
 
   @DomName('Document.adoptNode')
   @DocsEditable()
-  Node adoptNode(Node node) native;
+  Node adoptNode(Node node) native ;
 
   @JSName('caretRangeFromPoint')
   @DomName('Document.caretRangeFromPoint')
   @DocsEditable()
   // http://www.w3.org/TR/2009/WD-cssom-view-20090804/#dom-documentview-caretrangefrompoint
   @Experimental()
-  Range _caretRangeFromPoint(int x, int y) native;
+  Range _caretRangeFromPoint(int x, int y) native ;
 
   @DomName('Document.createDocumentFragment')
   @DocsEditable()
-  DocumentFragment createDocumentFragment() native;
+  DocumentFragment createDocumentFragment() native ;
 
   @JSName('createElement')
   @DomName('Document.createElement')
   @DocsEditable()
-  Element _createElement(String localName_OR_tagName, [String typeExtension]) native;
+  Element _createElement(String localName_OR_tagName, [String typeExtension])
+      native ;
 
   @JSName('createElementNS')
   @DomName('Document.createElementNS')
   @DocsEditable()
-  Element _createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) native;
+  Element _createElementNS(String namespaceURI, String qualifiedName,
+      [String typeExtension]) native ;
 
   @JSName('createEvent')
   @DomName('Document.createEvent')
   @DocsEditable()
-  Event _createEvent(String eventType) native;
+  Event _createEvent(String eventType) native ;
 
   @DomName('Document.createRange')
   @DocsEditable()
-  Range createRange() native;
+  Range createRange() native ;
 
   @JSName('createTextNode')
   @DomName('Document.createTextNode')
   @DocsEditable()
-  Text _createTextNode(String data) native;
+  Text _createTextNode(String data) native ;
 
   @DomName('Document.createTouch')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Touch _createTouch(Window window, EventTarget target, int identifier, num pageX, num pageY, num screenX, num screenY, num radiusX, num radiusY, num rotationAngle, num force) {
+  Touch _createTouch(
+      Window window,
+      EventTarget target,
+      int identifier,
+      num pageX,
+      num pageY,
+      num screenX,
+      num screenY,
+      num radiusX,
+      num radiusY,
+      num rotationAngle,
+      num force) {
     var target_1 = _convertDartToNative_EventTarget(target);
-    return _createTouch_1(window, target_1, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force);
+    return _createTouch_1(window, target_1, identifier, pageX, pageY, screenX,
+        screenY, radiusX, radiusY, rotationAngle, force);
   }
+
   @JSName('createTouch')
   @DomName('Document.createTouch')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Touch _createTouch_1(Window window, target, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force) native;
+  Touch _createTouch_1(Window window, target, identifier, pageX, pageY, screenX,
+      screenY, radiusX, radiusY, rotationAngle, force) native ;
 
   @JSName('createTouchList')
   @DomName('Document.createTouchList')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  TouchList _createTouchList(Touch touches) native;
+  TouchList _createTouchList(Touch touches) native ;
 
   @JSName('elementFromPoint')
   @DomName('Document.elementFromPoint')
   @DocsEditable()
-  Element _elementFromPoint(int x, int y) native;
+  Element _elementFromPoint(int x, int y) native ;
 
   @DomName('Document.elementsFromPoint')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Element> elementsFromPoint(int x, int y) native;
+  List<Element> elementsFromPoint(int x, int y) native ;
 
   @DomName('Document.execCommand')
   @DocsEditable()
-  bool execCommand(String commandId, [bool showUI, String value]) native;
+  bool execCommand(String commandId, [bool showUI, String value]) native ;
 
   @DomName('Document.exitFullscreen')
   @DocsEditable()
   @Experimental() // untriaged
-  void exitFullscreen() native;
+  void exitFullscreen() native ;
 
   @DomName('Document.exitPointerLock')
   @DocsEditable()
   @Experimental() // untriaged
-  void exitPointerLock() native;
+  void exitPointerLock() native ;
 
   @JSName('getCSSCanvasContext')
   @DomName('Document.getCSSCanvasContext')
   @DocsEditable()
   // https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Articles/Functions.html
   @Experimental() // non-standard
-  Object _getCssCanvasContext(String contextId, String name, int width, int height) native;
+  Object _getCssCanvasContext(
+      String contextId, String name, int width, int height) native ;
 
   @DomName('Document.getElementsByClassName')
   @DocsEditable()
   @Creates('NodeList|HtmlCollection')
   @Returns('NodeList|HtmlCollection')
-  List<Node> getElementsByClassName(String classNames) native;
+  List<Node> getElementsByClassName(String classNames) native ;
 
   @DomName('Document.getElementsByName')
   @DocsEditable()
   @Creates('NodeList|HtmlCollection')
   @Returns('NodeList|HtmlCollection')
-  List<Node> getElementsByName(String elementName) native;
+  List<Node> getElementsByName(String elementName) native ;
 
   @DomName('Document.getElementsByTagName')
   @DocsEditable()
   @Creates('NodeList|HtmlCollection')
   @Returns('NodeList|HtmlCollection')
-  List<Node> getElementsByTagName(String localName) native;
+  List<Node> getElementsByTagName(String localName) native ;
 
   @DomName('Document.importNode')
   @DocsEditable()
-  Node importNode(Node node, [bool deep]) native;
+  Node importNode(Node node, [bool deep]) native ;
 
   @DomName('Document.queryCommandEnabled')
   @DocsEditable()
-  bool queryCommandEnabled(String commandId) native;
+  bool queryCommandEnabled(String commandId) native ;
 
   @DomName('Document.queryCommandIndeterm')
   @DocsEditable()
-  bool queryCommandIndeterm(String commandId) native;
+  bool queryCommandIndeterm(String commandId) native ;
 
   @DomName('Document.queryCommandState')
   @DocsEditable()
-  bool queryCommandState(String commandId) native;
+  bool queryCommandState(String commandId) native ;
 
   @DomName('Document.queryCommandSupported')
   @DocsEditable()
-  bool queryCommandSupported(String commandId) native;
+  bool queryCommandSupported(String commandId) native ;
 
   @DomName('Document.queryCommandValue')
   @DocsEditable()
-  String queryCommandValue(String commandId) native;
+  String queryCommandValue(String commandId) native ;
 
   @DomName('Document.transformDocumentToTreeView')
   @DocsEditable()
   @Experimental() // untriaged
-  void transformDocumentToTreeView(String noStyleMessage) native;
+  void transformDocumentToTreeView(String noStyleMessage) native ;
 
   @JSName('webkitExitFullscreen')
   @DomName('Document.webkitExitFullscreen')
@@ -10156,13 +10191,13 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
-  void _webkitExitFullscreen() native;
+  void _webkitExitFullscreen() native ;
 
   // From NonElementParentNode
 
   @DomName('Document.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) native;
+  Element getElementById(String elementId) native ;
 
   // From ParentNode
 
@@ -10207,14 +10242,14 @@
    */
   @DomName('Document.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) native;
+  Element querySelector(String selectors) native ;
 
   @JSName('querySelectorAll')
   @DomName('Document.querySelectorAll')
   @DocsEditable()
   @Returns('NodeList')
   @Creates('NodeList')
-  List<Node> _querySelectorAll(String selectors) native;
+  List<Node> _querySelectorAll(String selectors) native ;
 
   /// Stream of `abort` events handled by this [Document].
   @DomName('Document.onabort')
@@ -10249,7 +10284,8 @@
   @DomName('Document.oncanplaythrough')
   @DocsEditable()
   @Experimental() // untriaged
-  Stream<Event> get onCanPlayThrough => Element.canPlayThroughEvent.forTarget(this);
+  Stream<Event> get onCanPlayThrough =>
+      Element.canPlayThroughEvent.forTarget(this);
 
   /// Stream of `change` events handled by this [Document].
   @DomName('Document.onchange')
@@ -10264,7 +10300,8 @@
   /// Stream of `contextmenu` events handled by this [Document].
   @DomName('Document.oncontextmenu')
   @DocsEditable()
-  Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
+  Stream<MouseEvent> get onContextMenu =>
+      Element.contextMenuEvent.forTarget(this);
 
   /// Stream of `copy` events handled by this [Document].
   @DomName('Document.oncopy')
@@ -10319,7 +10356,8 @@
   @DomName('Document.ondurationchange')
   @DocsEditable()
   @Experimental() // untriaged
-  Stream<Event> get onDurationChange => Element.durationChangeEvent.forTarget(this);
+  Stream<Event> get onDurationChange =>
+      Element.durationChangeEvent.forTarget(this);
 
   @DomName('Document.onemptied')
   @DocsEditable()
@@ -10379,7 +10417,8 @@
   @DomName('Document.onloadedmetadata')
   @DocsEditable()
   @Experimental() // untriaged
-  Stream<Event> get onLoadedMetadata => Element.loadedMetadataEvent.forTarget(this);
+  Stream<Event> get onLoadedMetadata =>
+      Element.loadedMetadataEvent.forTarget(this);
 
   /// Stream of `mousedown` events handled by this [Document].
   @DomName('Document.onmousedown')
@@ -10390,13 +10429,15 @@
   @DomName('Document.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
-  Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseEnter =>
+      Element.mouseEnterEvent.forTarget(this);
 
   /// Stream of `mouseleave` events handled by this [Document].
   @DomName('Document.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
-  Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseLeave =>
+      Element.mouseLeaveEvent.forTarget(this);
 
   /// Stream of `mousemove` events handled by this [Document].
   @DomName('Document.onmousemove')
@@ -10421,7 +10462,8 @@
   /// Stream of `mousewheel` events handled by this [Document].
   @DomName('Document.onmousewheel')
   @DocsEditable()
-  Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
+  Stream<WheelEvent> get onMouseWheel =>
+      Element.mouseWheelEvent.forTarget(this);
 
   /// Stream of `paste` events handled by this [Document].
   @DomName('Document.onpaste')
@@ -10446,7 +10488,8 @@
   @DomName('Document.onpointerlockchange')
   @DocsEditable()
   @Experimental() // untriaged
-  Stream<Event> get onPointerLockChange => pointerLockChangeEvent.forTarget(this);
+  Stream<Event> get onPointerLockChange =>
+      pointerLockChangeEvent.forTarget(this);
 
   @DomName('Document.onpointerlockerror')
   @DocsEditable()
@@ -10490,7 +10533,8 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#widl-Document-onsecuritypolicyviolation
   @Experimental()
-  Stream<SecurityPolicyViolationEvent> get onSecurityPolicyViolation => securityPolicyViolationEvent.forTarget(this);
+  Stream<SecurityPolicyViolationEvent> get onSecurityPolicyViolation =>
+      securityPolicyViolationEvent.forTarget(this);
 
   @DomName('Document.onseeked')
   @DocsEditable()
@@ -10542,7 +10586,8 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchCancel =>
+      Element.touchCancelEvent.forTarget(this);
 
   /// Stream of `touchend` events handled by this [Document].
   @DomName('Document.ontouchend')
@@ -10563,7 +10608,8 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchStart =>
+      Element.touchStartEvent.forTarget(this);
 
   @DomName('Document.onvolumechange')
   @DocsEditable()
@@ -10580,14 +10626,16 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
-  Stream<Event> get onFullscreenChange => Element.fullscreenChangeEvent.forTarget(this);
+  Stream<Event> get onFullscreenChange =>
+      Element.fullscreenChangeEvent.forTarget(this);
 
   /// Stream of `fullscreenerror` events handled by this [Document].
   @DomName('Document.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
-  Stream<Event> get onFullscreenError => Element.fullscreenErrorEvent.forTarget(this);
+  Stream<Event> get onFullscreenError =>
+      Element.fullscreenErrorEvent.forTarget(this);
 
   /**
    * Finds all descendant elements of this document that match the specified
@@ -10605,8 +10653,9 @@
    * For details about CSS selector syntax, see the
    * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
    */
-  ElementList<Element /*=T*/> querySelectorAll/*<T extends Element>*/(String selectors) =>
-    new _FrozenElementList/*<T>*/._wrap(_querySelectorAll(selectors));
+  ElementList<Element/*=T*/ > querySelectorAll/*<T extends Element>*/(
+          String selectors) =>
+      new _FrozenElementList/*<T>*/ ._wrap(_querySelectorAll(selectors));
 
   /**
    * Alias for [querySelector]. Note this function is deprecated because its
@@ -10624,7 +10673,8 @@
   @deprecated
   @Experimental()
   @DomName('Document.querySelectorAll')
-  ElementList<Element /*=T*/> queryAll/*<T extends Element>*/(String relativeSelectors) =>
+  ElementList<Element/*=T*/ > queryAll/*<T extends Element>*/(
+          String relativeSelectors) =>
       querySelectorAll(relativeSelectors);
 
   /// Checks if [registerElement] is supported on the current platform.
@@ -10652,12 +10702,13 @@
   // The three-argument version of this is automatically generated, but we need to
   // omit the typeExtension if it's null on Firefox or we get an is="null" attribute.
   @DomName('Document.createElementNS')
-  _createElementNS_2(String namespaceURI, String qualifiedName) =>
-      JS('Element', '#.createElementNS(#, #)', this, namespaceURI, qualifiedName);
+  _createElementNS_2(String namespaceURI, String qualifiedName) => JS(
+      'Element', '#.createElementNS(#, #)', this, namespaceURI, qualifiedName);
 
   @DomName('Document.createElementNS')
   @DocsEditable()
-  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) {
+  Element createElementNS(String namespaceURI, String qualifiedName,
+      [String typeExtension]) {
     return (typeExtension == null)
         ? _createElementNS_2(namespaceURI, qualifiedName)
         : _createElementNS(namespaceURI, qualifiedName, typeExtension);
@@ -10665,51 +10716,54 @@
 
   @DomName('Document.createNodeIterator')
   NodeIterator _createNodeIterator(Node root,
-      [int whatToShow, NodeFilter filter])
-      => JS('NodeIterator', '#.createNodeIterator(#, #, #, false)',
-          this, root, whatToShow, filter);
+          [int whatToShow, NodeFilter filter]) =>
+      JS('NodeIterator', '#.createNodeIterator(#, #, #, false)', this, root,
+          whatToShow, filter);
 
   @DomName('Document.createTreeWalker')
   TreeWalker _createTreeWalker(Node root,
-      [int whatToShow, NodeFilter filter])
-      => JS('TreeWalker', '#.createTreeWalker(#, #, #, false)',
-          this, root, whatToShow, filter);
+          [int whatToShow, NodeFilter filter]) =>
+      JS('TreeWalker', '#.createTreeWalker(#, #, #, false)', this, root,
+          whatToShow, filter);
 
   @DomName('Document.visibilityState')
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @Experimental()
-  String get visibilityState => JS('String',
-    '(#.visibilityState || #.mozVisibilityState || #.msVisibilityState ||'
-      '#.webkitVisibilityState)', this, this, this, this);
+  String get visibilityState => JS(
+      'String',
+      '(#.visibilityState || #.mozVisibilityState || #.msVisibilityState ||'
+      '#.webkitVisibilityState)',
+      this,
+      this,
+      this,
+      this);
 }
 // 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.
 
-
 @DomName('DocumentFragment')
 @Native("DocumentFragment")
-class DocumentFragment extends Node implements NonElementParentNode, ParentNode {
+class DocumentFragment extends Node
+    implements NonElementParentNode, ParentNode {
   factory DocumentFragment() => document.createDocumentFragment();
 
   factory DocumentFragment.html(String html,
       {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
-
     return document.body.createFragment(html,
-      validator: validator, treeSanitizer: treeSanitizer);
+        validator: validator, treeSanitizer: treeSanitizer);
   }
 
   factory DocumentFragment.svg(String svgContent,
       {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
-
     return new svg.SvgSvgElement().createFragment(svgContent,
         validator: validator, treeSanitizer: treeSanitizer);
   }
 
-  HtmlCollection get _children => throw new UnimplementedError(
-      'Use _docChildren instead');
+  HtmlCollection get _children =>
+      throw new UnimplementedError('Use _docChildren instead');
 
   // Native field is used only by Dart code so does not lead to instantiation
   // of native classes
@@ -10742,9 +10796,9 @@
    * For details about CSS selector syntax, see the
    * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
    */
-  ElementList<Element /*=T*/> querySelectorAll/*<T extends Element>*/(String selectors) =>
-    new _FrozenElementList/*<T>*/._wrap(_querySelectorAll(selectors));
-
+  ElementList<Element/*=T*/ > querySelectorAll/*<T extends Element>*/(
+          String selectors) =>
+      new _FrozenElementList/*<T>*/ ._wrap(_querySelectorAll(selectors));
 
   String get innerHtml {
     final e = new Element.tag("div");
@@ -10757,11 +10811,10 @@
   }
 
   void setInnerHtml(String html,
-    {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
-
+      {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
     this.nodes.clear();
-    append(document.body.createFragment(
-        html, validator: validator, treeSanitizer: treeSanitizer));
+    append(document.body.createFragment(html,
+        validator: validator, treeSanitizer: treeSanitizer));
   }
 
   /**
@@ -10772,15 +10825,14 @@
     this.append(new Text(text));
   }
 
-
   /**
    * Parses the specified text as HTML and adds the resulting node after the
    * last child of this document fragment.
    */
-  void appendHtml(String text, {NodeValidator validator,
-      NodeTreeSanitizer, treeSanitizer}) {
-    this.append(new DocumentFragment.html(text, validator: validator,
-        treeSanitizer: treeSanitizer));
+  void appendHtml(String text,
+      {NodeValidator validator, NodeTreeSanitizer, treeSanitizer}) {
+    this.append(new DocumentFragment.html(text,
+        validator: validator, treeSanitizer: treeSanitizer));
   }
 
   /** 
@@ -10801,17 +10853,20 @@
   @deprecated
   @Experimental()
   @DomName('DocumentFragment.querySelectorAll')
-  ElementList<Element /*=T*/> queryAll/*<T extends Element>*/(String relativeSelectors) =>
-    querySelectorAll(relativeSelectors);
+  ElementList<Element/*=T*/ > queryAll/*<T extends Element>*/(
+          String relativeSelectors) =>
+      querySelectorAll(relativeSelectors);
   // To suppress missing implicit constructor warnings.
-  factory DocumentFragment._() { throw new UnsupportedError("Not supported"); }
+  factory DocumentFragment._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   // From NonElementParentNode
 
   @DomName('DocumentFragment.getElementById')
   @DocsEditable()
   @Experimental() // untriaged
-  Element getElementById(String elementId) native;
+  Element getElementById(String elementId) native ;
 
   // From ParentNode
 
@@ -10844,27 +10899,27 @@
    */
   @DomName('DocumentFragment.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) native;
+  Element querySelector(String selectors) native ;
 
   @JSName('querySelectorAll')
   @DomName('DocumentFragment.querySelectorAll')
   @DocsEditable()
   @Returns('NodeList')
   @Creates('NodeList')
-  List<Node> _querySelectorAll(String selectors) native;
-
+  List<Node> _querySelectorAll(String selectors) 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.
 
-
 @DocsEditable()
 @DomName('DOMError')
 @Native("DOMError")
 class DomError extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DomError._() { throw new UnsupportedError("Not supported"); }
+  factory DomError._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DOMError.DOMError')
   @DocsEditable()
@@ -10874,7 +10929,8 @@
     }
     return DomError._create_2(name);
   }
-  static DomError _create_1(name, message) => JS('DomError', 'new DOMError(#,#)', name, message);
+  static DomError _create_1(name, message) =>
+      JS('DomError', 'new DOMError(#,#)', name, message);
   static DomError _create_2(name) => JS('DomError', 'new DOMError(#)', name);
 
   @DomName('DOMError.message')
@@ -10890,12 +10946,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.
 
-
 @DomName('DOMException')
 @Unstable()
 @Native("DOMException")
 class DomException extends Interceptor {
-
   static const String INDEX_SIZE = 'IndexSizeError';
   static const String HIERARCHY_REQUEST = 'HierarchyRequestError';
   static const String WRONG_DOCUMENT = 'WrongDocumentError';
@@ -10928,8 +10982,11 @@
     if (Device.isWebKit && errorName == 'SYNTAX_ERR') return 'SyntaxError';
     return errorName;
   }
+
   // To suppress missing implicit constructor warnings.
-  factory DomException._() { throw new UnsupportedError("Not supported"); }
+  factory DomException._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DOMException.message')
   @DocsEditable()
@@ -10943,61 +11000,66 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('DOMImplementation')
 @Native("DOMImplementation")
 class DomImplementation extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DomImplementation._() { throw new UnsupportedError("Not supported"); }
+  factory DomImplementation._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DOMImplementation.createDocument')
   @DocsEditable()
-  XmlDocument createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) native;
+  XmlDocument createDocument(
+      String namespaceURI, String qualifiedName, _DocumentType doctype) native ;
 
   @DomName('DOMImplementation.createDocumentType')
   @DocsEditable()
-  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native;
+  _DocumentType createDocumentType(
+      String qualifiedName, String publicId, String systemId) native ;
 
   @JSName('createHTMLDocument')
   @DomName('DOMImplementation.createHTMLDocument')
   @DocsEditable()
-  HtmlDocument createHtmlDocument(String title) native;
+  HtmlDocument createHtmlDocument(String title) native ;
 
   @DomName('DOMImplementation.hasFeature')
   @DocsEditable()
-  bool hasFeature() native;
+  bool hasFeature() 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.
 
-
 @DocsEditable()
 @DomName('Iterator')
 @Experimental() // untriaged
 @Native("Iterator")
 class DomIterator extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DomIterator._() { throw new UnsupportedError("Not supported"); }
+  factory DomIterator._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Iterator.next')
   @DocsEditable()
   @Experimental() // untriaged
-  Object next([Object value]) native;
+  Object next([Object 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.
 
-
 @DocsEditable()
 @DomName('DOMMatrix')
 @Experimental() // untriaged
 @Native("DOMMatrix")
 class DomMatrix extends DomMatrixReadOnly {
   // To suppress missing implicit constructor warnings.
-  factory DomMatrix._() { throw new UnsupportedError("Not supported"); }
+  factory DomMatrix._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DOMMatrix.DOMMatrix')
   @DocsEditable()
@@ -11011,7 +11073,8 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   static DomMatrix _create_1() => JS('DomMatrix', 'new DOMMatrix()');
-  static DomMatrix _create_2(other) => JS('DomMatrix', 'new DOMMatrix(#)', other);
+  static DomMatrix _create_2(other) =>
+      JS('DomMatrix', 'new DOMMatrix(#)', other);
 
   // Shadowing definition.
   num get a => JS("num", "#.a", this);
@@ -11170,45 +11233,48 @@
   @DomName('DOMMatrix.multiplySelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix multiplySelf(DomMatrix other) native;
+  DomMatrix multiplySelf(DomMatrix other) native ;
 
   @DomName('DOMMatrix.preMultiplySelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix preMultiplySelf(DomMatrix other) native;
+  DomMatrix preMultiplySelf(DomMatrix other) native ;
 
   @DomName('DOMMatrix.scale3dSelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scale3dSelf(num scale, [num originX, num originY, num originZ]) native;
+  DomMatrix scale3dSelf(num scale, [num originX, num originY, num originZ])
+      native ;
 
   @DomName('DOMMatrix.scaleNonUniformSelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scaleNonUniformSelf(num scaleX, [num scaleY, num scaleZ, num originX, num originY, num originZ]) native;
+  DomMatrix scaleNonUniformSelf(num scaleX,
+      [num scaleY, num scaleZ, num originX, num originY, num originZ]) native ;
 
   @DomName('DOMMatrix.scaleSelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scaleSelf(num scale, [num originX, num originY]) native;
+  DomMatrix scaleSelf(num scale, [num originX, num originY]) native ;
 
   @DomName('DOMMatrix.translateSelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix translateSelf(num tx, num ty, [num tz]) native;
+  DomMatrix translateSelf(num tx, num ty, [num tz]) 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.
 
-
 @DocsEditable()
 @DomName('DOMMatrixReadOnly')
 @Experimental() // untriaged
 @Native("DOMMatrixReadOnly")
 class DomMatrixReadOnly extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DomMatrixReadOnly._() { throw new UnsupportedError("Not supported"); }
+  factory DomMatrixReadOnly._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   num get a => JS("num", "#.a", this);
 
@@ -11261,49 +11327,51 @@
   @DomName('DOMMatrixReadOnly.multiply')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix multiply(DomMatrix other) native;
+  DomMatrix multiply(DomMatrix other) native ;
 
   @DomName('DOMMatrixReadOnly.scale')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scale(num scale, [num originX, num originY]) native;
+  DomMatrix scale(num scale, [num originX, num originY]) native ;
 
   @DomName('DOMMatrixReadOnly.scale3d')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scale3d(num scale, [num originX, num originY, num originZ]) native;
+  DomMatrix scale3d(num scale, [num originX, num originY, num originZ]) native ;
 
   @DomName('DOMMatrixReadOnly.scaleNonUniform')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix scaleNonUniform(num scaleX, [num scaleY, num scaleZn, num originX, num originY, num originZ]) native;
+  DomMatrix scaleNonUniform(num scaleX,
+      [num scaleY, num scaleZn, num originX, num originY, num originZ]) native ;
 
   @DomName('DOMMatrixReadOnly.toFloat32Array')
   @DocsEditable()
   @Experimental() // untriaged
-  Float32List toFloat32Array() native;
+  Float32List toFloat32Array() native ;
 
   @DomName('DOMMatrixReadOnly.toFloat64Array')
   @DocsEditable()
   @Experimental() // untriaged
-  Float64List toFloat64Array() native;
+  Float64List toFloat64Array() native ;
 
   @DomName('DOMMatrixReadOnly.translate')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix translate(num tx, num ty, [num tz]) native;
+  DomMatrix translate(num tx, num ty, [num tz]) 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.
 
-
 @DocsEditable()
 @DomName('DOMParser')
 @Native("DOMParser")
 class DomParser extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DomParser._() { throw new UnsupportedError("Not supported"); }
+  factory DomParser._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DOMParser.DOMParser')
   @DocsEditable()
@@ -11314,54 +11382,76 @@
 
   @DomName('DOMParser.parseFromString')
   @DocsEditable()
-  Document parseFromString(String str, String type) native;
+  Document parseFromString(String str, String type) 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.
 
-
 @DocsEditable()
 @DomName('DOMPoint')
 @Experimental() // untriaged
 @Native("DOMPoint")
 class DomPoint extends DomPointReadOnly {
   // To suppress missing implicit constructor warnings.
-  factory DomPoint._() { throw new UnsupportedError("Not supported"); }
+  factory DomPoint._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DOMPoint.DOMPoint')
   @DocsEditable()
   factory DomPoint([point_OR_x, num y, num z, num w]) {
-    if ((point_OR_x is Map || point_OR_x == null) && y == null && z == null && w == null) {
+    if ((point_OR_x is Map || point_OR_x == null) &&
+        y == null &&
+        z == null &&
+        w == null) {
       var point_1 = convertDartToNative_Dictionary(point_OR_x);
       return DomPoint._create_1(point_1);
     }
     if (point_OR_x == null && y == null && z == null && w == null) {
       return DomPoint._create_2();
     }
-    if ((point_OR_x is num || point_OR_x == null) && y == null && z == null && w == null) {
+    if ((point_OR_x is num || point_OR_x == null) &&
+        y == null &&
+        z == null &&
+        w == null) {
       return DomPoint._create_3(point_OR_x);
     }
-    if ((y is num || y == null) && (point_OR_x is num || point_OR_x == null) && z == null && w == null) {
+    if ((y is num || y == null) &&
+        (point_OR_x is num || point_OR_x == null) &&
+        z == null &&
+        w == null) {
       return DomPoint._create_4(point_OR_x, y);
     }
-    if ((z is num || z == null) && (y is num || y == null) && (point_OR_x is num || point_OR_x == null) && w == null) {
+    if ((z is num || z == null) &&
+        (y is num || y == null) &&
+        (point_OR_x is num || point_OR_x == null) &&
+        w == null) {
       return DomPoint._create_5(point_OR_x, y, z);
     }
-    if ((w is num || w == null) && (z is num || z == null) && (y is num || y == null) && (point_OR_x is num || point_OR_x == null)) {
+    if ((w is num || w == null) &&
+        (z is num || z == null) &&
+        (y is num || y == null) &&
+        (point_OR_x is num || point_OR_x == null)) {
       return DomPoint._create_6(point_OR_x, y, z, w);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  static DomPoint _create_1(point_OR_x) => JS('DomPoint', 'new DOMPoint(#)', point_OR_x);
+  static DomPoint _create_1(point_OR_x) =>
+      JS('DomPoint', 'new DOMPoint(#)', point_OR_x);
   static DomPoint _create_2() => JS('DomPoint', 'new DOMPoint()');
-  static DomPoint _create_3(point_OR_x) => JS('DomPoint', 'new DOMPoint(#)', point_OR_x);
-  static DomPoint _create_4(point_OR_x, y) => JS('DomPoint', 'new DOMPoint(#,#)', point_OR_x, y);
-  static DomPoint _create_5(point_OR_x, y, z) => JS('DomPoint', 'new DOMPoint(#,#,#)', point_OR_x, y, z);
-  static DomPoint _create_6(point_OR_x, y, z, w) => JS('DomPoint', 'new DOMPoint(#,#,#,#)', point_OR_x, y, z, w);
+  static DomPoint _create_3(point_OR_x) =>
+      JS('DomPoint', 'new DOMPoint(#)', point_OR_x);
+  static DomPoint _create_4(point_OR_x, y) =>
+      JS('DomPoint', 'new DOMPoint(#,#)', point_OR_x, y);
+  static DomPoint _create_5(point_OR_x, y, z) =>
+      JS('DomPoint', 'new DOMPoint(#,#,#)', point_OR_x, y, z);
+  static DomPoint _create_6(point_OR_x, y, z, w) =>
+      JS('DomPoint', 'new DOMPoint(#,#,#,#)', point_OR_x, y, z, w);
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => JS('bool', '!!(window.DOMPoint) || !!(window.WebKitPoint)');
+  static bool get supported =>
+      JS('bool', '!!(window.DOMPoint) || !!(window.WebKitPoint)');
 
   // Shadowing definition.
   num get w => JS("num", "#.w", this);
@@ -11395,21 +11485,23 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('DOMPointReadOnly')
 @Experimental() // untriaged
 @Native("DOMPointReadOnly")
 class DomPointReadOnly extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DomPointReadOnly._() { throw new UnsupportedError("Not supported"); }
+  factory DomPointReadOnly._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DOMPointReadOnly.DOMPointReadOnly')
   @DocsEditable()
   factory DomPointReadOnly(num x, num y, num z, num w) {
     return DomPointReadOnly._create_1(x, y, z, w);
   }
-  static DomPointReadOnly _create_1(x, y, z, w) => JS('DomPointReadOnly', 'new DOMPointReadOnly(#,#,#,#)', x, y, z, w);
+  static DomPointReadOnly _create_1(x, y, z, w) =>
+      JS('DomPointReadOnly', 'new DOMPointReadOnly(#,#,#,#)', x, y, z, w);
 
   num get w => JS("num", "#.w", this);
 
@@ -11423,26 +11515,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.
 
-
 @DocsEditable()
 @DomName('DOMRectReadOnly')
 @Experimental() // untriaged
 @Native("DOMRectReadOnly")
 class DomRectReadOnly extends Interceptor implements Rectangle {
-
   // NOTE! All code below should be common with RectangleBase.
-   String toString() {
+  String toString() {
     return 'Rectangle ($left, $top) $width x $height';
   }
 
   bool operator ==(other) {
-    if (other is !Rectangle) return false;
-    return left == other.left && top == other.top && width == other.width &&
+    if (other is! Rectangle) return false;
+    return left == other.left &&
+        top == other.top &&
+        width == other.width &&
         height == other.height;
   }
 
-  int get hashCode => _JenkinsSmiHash.hash4(left.hashCode, top.hashCode,
-      width.hashCode, height.hashCode);
+  int get hashCode => _JenkinsSmiHash.hash4(
+      left.hashCode, top.hashCode, width.hashCode, height.hashCode);
 
   /**
    * Computes the intersection of `this` and [other].
@@ -11468,7 +11560,6 @@
     return null;
   }
 
-
   /**
    * Returns true if `this` intersects [other].
    */
@@ -11497,9 +11588,9 @@
    */
   bool containsRectangle(Rectangle<num> another) {
     return left <= another.left &&
-           left + width >= another.left + another.width &&
-           top <= another.top &&
-           top + height >= another.top + another.height;
+        left + width >= another.left + another.width &&
+        top <= another.top &&
+        top + height >= another.top + another.height;
   }
 
   /**
@@ -11507,27 +11598,29 @@
    */
   bool containsPoint(Point<num> another) {
     return another.x >= left &&
-           another.x <= left + width &&
-           another.y >= top &&
-           another.y <= top + height;
+        another.x <= left + width &&
+        another.y >= top &&
+        another.y <= top + height;
   }
 
   Point get topLeft => new Point/*<num>*/(this.left, this.top);
   Point get topRight => new Point/*<num>*/(this.left + this.width, this.top);
-  Point get bottomRight => new Point/*<num>*/(this.left + this.width,
-      this.top + this.height);
-  Point get bottomLeft => new Point/*<num>*/(this.left,
-      this.top + this.height);
+  Point get bottomRight =>
+      new Point/*<num>*/(this.left + this.width, this.top + this.height);
+  Point get bottomLeft => new Point/*<num>*/(this.left, this.top + this.height);
 
-    // To suppress missing implicit constructor warnings.
-  factory DomRectReadOnly._() { throw new UnsupportedError("Not supported"); }
+  // To suppress missing implicit constructor warnings.
+  factory DomRectReadOnly._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DOMRectReadOnly.DOMRectReadOnly')
   @DocsEditable()
   factory DomRectReadOnly(num x, num y, num width, num height) {
     return DomRectReadOnly._create_1(x, y, width, height);
   }
-  static DomRectReadOnly _create_1(x, y, width, height) => JS('DomRectReadOnly', 'new DOMRectReadOnly(#,#,#,#)', x, y, width, height);
+  static DomRectReadOnly _create_1(x, y, width, height) => JS(
+      'DomRectReadOnly', 'new DOMRectReadOnly(#,#,#,#)', x, y, width, height);
 
   num get bottom => JS("num", "#.bottom", this);
 
@@ -11550,13 +11643,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.
 
-
 @DocsEditable()
 @DomName('DOMSettableTokenList')
 @Native("DOMSettableTokenList")
 class DomSettableTokenList extends DomTokenList {
   // To suppress missing implicit constructor warnings.
-  factory DomSettableTokenList._() { throw new UnsupportedError("Not supported"); }
+  factory DomSettableTokenList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
@@ -11566,31 +11660,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.
 
-
 @DocsEditable()
 @DomName('DOMStringList')
 @Native("DOMStringList")
-class DomStringList extends Interceptor with ListMixin<String>, ImmutableListMixin<String> implements List<String> {
+class DomStringList extends Interceptor
+    with ListMixin<String>, ImmutableListMixin<String>
+    implements List<String> {
   // To suppress missing implicit constructor warnings.
-  factory DomStringList._() { throw new UnsupportedError("Not supported"); }
+  factory DomStringList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DOMStringList.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  String operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  String operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return this.item(index);
   }
-  void operator[]=(int index, String value) {
+
+  void operator []=(int index, String value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<String> mixins.
   // String is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -11625,22 +11721,23 @@
   @DomName('DOMStringList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  String __getter__(int index) native;
+  String __getter__(int index) native ;
 
   @DomName('DOMStringList.item')
   @DocsEditable()
-  String item(int index) 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.
 
-
 @DocsEditable()
 @DomName('DOMStringMap')
 abstract class DomStringMap extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DomStringMap._() { throw new UnsupportedError("Not supported"); }
+  factory DomStringMap._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   void __delete__(index_OR_name);
 
@@ -11654,13 +11751,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.
 
-
 @DocsEditable()
 @DomName('DOMTokenList')
 @Native("DOMTokenList")
 class DomTokenList extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DomTokenList._() { throw new UnsupportedError("Not supported"); }
+  factory DomTokenList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DOMTokenList.length')
   @DocsEditable()
@@ -11669,43 +11767,43 @@
   @DomName('DOMTokenList.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(String tokens) native;
+  void add(String tokens) native ;
 
   @DomName('DOMTokenList.contains')
   @DocsEditable()
-  bool contains(String token) native;
+  bool contains(String token) native ;
 
   @DomName('DOMTokenList.item')
   @DocsEditable()
-  String item(int index) native;
+  String item(int index) native ;
 
   @DomName('DOMTokenList.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(String tokens) native;
+  void remove(String tokens) native ;
 
   @DomName('DOMTokenList.toggle')
   @DocsEditable()
-  bool toggle(String token, [bool force]) 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.
 
-
 @DocsEditable()
 @DomName('EffectModel')
 @Experimental() // untriaged
 @Native("EffectModel")
 class EffectModel extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory EffectModel._() { throw new UnsupportedError("Not supported"); }
+  factory EffectModel._() {
+    throw new UnsupportedError("Not 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.
 
-
 class _ChildrenElementList extends ListBase<Element>
     implements NodeListWrapper {
   // Raw Element.
@@ -11713,12 +11811,11 @@
   final HtmlCollection _childElements;
 
   _ChildrenElementList._wrap(Element element)
-    : _childElements = element._children,
-      _element = element;
+      : _childElements = element._children,
+        _element = element;
 
   bool contains(Object element) => _childElements.contains(element);
 
-
   bool get isEmpty {
     return _element._firstElementChild == null;
   }
@@ -11784,7 +11881,7 @@
   }
 
   void setRange(int start, int end, Iterable<Element> iterable,
-                [int skipCount = 0]) {
+      [int skipCount = 0]) {
     throw new UnimplementedError();
   }
 
@@ -11848,7 +11945,6 @@
     return result;
   }
 
-
   Element get last {
     Element result = _element._lastElementChild;
     if (result == null) throw new StateError("No elements");
@@ -12418,7 +12514,6 @@
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
   ElementStream<Event> get onFullscreenError;
-
 }
 
 // Wrapper over an immutable NodeList to make it implement ElementList.
@@ -12461,8 +12556,7 @@
 
   CssClassSet get classes => new _MultiElementCssClassSet(this);
 
-  CssStyleDeclarationBase get style =>
-      new _CssStyleDeclarationSet(this);
+  CssStyleDeclarationBase get style => new _CssStyleDeclarationSet(this);
 
   set classes(Iterable<String> value) {
     // TODO(sra): This might be faster for Sets:
@@ -12484,7 +12578,6 @@
 
   List<Node> get rawList => _nodeList;
 
-
   /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
   @DocsEditable()
@@ -12493,17 +12586,20 @@
   /// Stream of `beforecopy` events handled by this [Element].
   @DomName('Element.onbeforecopy')
   @DocsEditable()
-  ElementStream<Event> get onBeforeCopy => Element.beforeCopyEvent._forElementList(this);
+  ElementStream<Event> get onBeforeCopy =>
+      Element.beforeCopyEvent._forElementList(this);
 
   /// Stream of `beforecut` events handled by this [Element].
   @DomName('Element.onbeforecut')
   @DocsEditable()
-  ElementStream<Event> get onBeforeCut => Element.beforeCutEvent._forElementList(this);
+  ElementStream<Event> get onBeforeCut =>
+      Element.beforeCutEvent._forElementList(this);
 
   /// Stream of `beforepaste` events handled by this [Element].
   @DomName('Element.onbeforepaste')
   @DocsEditable()
-  ElementStream<Event> get onBeforePaste => Element.beforePasteEvent._forElementList(this);
+  ElementStream<Event> get onBeforePaste =>
+      Element.beforePasteEvent._forElementList(this);
 
   /// Stream of `blur` events handled by this [Element].
   @DomName('Element.onblur')
@@ -12513,42 +12609,50 @@
   @DomName('Element.oncanplay')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onCanPlay => Element.canPlayEvent._forElementList(this);
+  ElementStream<Event> get onCanPlay =>
+      Element.canPlayEvent._forElementList(this);
 
   @DomName('Element.oncanplaythrough')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onCanPlayThrough => Element.canPlayThroughEvent._forElementList(this);
+  ElementStream<Event> get onCanPlayThrough =>
+      Element.canPlayThroughEvent._forElementList(this);
 
   /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
   @DocsEditable()
-  ElementStream<Event> get onChange => Element.changeEvent._forElementList(this);
+  ElementStream<Event> get onChange =>
+      Element.changeEvent._forElementList(this);
 
   /// Stream of `click` events handled by this [Element].
   @DomName('Element.onclick')
   @DocsEditable()
-  ElementStream<MouseEvent> get onClick => Element.clickEvent._forElementList(this);
+  ElementStream<MouseEvent> get onClick =>
+      Element.clickEvent._forElementList(this);
 
   /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
-  ElementStream<MouseEvent> get onContextMenu => Element.contextMenuEvent._forElementList(this);
+  ElementStream<MouseEvent> get onContextMenu =>
+      Element.contextMenuEvent._forElementList(this);
 
   /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
   @DocsEditable()
-  ElementStream<ClipboardEvent> get onCopy => Element.copyEvent._forElementList(this);
+  ElementStream<ClipboardEvent> get onCopy =>
+      Element.copyEvent._forElementList(this);
 
   /// Stream of `cut` events handled by this [Element].
   @DomName('Element.oncut')
   @DocsEditable()
-  ElementStream<ClipboardEvent> get onCut => Element.cutEvent._forElementList(this);
+  ElementStream<ClipboardEvent> get onCut =>
+      Element.cutEvent._forElementList(this);
 
   /// Stream of `doubleclick` events handled by this [Element].
   @DomName('Element.ondblclick')
   @DocsEditable()
-  ElementStream<Event> get onDoubleClick => Element.doubleClickEvent._forElementList(this);
+  ElementStream<Event> get onDoubleClick =>
+      Element.doubleClickEvent._forElementList(this);
 
   /**
    * A stream of `drag` events fired when this element currently being dragged.
@@ -12569,7 +12673,8 @@
    */
   @DomName('Element.ondrag')
   @DocsEditable()
-  ElementStream<MouseEvent> get onDrag => Element.dragEvent._forElementList(this);
+  ElementStream<MouseEvent> get onDrag =>
+      Element.dragEvent._forElementList(this);
 
   /**
    * A stream of `dragend` events fired when this element completes a drag
@@ -12587,7 +12692,8 @@
    */
   @DomName('Element.ondragend')
   @DocsEditable()
-  ElementStream<MouseEvent> get onDragEnd => Element.dragEndEvent._forElementList(this);
+  ElementStream<MouseEvent> get onDragEnd =>
+      Element.dragEndEvent._forElementList(this);
 
   /**
    * A stream of `dragenter` events fired when a dragged object is first dragged
@@ -12605,7 +12711,8 @@
    */
   @DomName('Element.ondragenter')
   @DocsEditable()
-  ElementStream<MouseEvent> get onDragEnter => Element.dragEnterEvent._forElementList(this);
+  ElementStream<MouseEvent> get onDragEnter =>
+      Element.dragEnterEvent._forElementList(this);
 
   /**
    * A stream of `dragleave` events fired when an object being dragged over this
@@ -12623,7 +12730,8 @@
    */
   @DomName('Element.ondragleave')
   @DocsEditable()
-  ElementStream<MouseEvent> get onDragLeave => Element.dragLeaveEvent._forElementList(this);
+  ElementStream<MouseEvent> get onDragLeave =>
+      Element.dragLeaveEvent._forElementList(this);
 
   /**
    * A stream of `dragover` events fired when a dragged object is currently
@@ -12641,7 +12749,8 @@
    */
   @DomName('Element.ondragover')
   @DocsEditable()
-  ElementStream<MouseEvent> get onDragOver => Element.dragOverEvent._forElementList(this);
+  ElementStream<MouseEvent> get onDragOver =>
+      Element.dragOverEvent._forElementList(this);
 
   /**
    * A stream of `dragstart` events fired when this element starts being
@@ -12659,7 +12768,8 @@
    */
   @DomName('Element.ondragstart')
   @DocsEditable()
-  ElementStream<MouseEvent> get onDragStart => Element.dragStartEvent._forElementList(this);
+  ElementStream<MouseEvent> get onDragStart =>
+      Element.dragStartEvent._forElementList(this);
 
   /**
    * A stream of `drop` events fired when a dragged object is dropped on this
@@ -12677,17 +12787,20 @@
    */
   @DomName('Element.ondrop')
   @DocsEditable()
-  ElementStream<MouseEvent> get onDrop => Element.dropEvent._forElementList(this);
+  ElementStream<MouseEvent> get onDrop =>
+      Element.dropEvent._forElementList(this);
 
   @DomName('Element.ondurationchange')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onDurationChange => Element.durationChangeEvent._forElementList(this);
+  ElementStream<Event> get onDurationChange =>
+      Element.durationChangeEvent._forElementList(this);
 
   @DomName('Element.onemptied')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onEmptied => Element.emptiedEvent._forElementList(this);
+  ElementStream<Event> get onEmptied =>
+      Element.emptiedEvent._forElementList(this);
 
   @DomName('Element.onended')
   @DocsEditable()
@@ -12712,22 +12825,26 @@
   /// Stream of `invalid` events handled by this [Element].
   @DomName('Element.oninvalid')
   @DocsEditable()
-  ElementStream<Event> get onInvalid => Element.invalidEvent._forElementList(this);
+  ElementStream<Event> get onInvalid =>
+      Element.invalidEvent._forElementList(this);
 
   /// Stream of `keydown` events handled by this [Element].
   @DomName('Element.onkeydown')
   @DocsEditable()
-  ElementStream<KeyboardEvent> get onKeyDown => Element.keyDownEvent._forElementList(this);
+  ElementStream<KeyboardEvent> get onKeyDown =>
+      Element.keyDownEvent._forElementList(this);
 
   /// Stream of `keypress` events handled by this [Element].
   @DomName('Element.onkeypress')
   @DocsEditable()
-  ElementStream<KeyboardEvent> get onKeyPress => Element.keyPressEvent._forElementList(this);
+  ElementStream<KeyboardEvent> get onKeyPress =>
+      Element.keyPressEvent._forElementList(this);
 
   /// Stream of `keyup` events handled by this [Element].
   @DomName('Element.onkeyup')
   @DocsEditable()
-  ElementStream<KeyboardEvent> get onKeyUp => Element.keyUpEvent._forElementList(this);
+  ElementStream<KeyboardEvent> get onKeyUp =>
+      Element.keyUpEvent._forElementList(this);
 
   /// Stream of `load` events handled by this [Element].
   @DomName('Element.onload')
@@ -12737,61 +12854,72 @@
   @DomName('Element.onloadeddata')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onLoadedData => Element.loadedDataEvent._forElementList(this);
+  ElementStream<Event> get onLoadedData =>
+      Element.loadedDataEvent._forElementList(this);
 
   @DomName('Element.onloadedmetadata')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onLoadedMetadata => Element.loadedMetadataEvent._forElementList(this);
+  ElementStream<Event> get onLoadedMetadata =>
+      Element.loadedMetadataEvent._forElementList(this);
 
   /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
   @DocsEditable()
-  ElementStream<MouseEvent> get onMouseDown => Element.mouseDownEvent._forElementList(this);
+  ElementStream<MouseEvent> get onMouseDown =>
+      Element.mouseDownEvent._forElementList(this);
 
   /// Stream of `mouseenter` events handled by this [Element].
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent._forElementList(this);
+  ElementStream<MouseEvent> get onMouseEnter =>
+      Element.mouseEnterEvent._forElementList(this);
 
   /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent._forElementList(this);
+  ElementStream<MouseEvent> get onMouseLeave =>
+      Element.mouseLeaveEvent._forElementList(this);
 
   /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
   @DocsEditable()
-  ElementStream<MouseEvent> get onMouseMove => Element.mouseMoveEvent._forElementList(this);
+  ElementStream<MouseEvent> get onMouseMove =>
+      Element.mouseMoveEvent._forElementList(this);
 
   /// Stream of `mouseout` events handled by this [Element].
   @DomName('Element.onmouseout')
   @DocsEditable()
-  ElementStream<MouseEvent> get onMouseOut => Element.mouseOutEvent._forElementList(this);
+  ElementStream<MouseEvent> get onMouseOut =>
+      Element.mouseOutEvent._forElementList(this);
 
   /// Stream of `mouseover` events handled by this [Element].
   @DomName('Element.onmouseover')
   @DocsEditable()
-  ElementStream<MouseEvent> get onMouseOver => Element.mouseOverEvent._forElementList(this);
+  ElementStream<MouseEvent> get onMouseOver =>
+      Element.mouseOverEvent._forElementList(this);
 
   /// Stream of `mouseup` events handled by this [Element].
   @DomName('Element.onmouseup')
   @DocsEditable()
-  ElementStream<MouseEvent> get onMouseUp => Element.mouseUpEvent._forElementList(this);
+  ElementStream<MouseEvent> get onMouseUp =>
+      Element.mouseUpEvent._forElementList(this);
 
   /// Stream of `mousewheel` events handled by this [Element].
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
-  ElementStream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent._forElementList(this);
+  ElementStream<WheelEvent> get onMouseWheel =>
+      Element.mouseWheelEvent._forElementList(this);
 
   /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
   @DocsEditable()
-  ElementStream<ClipboardEvent> get onPaste => Element.pasteEvent._forElementList(this);
+  ElementStream<ClipboardEvent> get onPaste =>
+      Element.pasteEvent._forElementList(this);
 
   @DomName('Element.onpause')
   @DocsEditable()
@@ -12806,12 +12934,14 @@
   @DomName('Element.onplaying')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onPlaying => Element.playingEvent._forElementList(this);
+  ElementStream<Event> get onPlaying =>
+      Element.playingEvent._forElementList(this);
 
   @DomName('Element.onratechange')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onRateChange => Element.rateChangeEvent._forElementList(this);
+  ElementStream<Event> get onRateChange =>
+      Element.rateChangeEvent._forElementList(this);
 
   /// Stream of `reset` events handled by this [Element].
   @DomName('Element.onreset')
@@ -12821,102 +12951,119 @@
   @DomName('Element.onresize')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onResize => Element.resizeEvent._forElementList(this);
+  ElementStream<Event> get onResize =>
+      Element.resizeEvent._forElementList(this);
 
   /// Stream of `scroll` events handled by this [Element].
   @DomName('Element.onscroll')
   @DocsEditable()
-  ElementStream<Event> get onScroll => Element.scrollEvent._forElementList(this);
+  ElementStream<Event> get onScroll =>
+      Element.scrollEvent._forElementList(this);
 
   /// Stream of `search` events handled by this [Element].
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  ElementStream<Event> get onSearch => Element.searchEvent._forElementList(this);
+  ElementStream<Event> get onSearch =>
+      Element.searchEvent._forElementList(this);
 
   @DomName('Element.onseeked')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onSeeked => Element.seekedEvent._forElementList(this);
+  ElementStream<Event> get onSeeked =>
+      Element.seekedEvent._forElementList(this);
 
   @DomName('Element.onseeking')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onSeeking => Element.seekingEvent._forElementList(this);
+  ElementStream<Event> get onSeeking =>
+      Element.seekingEvent._forElementList(this);
 
   /// Stream of `select` events handled by this [Element].
   @DomName('Element.onselect')
   @DocsEditable()
-  ElementStream<Event> get onSelect => Element.selectEvent._forElementList(this);
+  ElementStream<Event> get onSelect =>
+      Element.selectEvent._forElementList(this);
 
   /// Stream of `selectstart` events handled by this [Element].
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
-  ElementStream<Event> get onSelectStart => Element.selectStartEvent._forElementList(this);
+  ElementStream<Event> get onSelectStart =>
+      Element.selectStartEvent._forElementList(this);
 
   @DomName('Element.onstalled')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onStalled => Element.stalledEvent._forElementList(this);
+  ElementStream<Event> get onStalled =>
+      Element.stalledEvent._forElementList(this);
 
   /// Stream of `submit` events handled by this [Element].
   @DomName('Element.onsubmit')
   @DocsEditable()
-  ElementStream<Event> get onSubmit => Element.submitEvent._forElementList(this);
+  ElementStream<Event> get onSubmit =>
+      Element.submitEvent._forElementList(this);
 
   @DomName('Element.onsuspend')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onSuspend => Element.suspendEvent._forElementList(this);
+  ElementStream<Event> get onSuspend =>
+      Element.suspendEvent._forElementList(this);
 
   @DomName('Element.ontimeupdate')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onTimeUpdate => Element.timeUpdateEvent._forElementList(this);
+  ElementStream<Event> get onTimeUpdate =>
+      Element.timeUpdateEvent._forElementList(this);
 
   /// Stream of `touchcancel` events handled by this [Element].
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  ElementStream<TouchEvent> get onTouchCancel => Element.touchCancelEvent._forElementList(this);
+  ElementStream<TouchEvent> get onTouchCancel =>
+      Element.touchCancelEvent._forElementList(this);
 
   /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  ElementStream<TouchEvent> get onTouchEnd => Element.touchEndEvent._forElementList(this);
+  ElementStream<TouchEvent> get onTouchEnd =>
+      Element.touchEndEvent._forElementList(this);
 
   /// Stream of `touchenter` events handled by this [Element].
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  ElementStream<TouchEvent> get onTouchEnter => Element.touchEnterEvent._forElementList(this);
+  ElementStream<TouchEvent> get onTouchEnter =>
+      Element.touchEnterEvent._forElementList(this);
 
   /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  ElementStream<TouchEvent> get onTouchLeave => Element.touchLeaveEvent._forElementList(this);
+  ElementStream<TouchEvent> get onTouchLeave =>
+      Element.touchLeaveEvent._forElementList(this);
 
   /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  ElementStream<TouchEvent> get onTouchMove => Element.touchMoveEvent._forElementList(this);
+  ElementStream<TouchEvent> get onTouchMove =>
+      Element.touchMoveEvent._forElementList(this);
 
   /// Stream of `touchstart` events handled by this [Element].
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  ElementStream<TouchEvent> get onTouchStart => Element.touchStartEvent._forElementList(this);
+  ElementStream<TouchEvent> get onTouchStart =>
+      Element.touchStartEvent._forElementList(this);
 
   /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
@@ -12925,32 +13072,36 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  ElementStream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent._forElementList(this);
+  ElementStream<TransitionEvent> get onTransitionEnd =>
+      Element.transitionEndEvent._forElementList(this);
 
   @DomName('Element.onvolumechange')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onVolumeChange => Element.volumeChangeEvent._forElementList(this);
+  ElementStream<Event> get onVolumeChange =>
+      Element.volumeChangeEvent._forElementList(this);
 
   @DomName('Element.onwaiting')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onWaiting => Element.waitingEvent._forElementList(this);
+  ElementStream<Event> get onWaiting =>
+      Element.waitingEvent._forElementList(this);
 
   /// Stream of `fullscreenchange` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
-  ElementStream<Event> get onFullscreenChange => Element.fullscreenChangeEvent._forElementList(this);
+  ElementStream<Event> get onFullscreenChange =>
+      Element.fullscreenChangeEvent._forElementList(this);
 
   /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
-  ElementStream<Event> get onFullscreenError => Element.fullscreenErrorEvent._forElementList(this);
-
+  ElementStream<Event> get onFullscreenError =>
+      Element.fullscreenErrorEvent._forElementList(this);
 }
 
 @DocsEditable()
@@ -12959,8 +13110,12 @@
  */
 @DomName('Element')
 @Native("Element")
-class Element extends Node implements NonDocumentTypeChildNode, GlobalEventHandlers, ParentNode, ChildNode {
-
+class Element extends Node
+    implements
+        NonDocumentTypeChildNode,
+        GlobalEventHandlers,
+        ParentNode,
+        ChildNode {
   /**
    * Creates an HTML element from a valid fragment of HTML.
    *
@@ -12984,8 +13139,8 @@
    */
   factory Element.html(String html,
       {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
-    var fragment = document.body.createFragment(html, validator: validator,
-        treeSanitizer: treeSanitizer);
+    var fragment = document.body.createFragment(html,
+        validator: validator, treeSanitizer: treeSanitizer);
 
     return fragment.nodes.where((e) => e is Element).single;
   }
@@ -13229,8 +13384,9 @@
    * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
    */
   @DomName('Element.querySelectorAll')
-  ElementList<Element /*=T*/> querySelectorAll/*<T extends Element>*/(String selectors) =>
-    new _FrozenElementList/*<T>*/._wrap(_querySelectorAll(selectors));
+  ElementList<Element/*=T*/ > querySelectorAll/*<T extends Element>*/(
+          String selectors) =>
+      new _FrozenElementList/*<T>*/ ._wrap(_querySelectorAll(selectors));
 
   /**
    * Alias for [querySelector]. Note this function is deprecated because its
@@ -13248,7 +13404,8 @@
   @deprecated
   @DomName('Element.querySelectorAll')
   @Experimental()
-  ElementList<Element /*=T*/> queryAll/*<T extends Element>*/(String relativeSelectors) =>
+  ElementList<Element/*=T*/ > queryAll/*<T extends Element>*/(
+          String relativeSelectors) =>
       querySelectorAll(relativeSelectors);
 
   /**
@@ -13295,8 +13452,7 @@
    * * [Custom data
    *   attributes](http://dev.w3.org/html5/spec-preview/global-attributes.html#custom-data-attribute)
    */
-  Map<String, String> get dataset =>
-    new _DataAttributeMap(attributes);
+  Map<String, String> get dataset => new _DataAttributeMap(attributes);
 
   set dataset(Map<String, String> value) {
     final data = this.dataset;
@@ -13343,14 +13499,14 @@
   /**
    * Gets the position of this element relative to the client area of the page.
    */
-  Rectangle get client => new Rectangle(clientLeft, clientTop, clientWidth,
-      clientHeight);
+  Rectangle get client =>
+      new Rectangle(clientLeft, clientTop, clientWidth, clientHeight);
 
   /**
    * Gets the offset of this element relative to its offsetParent.
    */
-  Rectangle get offset => new Rectangle(offsetLeft, offsetTop, offsetWidth,
-      offsetHeight);
+  Rectangle get offset =>
+      new Rectangle(offsetLeft, offsetTop, offsetWidth, offsetHeight);
 
   /**
    * Adds the specified text after the last child of this element.
@@ -13363,10 +13519,10 @@
    * Parses the specified text as HTML and adds the resulting node after the
    * last child of this element.
    */
-  void appendHtml(String text, {NodeValidator validator,
-      NodeTreeSanitizer treeSanitizer}) {
-    this.insertAdjacentHtml('beforeend', text, validator: validator,
-        treeSanitizer: treeSanitizer);
+  void appendHtml(String text,
+      {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+    this.insertAdjacentHtml('beforeend', text,
+        validator: validator, treeSanitizer: treeSanitizer);
   }
 
   /**
@@ -13452,16 +13608,17 @@
     } else {
       convertedFrames = frames;
     }
-    var convertedTiming = timing is Map ? convertDartToNative_Dictionary(timing) : timing;
+    var convertedTiming =
+        timing is Map ? convertDartToNative_Dictionary(timing) : timing;
     return convertedTiming == null
-      ? _animate(convertedFrames)
-      : _animate(convertedFrames, convertedTiming);
+        ? _animate(convertedFrames)
+        : _animate(convertedFrames, convertedTiming);
   }
 
   @DomName('Element.animate')
   @JSName('animate')
   @Experimental() // untriaged
-  Animation _animate(Object effect, [timing]) native;
+  Animation _animate(Object effect, [timing]) native ;
   /**
    * Called by the DOM whenever an attribute on this has been changed.
    */
@@ -13469,7 +13626,7 @@
 
   // Hooks to support custom WebComponents.
 
-  @Creates('Null')  // Set from Dart code; does not instantiate a native type.
+  @Creates('Null') // Set from Dart code; does not instantiate a native type.
   Element _xtag;
 
   /**
@@ -13563,7 +13720,7 @@
   @DomName('Element.mouseWheelEvent')
   static const EventStreamProvider<WheelEvent> mouseWheelEvent =
       const _CustomEventStreamProvider<WheelEvent>(
-        Element._determineMouseWheelEventType);
+          Element._determineMouseWheelEventType);
 
   static String _determineMouseWheelEventType(EventTarget e) => 'wheel';
 
@@ -13576,7 +13733,7 @@
   @DomName('Element.transitionEndEvent')
   static const EventStreamProvider<TransitionEvent> transitionEndEvent =
       const _CustomEventStreamProvider<TransitionEvent>(
-        Element._determineTransitionEventType);
+          Element._determineTransitionEventType);
 
   static String _determineTransitionEventType(EventTarget e) {
     // Unfortunately the normal 'ontransitionend' style checks don't work here.
@@ -13587,6 +13744,7 @@
     }
     return 'transitionend';
   }
+
   /**
    * Inserts text into the DOM at the specified location.
    *
@@ -13606,8 +13764,7 @@
   }
 
   @JSName('insertAdjacentText')
-  void _insertAdjacentText(String where, String text) native;
-
+  void _insertAdjacentText(String where, String text) native ;
 
   /**
    * Parses text as an HTML fragment and inserts it into the DOM at the
@@ -13631,19 +13788,20 @@
    * * [insertAdjacentText]
    * * [insertAdjacentElement]
    */
-  void insertAdjacentHtml(String where, String html, {NodeValidator validator,
-      NodeTreeSanitizer treeSanitizer}) {
-      if (treeSanitizer is _TrustedHtmlTreeSanitizer) {
-        _insertAdjacentHtml(where, html);
-      } else {
-        _insertAdjacentNode(where, createFragment(html,
-            validator: validator, treeSanitizer: treeSanitizer));
-      }
+  void insertAdjacentHtml(String where, String html,
+      {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+    if (treeSanitizer is _TrustedHtmlTreeSanitizer) {
+      _insertAdjacentHtml(where, html);
+    } else {
+      _insertAdjacentNode(
+          where,
+          createFragment(html,
+              validator: validator, treeSanitizer: treeSanitizer));
+    }
   }
 
-
   @JSName('insertAdjacentHTML')
-  void _insertAdjacentHtml(String where, String text) native;
+  void _insertAdjacentHtml(String where, String text) native ;
 
   /**
    * Inserts [element] into the DOM at the specified location.
@@ -13665,7 +13823,7 @@
   }
 
   @JSName('insertAdjacentElement')
-  void _insertAdjacentElement(String where, Element element) native;
+  void _insertAdjacentElement(String where, Element element) native ;
 
   void _insertAdjacentNode(String where, Node node) {
     switch (where.toLowerCase()) {
@@ -13714,7 +13872,7 @@
     do {
       if (elem.matches(selectors)) return true;
       elem = elem.parent;
-    } while(elem != null);
+    } while (elem != null);
     return false;
   }
 
@@ -13731,9 +13889,12 @@
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
   ShadowRoot createShadowRoot() {
-    return JS('ShadowRoot',
-      '(#.createShadowRoot || #.webkitCreateShadowRoot).call(#)',
-      this, this, this);
+    return JS(
+        'ShadowRoot',
+        '(#.createShadowRoot || #.webkitCreateShadowRoot).call(#)',
+        this,
+        this,
+        this);
   }
 
   /**
@@ -13866,7 +14027,8 @@
     }
     Element parentOffset = current.offsetParent;
     Point p = Element._offsetToHelper(parentOffset, parent);
-    return new Point/*<num>*/(p.x + current.offsetLeft, p.y + current.offsetTop);
+    return new Point/*<num>*/(
+        p.x + current.offsetLeft, p.y + current.offsetTop);
   }
 
   static HtmlDocument _parseDocument;
@@ -13967,11 +14129,30 @@
    * A hard-coded list of the tag names for which createContextualFragment
    * isn't supported.
    */
-  static const _tagsForWhichCreateContextualFragmentIsNotSupported =
-      const ['HEAD', 'AREA',
-      'BASE', 'BASEFONT', 'BR', 'COL', 'COLGROUP', 'EMBED', 'FRAME', 'FRAMESET',
-      'HR', 'IMAGE', 'IMG', 'INPUT', 'ISINDEX', 'LINK', 'META', 'PARAM',
-      'SOURCE', 'STYLE', 'TITLE', 'WBR'];
+  static const _tagsForWhichCreateContextualFragmentIsNotSupported = const [
+    'HEAD',
+    'AREA',
+    'BASE',
+    'BASEFONT',
+    'BR',
+    'COL',
+    'COLGROUP',
+    'EMBED',
+    'FRAME',
+    'FRAMESET',
+    'HR',
+    'IMAGE',
+    'IMG',
+    'INPUT',
+    'ISINDEX',
+    'LINK',
+    'META',
+    'PARAM',
+    'SOURCE',
+    'STYLE',
+    'TITLE',
+    'WBR'
+  ];
 
   /**
    * Parses the HTML fragment and sets it as the contents of this element.
@@ -14005,15 +14186,16 @@
    * * [NodeTreeSanitizer]
    */
   void setInnerHtml(String html,
-    {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+      {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
     text = null;
     if (treeSanitizer is _TrustedHtmlTreeSanitizer) {
       _innerHtml = html;
     } else {
-      append(createFragment(
-          html, validator: validator, treeSanitizer: treeSanitizer));
+      append(createFragment(html,
+          validator: validator, treeSanitizer: treeSanitizer));
     }
   }
+
   String get innerHtml => _innerHtml;
 
   /**
@@ -14029,7 +14211,9 @@
    * Those attributes are: attributes, lastChild, children, previousNode and tagName.
    */
   static bool _hasCorruptedAttributes(Element element) {
-     return JS('bool', r'''
+    return JS(
+        'bool',
+        r'''
        (function(element) {
          if (!(element.attributes instanceof NamedNodeMap)) {
 	   return true;
@@ -14064,7 +14248,8 @@
            }
          }
 	 return false;
-          })(#)''', element);
+          })(#)''',
+        element);
   }
 
   /// A secondary check for corruption, needed on IE
@@ -14130,9 +14315,10 @@
   @DocsEditable()
   int get scrollWidth => JS('num', '#.scrollWidth', this).round();
 
-
   // To suppress missing implicit constructor warnings.
-  factory Element._() { throw new UnsupportedError("Not supported"); }
+  factory Element._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `abort` events to event
@@ -14142,7 +14328,8 @@
    */
   @DomName('Element.abortEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
+  static const EventStreamProvider<Event> abortEvent =
+      const EventStreamProvider<Event>('abort');
 
   /**
    * Static factory designed to expose `beforecopy` events to event
@@ -14152,7 +14339,8 @@
    */
   @DomName('Element.beforecopyEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
+  static const EventStreamProvider<Event> beforeCopyEvent =
+      const EventStreamProvider<Event>('beforecopy');
 
   /**
    * Static factory designed to expose `beforecut` events to event
@@ -14162,7 +14350,8 @@
    */
   @DomName('Element.beforecutEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
+  static const EventStreamProvider<Event> beforeCutEvent =
+      const EventStreamProvider<Event>('beforecut');
 
   /**
    * Static factory designed to expose `beforepaste` events to event
@@ -14172,7 +14361,8 @@
    */
   @DomName('Element.beforepasteEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
+  static const EventStreamProvider<Event> beforePasteEvent =
+      const EventStreamProvider<Event>('beforepaste');
 
   /**
    * Static factory designed to expose `blur` events to event
@@ -14182,17 +14372,20 @@
    */
   @DomName('Element.blurEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
+  static const EventStreamProvider<Event> blurEvent =
+      const EventStreamProvider<Event>('blur');
 
   @DomName('Element.canplayEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
+  static const EventStreamProvider<Event> canPlayEvent =
+      const EventStreamProvider<Event>('canplay');
 
   @DomName('Element.canplaythroughEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
+  static const EventStreamProvider<Event> canPlayThroughEvent =
+      const EventStreamProvider<Event>('canplaythrough');
 
   /**
    * Static factory designed to expose `change` events to event
@@ -14202,7 +14395,8 @@
    */
   @DomName('Element.changeEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+  static const EventStreamProvider<Event> changeEvent =
+      const EventStreamProvider<Event>('change');
 
   /**
    * Static factory designed to expose `click` events to event
@@ -14212,7 +14406,8 @@
    */
   @DomName('Element.clickEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
+  static const EventStreamProvider<MouseEvent> clickEvent =
+      const EventStreamProvider<MouseEvent>('click');
 
   /**
    * Static factory designed to expose `contextmenu` events to event
@@ -14222,7 +14417,8 @@
    */
   @DomName('Element.contextmenuEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
+  static const EventStreamProvider<MouseEvent> contextMenuEvent =
+      const EventStreamProvider<MouseEvent>('contextmenu');
 
   /**
    * Static factory designed to expose `copy` events to event
@@ -14232,7 +14428,8 @@
    */
   @DomName('Element.copyEvent')
   @DocsEditable()
-  static const EventStreamProvider<ClipboardEvent> copyEvent = const EventStreamProvider<ClipboardEvent>('copy');
+  static const EventStreamProvider<ClipboardEvent> copyEvent =
+      const EventStreamProvider<ClipboardEvent>('copy');
 
   /**
    * Static factory designed to expose `cut` events to event
@@ -14242,7 +14439,8 @@
    */
   @DomName('Element.cutEvent')
   @DocsEditable()
-  static const EventStreamProvider<ClipboardEvent> cutEvent = const EventStreamProvider<ClipboardEvent>('cut');
+  static const EventStreamProvider<ClipboardEvent> cutEvent =
+      const EventStreamProvider<ClipboardEvent>('cut');
 
   /**
    * Static factory designed to expose `doubleclick` events to event
@@ -14252,7 +14450,8 @@
    */
   @DomName('Element.dblclickEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
+  static const EventStreamProvider<Event> doubleClickEvent =
+      const EventStreamProvider<Event>('dblclick');
 
   /**
    * A stream of `drag` events fired when an element is currently being dragged.
@@ -14273,7 +14472,8 @@
    */
   @DomName('Element.dragEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
+  static const EventStreamProvider<MouseEvent> dragEvent =
+      const EventStreamProvider<MouseEvent>('drag');
 
   /**
    * A stream of `dragend` events fired when an element completes a drag
@@ -14291,7 +14491,8 @@
    */
   @DomName('Element.dragendEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
+  static const EventStreamProvider<MouseEvent> dragEndEvent =
+      const EventStreamProvider<MouseEvent>('dragend');
 
   /**
    * A stream of `dragenter` events fired when a dragged object is first dragged
@@ -14309,7 +14510,8 @@
    */
   @DomName('Element.dragenterEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
+  static const EventStreamProvider<MouseEvent> dragEnterEvent =
+      const EventStreamProvider<MouseEvent>('dragenter');
 
   /**
    * A stream of `dragleave` events fired when an object being dragged over an
@@ -14327,7 +14529,8 @@
    */
   @DomName('Element.dragleaveEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
+  static const EventStreamProvider<MouseEvent> dragLeaveEvent =
+      const EventStreamProvider<MouseEvent>('dragleave');
 
   /**
    * A stream of `dragover` events fired when a dragged object is currently
@@ -14345,7 +14548,8 @@
    */
   @DomName('Element.dragoverEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
+  static const EventStreamProvider<MouseEvent> dragOverEvent =
+      const EventStreamProvider<MouseEvent>('dragover');
 
   /**
    * A stream of `dragstart` events for a dragged element whose drag has begun.
@@ -14362,7 +14566,8 @@
    */
   @DomName('Element.dragstartEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
+  static const EventStreamProvider<MouseEvent> dragStartEvent =
+      const EventStreamProvider<MouseEvent>('dragstart');
 
   /**
    * A stream of `drop` events fired when a dragged object is dropped on an
@@ -14380,22 +14585,26 @@
    */
   @DomName('Element.dropEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
+  static const EventStreamProvider<MouseEvent> dropEvent =
+      const EventStreamProvider<MouseEvent>('drop');
 
   @DomName('Element.durationchangeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
+  static const EventStreamProvider<Event> durationChangeEvent =
+      const EventStreamProvider<Event>('durationchange');
 
   @DomName('Element.emptiedEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
+  static const EventStreamProvider<Event> emptiedEvent =
+      const EventStreamProvider<Event>('emptied');
 
   @DomName('Element.endedEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+  static const EventStreamProvider<Event> endedEvent =
+      const EventStreamProvider<Event>('ended');
 
   /**
    * Static factory designed to expose `error` events to event
@@ -14405,7 +14614,8 @@
    */
   @DomName('Element.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /**
    * Static factory designed to expose `focus` events to event
@@ -14415,7 +14625,8 @@
    */
   @DomName('Element.focusEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
+  static const EventStreamProvider<Event> focusEvent =
+      const EventStreamProvider<Event>('focus');
 
   /**
    * Static factory designed to expose `input` events to event
@@ -14425,7 +14636,8 @@
    */
   @DomName('Element.inputEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
+  static const EventStreamProvider<Event> inputEvent =
+      const EventStreamProvider<Event>('input');
 
   /**
    * Static factory designed to expose `invalid` events to event
@@ -14435,7 +14647,8 @@
    */
   @DomName('Element.invalidEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> invalidEvent = const EventStreamProvider<Event>('invalid');
+  static const EventStreamProvider<Event> invalidEvent =
+      const EventStreamProvider<Event>('invalid');
 
   /**
    * Static factory designed to expose `keydown` events to event
@@ -14445,7 +14658,8 @@
    */
   @DomName('Element.keydownEvent')
   @DocsEditable()
-  static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
+  static const EventStreamProvider<KeyboardEvent> keyDownEvent =
+      const EventStreamProvider<KeyboardEvent>('keydown');
 
   /**
    * Static factory designed to expose `keypress` events to event
@@ -14455,7 +14669,8 @@
    */
   @DomName('Element.keypressEvent')
   @DocsEditable()
-  static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
+  static const EventStreamProvider<KeyboardEvent> keyPressEvent =
+      const EventStreamProvider<KeyboardEvent>('keypress');
 
   /**
    * Static factory designed to expose `keyup` events to event
@@ -14465,7 +14680,8 @@
    */
   @DomName('Element.keyupEvent')
   @DocsEditable()
-  static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
+  static const EventStreamProvider<KeyboardEvent> keyUpEvent =
+      const EventStreamProvider<KeyboardEvent>('keyup');
 
   /**
    * Static factory designed to expose `load` events to event
@@ -14475,17 +14691,20 @@
    */
   @DomName('Element.loadEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
+  static const EventStreamProvider<Event> loadEvent =
+      const EventStreamProvider<Event>('load');
 
   @DomName('Element.loadeddataEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
+  static const EventStreamProvider<Event> loadedDataEvent =
+      const EventStreamProvider<Event>('loadeddata');
 
   @DomName('Element.loadedmetadataEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
+  static const EventStreamProvider<Event> loadedMetadataEvent =
+      const EventStreamProvider<Event>('loadedmetadata');
 
   /**
    * Static factory designed to expose `mousedown` events to event
@@ -14495,7 +14714,8 @@
    */
   @DomName('Element.mousedownEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
+  static const EventStreamProvider<MouseEvent> mouseDownEvent =
+      const EventStreamProvider<MouseEvent>('mousedown');
 
   /**
    * Static factory designed to expose `mouseenter` events to event
@@ -14506,7 +14726,8 @@
   @DomName('Element.mouseenterEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
+  static const EventStreamProvider<MouseEvent> mouseEnterEvent =
+      const EventStreamProvider<MouseEvent>('mouseenter');
 
   /**
    * Static factory designed to expose `mouseleave` events to event
@@ -14517,7 +14738,8 @@
   @DomName('Element.mouseleaveEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
+  static const EventStreamProvider<MouseEvent> mouseLeaveEvent =
+      const EventStreamProvider<MouseEvent>('mouseleave');
 
   /**
    * Static factory designed to expose `mousemove` events to event
@@ -14527,7 +14749,8 @@
    */
   @DomName('Element.mousemoveEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
+  static const EventStreamProvider<MouseEvent> mouseMoveEvent =
+      const EventStreamProvider<MouseEvent>('mousemove');
 
   /**
    * Static factory designed to expose `mouseout` events to event
@@ -14537,7 +14760,8 @@
    */
   @DomName('Element.mouseoutEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
+  static const EventStreamProvider<MouseEvent> mouseOutEvent =
+      const EventStreamProvider<MouseEvent>('mouseout');
 
   /**
    * Static factory designed to expose `mouseover` events to event
@@ -14547,7 +14771,8 @@
    */
   @DomName('Element.mouseoverEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
+  static const EventStreamProvider<MouseEvent> mouseOverEvent =
+      const EventStreamProvider<MouseEvent>('mouseover');
 
   /**
    * Static factory designed to expose `mouseup` events to event
@@ -14557,7 +14782,8 @@
    */
   @DomName('Element.mouseupEvent')
   @DocsEditable()
-  static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
+  static const EventStreamProvider<MouseEvent> mouseUpEvent =
+      const EventStreamProvider<MouseEvent>('mouseup');
 
   /**
    * Static factory designed to expose `paste` events to event
@@ -14567,27 +14793,32 @@
    */
   @DomName('Element.pasteEvent')
   @DocsEditable()
-  static const EventStreamProvider<ClipboardEvent> pasteEvent = const EventStreamProvider<ClipboardEvent>('paste');
+  static const EventStreamProvider<ClipboardEvent> pasteEvent =
+      const EventStreamProvider<ClipboardEvent>('paste');
 
   @DomName('Element.pauseEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
+  static const EventStreamProvider<Event> pauseEvent =
+      const EventStreamProvider<Event>('pause');
 
   @DomName('Element.playEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
+  static const EventStreamProvider<Event> playEvent =
+      const EventStreamProvider<Event>('play');
 
   @DomName('Element.playingEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
+  static const EventStreamProvider<Event> playingEvent =
+      const EventStreamProvider<Event>('playing');
 
   @DomName('Element.ratechangeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
+  static const EventStreamProvider<Event> rateChangeEvent =
+      const EventStreamProvider<Event>('ratechange');
 
   /**
    * Static factory designed to expose `reset` events to event
@@ -14597,12 +14828,14 @@
    */
   @DomName('Element.resetEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
+  static const EventStreamProvider<Event> resetEvent =
+      const EventStreamProvider<Event>('reset');
 
   @DomName('Element.resizeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
+  static const EventStreamProvider<Event> resizeEvent =
+      const EventStreamProvider<Event>('resize');
 
   /**
    * Static factory designed to expose `scroll` events to event
@@ -14612,7 +14845,8 @@
    */
   @DomName('Element.scrollEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
+  static const EventStreamProvider<Event> scrollEvent =
+      const EventStreamProvider<Event>('scroll');
 
   /**
    * Static factory designed to expose `search` events to event
@@ -14624,17 +14858,20 @@
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
+  static const EventStreamProvider<Event> searchEvent =
+      const EventStreamProvider<Event>('search');
 
   @DomName('Element.seekedEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
+  static const EventStreamProvider<Event> seekedEvent =
+      const EventStreamProvider<Event>('seeked');
 
   @DomName('Element.seekingEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
+  static const EventStreamProvider<Event> seekingEvent =
+      const EventStreamProvider<Event>('seeking');
 
   /**
    * Static factory designed to expose `select` events to event
@@ -14644,7 +14881,8 @@
    */
   @DomName('Element.selectEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
+  static const EventStreamProvider<Event> selectEvent =
+      const EventStreamProvider<Event>('select');
 
   /**
    * Static factory designed to expose `selectstart` events to event
@@ -14655,12 +14893,14 @@
   @DomName('Element.selectstartEvent')
   @DocsEditable()
   @Experimental() // nonstandard
-  static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
+  static const EventStreamProvider<Event> selectStartEvent =
+      const EventStreamProvider<Event>('selectstart');
 
   @DomName('Element.stalledEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
+  static const EventStreamProvider<Event> stalledEvent =
+      const EventStreamProvider<Event>('stalled');
 
   /**
    * Static factory designed to expose `submit` events to event
@@ -14670,17 +14910,20 @@
    */
   @DomName('Element.submitEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
+  static const EventStreamProvider<Event> submitEvent =
+      const EventStreamProvider<Event>('submit');
 
   @DomName('Element.suspendEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
+  static const EventStreamProvider<Event> suspendEvent =
+      const EventStreamProvider<Event>('suspend');
 
   @DomName('Element.timeupdateEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
+  static const EventStreamProvider<Event> timeUpdateEvent =
+      const EventStreamProvider<Event>('timeupdate');
 
   /**
    * Static factory designed to expose `touchcancel` events to event
@@ -14692,7 +14935,8 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  static const EventStreamProvider<TouchEvent> touchCancelEvent = const EventStreamProvider<TouchEvent>('touchcancel');
+  static const EventStreamProvider<TouchEvent> touchCancelEvent =
+      const EventStreamProvider<TouchEvent>('touchcancel');
 
   /**
    * Static factory designed to expose `touchend` events to event
@@ -14704,7 +14948,8 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  static const EventStreamProvider<TouchEvent> touchEndEvent = const EventStreamProvider<TouchEvent>('touchend');
+  static const EventStreamProvider<TouchEvent> touchEndEvent =
+      const EventStreamProvider<TouchEvent>('touchend');
 
   /**
    * Static factory designed to expose `touchenter` events to event
@@ -14716,7 +14961,8 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  static const EventStreamProvider<TouchEvent> touchEnterEvent = const EventStreamProvider<TouchEvent>('touchenter');
+  static const EventStreamProvider<TouchEvent> touchEnterEvent =
+      const EventStreamProvider<TouchEvent>('touchenter');
 
   /**
    * Static factory designed to expose `touchleave` events to event
@@ -14728,7 +14974,8 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  static const EventStreamProvider<TouchEvent> touchLeaveEvent = const EventStreamProvider<TouchEvent>('touchleave');
+  static const EventStreamProvider<TouchEvent> touchLeaveEvent =
+      const EventStreamProvider<TouchEvent>('touchleave');
 
   /**
    * Static factory designed to expose `touchmove` events to event
@@ -14740,7 +14987,8 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  static const EventStreamProvider<TouchEvent> touchMoveEvent = const EventStreamProvider<TouchEvent>('touchmove');
+  static const EventStreamProvider<TouchEvent> touchMoveEvent =
+      const EventStreamProvider<TouchEvent>('touchmove');
 
   /**
    * Static factory designed to expose `touchstart` events to event
@@ -14752,17 +15000,20 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  static const EventStreamProvider<TouchEvent> touchStartEvent = const EventStreamProvider<TouchEvent>('touchstart');
+  static const EventStreamProvider<TouchEvent> touchStartEvent =
+      const EventStreamProvider<TouchEvent>('touchstart');
 
   @DomName('Element.volumechangeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
+  static const EventStreamProvider<Event> volumeChangeEvent =
+      const EventStreamProvider<Event>('volumechange');
 
   @DomName('Element.waitingEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
+  static const EventStreamProvider<Event> waitingEvent =
+      const EventStreamProvider<Event>('waiting');
 
   /**
    * Static factory designed to expose `fullscreenchange` events to event
@@ -14776,7 +15027,8 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  static const EventStreamProvider<Event> fullscreenChangeEvent = const EventStreamProvider<Event>('webkitfullscreenchange');
+  static const EventStreamProvider<Event> fullscreenChangeEvent =
+      const EventStreamProvider<Event>('webkitfullscreenchange');
 
   /**
    * Static factory designed to expose `fullscreenerror` events to event
@@ -14790,7 +15042,8 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  static const EventStreamProvider<Event> fullscreenErrorEvent = const EventStreamProvider<Event>('webkitfullscreenerror');
+  static const EventStreamProvider<Event> fullscreenErrorEvent =
+      const EventStreamProvider<Event>('webkitfullscreenerror');
 
   @DomName('Element.contentEditable')
   @DocsEditable()
@@ -14901,15 +15154,15 @@
 
   @DomName('Element.blur')
   @DocsEditable()
-  void blur() native;
+  void blur() native ;
 
   @DomName('Element.click')
   @DocsEditable()
-  void click() native;
+  void click() native ;
 
   @DomName('Element.focus')
   @DocsEditable()
-  void focus() native;
+  void focus() native ;
 
   @JSName('attributes')
   @DomName('Element.attributes')
@@ -14991,22 +15244,22 @@
   @DomName('Element.closest')
   @DocsEditable()
   @Experimental() // untriaged
-  Element closest(String selectors) native;
+  Element closest(String selectors) native ;
 
   @DomName('Element.getAnimations')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Animation> getAnimations() native;
+  List<Animation> getAnimations() native ;
 
   @DomName('Element.getAttribute')
   @DocsEditable()
   @Experimental() // untriaged
-  String getAttribute(String name) native;
+  String getAttribute(String name) native ;
 
   @DomName('Element.getAttributeNS')
   @DocsEditable()
   @Experimental() // untriaged
-  String getAttributeNS(String namespaceURI, String localName) native;
+  String getAttributeNS(String namespaceURI, String localName) native ;
 
   /**
    * Returns the smallest bounding rectangle that encompasses this element's
@@ -15022,7 +15275,7 @@
    */
   @DomName('Element.getBoundingClientRect')
   @DocsEditable()
-  Rectangle getBoundingClientRect() native;
+  Rectangle getBoundingClientRect() native ;
 
   /**
    * Returns a list of bounding rectangles for each box associated with this
@@ -15040,7 +15293,7 @@
   @DocsEditable()
   @Returns('_ClientRectList')
   @Creates('_ClientRectList')
-  List<Rectangle> getClientRects() native;
+  List<Rectangle> getClientRects() native ;
 
   /**
    * Returns a list of shadow DOM insertion points to which this element is
@@ -15057,7 +15310,7 @@
   @Experimental() // untriaged
   @Returns('NodeList')
   @Creates('NodeList')
-  List<Node> getDestinationInsertionPoints() native;
+  List<Node> getDestinationInsertionPoints() native ;
 
   /**
    * Returns a list of nodes with the given class name inside this element.
@@ -15072,44 +15325,44 @@
   @DocsEditable()
   @Creates('NodeList|HtmlCollection')
   @Returns('NodeList|HtmlCollection')
-  List<Node> getElementsByClassName(String classNames) native;
+  List<Node> getElementsByClassName(String classNames) native ;
 
   @JSName('getElementsByTagName')
   @DomName('Element.getElementsByTagName')
   @DocsEditable()
   @Creates('NodeList|HtmlCollection')
   @Returns('NodeList|HtmlCollection')
-  List<Node> _getElementsByTagName(String localName) native;
+  List<Node> _getElementsByTagName(String localName) native ;
 
   @JSName('hasAttribute')
   @DomName('Element.hasAttribute')
   @DocsEditable()
-  bool _hasAttribute(String name) native;
+  bool _hasAttribute(String name) native ;
 
   @JSName('hasAttributeNS')
   @DomName('Element.hasAttributeNS')
   @DocsEditable()
-  bool _hasAttributeNS(String namespaceURI, String localName) native;
+  bool _hasAttributeNS(String namespaceURI, String localName) native ;
 
   @JSName('removeAttribute')
   @DomName('Element.removeAttribute')
   @DocsEditable()
-  void _removeAttribute(String name) native;
+  void _removeAttribute(String name) native ;
 
   @JSName('removeAttributeNS')
   @DomName('Element.removeAttributeNS')
   @DocsEditable()
-  void _removeAttributeNS(String namespaceURI, String localName) native;
+  void _removeAttributeNS(String namespaceURI, String localName) native ;
 
   @DomName('Element.requestFullscreen')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestFullscreen() native;
+  void requestFullscreen() native ;
 
   @DomName('Element.requestPointerLock')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestPointerLock() native;
+  void requestPointerLock() native ;
 
   @DomName('Element.scroll')
   @DocsEditable()
@@ -15130,21 +15383,22 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+
   @JSName('scroll')
   @DomName('Element.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  void _scroll_1() native;
+  void _scroll_1() native ;
   @JSName('scroll')
   @DomName('Element.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  void _scroll_2(options) native;
+  void _scroll_2(options) native ;
   @JSName('scroll')
   @DomName('Element.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  void _scroll_3(num x, y) native;
+  void _scroll_3(num x, y) native ;
 
   @DomName('Element.scrollBy')
   @DocsEditable()
@@ -15165,33 +15419,34 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+
   @JSName('scrollBy')
   @DomName('Element.scrollBy')
   @DocsEditable()
   @Experimental() // untriaged
-  void _scrollBy_1() native;
+  void _scrollBy_1() native ;
   @JSName('scrollBy')
   @DomName('Element.scrollBy')
   @DocsEditable()
   @Experimental() // untriaged
-  void _scrollBy_2(options) native;
+  void _scrollBy_2(options) native ;
   @JSName('scrollBy')
   @DomName('Element.scrollBy')
   @DocsEditable()
   @Experimental() // untriaged
-  void _scrollBy_3(num x, y) native;
+  void _scrollBy_3(num x, y) native ;
 
   @JSName('scrollIntoView')
   @DomName('Element.scrollIntoView')
   @DocsEditable()
-  void _scrollIntoView([bool alignWithTop]) native;
+  void _scrollIntoView([bool alignWithTop]) native ;
 
   @JSName('scrollIntoViewIfNeeded')
   @DomName('Element.scrollIntoViewIfNeeded')
   @DocsEditable()
   // http://docs.webplatform.org/wiki/dom/methods/scrollIntoViewIfNeeded
   @Experimental() // non-standard
-  void _scrollIntoViewIfNeeded([bool centerIfNeeded]) native;
+  void _scrollIntoViewIfNeeded([bool centerIfNeeded]) native ;
 
   @DomName('Element.scrollTo')
   @DocsEditable()
@@ -15212,41 +15467,42 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+
   @JSName('scrollTo')
   @DomName('Element.scrollTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void _scrollTo_1() native;
+  void _scrollTo_1() native ;
   @JSName('scrollTo')
   @DomName('Element.scrollTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void _scrollTo_2(options) native;
+  void _scrollTo_2(options) native ;
   @JSName('scrollTo')
   @DomName('Element.scrollTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void _scrollTo_3(num x, y) native;
+  void _scrollTo_3(num x, y) native ;
 
   @DomName('Element.setAttribute')
   @DocsEditable()
-  void setAttribute(String name, String value) native;
+  void setAttribute(String name, String value) native ;
 
   @DomName('Element.setAttributeNS')
   @DocsEditable()
-  void setAttributeNS(String namespaceURI, String name, String value) native;
+  void setAttributeNS(String namespaceURI, String name, String value) native ;
 
   // From ChildNode
 
   @DomName('Element.after')
   @DocsEditable()
   @Experimental() // untriaged
-  void after(Object nodes) native;
+  void after(Object nodes) native ;
 
   @DomName('Element.before')
   @DocsEditable()
   @Experimental() // untriaged
-  void before(Object nodes) native;
+  void before(Object nodes) native ;
 
   // From NonDocumentTypeChildNode
 
@@ -15300,14 +15556,14 @@
    */
   @DomName('Element.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) native;
+  Element querySelector(String selectors) native ;
 
   @JSName('querySelectorAll')
   @DomName('Element.querySelectorAll')
   @DocsEditable()
   @Returns('NodeList')
   @Creates('NodeList')
-  List<Node> _querySelectorAll(String selectors) native;
+  List<Node> _querySelectorAll(String selectors) native ;
 
   /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
@@ -15342,7 +15598,8 @@
   @DomName('Element.oncanplaythrough')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onCanPlayThrough => canPlayThroughEvent.forElement(this);
+  ElementStream<Event> get onCanPlayThrough =>
+      canPlayThroughEvent.forElement(this);
 
   /// Stream of `change` events handled by this [Element].
   @DomName('Element.onchange')
@@ -15357,7 +15614,8 @@
   /// Stream of `contextmenu` events handled by this [Element].
   @DomName('Element.oncontextmenu')
   @DocsEditable()
-  ElementStream<MouseEvent> get onContextMenu => contextMenuEvent.forElement(this);
+  ElementStream<MouseEvent> get onContextMenu =>
+      contextMenuEvent.forElement(this);
 
   /// Stream of `copy` events handled by this [Element].
   @DomName('Element.oncopy')
@@ -15506,7 +15764,8 @@
   @DomName('Element.ondurationchange')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onDurationChange => durationChangeEvent.forElement(this);
+  ElementStream<Event> get onDurationChange =>
+      durationChangeEvent.forElement(this);
 
   @DomName('Element.onemptied')
   @DocsEditable()
@@ -15566,7 +15825,8 @@
   @DomName('Element.onloadedmetadata')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onLoadedMetadata => loadedMetadataEvent.forElement(this);
+  ElementStream<Event> get onLoadedMetadata =>
+      loadedMetadataEvent.forElement(this);
 
   /// Stream of `mousedown` events handled by this [Element].
   @DomName('Element.onmousedown')
@@ -15577,13 +15837,15 @@
   @DomName('Element.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<MouseEvent> get onMouseEnter => mouseEnterEvent.forElement(this);
+  ElementStream<MouseEvent> get onMouseEnter =>
+      mouseEnterEvent.forElement(this);
 
   /// Stream of `mouseleave` events handled by this [Element].
   @DomName('Element.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forElement(this);
+  ElementStream<MouseEvent> get onMouseLeave =>
+      mouseLeaveEvent.forElement(this);
 
   /// Stream of `mousemove` events handled by this [Element].
   @DomName('Element.onmousemove')
@@ -15610,7 +15872,8 @@
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
-  ElementStream<WheelEvent> get onMouseWheel => mouseWheelEvent.forElement(this);
+  ElementStream<WheelEvent> get onMouseWheel =>
+      mouseWheelEvent.forElement(this);
 
   /// Stream of `paste` events handled by this [Element].
   @DomName('Element.onpaste')
@@ -15705,7 +15968,8 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  ElementStream<TouchEvent> get onTouchCancel => touchCancelEvent.forElement(this);
+  ElementStream<TouchEvent> get onTouchCancel =>
+      touchCancelEvent.forElement(this);
 
   /// Stream of `touchend` events handled by this [Element].
   @DomName('Element.ontouchend')
@@ -15719,14 +15983,16 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  ElementStream<TouchEvent> get onTouchEnter => touchEnterEvent.forElement(this);
+  ElementStream<TouchEvent> get onTouchEnter =>
+      touchEnterEvent.forElement(this);
 
   /// Stream of `touchleave` events handled by this [Element].
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  ElementStream<TouchEvent> get onTouchLeave => touchLeaveEvent.forElement(this);
+  ElementStream<TouchEvent> get onTouchLeave =>
+      touchLeaveEvent.forElement(this);
 
   /// Stream of `touchmove` events handled by this [Element].
   @DomName('Element.ontouchmove')
@@ -15740,7 +16006,8 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  ElementStream<TouchEvent> get onTouchStart => touchStartEvent.forElement(this);
+  ElementStream<TouchEvent> get onTouchStart =>
+      touchStartEvent.forElement(this);
 
   /// Stream of `transitionend` events handled by this [Element].
   @DomName('Element.ontransitionend')
@@ -15749,7 +16016,8 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  ElementStream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forElement(this);
+  ElementStream<TransitionEvent> get onTransitionEnd =>
+      transitionEndEvent.forElement(this);
 
   @DomName('Element.onvolumechange')
   @DocsEditable()
@@ -15766,28 +16034,27 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
-  ElementStream<Event> get onFullscreenChange => fullscreenChangeEvent.forElement(this);
+  ElementStream<Event> get onFullscreenChange =>
+      fullscreenChangeEvent.forElement(this);
 
   /// Stream of `fullscreenerror` events handled by this [Element].
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
-  ElementStream<Event> get onFullscreenError => fullscreenErrorEvent.forElement(this);
-
+  ElementStream<Event> get onFullscreenError =>
+      fullscreenErrorEvent.forElement(this);
 }
 
-
 class _ElementFactoryProvider {
-
   @DomName('Document.createElement')
   // Optimization to improve performance until the dart2js compiler inlines this
   // method.
   static dynamic createElement_tag(String tag, String typeExtension) {
     // Firefox may return a JS function for some types (Embed, Object).
     if (typeExtension != null) {
-      return JS('Element|=Object', 'document.createElement(#, #)',
-          tag, typeExtension);
+      return JS('Element|=Object', 'document.createElement(#, #)', tag,
+          typeExtension);
     }
     // Should be able to eliminate this and just call the two-arg version above
     // with null typeExtension, but Chrome treats the tag as case-sensitive if
@@ -15795,10 +16062,8 @@
     // https://code.google.com/p/chromium/issues/detail?id=282467
     return JS('Element|=Object', 'document.createElement(#)', tag);
   }
-
 }
 
-
 /**
  * Options for Element.scrollIntoView.
  */
@@ -15809,8 +16074,10 @@
 
   /// Attempt to align the element to the top of the scrollable area.
   static const TOP = const ScrollAlignment._internal('TOP');
+
   /// Attempt to center the element in the scrollable area.
   static const CENTER = const ScrollAlignment._internal('CENTER');
+
   /// Attempt to align the element to the bottom of the scrollable area.
   static const BOTTOM = const ScrollAlignment._internal('BOTTOM');
 }
@@ -15818,7 +16085,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.
 
-
 @DocsEditable()
 @DomName('HTMLEmbedElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -15828,7 +16094,9 @@
 @Native("HTMLEmbedElement")
 class EmbedElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory EmbedElement._() { throw new UnsupportedError("Not supported"); }
+  factory EmbedElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLEmbedElement.HTMLEmbedElement')
   @DocsEditable()
@@ -15865,11 +16133,11 @@
 
   @DomName('HTMLEmbedElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) native;
+  bool __getter__(index_OR_name) native ;
 
   @DomName('HTMLEmbedElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) native;
+  void __setter__(index_OR_name, Node 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
@@ -15877,7 +16145,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('EntriesCallback')
 // http://www.w3.org/TR/file-system-api/#the-entriescallback-interface
 @Experimental()
@@ -15886,7 +16153,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.
 
-
 @DocsEditable()
 @DomName('Entry')
 // http://www.w3.org/TR/file-system-api/#the-entry-interface
@@ -15894,7 +16160,9 @@
 @Native("Entry")
 class Entry extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Entry._() { throw new UnsupportedError("Not supported"); }
+  factory Entry._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Entry.filesystem')
   @DocsEditable()
@@ -15919,87 +16187,106 @@
   @JSName('copyTo')
   @DomName('Entry.copyTo')
   @DocsEditable()
-  void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) native;
+  void _copyTo(DirectoryEntry parent,
+      {String name,
+      _EntryCallback successCallback,
+      _ErrorCallback errorCallback}) native ;
 
   @JSName('copyTo')
   @DomName('Entry.copyTo')
   @DocsEditable()
   Future<Entry> copyTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
-    _copyTo(parent, name : name,
-        successCallback : (value) { completer.complete(value); },
-        errorCallback : (error) { completer.completeError(error); });
+    _copyTo(parent, name: name, successCallback: (value) {
+      completer.complete(value);
+    }, errorCallback: (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
   @JSName('getMetadata')
   @DomName('Entry.getMetadata')
   @DocsEditable()
-  void _getMetadata(MetadataCallback successCallback, [_ErrorCallback errorCallback]) native;
+  void _getMetadata(MetadataCallback successCallback,
+      [_ErrorCallback errorCallback]) native ;
 
   @JSName('getMetadata')
   @DomName('Entry.getMetadata')
   @DocsEditable()
   Future<Metadata> getMetadata() {
     var completer = new Completer<Metadata>();
-    _getMetadata(
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
+    _getMetadata((value) {
+      completer.complete(value);
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
   @JSName('getParent')
   @DomName('Entry.getParent')
   @DocsEditable()
-  void _getParent([_EntryCallback successCallback, _ErrorCallback errorCallback]) native;
+  void _getParent(
+      [_EntryCallback successCallback, _ErrorCallback errorCallback]) native ;
 
   @JSName('getParent')
   @DomName('Entry.getParent')
   @DocsEditable()
   Future<Entry> getParent() {
     var completer = new Completer<Entry>();
-    _getParent(
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
+    _getParent((value) {
+      completer.complete(value);
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
   @JSName('moveTo')
   @DomName('Entry.moveTo')
   @DocsEditable()
-  void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) native;
+  void _moveTo(DirectoryEntry parent,
+      {String name,
+      _EntryCallback successCallback,
+      _ErrorCallback errorCallback}) native ;
 
   @JSName('moveTo')
   @DomName('Entry.moveTo')
   @DocsEditable()
   Future<Entry> moveTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
-    _moveTo(parent, name : name,
-        successCallback : (value) { completer.complete(value); },
-        errorCallback : (error) { completer.completeError(error); });
+    _moveTo(parent, name: name, successCallback: (value) {
+      completer.complete(value);
+    }, errorCallback: (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
   @JSName('remove')
   @DomName('Entry.remove')
   @DocsEditable()
-  void _remove(VoidCallback successCallback, [_ErrorCallback errorCallback]) native;
+  void _remove(VoidCallback successCallback, [_ErrorCallback errorCallback])
+      native ;
 
   @JSName('remove')
   @DomName('Entry.remove')
   @DocsEditable()
   Future remove() {
     var completer = new Completer();
-    _remove(
-        () { completer.complete(); },
-        (error) { completer.completeError(error); });
+    _remove(() {
+      completer.complete();
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
   @JSName('toURL')
   @DomName('Entry.toURL')
   @DocsEditable()
-  String toUrl() 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
@@ -16007,7 +16294,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('EntryCallback')
 // http://www.w3.org/TR/file-system-api/#the-entrycallback-interface
 @Experimental()
@@ -16018,7 +16304,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('ErrorCallback')
 // http://www.w3.org/TR/file-system-api/#the-errorcallback-interface
 @Experimental()
@@ -16027,14 +16312,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.
 
-
 @DocsEditable()
 @DomName('ErrorEvent')
 @Unstable()
 @Native("ErrorEvent")
 class ErrorEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory ErrorEvent._() { throw new UnsupportedError("Not supported"); }
+  factory ErrorEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ErrorEvent.ErrorEvent')
   @DocsEditable()
@@ -16045,8 +16331,10 @@
     }
     return ErrorEvent._create_2(type);
   }
-  static ErrorEvent _create_1(type, eventInitDict) => JS('ErrorEvent', 'new ErrorEvent(#,#)', type, eventInitDict);
-  static ErrorEvent _create_2(type) => JS('ErrorEvent', 'new ErrorEvent(#)', type);
+  static ErrorEvent _create_1(type, eventInitDict) =>
+      JS('ErrorEvent', 'new ErrorEvent(#,#)', type, eventInitDict);
+  static ErrorEvent _create_2(type) =>
+      JS('ErrorEvent', 'new ErrorEvent(#)', type);
 
   @DomName('ErrorEvent.colno')
   @DocsEditable()
@@ -16077,7 +16365,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('Event')
 @Native("Event,InputEvent")
 class Event extends Interceptor {
@@ -16087,10 +16374,9 @@
   //
   // 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}) {
-    return new Event.eventType('Event', type, canBubble: canBubble,
-        cancelable: cancelable);
+  factory Event(String type, {bool canBubble: true, bool cancelable: true}) {
+    return new Event.eventType('Event', type,
+        canBubble: canBubble, cancelable: cancelable);
   }
 
   /**
@@ -16101,8 +16387,8 @@
    *
    *     var e = new Event.type('MouseEvent', 'mousedown', true, true);
    */
-  factory Event.eventType(String type, String name, {bool canBubble: true,
-      bool cancelable: true}) {
+  factory Event.eventType(String type, String name,
+      {bool canBubble: true, bool cancelable: true}) {
     final Event e = document._createEvent(type);
     e._initEvent(name, canBubble, cancelable);
     return e;
@@ -16140,7 +16426,8 @@
     }
     return Event._create_2(type);
   }
-  static Event _create_1(type, eventInitDict) => JS('Event', 'new Event(#,#)', type, eventInitDict);
+  static Event _create_1(type, eventInitDict) =>
+      JS('Event', 'new Event(#,#)', type, eventInitDict);
   static Event _create_2(type) => JS('Event', 'new Event(#)', type);
 
   /**
@@ -16190,7 +16477,8 @@
 
   @DomName('Event.currentTarget')
   @DocsEditable()
-  EventTarget get currentTarget => _convertNativeToDart_EventTarget(this._get_currentTarget);
+  EventTarget get currentTarget =>
+      _convertNativeToDart_EventTarget(this._get_currentTarget);
   @JSName('currentTarget')
   @DomName('Event.currentTarget')
   @DocsEditable()
@@ -16242,26 +16530,24 @@
   @JSName('initEvent')
   @DomName('Event.initEvent')
   @DocsEditable()
-  void _initEvent(String type, bool bubbles, bool cancelable) native;
+  void _initEvent(String type, bool bubbles, bool cancelable) native ;
 
   @DomName('Event.preventDefault')
   @DocsEditable()
-  void preventDefault() native;
+  void preventDefault() native ;
 
   @DomName('Event.stopImmediatePropagation')
   @DocsEditable()
-  void stopImmediatePropagation() native;
+  void stopImmediatePropagation() native ;
 
   @DomName('Event.stopPropagation')
   @DocsEditable()
-  void stopPropagation() native;
-
+  void stopPropagation() native ;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for 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('EventSource')
 // http://www.w3.org/TR/eventsource/#the-eventsource-interface
 @Experimental() // stable
@@ -16274,7 +16560,9 @@
     return EventSource._factoryEventSource(url, parsedOptions);
   }
   // To suppress missing implicit constructor warnings.
-  factory EventSource._() { throw new UnsupportedError("Not supported"); }
+  factory EventSource._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `error` events to event
@@ -16284,7 +16572,8 @@
    */
   @DomName('EventSource.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /**
    * Static factory designed to expose `message` events to event
@@ -16294,7 +16583,8 @@
    */
   @DomName('EventSource.messageEvent')
   @DocsEditable()
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   /**
    * Static factory designed to expose `open` events to event
@@ -16304,19 +16594,25 @@
    */
   @DomName('EventSource.openEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
+  static const EventStreamProvider<Event> openEvent =
+      const EventStreamProvider<Event>('open');
 
   @DomName('EventSource.EventSource')
   @DocsEditable()
-  static EventSource _factoryEventSource(String url, [Map eventSourceInitDict]) {
+  static EventSource _factoryEventSource(String url,
+      [Map eventSourceInitDict]) {
     if (eventSourceInitDict != null) {
-      var eventSourceInitDict_1 = convertDartToNative_Dictionary(eventSourceInitDict);
+      var eventSourceInitDict_1 =
+          convertDartToNative_Dictionary(eventSourceInitDict);
       return EventSource._create_1(url, eventSourceInitDict_1);
     }
     return EventSource._create_2(url);
   }
-  static EventSource _create_1(url, eventSourceInitDict) => JS('EventSource', 'new EventSource(#,#)', url, eventSourceInitDict);
-  static EventSource _create_2(url) => JS('EventSource', 'new EventSource(#)', url);
+
+  static EventSource _create_1(url, eventSourceInitDict) =>
+      JS('EventSource', 'new EventSource(#,#)', url, eventSourceInitDict);
+  static EventSource _create_2(url) =>
+      JS('EventSource', 'new EventSource(#)', url);
 
   @DomName('EventSource.CLOSED')
   @DocsEditable()
@@ -16344,7 +16640,7 @@
 
   @DomName('EventSource.close')
   @DocsEditable()
-  void close() native;
+  void close() native ;
 
   /// Stream of `error` events handled by this [EventSource].
   @DomName('EventSource.onerror')
@@ -16360,13 +16656,11 @@
   @DomName('EventSource.onopen')
   @DocsEditable()
   Stream<Event> get onOpen => openEvent.forTarget(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.
 
-
 /**
  * Base class that supports listening for and dispatching browser events.
  *
@@ -16416,20 +16710,20 @@
 
 class ElementEvents extends Events {
   static final webkitEvents = {
-    'animationend' : 'webkitAnimationEnd',
-    'animationiteration' : 'webkitAnimationIteration',
-    'animationstart' : 'webkitAnimationStart',
-    'fullscreenchange' : 'webkitfullscreenchange',
-    'fullscreenerror' : 'webkitfullscreenerror',
-    'keyadded' : 'webkitkeyadded',
-    'keyerror' : 'webkitkeyerror',
-    'keymessage' : 'webkitkeymessage',
-    'needkey' : 'webkitneedkey',
-    'pointerlockchange' : 'webkitpointerlockchange',
-    'pointerlockerror' : 'webkitpointerlockerror',
-    'resourcetimingbufferfull' : 'webkitresourcetimingbufferfull',
+    'animationend': 'webkitAnimationEnd',
+    'animationiteration': 'webkitAnimationIteration',
+    'animationstart': 'webkitAnimationStart',
+    'fullscreenchange': 'webkitfullscreenchange',
+    'fullscreenerror': 'webkitfullscreenerror',
+    'keyadded': 'webkitkeyadded',
+    'keyerror': 'webkitkeyerror',
+    'keymessage': 'webkitkeymessage',
+    'needkey': 'webkitneedkey',
+    'pointerlockchange': 'webkitpointerlockchange',
+    'pointerlockerror': 'webkitpointerlockerror',
+    'resourcetimingbufferfull': 'webkitresourcetimingbufferfull',
     'transitionend': 'webkitTransitionEnd',
-    'speechchange' : 'webkitSpeechChange'
+    'speechchange': 'webkitSpeechChange'
   };
 
   ElementEvents(Element ptr) : super(ptr);
@@ -16454,7 +16748,6 @@
 @DomName('EventTarget')
 @Native("EventTarget")
 class EventTarget extends Interceptor {
-
   // Custom element created callback.
   EventTarget._created();
 
@@ -16464,7 +16757,8 @@
    */
   Events get on => new Events(this);
 
-  void addEventListener(String type, EventListener listener, [bool useCapture]) {
+  void addEventListener(String type, EventListener listener,
+      [bool useCapture]) {
     // TODO(leafp): This check is avoid a bug in our dispatch code when
     // listener is null.  The browser treats this call as a no-op in this
     // case, so it's fine to short-circuit it, but we should not have to.
@@ -16473,7 +16767,8 @@
     }
   }
 
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) {
+  void removeEventListener(String type, EventListener listener,
+      [bool useCapture]) {
     // TODO(leafp): This check is avoid a bug in our dispatch code when
     // listener is null.  The browser treats this call as a no-op in this
     // case, so it's fine to short-circuit it, but we should not have to.
@@ -16483,35 +16778,39 @@
   }
 
   // To suppress missing implicit constructor warnings.
-  factory EventTarget._() { throw new UnsupportedError("Not supported"); }
+  factory EventTarget._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('addEventListener')
   @DomName('EventTarget.addEventListener')
   @DocsEditable()
-  void _addEventListener(String type, EventListener listener, [bool capture]) native;
+  void _addEventListener(String type, EventListener listener, [bool capture])
+      native ;
 
   @DomName('EventTarget.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native;
+  bool dispatchEvent(Event event) native ;
 
   @JSName('removeEventListener')
   @DomName('EventTarget.removeEventListener')
   @DocsEditable()
-  void _removeEventListener(String type, EventListener listener, [bool capture]) native;
-
+  void _removeEventListener(String type, EventListener listener, [bool capture])
+      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.
 
-
 @DocsEditable()
 @DomName('ExtendableEvent')
 @Experimental() // untriaged
 @Native("ExtendableEvent")
 class ExtendableEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory ExtendableEvent._() { throw new UnsupportedError("Not supported"); }
+  factory ExtendableEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ExtendableEvent.ExtendableEvent')
   @DocsEditable()
@@ -16522,26 +16821,29 @@
     }
     return ExtendableEvent._create_2(type);
   }
-  static ExtendableEvent _create_1(type, eventInitDict) => JS('ExtendableEvent', 'new ExtendableEvent(#,#)', type, eventInitDict);
-  static ExtendableEvent _create_2(type) => JS('ExtendableEvent', 'new ExtendableEvent(#)', type);
+  static ExtendableEvent _create_1(type, eventInitDict) =>
+      JS('ExtendableEvent', 'new ExtendableEvent(#,#)', type, eventInitDict);
+  static ExtendableEvent _create_2(type) =>
+      JS('ExtendableEvent', 'new ExtendableEvent(#)', type);
 
   @DomName('ExtendableEvent.waitUntil')
   @DocsEditable()
   @Experimental() // untriaged
-  void waitUntil(Object value) native;
+  void waitUntil(Object 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.
 
-
 @DocsEditable()
 @DomName('FederatedCredential')
 @Experimental() // untriaged
 @Native("FederatedCredential")
 class FederatedCredential extends Credential {
   // To suppress missing implicit constructor warnings.
-  factory FederatedCredential._() { throw new UnsupportedError("Not supported"); }
+  factory FederatedCredential._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('FederatedCredential.FederatedCredential')
   @DocsEditable()
@@ -16549,7 +16851,8 @@
     var data_1 = convertDartToNative_Dictionary(data);
     return FederatedCredential._create_1(data_1);
   }
-  static FederatedCredential _create_1(data) => JS('FederatedCredential', 'new FederatedCredential(#)', data);
+  static FederatedCredential _create_1(data) =>
+      JS('FederatedCredential', 'new FederatedCredential(#)', data);
 
   @DomName('FederatedCredential.protocol')
   @DocsEditable()
@@ -16565,14 +16868,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.
 
-
 @DocsEditable()
 @DomName('FetchEvent')
 @Experimental() // untriaged
 @Native("FetchEvent")
 class FetchEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
-  factory FetchEvent._() { throw new UnsupportedError("Not supported"); }
+  factory FetchEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('FetchEvent.FetchEvent')
   @DocsEditable()
@@ -16583,8 +16887,10 @@
     }
     return FetchEvent._create_2(type);
   }
-  static FetchEvent _create_1(type, eventInitDict) => JS('FetchEvent', 'new FetchEvent(#,#)', type, eventInitDict);
-  static FetchEvent _create_2(type) => JS('FetchEvent', 'new FetchEvent(#)', type);
+  static FetchEvent _create_1(type, eventInitDict) =>
+      JS('FetchEvent', 'new FetchEvent(#,#)', type, eventInitDict);
+  static FetchEvent _create_2(type) =>
+      JS('FetchEvent', 'new FetchEvent(#)', type);
 
   @DomName('FetchEvent.isReload')
   @DocsEditable()
@@ -16599,20 +16905,21 @@
   @DomName('FetchEvent.respondWith')
   @DocsEditable()
   @Experimental() // untriaged
-  void respondWith(Object value) native;
+  void respondWith(Object 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.
 
-
 @DocsEditable()
 @DomName('HTMLFieldSetElement')
 @Unstable()
 @Native("HTMLFieldSetElement")
 class FieldSetElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory FieldSetElement._() { throw new UnsupportedError("Not supported"); }
+  factory FieldSetElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLFieldSetElement.HTMLFieldSetElement')
   @DocsEditable()
@@ -16658,28 +16965,29 @@
 
   @DomName('HTMLFieldSetElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native;
+  bool checkValidity() native ;
 
   @DomName('HTMLFieldSetElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() native;
+  bool reportValidity() native ;
 
   @DomName('HTMLFieldSetElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) 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.
 
-
 @DocsEditable()
 @DomName('File')
 @Native("File")
 class File extends Blob {
   // To suppress missing implicit constructor warnings.
-  factory File._() { throw new UnsupportedError("Not supported"); }
+  factory File._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('File.File')
   @DocsEditable()
@@ -16690,8 +16998,10 @@
     }
     return File._create_2(fileBits, fileName);
   }
-  static File _create_1(fileBits, fileName, options) => JS('File', 'new File(#,#,#)', fileBits, fileName, options);
-  static File _create_2(fileBits, fileName) => JS('File', 'new File(#,#)', fileBits, fileName);
+  static File _create_1(fileBits, fileName, options) =>
+      JS('File', 'new File(#,#,#)', fileBits, fileName, options);
+  static File _create_2(fileBits, fileName) =>
+      JS('File', 'new File(#,#)', fileBits, fileName);
 
   @DomName('File.lastModified')
   @DocsEditable()
@@ -16700,7 +17010,8 @@
 
   @DomName('File.lastModifiedDate')
   @DocsEditable()
-  DateTime get lastModifiedDate => convertNativeToDart_DateTime(this._get_lastModifiedDate);
+  DateTime get lastModifiedDate =>
+      convertNativeToDart_DateTime(this._get_lastModifiedDate);
   @JSName('lastModifiedDate')
   @DomName('File.lastModifiedDate')
   @DocsEditable()
@@ -16726,7 +17037,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('FileCallback')
 // http://www.w3.org/TR/file-system-api/#the-filecallback-interface
 @Experimental()
@@ -16735,7 +17045,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.
 
-
 @DocsEditable()
 @DomName('FileEntry')
 // http://www.w3.org/TR/file-system-api/#the-fileentry-interface
@@ -16743,37 +17052,45 @@
 @Native("FileEntry")
 class FileEntry extends Entry {
   // To suppress missing implicit constructor warnings.
-  factory FileEntry._() { throw new UnsupportedError("Not supported"); }
+  factory FileEntry._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('createWriter')
   @DomName('FileEntry.createWriter')
   @DocsEditable()
-  void _createWriter(_FileWriterCallback successCallback, [_ErrorCallback errorCallback]) native;
+  void _createWriter(_FileWriterCallback successCallback,
+      [_ErrorCallback errorCallback]) native ;
 
   @JSName('createWriter')
   @DomName('FileEntry.createWriter')
   @DocsEditable()
   Future<FileWriter> createWriter() {
     var completer = new Completer<FileWriter>();
-    _createWriter(
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
+    _createWriter((value) {
+      completer.complete(value);
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
   @JSName('file')
   @DomName('FileEntry.file')
   @DocsEditable()
-  void _file(_FileCallback successCallback, [_ErrorCallback errorCallback]) native;
+  void _file(_FileCallback successCallback, [_ErrorCallback errorCallback])
+      native ;
 
   @JSName('file')
   @DomName('FileEntry.file')
   @DocsEditable()
   Future<File> file() {
     var completer = new Completer<File>();
-    _file(
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
+    _file((value) {
+      completer.complete(value);
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 }
@@ -16781,7 +17098,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.
 
-
 @DocsEditable()
 @DomName('FileError')
 // http://dev.w3.org/2009/dap/file-system/pub/FileSystem/
@@ -16789,7 +17105,9 @@
 @Native("FileError")
 class FileError extends DomError {
   // To suppress missing implicit constructor warnings.
-  factory FileError._() { throw new UnsupportedError("Not supported"); }
+  factory FileError._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('FileError.ABORT_ERR')
   @DocsEditable()
@@ -16847,31 +17165,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.
 
-
 @DocsEditable()
 @DomName('FileList')
 @Native("FileList")
-class FileList extends Interceptor with ListMixin<File>, ImmutableListMixin<File> implements JavaScriptIndexingBehavior, List<File> {
+class FileList extends Interceptor
+    with ListMixin<File>, ImmutableListMixin<File>
+    implements JavaScriptIndexingBehavior, List<File> {
   // To suppress missing implicit constructor warnings.
-  factory FileList._() { throw new UnsupportedError("Not supported"); }
+  factory FileList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('FileList.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  File operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  File operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("File", "#[#]", this, index);
   }
-  void operator[]=(int index, File value) {
+
+  void operator []=(int index, File value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<File> mixins.
   // File is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -16905,18 +17225,16 @@
 
   @DomName('FileList.item')
   @DocsEditable()
-  File item(int index) native;
+  File item(int index) native ;
 }
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('FileReader')
 @Native("FileReader")
 class FileReader extends EventTarget {
-
   @DomName('FileReader.result')
   @DocsEditable()
   Object get result {
@@ -16928,7 +17246,9 @@
   }
 
   // To suppress missing implicit constructor warnings.
-  factory FileReader._() { throw new UnsupportedError("Not supported"); }
+  factory FileReader._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `abort` events to event
@@ -16938,7 +17258,8 @@
    */
   @DomName('FileReader.abortEvent')
   @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
+  static const EventStreamProvider<ProgressEvent> abortEvent =
+      const EventStreamProvider<ProgressEvent>('abort');
 
   /**
    * Static factory designed to expose `error` events to event
@@ -16948,7 +17269,8 @@
    */
   @DomName('FileReader.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /**
    * Static factory designed to expose `load` events to event
@@ -16958,7 +17280,8 @@
    */
   @DomName('FileReader.loadEvent')
   @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
+  static const EventStreamProvider<ProgressEvent> loadEvent =
+      const EventStreamProvider<ProgressEvent>('load');
 
   /**
    * Static factory designed to expose `loadend` events to event
@@ -16968,7 +17291,8 @@
    */
   @DomName('FileReader.loadendEvent')
   @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
+  static const EventStreamProvider<ProgressEvent> loadEndEvent =
+      const EventStreamProvider<ProgressEvent>('loadend');
 
   /**
    * Static factory designed to expose `loadstart` events to event
@@ -16978,7 +17302,8 @@
    */
   @DomName('FileReader.loadstartEvent')
   @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
+  static const EventStreamProvider<ProgressEvent> loadStartEvent =
+      const EventStreamProvider<ProgressEvent>('loadstart');
 
   /**
    * Static factory designed to expose `progress` events to event
@@ -16988,7 +17313,8 @@
    */
   @DomName('FileReader.progressEvent')
   @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
+  static const EventStreamProvider<ProgressEvent> progressEvent =
+      const EventStreamProvider<ProgressEvent>('progress');
 
   @DomName('FileReader.FileReader')
   @DocsEditable()
@@ -17019,20 +17345,20 @@
 
   @DomName('FileReader.abort')
   @DocsEditable()
-  void abort() native;
+  void abort() native ;
 
   @DomName('FileReader.readAsArrayBuffer')
   @DocsEditable()
-  void readAsArrayBuffer(Blob blob) native;
+  void readAsArrayBuffer(Blob blob) native ;
 
   @JSName('readAsDataURL')
   @DomName('FileReader.readAsDataURL')
   @DocsEditable()
-  void readAsDataUrl(Blob blob) native;
+  void readAsDataUrl(Blob blob) native ;
 
   @DomName('FileReader.readAsText')
   @DocsEditable()
-  void readAsText(Blob blob, [String label]) native;
+  void readAsText(Blob blob, [String label]) native ;
 
   /// Stream of `abort` events handled by this [FileReader].
   @DomName('FileReader.onabort')
@@ -17063,20 +17389,20 @@
   @DomName('FileReader.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(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.
 
-
 @DocsEditable()
 @DomName('Stream')
 @Experimental() // untriaged
 @Native("Stream")
 class FileStream extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory FileStream._() { throw new UnsupportedError("Not supported"); }
+  factory FileStream._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Stream.type')
   @DocsEditable()
@@ -17087,7 +17413,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.
 
-
 @DocsEditable()
 @DomName('DOMFileSystem')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -17096,7 +17421,9 @@
 @Native("DOMFileSystem")
 class FileSystem extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory FileSystem._() { throw new UnsupportedError("Not supported"); }
+  factory FileSystem._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.webkitRequestFileSystem)');
@@ -17115,7 +17442,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('FileSystemCallback')
 // http://www.w3.org/TR/file-system-api/#the-filesystemcallback-interface
 @Experimental()
@@ -17124,7 +17450,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.
 
-
 @DocsEditable()
 @DomName('FileWriter')
 // http://www.w3.org/TR/file-writer-api/#the-filewriter-interface
@@ -17132,7 +17457,9 @@
 @Native("FileWriter")
 class FileWriter extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory FileWriter._() { throw new UnsupportedError("Not supported"); }
+  factory FileWriter._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `abort` events to event
@@ -17142,7 +17469,8 @@
    */
   @DomName('FileWriter.abortEvent')
   @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
+  static const EventStreamProvider<ProgressEvent> abortEvent =
+      const EventStreamProvider<ProgressEvent>('abort');
 
   /**
    * Static factory designed to expose `error` events to event
@@ -17152,7 +17480,8 @@
    */
   @DomName('FileWriter.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /**
    * Static factory designed to expose `progress` events to event
@@ -17162,7 +17491,8 @@
    */
   @DomName('FileWriter.progressEvent')
   @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
+  static const EventStreamProvider<ProgressEvent> progressEvent =
+      const EventStreamProvider<ProgressEvent>('progress');
 
   /**
    * Static factory designed to expose `write` events to event
@@ -17172,7 +17502,8 @@
    */
   @DomName('FileWriter.writeEvent')
   @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> writeEvent = const EventStreamProvider<ProgressEvent>('write');
+  static const EventStreamProvider<ProgressEvent> writeEvent =
+      const EventStreamProvider<ProgressEvent>('write');
 
   /**
    * Static factory designed to expose `writeend` events to event
@@ -17182,7 +17513,8 @@
    */
   @DomName('FileWriter.writeendEvent')
   @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> writeEndEvent = const EventStreamProvider<ProgressEvent>('writeend');
+  static const EventStreamProvider<ProgressEvent> writeEndEvent =
+      const EventStreamProvider<ProgressEvent>('writeend');
 
   /**
    * Static factory designed to expose `writestart` events to event
@@ -17192,7 +17524,8 @@
    */
   @DomName('FileWriter.writestartEvent')
   @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> writeStartEvent = const EventStreamProvider<ProgressEvent>('writestart');
+  static const EventStreamProvider<ProgressEvent> writeStartEvent =
+      const EventStreamProvider<ProgressEvent>('writestart');
 
   @DomName('FileWriter.DONE')
   @DocsEditable()
@@ -17224,19 +17557,19 @@
 
   @DomName('FileWriter.abort')
   @DocsEditable()
-  void abort() native;
+  void abort() native ;
 
   @DomName('FileWriter.seek')
   @DocsEditable()
-  void seek(int position) native;
+  void seek(int position) native ;
 
   @DomName('FileWriter.truncate')
   @DocsEditable()
-  void truncate(int size) native;
+  void truncate(int size) native ;
 
   @DomName('FileWriter.write')
   @DocsEditable()
-  void write(Blob data) native;
+  void write(Blob data) native ;
 
   /// Stream of `abort` events handled by this [FileWriter].
   @DomName('FileWriter.onabort')
@@ -17274,7 +17607,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('FileWriterCallback')
 // http://www.w3.org/TR/file-writer-api/#idl-def-FileWriter
 @Experimental()
@@ -17283,13 +17615,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.
 
-
 @DocsEditable()
 @DomName('FocusEvent')
 @Native("FocusEvent")
 class FocusEvent extends UIEvent {
   // To suppress missing implicit constructor warnings.
-  factory FocusEvent._() { throw new UnsupportedError("Not supported"); }
+  factory FocusEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('FocusEvent.FocusEvent')
   @DocsEditable()
@@ -17300,12 +17633,15 @@
     }
     return FocusEvent._create_2(type);
   }
-  static FocusEvent _create_1(type, eventInitDict) => JS('FocusEvent', 'new FocusEvent(#,#)', type, eventInitDict);
-  static FocusEvent _create_2(type) => JS('FocusEvent', 'new FocusEvent(#)', type);
+  static FocusEvent _create_1(type, eventInitDict) =>
+      JS('FocusEvent', 'new FocusEvent(#,#)', type, eventInitDict);
+  static FocusEvent _create_2(type) =>
+      JS('FocusEvent', 'new FocusEvent(#)', type);
 
   @DomName('FocusEvent.relatedTarget')
   @DocsEditable()
-  EventTarget get relatedTarget => _convertNativeToDart_EventTarget(this._get_relatedTarget);
+  EventTarget get relatedTarget =>
+      _convertNativeToDart_EventTarget(this._get_relatedTarget);
   @JSName('relatedTarget')
   @DomName('FocusEvent.relatedTarget')
   @DocsEditable()
@@ -17316,14 +17652,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.
 
-
 @DocsEditable()
 @DomName('FontFace')
 @Experimental() // untriaged
 @Native("FontFace")
 class FontFace extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory FontFace._() { throw new UnsupportedError("Not supported"); }
+  factory FontFace._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('FontFace.FontFace')
   @DocsEditable()
@@ -17334,8 +17671,10 @@
     }
     return FontFace._create_2(family, source);
   }
-  static FontFace _create_1(family, source, descriptors) => JS('FontFace', 'new FontFace(#,#,#)', family, source, descriptors);
-  static FontFace _create_2(family, source) => JS('FontFace', 'new FontFace(#,#)', family, source);
+  static FontFace _create_1(family, source, descriptors) =>
+      JS('FontFace', 'new FontFace(#,#,#)', family, source, descriptors);
+  static FontFace _create_2(family, source) =>
+      JS('FontFace', 'new FontFace(#,#)', family, source);
 
   @DomName('FontFace.family')
   @DocsEditable()
@@ -17385,20 +17724,21 @@
   @DomName('FontFace.load')
   @DocsEditable()
   @Experimental() // untriaged
-  Future load() native;
+  Future load() 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.
 
-
 @DocsEditable()
 @DomName('FontFaceSet')
 @Experimental() // untriaged
 @Native("FontFaceSet")
 class FontFaceSet extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory FontFaceSet._() { throw new UnsupportedError("Not supported"); }
+  factory FontFaceSet._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('FontFaceSet.size')
   @DocsEditable()
@@ -17413,32 +17753,32 @@
   @DomName('FontFaceSet.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(FontFace fontFace) native;
+  void add(FontFace fontFace) native ;
 
   @DomName('FontFaceSet.check')
   @DocsEditable()
   @Experimental() // untriaged
-  bool check(String font, [String text]) native;
+  bool check(String font, [String text]) native ;
 
   @DomName('FontFaceSet.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  void clear() native;
+  void clear() native ;
 
   @DomName('FontFaceSet.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  bool delete(FontFace fontFace) native;
+  bool delete(FontFace fontFace) native ;
 
   @DomName('FontFaceSet.forEach')
   @DocsEditable()
   @Experimental() // untriaged
-  void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) native;
+  void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) native ;
 
   @DomName('FontFaceSet.has')
   @DocsEditable()
   @Experimental() // untriaged
-  bool has(FontFace fontFace) native;
+  bool has(FontFace fontFace) 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
@@ -17446,22 +17786,23 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('FontFaceSetForEachCallback')
 @Experimental() // untriaged
-typedef void FontFaceSetForEachCallback(FontFace fontFace, FontFace fontFaceAgain, FontFaceSet set);
+typedef void FontFaceSetForEachCallback(
+    FontFace fontFace, FontFace fontFaceAgain, FontFaceSet set);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('FontFaceSetLoadEvent')
 @Experimental() // untriaged
 @Native("FontFaceSetLoadEvent")
 class FontFaceSetLoadEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory FontFaceSetLoadEvent._() { throw new UnsupportedError("Not supported"); }
+  factory FontFaceSetLoadEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('FontFaceSetLoadEvent.fontfaces')
   @DocsEditable()
@@ -17472,7 +17813,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.
 
-
 @DocsEditable()
 @DomName('FormData')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -17482,7 +17822,9 @@
 @Native("FormData")
 class FormData extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory FormData._() { throw new UnsupportedError("Not supported"); }
+  factory FormData._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('FormData.FormData')
   @DocsEditable()
@@ -17500,49 +17842,50 @@
 
   @DomName('FormData.append')
   @DocsEditable()
-  void append(String name, String value) native;
+  void append(String name, String value) native ;
 
   @JSName('append')
   @DomName('FormData.append')
   @DocsEditable()
-  void appendBlob(String name, Blob value, [String filename]) native;
+  void appendBlob(String name, Blob value, [String filename]) native ;
 
   @DomName('FormData.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  void delete(String name) native;
+  void delete(String name) native ;
 
   @DomName('FormData.get')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get(String name) native;
+  Object get(String name) native ;
 
   @DomName('FormData.getAll')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Object> getAll(String name) native;
+  List<Object> getAll(String name) native ;
 
   @DomName('FormData.has')
   @DocsEditable()
   @Experimental() // untriaged
-  bool has(String name) native;
+  bool has(String name) native ;
 
   @DomName('FormData.set')
   @DocsEditable()
   @Experimental() // untriaged
-  void set(String name, value, [String filename]) native;
+  void set(String name, 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.
 
-
 @DocsEditable()
 @DomName('HTMLFormElement')
 @Native("HTMLFormElement")
 class FormElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory FormElement._() { throw new UnsupportedError("Not supported"); }
+  factory FormElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLFormElement.HTMLFormElement')
   @DocsEditable()
@@ -17598,21 +17941,21 @@
 
   @DomName('HTMLFormElement.__getter__')
   @DocsEditable()
-  Object __getter__(String name) native;
+  Object __getter__(String name) native ;
 
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native;
+  bool checkValidity() native ;
 
   @DomName('HTMLFormElement.item')
   @DocsEditable()
   @Experimental() // untriaged
-  Element item(int index) native;
+  Element item(int index) native ;
 
   @DomName('HTMLFormElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() native;
+  bool reportValidity() native ;
 
   @DomName('HTMLFormElement.requestAutocomplete')
   @DocsEditable()
@@ -17623,20 +17966,21 @@
     _requestAutocomplete_1(details_1);
     return;
   }
+
   @JSName('requestAutocomplete')
   @DomName('HTMLFormElement.requestAutocomplete')
   @DocsEditable()
   // http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html
   @Experimental()
-  void _requestAutocomplete_1(details) native;
+  void _requestAutocomplete_1(details) native ;
 
   @DomName('HTMLFormElement.reset')
   @DocsEditable()
-  void reset() native;
+  void reset() native ;
 
   @DomName('HTMLFormElement.submit')
   @DocsEditable()
-  void submit() 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
@@ -17644,7 +17988,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('FrameRequestCallback')
 @Experimental() // untriaged
 typedef void FrameRequestCallback(num highResTime);
@@ -17652,7 +17995,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.
 
-
 @DocsEditable()
 @DomName('Gamepad')
 // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#gamepad-interface
@@ -17660,7 +18002,9 @@
 @Native("Gamepad")
 class Gamepad extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Gamepad._() { throw new UnsupportedError("Not supported"); }
+  factory Gamepad._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Gamepad.axes')
   @DocsEditable()
@@ -17696,14 +18040,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.
 
-
 @DocsEditable()
 @DomName('GamepadButton')
 @Experimental() // untriaged
 @Native("GamepadButton")
 class GamepadButton extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory GamepadButton._() { throw new UnsupportedError("Not supported"); }
+  factory GamepadButton._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('GamepadButton.pressed')
   @DocsEditable()
@@ -17719,14 +18064,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.
 
-
 @DocsEditable()
 @DomName('GamepadEvent')
 @Experimental() // untriaged
 @Native("GamepadEvent")
 class GamepadEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory GamepadEvent._() { throw new UnsupportedError("Not supported"); }
+  factory GamepadEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('GamepadEvent.GamepadEvent')
   @DocsEditable()
@@ -17737,8 +18083,10 @@
     }
     return GamepadEvent._create_2(type);
   }
-  static GamepadEvent _create_1(type, eventInitDict) => JS('GamepadEvent', 'new GamepadEvent(#,#)', type, eventInitDict);
-  static GamepadEvent _create_2(type) => JS('GamepadEvent', 'new GamepadEvent(#)', type);
+  static GamepadEvent _create_1(type, eventInitDict) =>
+      JS('GamepadEvent', 'new GamepadEvent(#,#)', type, eventInitDict);
+  static GamepadEvent _create_2(type) =>
+      JS('GamepadEvent', 'new GamepadEvent(#)', type);
 
   @DomName('GamepadEvent.gamepad')
   @DocsEditable()
@@ -17749,42 +18097,44 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('Geofencing')
 @Experimental() // untriaged
 @Native("Geofencing")
 class Geofencing extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Geofencing._() { throw new UnsupportedError("Not supported"); }
+  factory Geofencing._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Geofencing.getRegisteredRegions')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegisteredRegions() native;
+  Future getRegisteredRegions() native ;
 
   @DomName('Geofencing.registerRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  Future registerRegion(GeofencingRegion region) native;
+  Future registerRegion(GeofencingRegion region) native ;
 
   @DomName('Geofencing.unregisterRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregisterRegion(String regionId) native;
+  Future unregisterRegion(String regionId) 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.
 
-
 @DocsEditable()
 @DomName('GeofencingEvent')
 @Experimental() // untriaged
 @Native("GeofencingEvent")
 class GeofencingEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory GeofencingEvent._() { throw new UnsupportedError("Not supported"); }
+  factory GeofencingEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('GeofencingEvent.id')
   @DocsEditable()
@@ -17800,14 +18150,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.
 
-
 @DocsEditable()
 @DomName('GeofencingRegion')
 @Experimental() // untriaged
 @Native("GeofencingRegion")
 class GeofencingRegion extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory GeofencingRegion._() { throw new UnsupportedError("Not supported"); }
+  factory GeofencingRegion._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('GeofencingRegion.id')
   @DocsEditable()
@@ -17818,16 +18169,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.
 
-
 @DocsEditable()
 @DomName('Geolocation')
 @Unstable()
 @Native("Geolocation")
 class Geolocation extends Interceptor {
-
   @DomName('Geolocation.getCurrentPosition')
-  Future<Geoposition> getCurrentPosition({bool enableHighAccuracy,
-      Duration timeout, Duration maximumAge}) {
+  Future<Geoposition> getCurrentPosition(
+      {bool enableHighAccuracy, Duration timeout, Duration maximumAge}) {
     var options = {};
     if (enableHighAccuracy != null) {
       options['enableHighAccuracy'] = enableHighAccuracy;
@@ -17840,14 +18189,11 @@
     }
     var completer = new Completer<Geoposition>();
     try {
-      _getCurrentPosition(
-          (position) {
-            completer.complete(_ensurePosition(position));
-          },
-          (error) {
-            completer.completeError(error);
-          },
-          options);
+      _getCurrentPosition((position) {
+        completer.complete(_ensurePosition(position));
+      }, (error) {
+        completer.completeError(error);
+      }, options);
     } catch (e, stacktrace) {
       completer.completeError(e, stacktrace);
     }
@@ -17855,9 +18201,8 @@
   }
 
   @DomName('Geolocation.watchPosition')
-  Stream<Geoposition> watchPosition({bool enableHighAccuracy,
-      Duration timeout, Duration maximumAge}) {
-
+  Stream<Geoposition> watchPosition(
+      {bool enableHighAccuracy, Duration timeout, Duration maximumAge}) {
     var options = {};
     if (enableHighAccuracy != null) {
       options['enableHighAccuracy'] = enableHighAccuracy;
@@ -17874,22 +18219,20 @@
     // type here for controller.stream to have the right type.
     // dartbug.com/26278
     StreamController<Geoposition> controller;
-    controller = new StreamController<Geoposition>(sync: true,
-      onListen: () {
-        assert(watchId == null);
-        watchId = _watchPosition(
-            (position) {
-              controller.add(_ensurePosition(position));
-            },
-            (error) {
-              controller.addError(error);
-            },
-            options);
-      },
-      onCancel: () {
-        assert(watchId != null);
-        _clearWatch(watchId);
-      });
+    controller = new StreamController<Geoposition>(
+        sync: true,
+        onListen: () {
+          assert(watchId == null);
+          watchId = _watchPosition((position) {
+            controller.add(_ensurePosition(position));
+          }, (error) {
+            controller.addError(error);
+          }, options);
+        },
+        onCancel: () {
+          assert(watchId != null);
+          _clearWatch(watchId);
+        });
 
     return controller.stream;
   }
@@ -17900,21 +18243,24 @@
       if (domPosition is Geoposition) {
         return domPosition;
       }
-    } catch(e) {}
+    } catch (e) {}
     return new _GeopositionWrapper(domPosition);
   }
 
   // To suppress missing implicit constructor warnings.
-  factory Geolocation._() { throw new UnsupportedError("Not supported"); }
+  factory Geolocation._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('clearWatch')
   @DomName('Geolocation.clearWatch')
   @DocsEditable()
-  void _clearWatch(int watchID) native;
+  void _clearWatch(int watchID) native ;
 
   @DomName('Geolocation.getCurrentPosition')
   @DocsEditable()
-  void _getCurrentPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Map options]) {
+  void _getCurrentPosition(_PositionCallback successCallback,
+      [_PositionErrorCallback errorCallback, Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
       _getCurrentPosition_1(successCallback, errorCallback, options_1);
@@ -17927,22 +18273,26 @@
     _getCurrentPosition_3(successCallback);
     return;
   }
+
   @JSName('getCurrentPosition')
   @DomName('Geolocation.getCurrentPosition')
   @DocsEditable()
-  void _getCurrentPosition_1(_PositionCallback successCallback, _PositionErrorCallback errorCallback, options) native;
+  void _getCurrentPosition_1(_PositionCallback successCallback,
+      _PositionErrorCallback errorCallback, options) native ;
   @JSName('getCurrentPosition')
   @DomName('Geolocation.getCurrentPosition')
   @DocsEditable()
-  void _getCurrentPosition_2(_PositionCallback successCallback, _PositionErrorCallback errorCallback) native;
+  void _getCurrentPosition_2(_PositionCallback successCallback,
+      _PositionErrorCallback errorCallback) native ;
   @JSName('getCurrentPosition')
   @DomName('Geolocation.getCurrentPosition')
   @DocsEditable()
-  void _getCurrentPosition_3(_PositionCallback successCallback) native;
+  void _getCurrentPosition_3(_PositionCallback successCallback) native ;
 
   @DomName('Geolocation.watchPosition')
   @DocsEditable()
-  int _watchPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Map options]) {
+  int _watchPosition(_PositionCallback successCallback,
+      [_PositionErrorCallback errorCallback, Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
       return _watchPosition_1(successCallback, errorCallback, options_1);
@@ -17952,18 +18302,21 @@
     }
     return _watchPosition_3(successCallback);
   }
+
   @JSName('watchPosition')
   @DomName('Geolocation.watchPosition')
   @DocsEditable()
-  int _watchPosition_1(_PositionCallback successCallback, _PositionErrorCallback errorCallback, options) native;
+  int _watchPosition_1(_PositionCallback successCallback,
+      _PositionErrorCallback errorCallback, options) native ;
   @JSName('watchPosition')
   @DomName('Geolocation.watchPosition')
   @DocsEditable()
-  int _watchPosition_2(_PositionCallback successCallback, _PositionErrorCallback errorCallback) native;
+  int _watchPosition_2(_PositionCallback successCallback,
+      _PositionErrorCallback errorCallback) native ;
   @JSName('watchPosition')
   @DomName('Geolocation.watchPosition')
   @DocsEditable()
-  int _watchPosition_3(_PositionCallback successCallback) native;
+  int _watchPosition_3(_PositionCallback successCallback) native ;
 }
 
 /**
@@ -17982,14 +18335,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.
 
-
 @DocsEditable()
 @DomName('Geoposition')
 @Unstable()
 @Native("Geoposition")
 class Geoposition extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Geoposition._() { throw new UnsupportedError("Not supported"); }
+  factory Geoposition._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Geoposition.coords')
   @DocsEditable()
@@ -18003,7 +18357,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.
 
-
 // We implement EventTarget and have stubs for its methods because it's tricky to
 // convince the scripts to make our instance methods abstract, and the bodies that
 // get generated require `this` to be an EventTarget.
@@ -18011,274 +18364,329 @@
 @DomName('GlobalEventHandlers')
 @Experimental() // untriaged
 abstract class GlobalEventHandlers implements EventTarget {
-
-  void addEventListener(String type, dynamic listener(Event event), [bool useCapture]);
+  void addEventListener(String type, dynamic listener(Event event),
+      [bool useCapture]);
   bool dispatchEvent(Event event);
-  void removeEventListener(String type, dynamic listener(Event event), [bool useCapture]);
+  void removeEventListener(String type, dynamic listener(Event event),
+      [bool useCapture]);
   Events get on;
 
   // To suppress missing implicit constructor warnings.
-  factory GlobalEventHandlers._() { throw new UnsupportedError("Not supported"); }
+  factory GlobalEventHandlers._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('GlobalEventHandlers.abortEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
+  static const EventStreamProvider<Event> abortEvent =
+      const EventStreamProvider<Event>('abort');
 
   @DomName('GlobalEventHandlers.blurEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
+  static const EventStreamProvider<Event> blurEvent =
+      const EventStreamProvider<Event>('blur');
 
   @DomName('GlobalEventHandlers.canplayEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
+  static const EventStreamProvider<Event> canPlayEvent =
+      const EventStreamProvider<Event>('canplay');
 
   @DomName('GlobalEventHandlers.canplaythroughEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
+  static const EventStreamProvider<Event> canPlayThroughEvent =
+      const EventStreamProvider<Event>('canplaythrough');
 
   @DomName('GlobalEventHandlers.changeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+  static const EventStreamProvider<Event> changeEvent =
+      const EventStreamProvider<Event>('change');
 
   @DomName('GlobalEventHandlers.clickEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
+  static const EventStreamProvider<MouseEvent> clickEvent =
+      const EventStreamProvider<MouseEvent>('click');
 
   @DomName('GlobalEventHandlers.contextmenuEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
+  static const EventStreamProvider<MouseEvent> contextMenuEvent =
+      const EventStreamProvider<MouseEvent>('contextmenu');
 
   @DomName('GlobalEventHandlers.dblclickEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
+  static const EventStreamProvider<Event> doubleClickEvent =
+      const EventStreamProvider<Event>('dblclick');
 
   @DomName('GlobalEventHandlers.dragEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
+  static const EventStreamProvider<MouseEvent> dragEvent =
+      const EventStreamProvider<MouseEvent>('drag');
 
   @DomName('GlobalEventHandlers.dragendEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
+  static const EventStreamProvider<MouseEvent> dragEndEvent =
+      const EventStreamProvider<MouseEvent>('dragend');
 
   @DomName('GlobalEventHandlers.dragenterEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
+  static const EventStreamProvider<MouseEvent> dragEnterEvent =
+      const EventStreamProvider<MouseEvent>('dragenter');
 
   @DomName('GlobalEventHandlers.dragleaveEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
+  static const EventStreamProvider<MouseEvent> dragLeaveEvent =
+      const EventStreamProvider<MouseEvent>('dragleave');
 
   @DomName('GlobalEventHandlers.dragoverEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
+  static const EventStreamProvider<MouseEvent> dragOverEvent =
+      const EventStreamProvider<MouseEvent>('dragover');
 
   @DomName('GlobalEventHandlers.dragstartEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
+  static const EventStreamProvider<MouseEvent> dragStartEvent =
+      const EventStreamProvider<MouseEvent>('dragstart');
 
   @DomName('GlobalEventHandlers.dropEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
+  static const EventStreamProvider<MouseEvent> dropEvent =
+      const EventStreamProvider<MouseEvent>('drop');
 
   @DomName('GlobalEventHandlers.durationchangeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
+  static const EventStreamProvider<Event> durationChangeEvent =
+      const EventStreamProvider<Event>('durationchange');
 
   @DomName('GlobalEventHandlers.emptiedEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
+  static const EventStreamProvider<Event> emptiedEvent =
+      const EventStreamProvider<Event>('emptied');
 
   @DomName('GlobalEventHandlers.endedEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+  static const EventStreamProvider<Event> endedEvent =
+      const EventStreamProvider<Event>('ended');
 
   @DomName('GlobalEventHandlers.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   @DomName('GlobalEventHandlers.focusEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
+  static const EventStreamProvider<Event> focusEvent =
+      const EventStreamProvider<Event>('focus');
 
   @DomName('GlobalEventHandlers.inputEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
+  static const EventStreamProvider<Event> inputEvent =
+      const EventStreamProvider<Event>('input');
 
   @DomName('GlobalEventHandlers.invalidEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> invalidEvent = const EventStreamProvider<Event>('invalid');
+  static const EventStreamProvider<Event> invalidEvent =
+      const EventStreamProvider<Event>('invalid');
 
   @DomName('GlobalEventHandlers.keydownEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
+  static const EventStreamProvider<KeyboardEvent> keyDownEvent =
+      const EventStreamProvider<KeyboardEvent>('keydown');
 
   @DomName('GlobalEventHandlers.keypressEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
+  static const EventStreamProvider<KeyboardEvent> keyPressEvent =
+      const EventStreamProvider<KeyboardEvent>('keypress');
 
   @DomName('GlobalEventHandlers.keyupEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
+  static const EventStreamProvider<KeyboardEvent> keyUpEvent =
+      const EventStreamProvider<KeyboardEvent>('keyup');
 
   @DomName('GlobalEventHandlers.loadEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
+  static const EventStreamProvider<Event> loadEvent =
+      const EventStreamProvider<Event>('load');
 
   @DomName('GlobalEventHandlers.loadeddataEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
+  static const EventStreamProvider<Event> loadedDataEvent =
+      const EventStreamProvider<Event>('loadeddata');
 
   @DomName('GlobalEventHandlers.loadedmetadataEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
+  static const EventStreamProvider<Event> loadedMetadataEvent =
+      const EventStreamProvider<Event>('loadedmetadata');
 
   @DomName('GlobalEventHandlers.mousedownEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
+  static const EventStreamProvider<MouseEvent> mouseDownEvent =
+      const EventStreamProvider<MouseEvent>('mousedown');
 
   @DomName('GlobalEventHandlers.mouseenterEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
+  static const EventStreamProvider<MouseEvent> mouseEnterEvent =
+      const EventStreamProvider<MouseEvent>('mouseenter');
 
   @DomName('GlobalEventHandlers.mouseleaveEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
+  static const EventStreamProvider<MouseEvent> mouseLeaveEvent =
+      const EventStreamProvider<MouseEvent>('mouseleave');
 
   @DomName('GlobalEventHandlers.mousemoveEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
+  static const EventStreamProvider<MouseEvent> mouseMoveEvent =
+      const EventStreamProvider<MouseEvent>('mousemove');
 
   @DomName('GlobalEventHandlers.mouseoutEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
+  static const EventStreamProvider<MouseEvent> mouseOutEvent =
+      const EventStreamProvider<MouseEvent>('mouseout');
 
   @DomName('GlobalEventHandlers.mouseoverEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
+  static const EventStreamProvider<MouseEvent> mouseOverEvent =
+      const EventStreamProvider<MouseEvent>('mouseover');
 
   @DomName('GlobalEventHandlers.mouseupEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
+  static const EventStreamProvider<MouseEvent> mouseUpEvent =
+      const EventStreamProvider<MouseEvent>('mouseup');
 
   @DomName('GlobalEventHandlers.mousewheelEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
+  static const EventStreamProvider<WheelEvent> mouseWheelEvent =
+      const EventStreamProvider<WheelEvent>('mousewheel');
 
   @DomName('GlobalEventHandlers.pauseEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
+  static const EventStreamProvider<Event> pauseEvent =
+      const EventStreamProvider<Event>('pause');
 
   @DomName('GlobalEventHandlers.playEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
+  static const EventStreamProvider<Event> playEvent =
+      const EventStreamProvider<Event>('play');
 
   @DomName('GlobalEventHandlers.playingEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
+  static const EventStreamProvider<Event> playingEvent =
+      const EventStreamProvider<Event>('playing');
 
   @DomName('GlobalEventHandlers.ratechangeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
+  static const EventStreamProvider<Event> rateChangeEvent =
+      const EventStreamProvider<Event>('ratechange');
 
   @DomName('GlobalEventHandlers.resetEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
+  static const EventStreamProvider<Event> resetEvent =
+      const EventStreamProvider<Event>('reset');
 
   @DomName('GlobalEventHandlers.resizeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
+  static const EventStreamProvider<Event> resizeEvent =
+      const EventStreamProvider<Event>('resize');
 
   @DomName('GlobalEventHandlers.scrollEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
+  static const EventStreamProvider<Event> scrollEvent =
+      const EventStreamProvider<Event>('scroll');
 
   @DomName('GlobalEventHandlers.seekedEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
+  static const EventStreamProvider<Event> seekedEvent =
+      const EventStreamProvider<Event>('seeked');
 
   @DomName('GlobalEventHandlers.seekingEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
+  static const EventStreamProvider<Event> seekingEvent =
+      const EventStreamProvider<Event>('seeking');
 
   @DomName('GlobalEventHandlers.selectEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
+  static const EventStreamProvider<Event> selectEvent =
+      const EventStreamProvider<Event>('select');
 
   @DomName('GlobalEventHandlers.stalledEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
+  static const EventStreamProvider<Event> stalledEvent =
+      const EventStreamProvider<Event>('stalled');
 
   @DomName('GlobalEventHandlers.submitEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
+  static const EventStreamProvider<Event> submitEvent =
+      const EventStreamProvider<Event>('submit');
 
   @DomName('GlobalEventHandlers.suspendEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
+  static const EventStreamProvider<Event> suspendEvent =
+      const EventStreamProvider<Event>('suspend');
 
   @DomName('GlobalEventHandlers.timeupdateEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
+  static const EventStreamProvider<Event> timeUpdateEvent =
+      const EventStreamProvider<Event>('timeupdate');
 
   @DomName('GlobalEventHandlers.volumechangeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
+  static const EventStreamProvider<Event> volumeChangeEvent =
+      const EventStreamProvider<Event>('volumechange');
 
   @DomName('GlobalEventHandlers.waitingEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
+  static const EventStreamProvider<Event> waitingEvent =
+      const EventStreamProvider<Event>('waiting');
 
   @DomName('GlobalEventHandlers.onabort')
   @DocsEditable()
@@ -18544,7 +18952,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.
 
-
 @DocsEditable()
 /**
  * An `<hr>` tag.
@@ -18553,7 +18960,9 @@
 @Native("HTMLHRElement")
 class HRElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory HRElement._() { throw new UnsupportedError("Not supported"); }
+  factory HRElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLHRElement.HTMLHRElement')
   @DocsEditable()
@@ -18584,20 +18993,20 @@
 @Native("HashChangeEvent")
 class HashChangeEvent extends Event {
   factory HashChangeEvent(String type,
-      {bool canBubble: true, bool cancelable: true, String oldUrl,
+      {bool canBubble: true,
+      bool cancelable: true,
+      String oldUrl,
       String newUrl}) {
-
     var options = {
-      'canBubble' : canBubble,
-      'cancelable' : cancelable,
+      'canBubble': canBubble,
+      'cancelable': cancelable,
       'oldURL': oldUrl,
       'newURL': newUrl,
     };
-    return JS('HashChangeEvent', 'new HashChangeEvent(#, #)',
-        type, convertDartToNative_Dictionary(options));
+    return JS('HashChangeEvent', 'new HashChangeEvent(#, #)', type,
+        convertDartToNative_Dictionary(options));
   }
 
-
   @DomName('HashChangeEvent.HashChangeEvent')
   @DocsEditable()
   factory HashChangeEvent._(String type, [Map eventInitDict]) {
@@ -18607,8 +19016,10 @@
     }
     return HashChangeEvent._create_2(type);
   }
-  static HashChangeEvent _create_1(type, eventInitDict) => JS('HashChangeEvent', 'new HashChangeEvent(#,#)', type, eventInitDict);
-  static HashChangeEvent _create_2(type) => JS('HashChangeEvent', 'new HashChangeEvent(#)', type);
+  static HashChangeEvent _create_1(type, eventInitDict) =>
+      JS('HashChangeEvent', 'new HashChangeEvent(#,#)', type, eventInitDict);
+  static HashChangeEvent _create_2(type) =>
+      JS('HashChangeEvent', 'new HashChangeEvent(#)', type);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => Device.isEventTypeSupported('HashChangeEvent');
@@ -18626,20 +19037,21 @@
   @JSName('initHashChangeEvent')
   @DomName('HashChangeEvent.initHashChangeEvent')
   @DocsEditable()
-  void _initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) native;
-
+  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.
 
-
 @DocsEditable()
 @DomName('HTMLHeadElement')
 @Native("HTMLHeadElement")
 class HeadElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory HeadElement._() { throw new UnsupportedError("Not supported"); }
+  factory HeadElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLHeadElement.HTMLHeadElement')
   @DocsEditable()
@@ -18655,14 +19067,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.
 
-
 @DocsEditable()
 @DomName('Headers')
 @Experimental() // untriaged
 @Native("Headers")
 class Headers extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Headers._() { throw new UnsupportedError("Not supported"); }
+  factory Headers._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Headers.Headers')
   @DocsEditable()
@@ -18691,13 +19104,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.
 
-
 @DocsEditable()
 @DomName('HTMLHeadingElement')
 @Native("HTMLHeadingElement")
 class HeadingElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory HeadingElement._() { throw new UnsupportedError("Not supported"); }
+  factory HeadingElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLHeadingElement.HTMLHeadingElement')
   @DocsEditable()
@@ -18733,11 +19147,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.
 
-
 @DomName('History')
 @Native("History")
 class History extends Interceptor implements HistoryBase {
-
   /**
    * Checks if the State APIs are supported on the current platform.
    *
@@ -18749,7 +19161,9 @@
    */
   static bool get supportsState => JS('bool', '!!window.history.pushState');
   // To suppress missing implicit constructor warnings.
-  factory History._() { throw new UnsupportedError("Not supported"); }
+  factory History._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('History.length')
   @DocsEditable()
@@ -18767,7 +19181,8 @@
 
   @DomName('History.state')
   @DocsEditable()
-  dynamic get state => convertNativeToDart_SerializedScriptValue(this._get_state);
+  dynamic get state =>
+      convertNativeToDart_SerializedScriptValue(this._get_state);
   @JSName('state')
   @DomName('History.state')
   @DocsEditable()
@@ -18777,15 +19192,15 @@
 
   @DomName('History.back')
   @DocsEditable()
-  void back() native;
+  void back() native ;
 
   @DomName('History.forward')
   @DocsEditable()
-  void forward() native;
+  void forward() native ;
 
   @DomName('History.go')
   @DocsEditable()
-  void go([int delta]) native;
+  void go([int delta]) native ;
 
   @DomName('History.pushState')
   @DocsEditable()
@@ -18793,7 +19208,8 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void pushState(/*SerializedScriptValue*/ data, String title, String url, [Map options]) {
+  void pushState(/*SerializedScriptValue*/ data, String title, String url,
+      [Map options]) {
     if (options != null) {
       var data_1 = convertDartToNative_SerializedScriptValue(data);
       var options_2 = convertDartToNative_Dictionary(options);
@@ -18804,6 +19220,7 @@
     _pushState_2(data_1, title, url);
     return;
   }
+
   @JSName('pushState')
   @DomName('History.pushState')
   @DocsEditable()
@@ -18811,7 +19228,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void _pushState_1(data, title, url, options) native;
+  void _pushState_1(data, title, url, options) native ;
   @JSName('pushState')
   @DomName('History.pushState')
   @DocsEditable()
@@ -18819,7 +19236,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void _pushState_2(data, title, url) native;
+  void _pushState_2(data, title, url) native ;
 
   @DomName('History.replaceState')
   @DocsEditable()
@@ -18827,7 +19244,8 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void replaceState(/*SerializedScriptValue*/ data, String title, String url, [Map options]) {
+  void replaceState(/*SerializedScriptValue*/ data, String title, String url,
+      [Map options]) {
     if (options != null) {
       var data_1 = convertDartToNative_SerializedScriptValue(data);
       var options_2 = convertDartToNative_Dictionary(options);
@@ -18838,6 +19256,7 @@
     _replaceState_2(data_1, title, url);
     return;
   }
+
   @JSName('replaceState')
   @DomName('History.replaceState')
   @DocsEditable()
@@ -18845,7 +19264,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void _replaceState_1(data, title, url, options) native;
+  void _replaceState_1(data, title, url, options) native ;
   @JSName('replaceState')
   @DomName('History.replaceState')
   @DocsEditable()
@@ -18853,60 +19272,63 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void _replaceState_2(data, title, url) native;
+  void _replaceState_2(data, title, 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.
 
-
 @DocsEditable()
 @DomName('HMDVRDevice')
 @Experimental() // untriaged
 @Native("HMDVRDevice")
 class HmdvrDevice extends VRDevice {
   // To suppress missing implicit constructor warnings.
-  factory HmdvrDevice._() { throw new UnsupportedError("Not supported"); }
+  factory HmdvrDevice._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HMDVRDevice.getEyeParameters')
   @DocsEditable()
   @Experimental() // untriaged
-  VREyeParameters getEyeParameters(String whichEye) native;
+  VREyeParameters getEyeParameters(String whichEye) native ;
 
   @DomName('HMDVRDevice.setFieldOfView')
   @DocsEditable()
   @Experimental() // untriaged
-  void setFieldOfView([VRFieldOfView leftFov, VRFieldOfView rightFov]) native;
+  void setFieldOfView([VRFieldOfView leftFov, VRFieldOfView rightFov]) 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.
 
-
 @DocsEditable()
 @DomName('HTMLCollection')
 @Native("HTMLCollection")
-class HtmlCollection extends Interceptor with ListMixin<Node>, ImmutableListMixin<Node> implements JavaScriptIndexingBehavior, List<Node> {
+class HtmlCollection extends Interceptor
+    with ListMixin<Node>, ImmutableListMixin<Node>
+    implements JavaScriptIndexingBehavior, List<Node> {
   // To suppress missing implicit constructor warnings.
-  factory HtmlCollection._() { throw new UnsupportedError("Not supported"); }
+  factory HtmlCollection._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLCollection.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  Node operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  Node operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("Node", "#[#]", this, index);
   }
-  void operator[]=(int index, Node value) {
+
+  void operator []=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<Node> mixins.
   // Node is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -18940,11 +19362,11 @@
 
   @DomName('HTMLCollection.item')
   @DocsEditable()
-  Node item(int index) native;
+  Node item(int index) native ;
 
   @DomName('HTMLCollection.namedItem')
   @DocsEditable()
-  Object namedItem(String name) native;
+  Object 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
@@ -18952,13 +19374,13 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('HTMLDocument')
 @Native("HTMLDocument")
 class HtmlDocument extends Document {
   // To suppress missing implicit constructor warnings.
-  factory HtmlDocument._() { throw new UnsupportedError("Not supported"); }
-
+  factory HtmlDocument._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Document.body')
   BodyElement body;
@@ -18985,7 +19407,6 @@
   static bool get supportsCssCanvasContext =>
       JS('bool', '!!(document.getCSSCanvasContext)');
 
-
   /**
    * Gets a CanvasRenderingContext which can be used as the CSS background of an
    * element.
@@ -19010,8 +19431,8 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @DomName('Document.getCSSCanvasContext')
-  CanvasRenderingContext getCssCanvasContext(String contextId, String name,
-      int width, int height) {
+  CanvasRenderingContext getCssCanvasContext(
+      String contextId, String name, int width, int height) {
     return _getCssCanvasContext(contextId, name, width, height);
   }
 
@@ -19064,7 +19485,6 @@
     _webkitExitFullscreen();
   }
 
-
   @Experimental()
   /**
    * Register a custom subclass of Element to be instantiatable by the DOM.
@@ -19109,8 +19529,8 @@
    */
   void registerElement(String tag, Type customElementClass,
       {String extendsTag}) {
-    _registerCustomElement(JS('', 'window'), this, tag, customElementClass,
-        extendsTag);
+    _registerCustomElement(
+        JS('', 'window'), this, tag, customElementClass, extendsTag);
   }
 
   /** *Deprecated*: use [registerElement] instead. */
@@ -19133,7 +19553,7 @@
   @Experimental()
   static const EventStreamProvider<Event> visibilityChangeEvent =
       const _CustomEventStreamProvider<Event>(
-        _determineVisibilityChangeEventType);
+          _determineVisibilityChangeEventType);
 
   static String _determineVisibilityChangeEventType(EventTarget e) {
     if (JS('bool', '(typeof #.hidden !== "undefined")', e)) {
@@ -19153,8 +19573,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @Experimental()
-  Stream<Event> get onVisibilityChange =>
-      visibilityChangeEvent.forTarget(this);
+  Stream<Event> get onVisibilityChange => visibilityChangeEvent.forTarget(this);
 
   /// Creates an element upgrader which can be used to change the Dart wrapper
   /// type for elements.
@@ -19173,34 +19592,36 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('HTMLFormControlsCollection')
 @Native("HTMLFormControlsCollection")
 class HtmlFormControlsCollection extends HtmlCollection {
   // To suppress missing implicit constructor warnings.
-  factory HtmlFormControlsCollection._() { throw new UnsupportedError("Not supported"); }
+  factory HtmlFormControlsCollection._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLFormControlsCollection.item')
   @DocsEditable()
   @Experimental() // untriaged
-  Node item(int index) native;
+  Node item(int index) native ;
 
   @DomName('HTMLFormControlsCollection.namedItem')
   @DocsEditable()
-  Object namedItem(String name) native;
+  Object 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.
 
-
 @DocsEditable()
 @DomName('HTMLHtmlElement')
 @Native("HTMLHtmlElement")
 class HtmlHtmlElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory HtmlHtmlElement._() { throw new UnsupportedError("Not supported"); }
+  factory HtmlHtmlElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLHtmlElement.HTMLHtmlElement')
   @DocsEditable()
@@ -19216,26 +19637,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.
 
-
 @DocsEditable()
 @DomName('HTMLOptionsCollection')
 @Native("HTMLOptionsCollection")
 class HtmlOptionsCollection extends HtmlCollection {
   // To suppress missing implicit constructor warnings.
-  factory HtmlOptionsCollection._() { throw new UnsupportedError("Not supported"); }
+  factory HtmlOptionsCollection._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('item')
   @DomName('HTMLOptionsCollection.item')
   @DocsEditable()
   @Experimental() // untriaged
-  Node _item(int index) native;
+  Node _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.
 
-
- /**
+/**
   * A client-side XHR request for getting data from a URL,
   * formally known as XMLHttpRequest.
   *
@@ -19285,7 +19706,6 @@
 @DomName('XMLHttpRequest')
 @Native("XMLHttpRequest")
 class HttpRequest extends HttpRequestEventTarget {
-
   /**
    * Creates a GET request for the specified [url].
    *
@@ -19312,8 +19732,9 @@
    */
   static Future<String> getString(String url,
       {bool withCredentials, void onProgress(ProgressEvent e)}) {
-    return request(url, withCredentials: withCredentials,
-        onProgress: onProgress).then((HttpRequest xhr) => xhr.responseText);
+    return request(url,
+            withCredentials: withCredentials, onProgress: onProgress)
+        .then((HttpRequest xhr) => xhr.responseText);
   }
 
   /**
@@ -19342,10 +19763,10 @@
    * * [request]
    */
   static Future<HttpRequest> postFormData(String url, Map<String, String> data,
-      {bool withCredentials, String responseType,
+      {bool withCredentials,
+      String responseType,
       Map<String, String> requestHeaders,
       void onProgress(ProgressEvent e)}) {
-
     var parts = [];
     data.forEach((key, value) {
       parts.add('${Uri.encodeQueryComponent(key)}='
@@ -19359,9 +19780,12 @@
     requestHeaders.putIfAbsent('Content-Type',
         () => 'application/x-www-form-urlencoded; charset=UTF-8');
 
-    return request(url, method: 'POST', withCredentials: withCredentials,
+    return request(url,
+        method: 'POST',
+        withCredentials: withCredentials,
         responseType: responseType,
-        requestHeaders: requestHeaders, sendData: formData,
+        requestHeaders: requestHeaders,
+        sendData: formData,
         onProgress: onProgress);
   }
 
@@ -19420,8 +19844,12 @@
    * See also: [authorization headers](http://en.wikipedia.org/wiki/Basic_access_authentication).
    */
   static Future<HttpRequest> request(String url,
-      {String method, bool withCredentials, String responseType,
-      String mimeType, Map<String, String> requestHeaders, sendData,
+      {String method,
+      bool withCredentials,
+      String responseType,
+      String mimeType,
+      Map<String, String> requestHeaders,
+      sendData,
       void onProgress(ProgressEvent e)}) {
     var completer = new Completer<HttpRequest>();
 
@@ -19463,7 +19891,7 @@
       // redirect case will be handled by the browser before it gets to us,
       // so if we see it we should pass it through to the user.
       var unknownRedirect = xhr.status > 307 && xhr.status < 400;
-      
+
       if (accepted || fileUri || notModified || unknownRedirect) {
         completer.complete(xhr);
       } else {
@@ -19539,13 +19967,21 @@
     }
     var xhr = JS('var', 'new XDomainRequest()');
     JS('', '#.open(#, #)', xhr, method, url);
-    JS('', '#.onload = #', xhr, convertDartClosureToJS((e) {
-      var response = JS('String', '#.responseText', xhr);
-      completer.complete(response);
-    }, 1));
-    JS('', '#.onerror = #', xhr, convertDartClosureToJS((e) {
-      completer.completeError(e);
-    }, 1));
+    JS(
+        '',
+        '#.onload = #',
+        xhr,
+        convertDartClosureToJS((e) {
+          var response = JS('String', '#.responseText', xhr);
+          completer.complete(response);
+        }, 1));
+    JS(
+        '',
+        '#.onerror = #',
+        xhr,
+        convertDartClosureToJS((e) {
+          completer.completeError(e);
+        }, 1));
 
     // IE9 RTM - XDomainRequest issued requests may abort if all event handlers
     // not specified
@@ -19616,10 +20052,13 @@
    */
   @DomName('XMLHttpRequest.open')
   @DocsEditable()
-  void open(String method, String url, {bool async, String user, String password}) native;
+  void open(String method, String url,
+      {bool async, String user, String password}) native ;
 
   // To suppress missing implicit constructor warnings.
-  factory HttpRequest._() { throw new UnsupportedError("Not supported"); }
+  factory HttpRequest._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `readystatechange` events to event
@@ -19629,7 +20068,8 @@
    */
   @DomName('XMLHttpRequest.readystatechangeEvent')
   @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> readyStateChangeEvent = const EventStreamProvider<ProgressEvent>('readystatechange');
+  static const EventStreamProvider<ProgressEvent> readyStateChangeEvent =
+      const EventStreamProvider<ProgressEvent>('readystatechange');
 
   /**
    * General constructor for any type of request (GET, POST, etc).
@@ -19738,7 +20178,8 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Creates('NativeByteBuffer|Blob|Document|=Object|JSExtendableArray|String|num')
+  @Creates(
+      'NativeByteBuffer|Blob|Document|=Object|JSExtendableArray|String|num')
   final dynamic _get_response;
 
   /**
@@ -19844,7 +20285,7 @@
    */
   @DomName('XMLHttpRequest.abort')
   @DocsEditable()
-  void abort() native;
+  void abort() native ;
 
   /**
    * Retrieve all the response headers from a request.
@@ -19860,7 +20301,7 @@
   @DomName('XMLHttpRequest.getAllResponseHeaders')
   @DocsEditable()
   @Unstable()
-  String getAllResponseHeaders() native;
+  String getAllResponseHeaders() native ;
 
   /**
    * Return the response header named `header`, or null if not found.
@@ -19872,7 +20313,7 @@
   @DomName('XMLHttpRequest.getResponseHeader')
   @DocsEditable()
   @Unstable()
-  String getResponseHeader(String name) native;
+  String getResponseHeader(String name) native ;
 
   /**
    * Specify a particular MIME type (such as `text/xml`) desired for the
@@ -19886,7 +20327,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void overrideMimeType(String mime) native;
+  void overrideMimeType(String mime) native ;
 
   /**
    * Send the request with any given `data`.
@@ -19903,7 +20344,7 @@
    */
   @DomName('XMLHttpRequest.send')
   @DocsEditable()
-  void send([body_OR_data]) native;
+  void send([body_OR_data]) native ;
 
   /**
    * Sets the value of an HTTP requst header.
@@ -19924,7 +20365,7 @@
    */
   @DomName('XMLHttpRequest.setRequestHeader')
   @DocsEditable()
-  void setRequestHeader(String name, String value) native;
+  void setRequestHeader(String name, String value) native ;
 
   /// Stream of `readystatechange` events handled by this [HttpRequest].
 /**
@@ -19933,21 +20374,22 @@
    */
   @DomName('XMLHttpRequest.onreadystatechange')
   @DocsEditable()
-  Stream<ProgressEvent> get onReadyStateChange => readyStateChangeEvent.forTarget(this);
-
+  Stream<ProgressEvent> get onReadyStateChange =>
+      readyStateChangeEvent.forTarget(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.
 
-
 @DocsEditable()
 @DomName('XMLHttpRequestEventTarget')
 @Experimental() // untriaged
 @Native("XMLHttpRequestEventTarget")
 class HttpRequestEventTarget extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory HttpRequestEventTarget._() { throw new UnsupportedError("Not supported"); }
+  factory HttpRequestEventTarget._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `abort` events to event
@@ -19958,7 +20400,8 @@
   @DomName('XMLHttpRequestEventTarget.abortEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
+  static const EventStreamProvider<ProgressEvent> abortEvent =
+      const EventStreamProvider<ProgressEvent>('abort');
 
   /**
    * Static factory designed to expose `error` events to event
@@ -19969,7 +20412,8 @@
   @DomName('XMLHttpRequestEventTarget.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');
+  static const EventStreamProvider<ProgressEvent> errorEvent =
+      const EventStreamProvider<ProgressEvent>('error');
 
   /**
    * Static factory designed to expose `load` events to event
@@ -19980,7 +20424,8 @@
   @DomName('XMLHttpRequestEventTarget.loadEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
+  static const EventStreamProvider<ProgressEvent> loadEvent =
+      const EventStreamProvider<ProgressEvent>('load');
 
   /**
    * Static factory designed to expose `loadend` events to event
@@ -19991,7 +20436,8 @@
   @DomName('XMLHttpRequestEventTarget.loadendEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
+  static const EventStreamProvider<ProgressEvent> loadEndEvent =
+      const EventStreamProvider<ProgressEvent>('loadend');
 
   /**
    * Static factory designed to expose `loadstart` events to event
@@ -20002,7 +20448,8 @@
   @DomName('XMLHttpRequestEventTarget.loadstartEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
+  static const EventStreamProvider<ProgressEvent> loadStartEvent =
+      const EventStreamProvider<ProgressEvent>('loadstart');
 
   /**
    * Static factory designed to expose `progress` events to event
@@ -20013,7 +20460,8 @@
   @DomName('XMLHttpRequestEventTarget.progressEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
+  static const EventStreamProvider<ProgressEvent> progressEvent =
+      const EventStreamProvider<ProgressEvent>('progress');
 
   /**
    * Static factory designed to expose `timeout` events to event
@@ -20024,7 +20472,8 @@
   @DomName('XMLHttpRequestEventTarget.timeoutEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<ProgressEvent> timeoutEvent = const EventStreamProvider<ProgressEvent>('timeout');
+  static const EventStreamProvider<ProgressEvent> timeoutEvent =
+      const EventStreamProvider<ProgressEvent>('timeout');
 
   /// Stream of `abort` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onabort')
@@ -20080,7 +20529,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.
 
-
 @DocsEditable()
 @DomName('XMLHttpRequestUpload')
 // http://xhr.spec.whatwg.org/#xmlhttprequestupload
@@ -20088,19 +20536,22 @@
 @Native("XMLHttpRequestUpload")
 class HttpRequestUpload extends HttpRequestEventTarget {
   // To suppress missing implicit constructor warnings.
-  factory HttpRequestUpload._() { throw new UnsupportedError("Not supported"); }
+  factory HttpRequestUpload._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('HTMLIFrameElement')
 @Native("HTMLIFrameElement")
 class IFrameElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory IFrameElement._() { throw new UnsupportedError("Not supported"); }
+  factory IFrameElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLIFrameElement.HTMLIFrameElement')
   @DocsEditable()
@@ -20119,7 +20570,8 @@
 
   @DomName('HTMLIFrameElement.contentWindow')
   @DocsEditable()
-  WindowBase get contentWindow => _convertNativeToDart_Window(this._get_contentWindow);
+  WindowBase get contentWindow =>
+      _convertNativeToDart_Window(this._get_contentWindow);
   @JSName('contentWindow')
   @DomName('HTMLIFrameElement.contentWindow')
   @DocsEditable()
@@ -20155,14 +20607,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.
 
-
 @DocsEditable()
 @DomName('ImageBitmap')
 @Experimental() // untriaged
 @Native("ImageBitmap")
 class ImageBitmap extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ImageBitmap._() { throw new UnsupportedError("Not supported"); }
+  factory ImageBitmap._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ImageBitmap.height')
   @DocsEditable()
@@ -20181,9 +20634,10 @@
 @DomName('ImageData')
 @Native("ImageData")
 class ImageData extends Interceptor {
-
   // To suppress missing implicit constructor warnings.
-  factory ImageData._() { throw new UnsupportedError("Not supported"); }
+  factory ImageData._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ImageData.ImageData')
   @DocsEditable()
@@ -20199,9 +20653,12 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  static ImageData _create_1(data_OR_sw, sh_OR_sw) => JS('ImageData', 'new ImageData(#,#)', data_OR_sw, sh_OR_sw);
-  static ImageData _create_2(data_OR_sw, sh_OR_sw) => JS('ImageData', 'new ImageData(#,#)', data_OR_sw, sh_OR_sw);
-  static ImageData _create_3(data_OR_sw, sh_OR_sw, sh) => JS('ImageData', 'new ImageData(#,#,#)', data_OR_sw, sh_OR_sw, sh);
+  static ImageData _create_1(data_OR_sw, sh_OR_sw) =>
+      JS('ImageData', 'new ImageData(#,#)', data_OR_sw, sh_OR_sw);
+  static ImageData _create_2(data_OR_sw, sh_OR_sw) =>
+      JS('ImageData', 'new ImageData(#,#)', data_OR_sw, sh_OR_sw);
+  static ImageData _create_3(data_OR_sw, sh_OR_sw, sh) =>
+      JS('ImageData', 'new ImageData(#,#,#)', data_OR_sw, sh_OR_sw, sh);
 
   @DomName('ImageData.data')
   @DocsEditable()
@@ -20216,18 +20673,18 @@
   @DomName('ImageData.width')
   @DocsEditable()
   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.
 
-
 @DomName('HTMLImageElement')
 @Native("HTMLImageElement")
 class ImageElement extends HtmlElement implements CanvasImageSource {
   // To suppress missing implicit constructor warnings.
-  factory ImageElement._() { throw new UnsupportedError("Not supported"); }
+  factory ImageElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLImageElement.HTMLImageElement')
   @DocsEditable()
@@ -20299,38 +20756,39 @@
   @DomName('HTMLImageElement.width')
   @DocsEditable()
   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.
 
-
 @DocsEditable()
 @DomName('InjectedScriptHost')
 @Experimental() // untriaged
 @Native("InjectedScriptHost")
 class InjectedScriptHost extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory InjectedScriptHost._() { throw new UnsupportedError("Not supported"); }
+  factory InjectedScriptHost._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('InjectedScriptHost.inspect')
   @DocsEditable()
   @Experimental() // untriaged
-  void inspect(Object objectId, Object hints) native;
+  void inspect(Object objectId, Object hints) 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.
 
-
 @DocsEditable()
 @DomName('InputDevice')
 @Experimental() // untriaged
 @Native("InputDevice")
 class InputDevice extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory InputDevice._() { throw new UnsupportedError("Not supported"); }
+  factory InputDevice._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('InputDevice.InputDevice')
   @DocsEditable()
@@ -20341,7 +20799,8 @@
     }
     return InputDevice._create_2();
   }
-  static InputDevice _create_1(deviceInitDict) => JS('InputDevice', 'new InputDevice(#)', deviceInitDict);
+  static InputDevice _create_1(deviceInitDict) =>
+      JS('InputDevice', 'new InputDevice(#)', deviceInitDict);
   static InputDevice _create_2() => JS('InputDevice', 'new InputDevice()');
 
   @DomName('InputDevice.firesTouchEvents')
@@ -20353,45 +20812,46 @@
 // for 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('HTMLInputElement')
 @Native("HTMLInputElement")
-class InputElement extends HtmlElement implements
-    HiddenInputElement,
-    SearchInputElement,
-    TextInputElement,
-    UrlInputElement,
-    TelephoneInputElement,
-    EmailInputElement,
-    PasswordInputElement,
-    DateInputElement,
-    MonthInputElement,
-    WeekInputElement,
-    TimeInputElement,
-    LocalDateTimeInputElement,
-    NumberInputElement,
-    RangeInputElement,
-    CheckboxInputElement,
-    RadioButtonInputElement,
-    FileUploadInputElement,
-    SubmitButtonInputElement,
-    ImageButtonInputElement,
-    ResetButtonInputElement,
-    ButtonInputElement {
-
+class InputElement extends HtmlElement
+    implements
+        HiddenInputElement,
+        SearchInputElement,
+        TextInputElement,
+        UrlInputElement,
+        TelephoneInputElement,
+        EmailInputElement,
+        PasswordInputElement,
+        DateInputElement,
+        MonthInputElement,
+        WeekInputElement,
+        TimeInputElement,
+        LocalDateTimeInputElement,
+        NumberInputElement,
+        RangeInputElement,
+        CheckboxInputElement,
+        RadioButtonInputElement,
+        FileUploadInputElement,
+        SubmitButtonInputElement,
+        ImageButtonInputElement,
+        ResetButtonInputElement,
+        ButtonInputElement {
   factory InputElement({String type}) {
     InputElement e = document.createElement("input");
     if (type != null) {
       try {
         // IE throws an exception for unknown types.
         e.type = type;
-      } catch(_) {}
+      } catch (_) {}
     }
     return e;
   }
 
   // To suppress missing implicit constructor warnings.
-  factory InputElement._() { throw new UnsupportedError("Not supported"); }
+  factory InputElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -20587,7 +21047,8 @@
 
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
-  DateTime get valueAsDate => convertNativeToDart_DateTime(this._get_valueAsDate);
+  DateTime get valueAsDate =>
+      convertNativeToDart_DateTime(this._get_valueAsDate);
   @JSName('valueAsDate')
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
@@ -20597,6 +21058,7 @@
   set valueAsDate(DateTime value) {
     this._set_valueAsDate = convertDartToNative_DateTime(value);
   }
+
   set _set_valueAsDate(/*dynamic*/ value) {
     JS("void", "#.valueAsDate = #", this, value);
   }
@@ -20633,42 +21095,41 @@
 
   @DomName('HTMLInputElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native;
+  bool checkValidity() native ;
 
   @DomName('HTMLInputElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() native;
+  bool reportValidity() native ;
 
   @DomName('HTMLInputElement.select')
   @DocsEditable()
-  void select() native;
+  void select() native ;
 
   @DomName('HTMLInputElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) native;
+  void setCustomValidity(String error) native ;
 
   @DomName('HTMLInputElement.setRangeText')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#dom-textarea/input-setrangetext
   @Experimental() // experimental
-  void setRangeText(String replacement, {int start, int end, String selectionMode}) native;
+  void setRangeText(String replacement,
+      {int start, int end, String selectionMode}) native ;
 
   @DomName('HTMLInputElement.setSelectionRange')
   @DocsEditable()
-  void setSelectionRange(int start, int end, [String direction]) native;
+  void setSelectionRange(int start, int end, [String direction]) native ;
 
   @DomName('HTMLInputElement.stepDown')
   @DocsEditable()
-  void stepDown([int n]) native;
+  void stepDown([int n]) native ;
 
   @DomName('HTMLInputElement.stepUp')
   @DocsEditable()
-  void stepUp([int n]) native;
-
+  void stepUp([int n]) native ;
 }
 
-
 // Interfaces representing the InputElement APIs which are supported
 // for the various types of InputElement. From:
 // http://www.w3.org/html/wg/drafts/html/master/forms.html#the-input-element.
@@ -20721,7 +21182,6 @@
   factory HiddenInputElement() => new InputElement(type: 'hidden');
 }
 
-
 /**
  * Base interface for all inputs which involve text editing.
  */
@@ -20905,7 +21365,6 @@
  * Base interface for all input element types which involve ranges.
  */
 abstract class RangeInputElementBase implements InputElementBase {
-
   @DomName('HTMLInputElement.list')
   Element get list;
 
@@ -21111,7 +21570,6 @@
   bool required;
 }
 
-
 /**
  * A control that when used with other [ReadioButtonInputElement] controls
  * forms a radio button group in which only one control can be checked at a
@@ -21226,7 +21684,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.
 
-
 /**
  * An event that describes user interaction with the keyboard.
  *
@@ -21239,7 +21696,6 @@
 @DomName('KeyboardEvent')
 @Native("KeyboardEvent")
 class KeyboardEvent extends UIEvent {
-
   /**
    * Programmatically create a KeyboardEvent.
    *
@@ -21251,35 +21707,58 @@
    * Event [KeyEvent].
    */
   factory KeyboardEvent(String type,
-      {Window view, bool canBubble: true, bool cancelable: true,
-      int keyLocation: 1, bool ctrlKey: false,
-      bool altKey: false, bool shiftKey: false, bool metaKey: false}) {
+      {Window view,
+      bool canBubble: true,
+      bool cancelable: true,
+      int keyLocation: 1,
+      bool ctrlKey: false,
+      bool altKey: false,
+      bool shiftKey: false,
+      bool metaKey: false}) {
     if (view == null) {
       view = window;
     }
     KeyboardEvent e = document._createEvent("KeyboardEvent");
-    e._initKeyboardEvent(type, canBubble, cancelable, view, "",
-        keyLocation, ctrlKey, altKey, shiftKey, metaKey);
+    e._initKeyboardEvent(type, canBubble, cancelable, view, "", keyLocation,
+        ctrlKey, altKey, shiftKey, metaKey);
     return e;
   }
 
   @DomName('KeyboardEvent.initKeyboardEvent')
-  void _initKeyboardEvent(String type, bool canBubble, bool cancelable,
-      Window view, String keyIdentifier, int keyLocation, bool ctrlKey,
-      bool altKey, bool shiftKey, bool metaKey) {
+  void _initKeyboardEvent(
+      String type,
+      bool canBubble,
+      bool cancelable,
+      Window view,
+      String keyIdentifier,
+      int keyLocation,
+      bool ctrlKey,
+      bool altKey,
+      bool shiftKey,
+      bool metaKey) {
     if (JS('bool', 'typeof(#.initKeyEvent) == "function"', this)) {
       // initKeyEvent is only in Firefox (instead of initKeyboardEvent). It has
       // a slightly different signature, and allows you to specify keyCode and
       // charCode as the last two arguments, but we just set them as the default
       // since they can't be specified in other browsers.
-      JS('void', '#.initKeyEvent(#, #, #, #, #, #, #, #, 0, 0)', this,
-          type, canBubble, cancelable, view,
-          ctrlKey, altKey, shiftKey, metaKey);
+      JS('void', '#.initKeyEvent(#, #, #, #, #, #, #, #, 0, 0)', this, type,
+          canBubble, cancelable, view, ctrlKey, altKey, shiftKey, metaKey);
     } else {
       // initKeyboardEvent is for all other browsers.
-      JS('void', '#.initKeyboardEvent(#, #, #, #, #, #, #, #, #, #)', this,
-          type, canBubble, cancelable, view, keyIdentifier, keyLocation,
-          ctrlKey, altKey, shiftKey, metaKey);
+      JS(
+          'void',
+          '#.initKeyboardEvent(#, #, #, #, #, #, #, #, #, #)',
+          this,
+          type,
+          canBubble,
+          cancelable,
+          view,
+          keyIdentifier,
+          keyLocation,
+          ctrlKey,
+          altKey,
+          shiftKey,
+          metaKey);
     }
   }
 
@@ -21301,8 +21780,10 @@
     }
     return KeyboardEvent._create_2(type);
   }
-  static KeyboardEvent _create_1(type, eventInitDict) => JS('KeyboardEvent', 'new KeyboardEvent(#,#)', type, eventInitDict);
-  static KeyboardEvent _create_2(type) => JS('KeyboardEvent', 'new KeyboardEvent(#)', type);
+  static KeyboardEvent _create_1(type, eventInitDict) =>
+      JS('KeyboardEvent', 'new KeyboardEvent(#,#)', type, eventInitDict);
+  static KeyboardEvent _create_2(type) =>
+      JS('KeyboardEvent', 'new KeyboardEvent(#)', type);
 
   @DomName('KeyboardEvent.DOM_KEY_LOCATION_LEFT')
   @DocsEditable()
@@ -21374,46 +21855,54 @@
   @DomName('KeyboardEvent.getModifierState')
   @DocsEditable()
   @Experimental() // untriaged
-  bool getModifierState(String keyArg) native;
-
+  bool getModifierState(String keyArg) 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.
 
-
 @DocsEditable()
 @DomName('KeyframeEffect')
 @Experimental() // untriaged
 @Native("KeyframeEffect")
 class KeyframeEffect extends AnimationEffectReadOnly {
   // To suppress missing implicit constructor warnings.
-  factory KeyframeEffect._() { throw new UnsupportedError("Not supported"); }
+  factory KeyframeEffect._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('KeyframeEffect.KeyframeEffect')
   @DocsEditable()
   factory KeyframeEffect(Element target, List<Map> keyframes, [timing]) {
-    if ((keyframes is List<Map>) && (target is Element || target == null) && timing == null) {
+    if ((keyframes is List<Map>) &&
+        (target is Element || target == null) &&
+        timing == null) {
       return KeyframeEffect._create_1(target, keyframes);
     }
-    if ((timing is num) && (keyframes is List<Map>) && (target is Element || target == null)) {
+    if ((timing is num) &&
+        (keyframes is List<Map>) &&
+        (target is Element || target == null)) {
       return KeyframeEffect._create_2(target, keyframes, timing);
     }
-    if ((timing is Map) && (keyframes is List<Map>) && (target is Element || target == null)) {
+    if ((timing is Map) &&
+        (keyframes is List<Map>) &&
+        (target is Element || target == null)) {
       var timing_1 = convertDartToNative_Dictionary(timing);
       return KeyframeEffect._create_3(target, keyframes, timing_1);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  static KeyframeEffect _create_1(target, keyframes) => JS('KeyframeEffect', 'new KeyframeEffect(#,#)', target, keyframes);
-  static KeyframeEffect _create_2(target, keyframes, timing) => JS('KeyframeEffect', 'new KeyframeEffect(#,#,#)', target, keyframes, timing);
-  static KeyframeEffect _create_3(target, keyframes, timing) => JS('KeyframeEffect', 'new KeyframeEffect(#,#,#)', target, keyframes, timing);
+  static KeyframeEffect _create_1(target, keyframes) =>
+      JS('KeyframeEffect', 'new KeyframeEffect(#,#)', target, keyframes);
+  static KeyframeEffect _create_2(target, keyframes, timing) => JS(
+      'KeyframeEffect', 'new KeyframeEffect(#,#,#)', target, keyframes, timing);
+  static KeyframeEffect _create_3(target, keyframes, timing) => JS(
+      'KeyframeEffect', 'new KeyframeEffect(#,#,#)', target, keyframes, timing);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('HTMLKeygenElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -21423,7 +21912,9 @@
 @Native("HTMLKeygenElement")
 class KeygenElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory KeygenElement._() { throw new UnsupportedError("Not supported"); }
+  factory KeygenElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLKeygenElement.HTMLKeygenElement')
   @DocsEditable()
@@ -21436,7 +21927,9 @@
   KeygenElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => Element.isTagSupported('keygen') && (new Element.tag('keygen') is KeygenElement);
+  static bool get supported =>
+      Element.isTagSupported('keygen') &&
+      (new Element.tag('keygen') is KeygenElement);
 
   @DomName('HTMLKeygenElement.autofocus')
   @DocsEditable()
@@ -21487,28 +21980,29 @@
 
   @DomName('HTMLKeygenElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native;
+  bool checkValidity() native ;
 
   @DomName('HTMLKeygenElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() native;
+  bool reportValidity() native ;
 
   @DomName('HTMLKeygenElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) 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.
 
-
 @DocsEditable()
 @DomName('HTMLLIElement')
 @Native("HTMLLIElement")
 class LIElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory LIElement._() { throw new UnsupportedError("Not supported"); }
+  factory LIElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLLIElement.HTMLLIElement')
   @DocsEditable()
@@ -21528,13 +22022,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.
 
-
 @DocsEditable()
 @DomName('HTMLLabelElement')
 @Native("HTMLLabelElement")
 class LabelElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory LabelElement._() { throw new UnsupportedError("Not supported"); }
+  factory LabelElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLLabelElement.HTMLLabelElement')
   @DocsEditable()
@@ -21562,13 +22057,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.
 
-
 @DocsEditable()
 @DomName('HTMLLegendElement')
 @Native("HTMLLegendElement")
 class LegendElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory LegendElement._() { throw new UnsupportedError("Not supported"); }
+  factory LegendElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLLegendElement.HTMLLegendElement')
   @DocsEditable()
@@ -21588,13 +22084,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.
 
-
 @DocsEditable()
 @DomName('HTMLLinkElement')
 @Native("HTMLLinkElement")
 class LinkElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory LinkElement._() { throw new UnsupportedError("Not supported"); }
+  factory LinkElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLLinkElement.HTMLLinkElement')
   @DocsEditable()
@@ -21654,8 +22151,7 @@
   @DocsEditable()
   String type;
 
-
-    /// Checks if HTML imports are supported on the current platform.
+  /// Checks if HTML imports are supported on the current platform.
   bool get supportsImport {
     return JS('bool', '("import" in #)', this);
   }
@@ -21664,13 +22160,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.
 
-
 @DocsEditable()
 @DomName('Location')
 @Native("Location")
 class Location extends Interceptor implements LocationBase {
   // To suppress missing implicit constructor warnings.
-  factory Location._() { throw new UnsupportedError("Not supported"); }
+  factory Location._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Location.ancestorOrigins')
   @DocsEditable()
@@ -21713,16 +22210,15 @@
 
   @DomName('Location.assign')
   @DocsEditable()
-  void assign([String url]) native;
+  void assign([String url]) native ;
 
   @DomName('Location.reload')
   @DocsEditable()
-  void reload() native;
+  void reload() native ;
 
   @DomName('Location.replace')
   @DocsEditable()
-  void replace(String url) native;
-
+  void replace(String url) native ;
 
   @DomName('Location.origin')
   String get origin {
@@ -21740,13 +22236,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.
 
-
 @DocsEditable()
 @DomName('HTMLMapElement')
 @Native("HTMLMapElement")
 class MapElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory MapElement._() { throw new UnsupportedError("Not supported"); }
+  factory MapElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLMapElement.HTMLMapElement')
   @DocsEditable()
@@ -21772,7 +22269,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.
 
-
 @DocsEditable()
 @DomName('MediaController')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#mediacontroller
@@ -21780,14 +22276,17 @@
 @Native("MediaController")
 class MediaController extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory MediaController._() { throw new UnsupportedError("Not supported"); }
+  factory MediaController._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaController.MediaController')
   @DocsEditable()
   factory MediaController() {
     return MediaController._create_1();
   }
-  static MediaController _create_1() => JS('MediaController', 'new MediaController()');
+  static MediaController _create_1() =>
+      JS('MediaController', 'new MediaController()');
 
   @DomName('MediaController.buffered')
   @DocsEditable()
@@ -21835,28 +22334,29 @@
 
   @DomName('MediaController.pause')
   @DocsEditable()
-  void pause() native;
+  void pause() native ;
 
   @DomName('MediaController.play')
   @DocsEditable()
-  void play() native;
+  void play() native ;
 
   @DomName('MediaController.unpause')
   @DocsEditable()
-  void unpause() native;
+  void unpause() 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.
 
-
 @DocsEditable()
 @DomName('MediaDeviceInfo')
 @Experimental() // untriaged
 @Native("MediaDeviceInfo")
 class MediaDeviceInfo extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MediaDeviceInfo._() { throw new UnsupportedError("Not supported"); }
+  factory MediaDeviceInfo._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaDeviceInfo.deviceId')
   @DocsEditable()
@@ -21882,19 +22382,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.
 
-
 @DocsEditable()
 @DomName('MediaDevices')
 @Experimental() // untriaged
 @Native("MediaDevices")
 class MediaDevices extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MediaDevices._() { throw new UnsupportedError("Not supported"); }
+  factory MediaDevices._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaDevices.enumerateDevices')
   @DocsEditable()
   @Experimental() // untriaged
-  Future enumerateDevices() native;
+  Future enumerateDevices() native ;
 
   @DomName('MediaDevices.getUserMedia')
   @DocsEditable()
@@ -21903,24 +22404,26 @@
     var options_1 = convertDartToNative_Dictionary(options);
     return _getUserMedia_1(options_1);
   }
+
   @JSName('getUserMedia')
   @DomName('MediaDevices.getUserMedia')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _getUserMedia_1(options) native;
+  Future _getUserMedia_1(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.
 
-
 @DocsEditable()
 @DomName('HTMLMediaElement')
 @Unstable()
 @Native("HTMLMediaElement")
 class MediaElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory MediaElement._() { throw new UnsupportedError("Not supported"); }
+  factory MediaElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `keyadded` events to event
@@ -21934,7 +22437,8 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
-  static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
+  static const EventStreamProvider<MediaKeyEvent> keyAddedEvent =
+      const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
 
   /**
    * Static factory designed to expose `keyerror` events to event
@@ -21948,7 +22452,8 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
-  static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
+  static const EventStreamProvider<MediaKeyEvent> keyErrorEvent =
+      const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
 
   /**
    * Static factory designed to expose `keymessage` events to event
@@ -21962,7 +22467,8 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
-  static const EventStreamProvider<MediaKeyEvent> keyMessageEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeymessage');
+  static const EventStreamProvider<MediaKeyEvent> keyMessageEvent =
+      const EventStreamProvider<MediaKeyEvent>('webkitkeymessage');
 
   /**
    * Static factory designed to expose `needkey` events to event
@@ -21976,7 +22482,8 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
-  static const EventStreamProvider<MediaKeyEvent> needKeyEvent = const EventStreamProvider<MediaKeyEvent>('webkitneedkey');
+  static const EventStreamProvider<MediaKeyEvent> needKeyEvent =
+      const EventStreamProvider<MediaKeyEvent>('webkitneedkey');
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -22175,34 +22682,34 @@
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-addtexttrack
   @Experimental()
-  TextTrack addTextTrack(String kind, [String label, String language]) native;
+  TextTrack addTextTrack(String kind, [String label, String language]) native ;
 
   @DomName('HTMLMediaElement.canPlayType')
   @DocsEditable()
   @Unstable()
-  String canPlayType(String type, [String keySystem]) native;
+  String canPlayType(String type, [String keySystem]) native ;
 
   @DomName('HTMLMediaElement.load')
   @DocsEditable()
-  void load() native;
+  void load() native ;
 
   @DomName('HTMLMediaElement.pause')
   @DocsEditable()
-  void pause() native;
+  void pause() native ;
 
   @DomName('HTMLMediaElement.play')
   @DocsEditable()
-  void play() native;
+  void play() native ;
 
   @DomName('HTMLMediaElement.setMediaKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future setMediaKeys(MediaKeys mediaKeys) native;
+  Future setMediaKeys(MediaKeys mediaKeys) native ;
 
   @DomName('HTMLMediaElement.setSinkId')
   @DocsEditable()
   @Experimental() // untriaged
-  Future setSinkId(String sinkId) native;
+  Future setSinkId(String sinkId) native ;
 
   @JSName('webkitAddKey')
   @DomName('HTMLMediaElement.webkitAddKey')
@@ -22211,7 +22718,8 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
-  void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) native;
+  void addKey(String keySystem, Uint8List key,
+      [Uint8List initData, String sessionId]) native ;
 
   @JSName('webkitCancelKeyRequest')
   @DomName('HTMLMediaElement.webkitCancelKeyRequest')
@@ -22220,7 +22728,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
-  void cancelKeyRequest(String keySystem, String sessionId) native;
+  void cancelKeyRequest(String keySystem, String sessionId) native ;
 
   @JSName('webkitGenerateKeyRequest')
   @DomName('HTMLMediaElement.webkitGenerateKeyRequest')
@@ -22229,7 +22737,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
-  void generateKeyRequest(String keySystem, [Uint8List initData]) native;
+  void generateKeyRequest(String keySystem, [Uint8List initData]) native ;
 
   /// Stream of `keyadded` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitkeyadded')
@@ -22250,7 +22758,8 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
-  ElementStream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forElement(this);
+  ElementStream<MediaKeyEvent> get onKeyMessage =>
+      keyMessageEvent.forElement(this);
 
   /// Stream of `needkey` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.onwebkitneedkey')
@@ -22263,14 +22772,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.
 
-
 @DocsEditable()
 @DomName('MediaEncryptedEvent')
 @Experimental() // untriaged
 @Native("MediaEncryptedEvent")
 class MediaEncryptedEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory MediaEncryptedEvent._() { throw new UnsupportedError("Not supported"); }
+  factory MediaEncryptedEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaEncryptedEvent.MediaEncryptedEvent')
   @DocsEditable()
@@ -22281,8 +22791,13 @@
     }
     return MediaEncryptedEvent._create_2(type);
   }
-  static MediaEncryptedEvent _create_1(type, eventInitDict) => JS('MediaEncryptedEvent', 'new MediaEncryptedEvent(#,#)', type, eventInitDict);
-  static MediaEncryptedEvent _create_2(type) => JS('MediaEncryptedEvent', 'new MediaEncryptedEvent(#)', type);
+  static MediaEncryptedEvent _create_1(type, eventInitDict) => JS(
+      'MediaEncryptedEvent',
+      'new MediaEncryptedEvent(#,#)',
+      type,
+      eventInitDict);
+  static MediaEncryptedEvent _create_2(type) =>
+      JS('MediaEncryptedEvent', 'new MediaEncryptedEvent(#)', type);
 
   @DomName('MediaEncryptedEvent.initData')
   @DocsEditable()
@@ -22298,14 +22813,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.
 
-
 @DocsEditable()
 @DomName('MediaError')
 @Unstable()
 @Native("MediaError")
 class MediaError extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MediaError._() { throw new UnsupportedError("Not supported"); }
+  factory MediaError._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaError.MEDIA_ERR_ABORTED')
   @DocsEditable()
@@ -22331,7 +22847,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.
 
-
 @DocsEditable()
 @DomName('MediaKeyError')
 // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#error-codes
@@ -22339,7 +22854,9 @@
 @Native("MediaKeyError")
 class MediaKeyError extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MediaKeyError._() { throw new UnsupportedError("Not supported"); }
+  factory MediaKeyError._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaKeyError.MEDIA_KEYERR_CLIENT')
   @DocsEditable()
@@ -22378,7 +22895,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.
 
-
 @DocsEditable()
 @DomName('MediaKeyEvent')
 // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#event-definitions
@@ -22386,7 +22902,9 @@
 @Native("MediaKeyEvent")
 class MediaKeyEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory MediaKeyEvent._() { throw new UnsupportedError("Not supported"); }
+  factory MediaKeyEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaKeyEvent.MediaKeyEvent')
   @DocsEditable()
@@ -22397,8 +22915,10 @@
     }
     return MediaKeyEvent._create_2(type);
   }
-  static MediaKeyEvent _create_1(type, eventInitDict) => JS('MediaKeyEvent', 'new MediaKeyEvent(#,#)', type, eventInitDict);
-  static MediaKeyEvent _create_2(type) => JS('MediaKeyEvent', 'new MediaKeyEvent(#)', type);
+  static MediaKeyEvent _create_1(type, eventInitDict) =>
+      JS('MediaKeyEvent', 'new MediaKeyEvent(#,#)', type, eventInitDict);
+  static MediaKeyEvent _create_2(type) =>
+      JS('MediaKeyEvent', 'new MediaKeyEvent(#)', type);
 
   @JSName('defaultURL')
   @DomName('MediaKeyEvent.defaultURL')
@@ -22433,7 +22953,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.
 
-
 @DocsEditable()
 @DomName('MediaKeyMessageEvent')
 // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeymessageevent
@@ -22441,7 +22960,9 @@
 @Native("MediaKeyMessageEvent")
 class MediaKeyMessageEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory MediaKeyMessageEvent._() { throw new UnsupportedError("Not supported"); }
+  factory MediaKeyMessageEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaKeyMessageEvent.MediaKeyMessageEvent')
   @DocsEditable()
@@ -22452,8 +22973,13 @@
     }
     return MediaKeyMessageEvent._create_2(type);
   }
-  static MediaKeyMessageEvent _create_1(type, eventInitDict) => JS('MediaKeyMessageEvent', 'new MediaKeyMessageEvent(#,#)', type, eventInitDict);
-  static MediaKeyMessageEvent _create_2(type) => JS('MediaKeyMessageEvent', 'new MediaKeyMessageEvent(#)', type);
+  static MediaKeyMessageEvent _create_1(type, eventInitDict) => JS(
+      'MediaKeyMessageEvent',
+      'new MediaKeyMessageEvent(#,#)',
+      type,
+      eventInitDict);
+  static MediaKeyMessageEvent _create_2(type) =>
+      JS('MediaKeyMessageEvent', 'new MediaKeyMessageEvent(#)', type);
 
   @DomName('MediaKeyMessageEvent.message')
   @DocsEditable()
@@ -22468,7 +22994,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.
 
-
 @DocsEditable()
 @DomName('MediaKeySession')
 // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeysession
@@ -22476,7 +23001,9 @@
 @Native("MediaKeySession")
 class MediaKeySession extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory MediaKeySession._() { throw new UnsupportedError("Not supported"); }
+  factory MediaKeySession._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaKeySession.closed')
   @DocsEditable()
@@ -22499,40 +23026,42 @@
 
   @DomName('MediaKeySession.close')
   @DocsEditable()
-  Future close() native;
+  Future close() native ;
 
   @DomName('MediaKeySession.generateRequest')
   @DocsEditable()
   @Experimental() // untriaged
-  Future generateRequest(String initDataType, /*BufferSource*/ initData) native;
+  Future generateRequest(String initDataType, /*BufferSource*/ initData)
+      native ;
 
   @DomName('MediaKeySession.load')
   @DocsEditable()
   @Experimental() // untriaged
-  Future load(String sessionId) native;
+  Future load(String sessionId) native ;
 
   @DomName('MediaKeySession.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  Future remove() native;
+  Future remove() native ;
 
   @JSName('update')
   @DomName('MediaKeySession.update')
   @DocsEditable()
-  Future _update(/*BufferSource*/ response) native;
+  Future _update(/*BufferSource*/ response) 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.
 
-
 @DocsEditable()
 @DomName('MediaKeyStatusMap')
 @Experimental() // untriaged
 @Native("MediaKeyStatusMap")
 class MediaKeyStatusMap extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MediaKeyStatusMap._() { throw new UnsupportedError("Not supported"); }
+  factory MediaKeyStatusMap._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaKeyStatusMap.size')
   @DocsEditable()
@@ -22543,14 +23072,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.
 
-
 @DocsEditable()
 @DomName('MediaKeySystemAccess')
 @Experimental() // untriaged
 @Native("MediaKeySystemAccess")
 class MediaKeySystemAccess extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MediaKeySystemAccess._() { throw new UnsupportedError("Not supported"); }
+  factory MediaKeySystemAccess._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaKeySystemAccess.keySystem')
   @DocsEditable()
@@ -22560,7 +23090,7 @@
   @DomName('MediaKeySystemAccess.createMediaKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future createMediaKeys() native;
+  Future createMediaKeys() native ;
 
   @DomName('MediaKeySystemAccess.getConfiguration')
   @DocsEditable()
@@ -22568,17 +23098,17 @@
   Map getConfiguration() {
     return convertNativeToDart_Dictionary(_getConfiguration_1());
   }
+
   @JSName('getConfiguration')
   @DomName('MediaKeySystemAccess.getConfiguration')
   @DocsEditable()
   @Experimental() // untriaged
-  _getConfiguration_1() native;
+  _getConfiguration_1() 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.
 
-
 @DocsEditable()
 @DomName('MediaKeys')
 // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html
@@ -22586,30 +23116,33 @@
 @Native("MediaKeys")
 class MediaKeys extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MediaKeys._() { throw new UnsupportedError("Not supported"); }
+  factory MediaKeys._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('createSession')
   @DomName('MediaKeys.createSession')
   @DocsEditable()
-  MediaKeySession _createSession([String sessionType]) native;
+  MediaKeySession _createSession([String sessionType]) native ;
 
   @DomName('MediaKeys.setServerCertificate')
   @DocsEditable()
   @Experimental() // untriaged
-  Future setServerCertificate(/*BufferSource*/ serverCertificate) native;
+  Future setServerCertificate(/*BufferSource*/ serverCertificate) 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.
 
-
 @DocsEditable()
 @DomName('MediaList')
 @Unstable()
 @Native("MediaList")
 class MediaList extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MediaList._() { throw new UnsupportedError("Not supported"); }
+  factory MediaList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaList.length')
   @DocsEditable()
@@ -22621,33 +23154,35 @@
 
   @DomName('MediaList.appendMedium')
   @DocsEditable()
-  void appendMedium(String medium) native;
+  void appendMedium(String medium) native ;
 
   @DomName('MediaList.deleteMedium')
   @DocsEditable()
-  void deleteMedium(String medium) native;
+  void deleteMedium(String medium) native ;
 
   @DomName('MediaList.item')
   @DocsEditable()
-  String item(int index) 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.
 
-
 @DocsEditable()
 @DomName('MediaQueryList')
 @Unstable()
 @Native("MediaQueryList")
 class MediaQueryList extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory MediaQueryList._() { throw new UnsupportedError("Not supported"); }
+  factory MediaQueryList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaQueryList.changeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+  static const EventStreamProvider<Event> changeEvent =
+      const EventStreamProvider<Event>('change');
 
   @DomName('MediaQueryList.matches')
   @DocsEditable()
@@ -22659,11 +23194,11 @@
 
   @DomName('MediaQueryList.addListener')
   @DocsEditable()
-  void addListener(EventListener listener) native;
+  void addListener(EventListener listener) native ;
 
   @DomName('MediaQueryList.removeListener')
   @DocsEditable()
-  void removeListener(EventListener listener) native;
+  void removeListener(EventListener listener) native ;
 
   @DomName('MediaQueryList.onchange')
   @DocsEditable()
@@ -22674,14 +23209,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.
 
-
 @DocsEditable()
 @DomName('MediaQueryListEvent')
 @Experimental() // untriaged
 @Native("MediaQueryListEvent")
 class MediaQueryListEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory MediaQueryListEvent._() { throw new UnsupportedError("Not supported"); }
+  factory MediaQueryListEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaQueryListEvent.MediaQueryListEvent')
   @DocsEditable()
@@ -22692,8 +23228,13 @@
     }
     return MediaQueryListEvent._create_2(type);
   }
-  static MediaQueryListEvent _create_1(type, eventInitDict) => JS('MediaQueryListEvent', 'new MediaQueryListEvent(#,#)', type, eventInitDict);
-  static MediaQueryListEvent _create_2(type) => JS('MediaQueryListEvent', 'new MediaQueryListEvent(#)', type);
+  static MediaQueryListEvent _create_1(type, eventInitDict) => JS(
+      'MediaQueryListEvent',
+      'new MediaQueryListEvent(#,#)',
+      type,
+      eventInitDict);
+  static MediaQueryListEvent _create_2(type) =>
+      JS('MediaQueryListEvent', 'new MediaQueryListEvent(#)', type);
 
   @DomName('MediaQueryListEvent.matches')
   @DocsEditable()
@@ -22709,14 +23250,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.
 
-
 @DocsEditable()
 @DomName('MediaSession')
 @Experimental() // untriaged
 @Native("MediaSession")
 class MediaSession extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MediaSession._() { throw new UnsupportedError("Not supported"); }
+  factory MediaSession._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaSession.MediaSession')
   @DocsEditable()
@@ -22728,18 +23270,17 @@
   @DomName('MediaSession.activate')
   @DocsEditable()
   @Experimental() // untriaged
-  void activate() native;
+  void activate() native ;
 
   @DomName('MediaSession.deactivate')
   @DocsEditable()
   @Experimental() // untriaged
-  void deactivate() native;
+  void deactivate() 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.
 
-
 @DocsEditable()
 @DomName('MediaSource')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -22749,7 +23290,9 @@
 @Native("MediaSource")
 class MediaSource extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory MediaSource._() { throw new UnsupportedError("Not supported"); }
+  factory MediaSource._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaSource.MediaSource')
   @DocsEditable()
@@ -22779,25 +23322,24 @@
 
   @DomName('MediaSource.addSourceBuffer')
   @DocsEditable()
-  SourceBuffer addSourceBuffer(String type) native;
+  SourceBuffer addSourceBuffer(String type) native ;
 
   @DomName('MediaSource.endOfStream')
   @DocsEditable()
-  void endOfStream([String error]) native;
+  void endOfStream([String error]) native ;
 
   @DomName('MediaSource.isTypeSupported')
   @DocsEditable()
-  static bool isTypeSupported(String type) native;
+  static bool isTypeSupported(String type) native ;
 
   @DomName('MediaSource.removeSourceBuffer')
   @DocsEditable()
-  void removeSourceBuffer(SourceBuffer buffer) native;
+  void removeSourceBuffer(SourceBuffer buffer) native ;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for 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('MediaStream')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental()
@@ -22805,7 +23347,9 @@
 @Native("MediaStream")
 class MediaStream extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory MediaStream._() { throw new UnsupportedError("Not supported"); }
+  factory MediaStream._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `addtrack` events to event
@@ -22815,7 +23359,8 @@
    */
   @DomName('MediaStream.addtrackEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> addTrackEvent = const EventStreamProvider<Event>('addtrack');
+  static const EventStreamProvider<Event> addTrackEvent =
+      const EventStreamProvider<Event>('addtrack');
 
   /**
    * Static factory designed to expose `ended` events to event
@@ -22825,7 +23370,8 @@
    */
   @DomName('MediaStream.endedEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+  static const EventStreamProvider<Event> endedEvent =
+      const EventStreamProvider<Event>('ended');
 
   /**
    * Static factory designed to expose `removetrack` events to event
@@ -22835,7 +23381,8 @@
    */
   @DomName('MediaStream.removetrackEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> removeTrackEvent = const EventStreamProvider<Event>('removetrack');
+  static const EventStreamProvider<Event> removeTrackEvent =
+      const EventStreamProvider<Event>('removetrack');
 
   @DomName('MediaStream.MediaStream')
   @DocsEditable()
@@ -22846,14 +23393,17 @@
     if ((stream_OR_tracks is MediaStream || stream_OR_tracks == null)) {
       return MediaStream._create_2(stream_OR_tracks);
     }
-    if ((stream_OR_tracks is List<MediaStreamTrack> || stream_OR_tracks == null)) {
+    if ((stream_OR_tracks is List<MediaStreamTrack> ||
+        stream_OR_tracks == null)) {
       return MediaStream._create_3(stream_OR_tracks);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   static MediaStream _create_1() => JS('MediaStream', 'new MediaStream()');
-  static MediaStream _create_2(stream_OR_tracks) => JS('MediaStream', 'new MediaStream(#)', stream_OR_tracks);
-  static MediaStream _create_3(stream_OR_tracks) => JS('MediaStream', 'new MediaStream(#)', stream_OR_tracks);
+  static MediaStream _create_2(stream_OR_tracks) =>
+      JS('MediaStream', 'new MediaStream(#)', stream_OR_tracks);
+  static MediaStream _create_3(stream_OR_tracks) =>
+      JS('MediaStream', 'new MediaStream(#)', stream_OR_tracks);
 
   @DomName('MediaStream.active')
   @DocsEditable()
@@ -22875,41 +23425,41 @@
 
   @DomName('MediaStream.addTrack')
   @DocsEditable()
-  void addTrack(MediaStreamTrack track) native;
+  void addTrack(MediaStreamTrack track) native ;
 
   @DomName('MediaStream.clone')
   @DocsEditable()
   @Experimental() // untriaged
-  MediaStream clone() native;
+  MediaStream clone() native ;
 
   @DomName('MediaStream.getAudioTracks')
   @DocsEditable()
   @Creates('JSExtendableArray')
   @Returns('JSExtendableArray')
-  List<MediaStreamTrack> getAudioTracks() native;
+  List<MediaStreamTrack> getAudioTracks() native ;
 
   @DomName('MediaStream.getTrackById')
   @DocsEditable()
-  MediaStreamTrack getTrackById(String trackId) native;
+  MediaStreamTrack getTrackById(String trackId) native ;
 
   @DomName('MediaStream.getTracks')
   @DocsEditable()
   @Experimental() // untriaged
-  List<MediaStreamTrack> getTracks() native;
+  List<MediaStreamTrack> getTracks() native ;
 
   @DomName('MediaStream.getVideoTracks')
   @DocsEditable()
   @Creates('JSExtendableArray')
   @Returns('JSExtendableArray')
-  List<MediaStreamTrack> getVideoTracks() native;
+  List<MediaStreamTrack> getVideoTracks() native ;
 
   @DomName('MediaStream.removeTrack')
   @DocsEditable()
-  void removeTrack(MediaStreamTrack track) native;
+  void removeTrack(MediaStreamTrack track) native ;
 
   @DomName('MediaStream.stop')
   @DocsEditable()
-  void stop() native;
+  void stop() native ;
 
   /// Stream of `addtrack` events handled by this [MediaStream].
   @DomName('MediaStream.onaddtrack')
@@ -22926,7 +23476,6 @@
   @DocsEditable()
   Stream<Event> get onRemoveTrack => removeTrackEvent.forTarget(this);
 
-
   /**
    * Checks if the MediaStream APIs are supported on the current platform.
    *
@@ -22934,19 +23483,19 @@
    *
    * * [Navigator.getUserMedia]
    */
-  static bool get supported =>
-    JS('bool', '''!!(#.getUserMedia || #.webkitGetUserMedia ||
+  static bool get supported => JS(
+      'bool',
+      '''!!(#.getUserMedia || #.webkitGetUserMedia ||
         #.mozGetUserMedia || #.msGetUserMedia)''',
-        window.navigator,
-        window.navigator,
-        window.navigator,
-        window.navigator);
+      window.navigator,
+      window.navigator,
+      window.navigator,
+      window.navigator);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('MediaStreamEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -22955,7 +23504,9 @@
 @Native("MediaStreamEvent")
 class MediaStreamEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory MediaStreamEvent._() { throw new UnsupportedError("Not supported"); }
+  factory MediaStreamEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaStreamEvent.MediaStreamEvent')
   @DocsEditable()
@@ -22966,8 +23517,10 @@
     }
     return MediaStreamEvent._create_2(type);
   }
-  static MediaStreamEvent _create_1(type, eventInitDict) => JS('MediaStreamEvent', 'new MediaStreamEvent(#,#)', type, eventInitDict);
-  static MediaStreamEvent _create_2(type) => JS('MediaStreamEvent', 'new MediaStreamEvent(#)', type);
+  static MediaStreamEvent _create_1(type, eventInitDict) =>
+      JS('MediaStreamEvent', 'new MediaStreamEvent(#,#)', type, eventInitDict);
+  static MediaStreamEvent _create_2(type) =>
+      JS('MediaStreamEvent', 'new MediaStreamEvent(#)', type);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => Device.isEventTypeSupported('MediaStreamEvent');
@@ -22980,7 +23533,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.
 
-
 @DocsEditable()
 @DomName('MediaStreamTrack')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -22989,7 +23541,9 @@
 @Native("MediaStreamTrack")
 class MediaStreamTrack extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory MediaStreamTrack._() { throw new UnsupportedError("Not supported"); }
+  factory MediaStreamTrack._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `ended` events to event
@@ -22999,7 +23553,8 @@
    */
   @DomName('MediaStreamTrack.endedEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+  static const EventStreamProvider<Event> endedEvent =
+      const EventStreamProvider<Event>('ended');
 
   /**
    * Static factory designed to expose `mute` events to event
@@ -23009,7 +23564,8 @@
    */
   @DomName('MediaStreamTrack.muteEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> muteEvent = const EventStreamProvider<Event>('mute');
+  static const EventStreamProvider<Event> muteEvent =
+      const EventStreamProvider<Event>('mute');
 
   /**
    * Static factory designed to expose `unmute` events to event
@@ -23019,7 +23575,8 @@
    */
   @DomName('MediaStreamTrack.unmuteEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> unmuteEvent = const EventStreamProvider<Event>('unmute');
+  static const EventStreamProvider<Event> unmuteEvent =
+      const EventStreamProvider<Event>('unmute');
 
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
@@ -23049,13 +23606,13 @@
   @DomName('MediaStreamTrack.clone')
   @DocsEditable()
   @Experimental() // untriaged
-  MediaStreamTrack clone() native;
+  MediaStreamTrack clone() native ;
 
   @JSName('getSources')
   @DomName('MediaStreamTrack.getSources')
   @DocsEditable()
   @Experimental() // untriaged
-  static void _getSources(MediaStreamTrackSourcesCallback callback) native;
+  static void _getSources(MediaStreamTrackSourcesCallback callback) native ;
 
   @JSName('getSources')
   @DomName('MediaStreamTrack.getSources')
@@ -23063,15 +23620,16 @@
   @Experimental() // untriaged
   static Future<List<SourceInfo>> getSources() {
     var completer = new Completer<List<SourceInfo>>();
-    _getSources(
-        (value) { completer.complete(value); });
+    _getSources((value) {
+      completer.complete(value);
+    });
     return completer.future;
   }
 
   @DomName('MediaStreamTrack.stop')
   @DocsEditable()
   @Experimental() // untriaged
-  void stop() native;
+  void stop() native ;
 
   /// Stream of `ended` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onended')
@@ -23092,7 +23650,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.
 
-
 @DocsEditable()
 @DomName('MediaStreamTrackEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -23101,10 +23658,13 @@
 @Native("MediaStreamTrackEvent")
 class MediaStreamTrackEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory MediaStreamTrackEvent._() { throw new UnsupportedError("Not supported"); }
+  factory MediaStreamTrackEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => Device.isEventTypeSupported('MediaStreamTrackEvent');
+  static bool get supported =>
+      Device.isEventTypeSupported('MediaStreamTrackEvent');
 
   @DomName('MediaStreamTrackEvent.track')
   @DocsEditable()
@@ -23116,7 +23676,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('MediaStreamTrackSourcesCallback')
 @Experimental() // untriaged
 typedef void MediaStreamTrackSourcesCallback(List<SourceInfo> sources);
@@ -23124,14 +23683,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.
 
-
 @DocsEditable()
 @DomName('MemoryInfo')
 @Experimental() // nonstandard
 @Native("MemoryInfo")
 class MemoryInfo extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MemoryInfo._() { throw new UnsupportedError("Not supported"); }
+  factory MemoryInfo._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MemoryInfo.jsHeapSizeLimit')
   @DocsEditable()
@@ -23149,7 +23709,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.
 
-
 @DocsEditable()
 /**
  * An HTML <menu> element.
@@ -23165,7 +23724,9 @@
 @Native("HTMLMenuElement")
 class MenuElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory MenuElement._() { throw new UnsupportedError("Not supported"); }
+  factory MenuElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLMenuElement.HTMLMenuElement')
   @DocsEditable()
@@ -23191,14 +23752,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.
 
-
 @DocsEditable()
 @DomName('HTMLMenuItemElement')
 @Experimental() // untriaged
 @Native("HTMLMenuItemElement")
 class MenuItemElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory MenuItemElement._() { throw new UnsupportedError("Not supported"); }
+  factory MenuItemElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -23246,14 +23808,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.
 
-
 @DocsEditable()
 @DomName('MessageChannel')
 @Unstable()
 @Native("MessageChannel")
 class MessageChannel extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MessageChannel._() { throw new UnsupportedError("Not supported"); }
+  factory MessageChannel._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MessageChannel.port1')
   @DocsEditable()
@@ -23269,21 +23832,33 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('MessageEvent')
 @Native("MessageEvent")
 class MessageEvent extends Event {
   factory MessageEvent(String type,
-      {bool canBubble: false, bool cancelable: false, Object data,
-      String origin, String lastEventId,
-      Window source, List<MessagePort> messagePorts}) {
+      {bool canBubble: false,
+      bool cancelable: false,
+      Object data,
+      String origin,
+      String lastEventId,
+      Window source,
+      List<MessagePort> messagePorts}) {
     if (source == null) {
       source = window;
     }
-    if (!Device.isIE) { // TODO: This if check should be removed once IE
+    if (!Device.isIE) {
+      // TODO: This if check should be removed once IE
       // implements the constructor.
-      return JS('MessageEvent', 'new MessageEvent(#, {bubbles: #, cancelable: #, data: #, origin: #, lastEventId: #, source: #, ports: #})',
-          type, canBubble, cancelable, data, origin, lastEventId, source,
+      return JS(
+          'MessageEvent',
+          'new MessageEvent(#, {bubbles: #, cancelable: #, data: #, origin: #, lastEventId: #, source: #, ports: #})',
+          type,
+          canBubble,
+          cancelable,
+          data,
+          origin,
+          lastEventId,
+          source,
           messagePorts);
     }
     MessageEvent event = document._createEvent("MessageEvent");
@@ -23306,8 +23881,6 @@
   @annotation_Returns_SerializedScriptValue
   final dynamic _get_data;
 
-
-
   @DomName('MessageEvent.MessageEvent')
   @DocsEditable()
   factory MessageEvent._(String type, [Map eventInitDict]) {
@@ -23317,8 +23890,10 @@
     }
     return MessageEvent._create_2(type);
   }
-  static MessageEvent _create_1(type, eventInitDict) => JS('MessageEvent', 'new MessageEvent(#,#)', type, eventInitDict);
-  static MessageEvent _create_2(type) => JS('MessageEvent', 'new MessageEvent(#)', type);
+  static MessageEvent _create_1(type, eventInitDict) =>
+      JS('MessageEvent', 'new MessageEvent(#,#)', type, eventInitDict);
+  static MessageEvent _create_2(type) =>
+      JS('MessageEvent', 'new MessageEvent(#)', type);
 
   @DomName('MessageEvent.lastEventId')
   @DocsEditable()
@@ -23342,21 +23917,29 @@
   @JSName('initMessageEvent')
   @DomName('MessageEvent.initMessageEvent')
   @DocsEditable()
-  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> portsArg) native;
-
+  void _initMessageEvent(
+      String typeArg,
+      bool canBubbleArg,
+      bool cancelableArg,
+      Object dataArg,
+      String originArg,
+      String lastEventIdArg,
+      Window sourceArg,
+      List<MessagePort> portsArg) 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.
 
-
 @DocsEditable()
 @DomName('MessagePort')
 @Unstable()
 @Native("MessagePort")
 class MessagePort extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory MessagePort._() { throw new UnsupportedError("Not supported"); }
+  factory MessagePort._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `message` events to event
@@ -23366,11 +23949,12 @@
    */
   @DomName('MessagePort.messageEvent')
   @DocsEditable()
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   @DomName('MessagePort.close')
   @DocsEditable()
-  void close() native;
+  void close() native ;
 
   @DomName('MessagePort.postMessage')
   @DocsEditable()
@@ -23384,18 +23968,19 @@
     _postMessage_2(message_1);
     return;
   }
+
   @JSName('postMessage')
   @DomName('MessagePort.postMessage')
   @DocsEditable()
-  void _postMessage_1(message, List<MessagePort> transfer) native;
+  void _postMessage_1(message, List<MessagePort> transfer) native ;
   @JSName('postMessage')
   @DomName('MessagePort.postMessage')
   @DocsEditable()
-  void _postMessage_2(message) native;
+  void _postMessage_2(message) native ;
 
   @DomName('MessagePort.start')
   @DocsEditable()
-  void start() native;
+  void start() native ;
 
   /// Stream of `message` events handled by this [MessagePort].
   @DomName('MessagePort.onmessage')
@@ -23406,13 +23991,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.
 
-
 @DocsEditable()
 @DomName('HTMLMetaElement')
 @Native("HTMLMetaElement")
 class MetaElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory MetaElement._() { throw new UnsupportedError("Not supported"); }
+  factory MetaElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLMetaElement.HTMLMetaElement')
   @DocsEditable()
@@ -23440,7 +24026,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.
 
-
 @DocsEditable()
 @DomName('Metadata')
 // http://www.w3.org/TR/file-system-api/#the-metadata-interface
@@ -23448,11 +24033,14 @@
 @Native("Metadata")
 class Metadata extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Metadata._() { throw new UnsupportedError("Not supported"); }
+  factory Metadata._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Metadata.modificationTime')
   @DocsEditable()
-  DateTime get modificationTime => convertNativeToDart_DateTime(this._get_modificationTime);
+  DateTime get modificationTime =>
+      convertNativeToDart_DateTime(this._get_modificationTime);
   @JSName('modificationTime')
   @DomName('Metadata.modificationTime')
   @DocsEditable()
@@ -23469,7 +24057,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('MetadataCallback')
 // http://www.w3.org/TR/file-system-api/#idl-def-MetadataCallback
 @Experimental()
@@ -23478,7 +24065,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.
 
-
 @DocsEditable()
 @DomName('HTMLMeterElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -23488,7 +24074,9 @@
 @Native("HTMLMeterElement")
 class MeterElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory MeterElement._() { throw new UnsupportedError("Not supported"); }
+  factory MeterElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLMeterElement.HTMLMeterElement')
   @DocsEditable()
@@ -23538,7 +24126,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.
 
-
 @DocsEditable()
 @DomName('MIDIAccess')
 // http://webaudio.github.io/web-midi-api/#midiaccess-interface
@@ -23546,7 +24133,9 @@
 @Native("MIDIAccess")
 class MidiAccess extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory MidiAccess._() { throw new UnsupportedError("Not supported"); }
+  factory MidiAccess._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MIDIAccess.inputs')
   @DocsEditable()
@@ -23565,7 +24154,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.
 
-
 @DocsEditable()
 @DomName('MIDIConnectionEvent')
 // http://webaudio.github.io/web-midi-api/#midiconnectionevent-interface
@@ -23573,7 +24161,9 @@
 @Native("MIDIConnectionEvent")
 class MidiConnectionEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory MidiConnectionEvent._() { throw new UnsupportedError("Not supported"); }
+  factory MidiConnectionEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MIDIConnectionEvent.MIDIConnectionEvent')
   @DocsEditable()
@@ -23584,8 +24174,13 @@
     }
     return MidiConnectionEvent._create_2(type);
   }
-  static MidiConnectionEvent _create_1(type, eventInitDict) => JS('MidiConnectionEvent', 'new MIDIConnectionEvent(#,#)', type, eventInitDict);
-  static MidiConnectionEvent _create_2(type) => JS('MidiConnectionEvent', 'new MIDIConnectionEvent(#)', type);
+  static MidiConnectionEvent _create_1(type, eventInitDict) => JS(
+      'MidiConnectionEvent',
+      'new MIDIConnectionEvent(#,#)',
+      type,
+      eventInitDict);
+  static MidiConnectionEvent _create_2(type) =>
+      JS('MidiConnectionEvent', 'new MIDIConnectionEvent(#)', type);
 
   @DomName('MIDIConnectionEvent.port')
   @DocsEditable()
@@ -23595,7 +24190,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.
 
-
 @DocsEditable()
 @DomName('MIDIInput')
 // http://webaudio.github.io/web-midi-api/#idl-def-MIDIInput
@@ -23603,7 +24197,9 @@
 @Native("MIDIInput")
 class MidiInput extends MidiPort {
   // To suppress missing implicit constructor warnings.
-  factory MidiInput._() { throw new UnsupportedError("Not supported"); }
+  factory MidiInput._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `midimessage` events to event
@@ -23613,25 +24209,28 @@
    */
   @DomName('MIDIInput.midimessageEvent')
   @DocsEditable()
-  static const EventStreamProvider<MidiMessageEvent> midiMessageEvent = const EventStreamProvider<MidiMessageEvent>('midimessage');
+  static const EventStreamProvider<MidiMessageEvent> midiMessageEvent =
+      const EventStreamProvider<MidiMessageEvent>('midimessage');
 
   /// Stream of `midimessage` events handled by this [MidiInput].
   @DomName('MIDIInput.onmidimessage')
   @DocsEditable()
-  Stream<MidiMessageEvent> get onMidiMessage => midiMessageEvent.forTarget(this);
+  Stream<MidiMessageEvent> get onMidiMessage =>
+      midiMessageEvent.forTarget(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.
 
-
 @DocsEditable()
 @DomName('MIDIInputMap')
 @Experimental() // untriaged
 @Native("MIDIInputMap")
 class MidiInputMap extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MidiInputMap._() { throw new UnsupportedError("Not supported"); }
+  factory MidiInputMap._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MIDIInputMap.size')
   @DocsEditable()
@@ -23642,7 +24241,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.
 
-
 @DocsEditable()
 @DomName('MIDIMessageEvent')
 // http://webaudio.github.io/web-midi-api/#midimessageevent-interface
@@ -23650,7 +24248,9 @@
 @Native("MIDIMessageEvent")
 class MidiMessageEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory MidiMessageEvent._() { throw new UnsupportedError("Not supported"); }
+  factory MidiMessageEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MIDIMessageEvent.MIDIMessageEvent')
   @DocsEditable()
@@ -23661,8 +24261,10 @@
     }
     return MidiMessageEvent._create_2(type);
   }
-  static MidiMessageEvent _create_1(type, eventInitDict) => JS('MidiMessageEvent', 'new MIDIMessageEvent(#,#)', type, eventInitDict);
-  static MidiMessageEvent _create_2(type) => JS('MidiMessageEvent', 'new MIDIMessageEvent(#)', type);
+  static MidiMessageEvent _create_1(type, eventInitDict) =>
+      JS('MidiMessageEvent', 'new MIDIMessageEvent(#,#)', type, eventInitDict);
+  static MidiMessageEvent _create_2(type) =>
+      JS('MidiMessageEvent', 'new MIDIMessageEvent(#)', type);
 
   @DomName('MIDIMessageEvent.data')
   @DocsEditable()
@@ -23676,7 +24278,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.
 
-
 @DocsEditable()
 @DomName('MIDIOutput')
 // http://webaudio.github.io/web-midi-api/#midioutput-interface
@@ -23684,24 +24285,27 @@
 @Native("MIDIOutput")
 class MidiOutput extends MidiPort {
   // To suppress missing implicit constructor warnings.
-  factory MidiOutput._() { throw new UnsupportedError("Not supported"); }
+  factory MidiOutput._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MIDIOutput.send')
   @DocsEditable()
-  void send(Uint8List data, [num timestamp]) native;
+  void send(Uint8List data, [num timestamp]) 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.
 
-
 @DocsEditable()
 @DomName('MIDIOutputMap')
 @Experimental() // untriaged
 @Native("MIDIOutputMap")
 class MidiOutputMap extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MidiOutputMap._() { throw new UnsupportedError("Not supported"); }
+  factory MidiOutputMap._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MIDIOutputMap.size')
   @DocsEditable()
@@ -23712,7 +24316,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.
 
-
 @DocsEditable()
 @DomName('MIDIPort')
 // http://webaudio.github.io/web-midi-api/#idl-def-MIDIPort
@@ -23720,7 +24323,9 @@
 @Native("MIDIPort")
 class MidiPort extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory MidiPort._() { throw new UnsupportedError("Not supported"); }
+  factory MidiPort._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MIDIPort.connection')
   @DocsEditable()
@@ -23755,25 +24360,26 @@
   @DomName('MIDIPort.close')
   @DocsEditable()
   @Experimental() // untriaged
-  Future close() native;
+  Future close() native ;
 
   @DomName('MIDIPort.open')
   @DocsEditable()
   @Experimental() // untriaged
-  Future open() native;
+  Future open() 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.
 
-
 @DocsEditable()
 @DomName('MimeType')
 @Experimental() // non-standard
 @Native("MimeType")
 class MimeType extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MimeType._() { throw new UnsupportedError("Not supported"); }
+  factory MimeType._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MimeType.description')
   @DocsEditable()
@@ -23795,32 +24401,34 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('MimeTypeArray')
 @Experimental() // non-standard
 @Native("MimeTypeArray")
-class MimeTypeArray extends Interceptor with ListMixin<MimeType>, ImmutableListMixin<MimeType> implements JavaScriptIndexingBehavior, List<MimeType> {
+class MimeTypeArray extends Interceptor
+    with ListMixin<MimeType>, ImmutableListMixin<MimeType>
+    implements JavaScriptIndexingBehavior, List<MimeType> {
   // To suppress missing implicit constructor warnings.
-  factory MimeTypeArray._() { throw new UnsupportedError("Not supported"); }
+  factory MimeTypeArray._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MimeTypeArray.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  MimeType operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  MimeType operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("MimeType", "#[#]", this, index);
   }
-  void operator[]=(int index, MimeType value) {
+
+  void operator []=(int index, MimeType value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<MimeType> mixins.
   // MimeType is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -23854,24 +24462,25 @@
 
   @DomName('MimeTypeArray.item')
   @DocsEditable()
-  MimeType item(int index) native;
+  MimeType item(int index) native ;
 
   @DomName('MimeTypeArray.namedItem')
   @DocsEditable()
-  MimeType namedItem(String name) native;
+  MimeType 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.
 
-
 @DocsEditable()
 @DomName('HTMLModElement')
 @Unstable()
 @Native("HTMLModElement")
 class ModElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory ModElement._() { throw new UnsupportedError("Not supported"); }
+  factory ModElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -23891,23 +24500,44 @@
 // for 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('MouseEvent')
 @Native("MouseEvent,DragEvent")
 class MouseEvent extends UIEvent {
   factory MouseEvent(String type,
-      {Window view, int detail: 0, int screenX: 0, int screenY: 0,
-      int clientX: 0, int clientY: 0, int button: 0, bool canBubble: true,
-      bool cancelable: true, bool ctrlKey: false, bool altKey: false,
-      bool shiftKey: false, bool metaKey: false, EventTarget relatedTarget}) {
-
+      {Window view,
+      int detail: 0,
+      int screenX: 0,
+      int screenY: 0,
+      int clientX: 0,
+      int clientY: 0,
+      int button: 0,
+      bool canBubble: true,
+      bool cancelable: true,
+      bool ctrlKey: false,
+      bool altKey: false,
+      bool shiftKey: false,
+      bool metaKey: false,
+      EventTarget relatedTarget}) {
     if (view == null) {
       view = window;
     }
     MouseEvent event = document._createEvent('MouseEvent');
-    event._initMouseEvent(type, canBubble, cancelable, view, detail,
-        screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
-        button, relatedTarget);
+    event._initMouseEvent(
+        type,
+        canBubble,
+        cancelable,
+        view,
+        detail,
+        screenX,
+        screenY,
+        clientX,
+        clientY,
+        ctrlKey,
+        altKey,
+        shiftKey,
+        metaKey,
+        button,
+        relatedTarget);
     return event;
   }
 
@@ -23920,8 +24550,10 @@
     }
     return MouseEvent._create_2(type);
   }
-  static MouseEvent _create_1(type, eventInitDict) => JS('MouseEvent', 'new MouseEvent(#,#)', type, eventInitDict);
-  static MouseEvent _create_2(type) => JS('MouseEvent', 'new MouseEvent(#)', type);
+  static MouseEvent _create_1(type, eventInitDict) =>
+      JS('MouseEvent', 'new MouseEvent(#,#)', type, eventInitDict);
+  static MouseEvent _create_2(type) =>
+      JS('MouseEvent', 'new MouseEvent(#)', type);
 
   @DomName('MouseEvent.altKey')
   @DocsEditable()
@@ -24014,7 +24646,8 @@
 
   @DomName('MouseEvent.relatedTarget')
   @DocsEditable()
-  EventTarget get relatedTarget => _convertNativeToDart_EventTarget(this._get_relatedTarget);
+  EventTarget get relatedTarget =>
+      _convertNativeToDart_EventTarget(this._get_relatedTarget);
   @JSName('relatedTarget')
   @DomName('MouseEvent.relatedTarget')
   @DocsEditable()
@@ -24069,16 +24702,61 @@
 
   @DomName('MouseEvent.initMouseEvent')
   @DocsEditable()
-  void _initMouseEvent(String type, bool bubbles, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) {
+  void _initMouseEvent(
+      String type,
+      bool bubbles,
+      bool cancelable,
+      Window view,
+      int detail,
+      int screenX,
+      int screenY,
+      int clientX,
+      int clientY,
+      bool ctrlKey,
+      bool altKey,
+      bool shiftKey,
+      bool metaKey,
+      int button,
+      EventTarget relatedTarget) {
     var relatedTarget_1 = _convertDartToNative_EventTarget(relatedTarget);
-    _initMouseEvent_1(type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
+    _initMouseEvent_1(
+        type,
+        bubbles,
+        cancelable,
+        view,
+        detail,
+        screenX,
+        screenY,
+        clientX,
+        clientY,
+        ctrlKey,
+        altKey,
+        shiftKey,
+        metaKey,
+        button,
+        relatedTarget_1);
     return;
   }
+
   @JSName('initMouseEvent')
   @DomName('MouseEvent.initMouseEvent')
   @DocsEditable()
-  void _initMouseEvent_1(type, bubbles, cancelable, Window view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native;
-
+  void _initMouseEvent_1(
+      type,
+      bubbles,
+      cancelable,
+      Window view,
+      detail,
+      screenX,
+      screenY,
+      clientX,
+      clientY,
+      ctrlKey,
+      altKey,
+      shiftKey,
+      metaKey,
+      button,
+      relatedTarget) native ;
 
   @DomName('MouseEvent.clientX')
   @DomName('MouseEvent.clientY')
@@ -24106,8 +24784,7 @@
     } else {
       // Firefox does not support offsetX.
       if (!(this.target is Element)) {
-        throw new UnsupportedError(
-            'offsetX is only supported on elements');
+        throw new UnsupportedError('offsetX is only supported on elements');
       }
       Element target = this.target;
       var point = (this.client - target.getBoundingClientRect().topLeft);
@@ -24133,14 +24810,13 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('MutationCallback')
-typedef void MutationCallback(List<MutationRecord> mutations, MutationObserver observer);
+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.
 
-
 @DomName('MutationObserver')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -24148,10 +24824,9 @@
 @Experimental()
 @Native("MutationObserver,WebKitMutationObserver")
 class MutationObserver extends Interceptor {
-
   @DomName('MutationObserver.disconnect')
   @DocsEditable()
-  void disconnect() native;
+  void disconnect() native ;
 
   @DomName('MutationObserver.observe')
   @DocsEditable()
@@ -24160,22 +24835,23 @@
     _observe_1(target, options_1);
     return;
   }
+
   @JSName('observe')
   @DomName('MutationObserver.observe')
   @DocsEditable()
-  void _observe_1(Node target, options) native;
+  void _observe_1(Node target, options) native ;
 
   @DomName('MutationObserver.takeRecords')
   @DocsEditable()
-  List<MutationRecord> takeRecords() native;
+  List<MutationRecord> takeRecords() native ;
 
   /**
    * Checks to see if the mutation observer API is supported on the current
    * platform.
    */
   static bool get supported {
-    return JS('bool',
-        '!!(window.MutationObserver || window.WebKitMutationObserver)');
+    return JS(
+        'bool', '!!(window.MutationObserver || window.WebKitMutationObserver)');
   }
 
   /**
@@ -24189,14 +24865,13 @@
    * * If characterDataOldValue is true then characterData must be true.
    */
   void observe(Node target,
-               {bool childList,
-                bool attributes,
-                bool characterData,
-                bool subtree,
-                bool attributeOldValue,
-                bool characterDataOldValue,
-                List<String> attributeFilter}) {
-
+      {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();
 
@@ -24218,29 +24893,33 @@
     _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 };
-
+  // 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.
+  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.
   @JSName('observe')
-  void _call(target, options) native;
+  void _call(target, options) native ;
 
   factory MutationObserver(MutationCallback callback) {
     // Dummy statement to mark types as instantiated.
     JS('MutationObserver|MutationRecord', '0');
 
-    return JS('MutationObserver',
+    return JS(
+        'MutationObserver',
         'new(window.MutationObserver||window.WebKitMutationObserver||'
         'window.MozMutationObserver)(#)',
         convertDartClosureToJS(_wrapBinaryZone(callback), 2));
@@ -24250,13 +24929,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.
 
-
 @DocsEditable()
 @DomName('MutationRecord')
 @Native("MutationRecord")
 class MutationRecord extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory MutationRecord._() { throw new UnsupportedError("Not supported"); }
+  factory MutationRecord._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MutationRecord.addedNodes')
   @DocsEditable()
@@ -24302,14 +24982,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.
 
-
 @DomName('Navigator')
 @Native("Navigator")
-class Navigator extends Interceptor implements NavigatorStorageUtils, NavigatorCpu, NavigatorLanguage, NavigatorOnLine, NavigatorID {
-
+class Navigator extends Interceptor
+    implements
+        NavigatorStorageUtils,
+        NavigatorCpu,
+        NavigatorLanguage,
+        NavigatorOnLine,
+        NavigatorID {
   @DomName('Navigator.language')
-  String get language => JS('String', '#.language || #.userLanguage', this,
-      this);
+  String get language =>
+      JS('String', '#.language || #.userLanguage', this, this);
 
   /**
    * Gets a stream (video and or audio) from the local computer.
@@ -24351,35 +25035,40 @@
   @Experimental()
   Future<MediaStream> getUserMedia({audio: false, video: false}) {
     var completer = new Completer<MediaStream>();
-    var options = {
-      'audio': audio,
-      'video': video
-    };
+    var options = {'audio': audio, 'video': video};
     _ensureGetUserMedia();
     this._getUserMedia(convertDartToNative_SerializedScriptValue(options),
-      (stream) {
-        completer.complete(stream);
-      },
-      (error) {
-        completer.completeError(error);
-      });
+        (stream) {
+      completer.complete(stream);
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
   _ensureGetUserMedia() {
     if (JS('bool', '!(#.getUserMedia)', this)) {
-      JS('void', '#.getUserMedia = '
+      JS(
+          'void',
+          '#.getUserMedia = '
           '(#.getUserMedia || #.webkitGetUserMedia || #.mozGetUserMedia ||'
-          '#.msGetUserMedia)', this, this, this, this, this);
+          '#.msGetUserMedia)',
+          this,
+          this,
+          this,
+          this,
+          this);
     }
   }
 
   @JSName('getUserMedia')
   void _getUserMedia(options, _NavigatorUserMediaSuccessCallback success,
-      _NavigatorUserMediaErrorCallback error) native;
+      _NavigatorUserMediaErrorCallback error) native ;
 
   // To suppress missing implicit constructor warnings.
-  factory Navigator._() { throw new UnsupportedError("Not supported"); }
+  factory Navigator._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Navigator.bluetooth')
   @DocsEditable()
@@ -24483,24 +25172,24 @@
   @DomName('Navigator.getBattery')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getBattery() native;
+  Future getBattery() native ;
 
   @DomName('Navigator.getGamepads')
   @DocsEditable()
   @Experimental() // untriaged
   @Returns('_GamepadList')
   @Creates('_GamepadList')
-  List<Gamepad> getGamepads() native;
+  List<Gamepad> getGamepads() native ;
 
   @DomName('Navigator.getVRDevices')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getVRDevices() native;
+  Future getVRDevices() native ;
 
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable()
   @Unstable()
-  void registerProtocolHandler(String scheme, String url, String title) native;
+  void registerProtocolHandler(String scheme, String url, String title) native ;
 
   @DomName('Navigator.requestMIDIAccess')
   @DocsEditable()
@@ -24512,26 +25201,28 @@
     }
     return _requestMidiAccess_2();
   }
+
   @JSName('requestMIDIAccess')
   @DomName('Navigator.requestMIDIAccess')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _requestMidiAccess_1(options) native;
+  Future _requestMidiAccess_1(options) native ;
   @JSName('requestMIDIAccess')
   @DomName('Navigator.requestMIDIAccess')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _requestMidiAccess_2() native;
+  Future _requestMidiAccess_2() native ;
 
   @DomName('Navigator.requestMediaKeySystemAccess')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requestMediaKeySystemAccess(String keySystem, List<Map> supportedConfigurations) native;
+  Future requestMediaKeySystemAccess(
+      String keySystem, List<Map> supportedConfigurations) native ;
 
   @DomName('Navigator.sendBeacon')
   @DocsEditable()
   @Experimental() // untriaged
-  bool sendBeacon(String url, Object data) native;
+  bool sendBeacon(String url, Object data) native ;
 
   // From NavigatorCPU
 
@@ -24598,20 +25289,20 @@
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
   @Experimental()
-  void getStorageUpdates() native;
-
+  void getStorageUpdates() 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.
 
-
 @DocsEditable()
 @DomName('NavigatorCPU')
 @Experimental() // untriaged
 abstract class NavigatorCpu extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory NavigatorCpu._() { throw new UnsupportedError("Not supported"); }
+  factory NavigatorCpu._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   final int hardwareConcurrency;
 }
@@ -24619,13 +25310,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.
 
-
 @DocsEditable()
 @DomName('NavigatorID')
 @Experimental() // untriaged
 abstract class NavigatorID extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory NavigatorID._() { throw new UnsupportedError("Not supported"); }
+  factory NavigatorID._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   final String appCodeName;
 
@@ -24645,13 +25337,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.
 
-
 @DocsEditable()
 @DomName('NavigatorLanguage')
 @Experimental() // untriaged
 abstract class NavigatorLanguage extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory NavigatorLanguage._() { throw new UnsupportedError("Not supported"); }
+  factory NavigatorLanguage._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   final String language;
 
@@ -24661,13 +25354,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.
 
-
 @DocsEditable()
 @DomName('NavigatorOnLine')
 @Experimental() // untriaged
 abstract class NavigatorOnLine extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory NavigatorOnLine._() { throw new UnsupportedError("Not supported"); }
+  factory NavigatorOnLine._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   final bool onLine;
 }
@@ -24675,14 +25369,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.
 
-
 @DocsEditable()
 @DomName('NavigatorStorageUtils')
 @Experimental() // untriaged
 @Native("NavigatorStorageUtils")
 class NavigatorStorageUtils extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory NavigatorStorageUtils._() { throw new UnsupportedError("Not supported"); }
+  factory NavigatorStorageUtils._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('NavigatorStorageUtils.cookieEnabled')
   @DocsEditable()
@@ -24692,13 +25387,12 @@
   @DomName('NavigatorStorageUtils.getStorageUpdates')
   @DocsEditable()
   @Experimental() // untriaged
-  void getStorageUpdates() native;
+  void getStorageUpdates() 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.
 
-
 @DocsEditable()
 @DomName('NavigatorUserMediaError')
 // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaError
@@ -24706,7 +25400,9 @@
 @Native("NavigatorUserMediaError")
 class NavigatorUserMediaError extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory NavigatorUserMediaError._() { throw new UnsupportedError("Not supported"); }
+  factory NavigatorUserMediaError._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('NavigatorUserMediaError.constraintName')
   @DocsEditable()
@@ -24726,7 +25422,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('NavigatorUserMediaErrorCallback')
 // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaErrorCallback
 @Experimental()
@@ -24737,7 +25432,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('NavigatorUserMediaSuccessCallback')
 // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaSuccessCallback
 @Experimental()
@@ -24746,14 +25440,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.
 
-
 @DocsEditable()
 @DomName('NetworkInformation')
 @Experimental() // untriaged
 @Native("NetworkInformation")
 class NetworkInformation extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory NetworkInformation._() { throw new UnsupportedError("Not supported"); }
+  factory NetworkInformation._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('NetworkInformation.type')
   @DocsEditable()
@@ -24764,7 +25459,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.
 
-
 /**
  * Lazy implementation of the child nodes of an element that does not request
  * the actual child nodes of an element until strictly necessary greatly
@@ -24775,17 +25469,18 @@
 
   _ChildNodeListLazy(this._this);
 
-
   Node get first {
     Node result = JS('Node|Null', '#.firstChild', _this);
     if (result == null) throw new StateError("No elements");
     return result;
   }
+
   Node get last {
     Node result = JS('Node|Null', '#.lastChild', _this);
     if (result == null) throw new StateError("No elements");
     return result;
   }
+
   Node get single {
     int l = this.length;
     if (l == 0) throw new StateError("No elements");
@@ -24907,7 +25602,7 @@
 
   // FIXME: implement these.
   void setRange(int start, int end, Iterable<Node> iterable,
-                [int skipCount = 0]) {
+      [int skipCount = 0]) {
     throw new UnsupportedError("Cannot setRange on Node list");
   }
 
@@ -24921,20 +25616,17 @@
   int get length => _this.childNodes.length;
 
   set length(int value) {
-    throw new UnsupportedError(
-        "Cannot set length on immutable List.");
+    throw new UnsupportedError("Cannot set length on immutable List.");
   }
 
-  Node operator[](int index) => _this.childNodes[index];
+  Node operator [](int index) => _this.childNodes[index];
 
   List<Node> get rawList => _this.childNodes;
 }
 
-
 @DomName('Node')
 @Native("Node")
 class Node extends EventTarget {
-
   // Custom element created callback.
   Node._created() : super._created();
 
@@ -24976,9 +25668,8 @@
     try {
       final Node parent = this.parentNode;
       parent._replaceChild(otherNode, this);
-    } catch (e) {
-
-    };
+    } catch (e) {}
+    ;
     return this;
   }
 
@@ -25017,7 +25708,7 @@
    * Print out a String representation of this Node.
    */
   String toString() {
-    String value = nodeValue;  // Fetch DOM Node property once.
+    String value = nodeValue; // Fetch DOM Node property once.
     return value == null ? super.toString() : value;
   }
 
@@ -25036,7 +25727,9 @@
   final List<Node> childNodes;
 
   // To suppress missing implicit constructor warnings.
-  factory Node._() { throw new UnsupportedError("Not supported"); }
+  factory Node._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Node.ATTRIBUTE_NODE')
   @DocsEditable()
@@ -25275,7 +25968,7 @@
    */
   @DomName('Node.appendChild')
   @DocsEditable()
-  Node append(Node node) native;
+  Node append(Node node) native ;
 
   @JSName('cloneNode')
   /**
@@ -25291,7 +25984,7 @@
    */
   @DomName('Node.cloneNode')
   @DocsEditable()
-  Node clone(bool deep) native;
+  Node clone(bool deep) native ;
 
   /**
    * Returns true if this node contains the specified node.
@@ -25303,7 +25996,7 @@
    */
   @DomName('Node.contains')
   @DocsEditable()
-  bool contains(Node other) native;
+  bool contains(Node other) native ;
 
   /**
    * Returns true if this node has any children.
@@ -25315,7 +26008,7 @@
    */
   @DomName('Node.hasChildNodes')
   @DocsEditable()
-  bool hasChildNodes() native;
+  bool hasChildNodes() native ;
 
   /**
    * Inserts all of the nodes into this node directly before refChild.
@@ -25327,31 +26020,31 @@
    */
   @DomName('Node.insertBefore')
   @DocsEditable()
-  Node insertBefore(Node node, Node child) native;
+  Node insertBefore(Node node, Node child) native ;
 
   @JSName('removeChild')
   @DomName('Node.removeChild')
   @DocsEditable()
-  Node _removeChild(Node child) native;
+  Node _removeChild(Node child) native ;
 
   @JSName('replaceChild')
   @DomName('Node.replaceChild')
   @DocsEditable()
-  Node _replaceChild(Node node, Node child) native;
-
+  Node _replaceChild(Node node, Node child) 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.
 
-
 @DocsEditable()
 @DomName('NodeFilter')
 @Unstable()
 @Native("NodeFilter")
 class NodeFilter extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory NodeFilter._() { throw new UnsupportedError("Not supported"); }
+  factory NodeFilter._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('NodeFilter.FILTER_ACCEPT')
   @DocsEditable()
@@ -25401,7 +26094,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.
 
-
 @DomName('NodeIterator')
 @Unstable()
 @Native("NodeIterator")
@@ -25410,7 +26102,9 @@
     return document._createNodeIterator(root, whatToShow, null);
   }
   // To suppress missing implicit constructor warnings.
-  factory NodeIterator._() { throw new UnsupportedError("Not supported"); }
+  factory NodeIterator._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('NodeIterator.pointerBeforeReferenceNode')
   @DocsEditable()
@@ -25430,46 +26124,47 @@
 
   @DomName('NodeIterator.detach')
   @DocsEditable()
-  void detach() native;
+  void detach() native ;
 
   @DomName('NodeIterator.nextNode')
   @DocsEditable()
-  Node nextNode() native;
+  Node nextNode() native ;
 
   @DomName('NodeIterator.previousNode')
   @DocsEditable()
-  Node previousNode() native;
-
+  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.
 
-
 @DocsEditable()
 @DomName('NodeList')
 @Native("NodeList,RadioNodeList")
-class NodeList extends Interceptor with ListMixin<Node>, ImmutableListMixin<Node> implements JavaScriptIndexingBehavior, List<Node> {
+class NodeList extends Interceptor
+    with ListMixin<Node>, ImmutableListMixin<Node>
+    implements JavaScriptIndexingBehavior, List<Node> {
   // To suppress missing implicit constructor warnings.
-  factory NodeList._() { throw new UnsupportedError("Not supported"); }
+  factory NodeList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('NodeList.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  Node operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  Node operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("Node", "#[#]", this, index);
   }
-  void operator[]=(int index, Node value) {
+
+  void operator []=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<Node> mixins.
   // Node is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -25504,20 +26199,21 @@
   @JSName('item')
   @DomName('NodeList.item')
   @DocsEditable()
-  Node _item(int index) native;
+  Node _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.
 
-
 @DocsEditable()
 @DomName('NonDocumentTypeChildNode')
 @Experimental() // untriaged
 @Native("NonDocumentTypeChildNode")
 class NonDocumentTypeChildNode extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory NonDocumentTypeChildNode._() { throw new UnsupportedError("Not supported"); }
+  factory NonDocumentTypeChildNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('NonDocumentTypeChildNode.nextElementSibling')
   @DocsEditable()
@@ -25533,34 +26229,36 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('NonElementParentNode')
 @Experimental() // untriaged
 @Native("NonElementParentNode")
 class NonElementParentNode extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory NonElementParentNode._() { throw new UnsupportedError("Not supported"); }
+  factory NonElementParentNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('NonElementParentNode.getElementById')
   @DocsEditable()
   @Experimental() // untriaged
-  Element getElementById(String elementId) native;
+  Element getElementById(String elementId) native ;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for 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('Notification')
 // http://www.w3.org/TR/notifications/#notification
 @Experimental() // experimental
 @Native("Notification")
 class Notification extends EventTarget {
-
-  factory Notification(String title, {String dir: null, String body: null,
-      String lang: null, String tag: null, String icon: null}) {
-
+  factory Notification(String title,
+      {String dir: null,
+      String body: null,
+      String lang: null,
+      String tag: null,
+      String icon: null}) {
     var parsedOptions = {};
     if (dir != null) parsedOptions['dir'] = dir;
     if (body != null) parsedOptions['body'] = body;
@@ -25570,7 +26268,9 @@
     return Notification._factoryNotification(title, parsedOptions);
   }
   // To suppress missing implicit constructor warnings.
-  factory Notification._() { throw new UnsupportedError("Not supported"); }
+  factory Notification._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `click` events to event
@@ -25580,7 +26280,8 @@
    */
   @DomName('Notification.clickEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> clickEvent = const EventStreamProvider<Event>('click');
+  static const EventStreamProvider<Event> clickEvent =
+      const EventStreamProvider<Event>('click');
 
   /**
    * Static factory designed to expose `close` events to event
@@ -25590,7 +26291,8 @@
    */
   @DomName('Notification.closeEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
+  static const EventStreamProvider<Event> closeEvent =
+      const EventStreamProvider<Event>('close');
 
   /**
    * Static factory designed to expose `error` events to event
@@ -25600,7 +26302,8 @@
    */
   @DomName('Notification.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /**
    * Static factory designed to expose `show` events to event
@@ -25610,7 +26313,8 @@
    */
   @DomName('Notification.showEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');
+  static const EventStreamProvider<Event> showEvent =
+      const EventStreamProvider<Event>('show');
 
   @DomName('Notification.Notification')
   @DocsEditable()
@@ -25621,8 +26325,11 @@
     }
     return Notification._create_2(title);
   }
-  static Notification _create_1(title, options) => JS('Notification', 'new Notification(#,#)', title, options);
-  static Notification _create_2(title) => JS('Notification', 'new Notification(#)', title);
+
+  static Notification _create_1(title, options) =>
+      JS('Notification', 'new Notification(#,#)', title, options);
+  static Notification _create_2(title) =>
+      JS('Notification', 'new Notification(#)', title);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.Notification)');
@@ -25680,20 +26387,22 @@
 
   @DomName('Notification.close')
   @DocsEditable()
-  void close() native;
+  void close() native ;
 
   @JSName('requestPermission')
   @DomName('Notification.requestPermission')
   @DocsEditable()
-  static void _requestPermission([_NotificationPermissionCallback callback]) native;
+  static void _requestPermission([_NotificationPermissionCallback callback])
+      native ;
 
   @JSName('requestPermission')
   @DomName('Notification.requestPermission')
   @DocsEditable()
   static Future<String> requestPermission() {
     var completer = new Completer<String>();
-    _requestPermission(
-        (value) { completer.complete(value); });
+    _requestPermission((value) {
+      completer.complete(value);
+    });
     return completer.future;
   }
 
@@ -25716,20 +26425,20 @@
   @DomName('Notification.onshow')
   @DocsEditable()
   Stream<Event> get onShow => showEvent.forTarget(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.
 
-
 @DocsEditable()
 @DomName('NotificationEvent')
 @Experimental() // untriaged
 @Native("NotificationEvent")
 class NotificationEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
-  factory NotificationEvent._() { throw new UnsupportedError("Not supported"); }
+  factory NotificationEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('NotificationEvent.NotificationEvent')
   @DocsEditable()
@@ -25740,8 +26449,10 @@
     }
     return NotificationEvent._create_2(type);
   }
-  static NotificationEvent _create_1(type, eventInitDict) => JS('NotificationEvent', 'new NotificationEvent(#,#)', type, eventInitDict);
-  static NotificationEvent _create_2(type) => JS('NotificationEvent', 'new NotificationEvent(#)', type);
+  static NotificationEvent _create_1(type, eventInitDict) => JS(
+      'NotificationEvent', 'new NotificationEvent(#,#)', type, eventInitDict);
+  static NotificationEvent _create_2(type) =>
+      JS('NotificationEvent', 'new NotificationEvent(#)', type);
 
   @DomName('NotificationEvent.notification')
   @DocsEditable()
@@ -25754,7 +26465,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('NotificationPermissionCallback')
 // http://www.w3.org/TR/notifications/#notificationpermissioncallback
 @Experimental()
@@ -25763,13 +26473,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.
 
-
 @DocsEditable()
 @DomName('HTMLOListElement')
 @Native("HTMLOListElement")
 class OListElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory OListElement._() { throw new UnsupportedError("Not supported"); }
+  factory OListElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLOListElement.HTMLOListElement')
   @DocsEditable()
@@ -25797,7 +26508,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.
 
-
 @DocsEditable()
 @DomName('HTMLObjectElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -25807,7 +26517,9 @@
 @Native("HTMLObjectElement")
 class ObjectElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory ObjectElement._() { throw new UnsupportedError("Not supported"); }
+  factory ObjectElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLObjectElement.HTMLObjectElement')
   @DocsEditable()
@@ -25864,36 +26576,37 @@
 
   @DomName('HTMLObjectElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) native;
+  bool __getter__(index_OR_name) native ;
 
   @DomName('HTMLObjectElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) native;
+  void __setter__(index_OR_name, Node value) native ;
 
   @DomName('HTMLObjectElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native;
+  bool checkValidity() native ;
 
   @DomName('HTMLObjectElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() native;
+  bool reportValidity() native ;
 
   @DomName('HTMLObjectElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) 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.
 
-
 @DocsEditable()
 @DomName('HTMLOptGroupElement')
 @Native("HTMLOptGroupElement")
 class OptGroupElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory OptGroupElement._() { throw new UnsupportedError("Not supported"); }
+  factory OptGroupElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLOptGroupElement.HTMLOptGroupElement')
   @DocsEditable()
@@ -25917,17 +26630,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.
 
-
 @DomName('HTMLOptionElement')
 @Native("HTMLOptionElement")
 class OptionElement extends HtmlElement {
-  factory OptionElement({String data: '', String value : '', bool selected: false}) {
+  factory OptionElement(
+      {String data: '', String value: '', bool selected: false}) {
     return new OptionElement._(data, value, null, selected);
   }
 
   @DomName('HTMLOptionElement.HTMLOptionElement')
   @DocsEditable()
-  factory OptionElement._([String data, String value, bool defaultSelected, bool selected]) {
+  factory OptionElement._(
+      [String data, String value, bool defaultSelected, bool selected]) {
     if (selected != null) {
       return OptionElement._create_1(data, value, defaultSelected, selected);
     }
@@ -25942,10 +26656,19 @@
     }
     return OptionElement._create_5();
   }
-  static OptionElement _create_1(data, value, defaultSelected, selected) => JS('OptionElement', 'new Option(#,#,#,#)', data, value, defaultSelected, selected);
-  static OptionElement _create_2(data, value, defaultSelected) => JS('OptionElement', 'new Option(#,#,#)', data, value, defaultSelected);
-  static OptionElement _create_3(data, value) => JS('OptionElement', 'new Option(#,#)', data, value);
-  static OptionElement _create_4(data) => JS('OptionElement', 'new Option(#)', data);
+  static OptionElement _create_1(data, value, defaultSelected, selected) => JS(
+      'OptionElement',
+      'new Option(#,#,#,#)',
+      data,
+      value,
+      defaultSelected,
+      selected);
+  static OptionElement _create_2(data, value, defaultSelected) =>
+      JS('OptionElement', 'new Option(#,#,#)', data, value, defaultSelected);
+  static OptionElement _create_3(data, value) =>
+      JS('OptionElement', 'new Option(#,#)', data, value);
+  static OptionElement _create_4(data) =>
+      JS('OptionElement', 'new Option(#)', data);
   static OptionElement _create_5() => JS('OptionElement', 'new Option()');
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -25981,13 +26704,11 @@
   @DomName('HTMLOptionElement.value')
   @DocsEditable()
   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.
 
-
 @DocsEditable()
 @DomName('HTMLOutputElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -25996,7 +26717,9 @@
 @Native("HTMLOutputElement")
 class OutputElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory OutputElement._() { throw new UnsupportedError("Not supported"); }
+  factory OutputElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLOutputElement.HTMLOutputElement')
   @DocsEditable()
@@ -26056,22 +26779,21 @@
 
   @DomName('HTMLOutputElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native;
+  bool checkValidity() native ;
 
   @DomName('HTMLOutputElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() native;
+  bool reportValidity() native ;
 
   @DomName('HTMLOutputElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) 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.
 
-
 @DocsEditable()
 @DomName('PageTransitionEvent')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#pagetransitionevent
@@ -26079,7 +26801,9 @@
 @Native("PageTransitionEvent")
 class PageTransitionEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory PageTransitionEvent._() { throw new UnsupportedError("Not supported"); }
+  factory PageTransitionEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PageTransitionEvent.PageTransitionEvent')
   @DocsEditable()
@@ -26090,8 +26814,13 @@
     }
     return PageTransitionEvent._create_2(type);
   }
-  static PageTransitionEvent _create_1(type, eventInitDict) => JS('PageTransitionEvent', 'new PageTransitionEvent(#,#)', type, eventInitDict);
-  static PageTransitionEvent _create_2(type) => JS('PageTransitionEvent', 'new PageTransitionEvent(#)', type);
+  static PageTransitionEvent _create_1(type, eventInitDict) => JS(
+      'PageTransitionEvent',
+      'new PageTransitionEvent(#,#)',
+      type,
+      eventInitDict);
+  static PageTransitionEvent _create_2(type) =>
+      JS('PageTransitionEvent', 'new PageTransitionEvent(#)', type);
 
   @DomName('PageTransitionEvent.persisted')
   @DocsEditable()
@@ -26101,13 +26830,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.
 
-
 @DocsEditable()
 @DomName('HTMLParagraphElement')
 @Native("HTMLParagraphElement")
 class ParagraphElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory ParagraphElement._() { throw new UnsupportedError("Not supported"); }
+  factory ParagraphElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLParagraphElement.HTMLParagraphElement')
   @DocsEditable()
@@ -26123,14 +26853,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.
 
-
 @DocsEditable()
 @DomName('HTMLParamElement')
 @Unstable()
 @Native("HTMLParamElement")
 class ParamElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory ParamElement._() { throw new UnsupportedError("Not supported"); }
+  factory ParamElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLParamElement.HTMLParamElement')
   @DocsEditable()
@@ -26154,13 +26885,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.
 
-
 @DocsEditable()
 @DomName('ParentNode')
 @Experimental() // untriaged
 abstract class ParentNode extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ParentNode._() { throw new UnsupportedError("Not supported"); }
+  factory ParentNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   final int _childElementCount;
 
@@ -26178,18 +26910,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.
 
-
 @DocsEditable()
 @DomName('PasswordCredential')
 @Experimental() // untriaged
 @Native("PasswordCredential")
 class PasswordCredential extends Credential {
   // To suppress missing implicit constructor warnings.
-  factory PasswordCredential._() { throw new UnsupportedError("Not supported"); }
+  factory PasswordCredential._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PasswordCredential.PasswordCredential')
   @DocsEditable()
-  factory PasswordCredential(String id, String password, [String name, String iconURL]) {
+  factory PasswordCredential(String id, String password,
+      [String name, String iconURL]) {
     if (iconURL != null) {
       return PasswordCredential._create_1(id, password, name, iconURL);
     }
@@ -26198,9 +26932,21 @@
     }
     return PasswordCredential._create_3(id, password);
   }
-  static PasswordCredential _create_1(id, password, name, iconURL) => JS('PasswordCredential', 'new PasswordCredential(#,#,#,#)', id, password, name, iconURL);
-  static PasswordCredential _create_2(id, password, name) => JS('PasswordCredential', 'new PasswordCredential(#,#,#)', id, password, name);
-  static PasswordCredential _create_3(id, password) => JS('PasswordCredential', 'new PasswordCredential(#,#)', id, password);
+  static PasswordCredential _create_1(id, password, name, iconURL) => JS(
+      'PasswordCredential',
+      'new PasswordCredential(#,#,#,#)',
+      id,
+      password,
+      name,
+      iconURL);
+  static PasswordCredential _create_2(id, password, name) => JS(
+      'PasswordCredential',
+      'new PasswordCredential(#,#,#)',
+      id,
+      password,
+      name);
+  static PasswordCredential _create_3(id, password) =>
+      JS('PasswordCredential', 'new PasswordCredential(#,#)', id, password);
 
   @DomName('PasswordCredential.formData')
   @DocsEditable()
@@ -26216,14 +26962,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.
 
-
 @DocsEditable()
 @DomName('Path2D')
 @Experimental() // untriaged
 @Native("Path2D")
 class Path2D extends Interceptor implements _CanvasPathMethods {
   // To suppress missing implicit constructor warnings.
-  factory Path2D._() { throw new UnsupportedError("Not supported"); }
+  factory Path2D._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Path2D.Path2D')
   @DocsEditable()
@@ -26240,66 +26987,70 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   static Path2D _create_1() => JS('Path2D', 'new Path2D()');
-  static Path2D _create_2(path_OR_text) => JS('Path2D', 'new Path2D(#)', path_OR_text);
-  static Path2D _create_3(path_OR_text) => JS('Path2D', 'new Path2D(#)', path_OR_text);
+  static Path2D _create_2(path_OR_text) =>
+      JS('Path2D', 'new Path2D(#)', path_OR_text);
+  static Path2D _create_3(path_OR_text) =>
+      JS('Path2D', 'new Path2D(#)', path_OR_text);
 
   @DomName('Path2D.addPath')
   @DocsEditable()
   @Experimental() // untriaged
-  void addPath(Path2D path, [Matrix transform]) native;
+  void addPath(Path2D path, [Matrix transform]) native ;
 
   // From CanvasPathMethods
 
   @DomName('Path2D.arc')
   @DocsEditable()
   @Experimental() // untriaged
-  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native;
+  void arc(num x, num y, num radius, num startAngle, num endAngle,
+      bool anticlockwise) native ;
 
   @DomName('Path2D.arcTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void arcTo(num x1, num y1, num x2, num y2, num radius) native;
+  void arcTo(num x1, num y1, num x2, num y2, num radius) native ;
 
   @DomName('Path2D.bezierCurveTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native;
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y)
+      native ;
 
   @DomName('Path2D.closePath')
   @DocsEditable()
   @Experimental() // untriaged
-  void closePath() native;
+  void closePath() native ;
 
   @DomName('Path2D.ellipse')
   @DocsEditable()
   @Experimental() // untriaged
-  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) native;
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation,
+      num startAngle, num endAngle, bool anticlockwise) native ;
 
   @DomName('Path2D.lineTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void lineTo(num x, num y) native;
+  void lineTo(num x, num y) native ;
 
   @DomName('Path2D.moveTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void moveTo(num x, num y) native;
+  void moveTo(num x, num y) native ;
 
   @DomName('Path2D.quadraticCurveTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) native;
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) native ;
 
   @DomName('Path2D.rect')
   @DocsEditable()
   @Experimental() // untriaged
-  void rect(num x, num y, num width, num height) native;
+  void rect(num x, num y, num width, num 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.
 
-
 @DocsEditable()
 @DomName('Performance')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -26308,7 +27059,9 @@
 @Native("Performance")
 class Performance extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory Performance._() { throw new UnsupportedError("Not supported"); }
+  factory Performance._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `resourcetimingbufferfull` events to event
@@ -26322,7 +27075,8 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
-  static const EventStreamProvider<Event> resourceTimingBufferFullEvent = const EventStreamProvider<Event>('webkitresourcetimingbufferfull');
+  static const EventStreamProvider<Event> resourceTimingBufferFullEvent =
+      const EventStreamProvider<Event>('webkitresourcetimingbufferfull');
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.performance)');
@@ -26343,58 +27097,59 @@
   @DomName('Performance.clearFrameTimings')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearFrameTimings() native;
+  void clearFrameTimings() native ;
 
   @DomName('Performance.clearMarks')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void clearMarks(String markName) native;
+  void clearMarks(String markName) native ;
 
   @DomName('Performance.clearMeasures')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void clearMeasures(String measureName) native;
+  void clearMeasures(String measureName) native ;
 
   @DomName('Performance.getEntries')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntries() native;
+  List<PerformanceEntry> getEntries() native ;
 
   @DomName('Performance.getEntriesByName')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntriesByName(String name, String entryType) native;
+  List<PerformanceEntry> getEntriesByName(String name, String entryType)
+      native ;
 
   @DomName('Performance.getEntriesByType')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntriesByType(String entryType) native;
+  List<PerformanceEntry> getEntriesByType(String entryType) native ;
 
   @DomName('Performance.mark')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void mark(String markName) native;
+  void mark(String markName) native ;
 
   @DomName('Performance.measure')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void measure(String measureName, String startMark, String endMark) native;
+  void measure(String measureName, String startMark, String endMark) native ;
 
   @DomName('Performance.now')
   @DocsEditable()
-  double now() native;
+  double now() native ;
 
   @DomName('Performance.setFrameTimingBufferSize')
   @DocsEditable()
   @Experimental() // untriaged
-  void setFrameTimingBufferSize(int maxSize) native;
+  void setFrameTimingBufferSize(int maxSize) native ;
 
   @JSName('webkitClearResourceTimings')
   @DomName('Performance.webkitClearResourceTimings')
@@ -26403,7 +27158,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#extensions-performance-interface
-  void clearResourceTimings() native;
+  void clearResourceTimings() native ;
 
   @JSName('webkitSetResourceTimingBufferSize')
   @DomName('Performance.webkitSetResourceTimingBufferSize')
@@ -26412,27 +27167,29 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
-  void setResourceTimingBufferSize(int maxSize) native;
+  void setResourceTimingBufferSize(int maxSize) native ;
 
   /// Stream of `resourcetimingbufferfull` events handled by this [Performance].
   @DomName('Performance.onwebkitresourcetimingbufferfull')
   @DocsEditable()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
   @Experimental()
-  Stream<Event> get onResourceTimingBufferFull => resourceTimingBufferFullEvent.forTarget(this);
+  Stream<Event> get onResourceTimingBufferFull =>
+      resourceTimingBufferFullEvent.forTarget(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.
 
-
 @DocsEditable()
 @DomName('PerformanceCompositeTiming')
 @Experimental() // untriaged
 @Native("PerformanceCompositeTiming")
 class PerformanceCompositeTiming extends PerformanceEntry {
   // To suppress missing implicit constructor warnings.
-  factory PerformanceCompositeTiming._() { throw new UnsupportedError("Not supported"); }
+  factory PerformanceCompositeTiming._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PerformanceCompositeTiming.sourceFrame')
   @DocsEditable()
@@ -26443,7 +27200,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.
 
-
 @DocsEditable()
 @DomName('PerformanceEntry')
 // http://www.w3.org/TR/performance-timeline/#sec-PerformanceEntry-interface
@@ -26451,7 +27207,9 @@
 @Native("PerformanceEntry")
 class PerformanceEntry extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PerformanceEntry._() { throw new UnsupportedError("Not supported"); }
+  factory PerformanceEntry._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PerformanceEntry.duration')
   @DocsEditable()
@@ -26473,7 +27231,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.
 
-
 @DocsEditable()
 @DomName('PerformanceMark')
 // http://www.w3.org/TR/user-timing/#performancemark
@@ -26481,13 +27238,14 @@
 @Native("PerformanceMark")
 class PerformanceMark extends PerformanceEntry {
   // To suppress missing implicit constructor warnings.
-  factory PerformanceMark._() { throw new UnsupportedError("Not supported"); }
+  factory PerformanceMark._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('PerformanceMeasure')
 // http://www.w3.org/TR/user-timing/#performancemeasure
@@ -26495,20 +27253,23 @@
 @Native("PerformanceMeasure")
 class PerformanceMeasure extends PerformanceEntry {
   // To suppress missing implicit constructor warnings.
-  factory PerformanceMeasure._() { throw new UnsupportedError("Not supported"); }
+  factory PerformanceMeasure._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('PerformanceNavigation')
 @Unstable()
 @Native("PerformanceNavigation")
 class PerformanceNavigation extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PerformanceNavigation._() { throw new UnsupportedError("Not supported"); }
+  factory PerformanceNavigation._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PerformanceNavigation.TYPE_BACK_FORWARD')
   @DocsEditable()
@@ -26538,14 +27299,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.
 
-
 @DocsEditable()
 @DomName('PerformanceRenderTiming')
 @Experimental() // untriaged
 @Native("PerformanceRenderTiming")
 class PerformanceRenderTiming extends PerformanceEntry {
   // To suppress missing implicit constructor warnings.
-  factory PerformanceRenderTiming._() { throw new UnsupportedError("Not supported"); }
+  factory PerformanceRenderTiming._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PerformanceRenderTiming.sourceFrame')
   @DocsEditable()
@@ -26556,7 +27318,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.
 
-
 @DocsEditable()
 @DomName('PerformanceResourceTiming')
 // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming
@@ -26564,7 +27325,9 @@
 @Native("PerformanceResourceTiming")
 class PerformanceResourceTiming extends PerformanceEntry {
   // To suppress missing implicit constructor warnings.
-  factory PerformanceResourceTiming._() { throw new UnsupportedError("Not supported"); }
+  factory PerformanceResourceTiming._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PerformanceResourceTiming.connectEnd')
   @DocsEditable()
@@ -26626,14 +27389,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.
 
-
 @DocsEditable()
 @DomName('PerformanceTiming')
 @Unstable()
 @Native("PerformanceTiming")
 class PerformanceTiming extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PerformanceTiming._() { throw new UnsupportedError("Not supported"); }
+  factory PerformanceTiming._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PerformanceTiming.connectEnd')
   @DocsEditable()
@@ -26723,14 +27487,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.
 
-
 @DocsEditable()
 @DomName('PeriodicSyncEvent')
 @Experimental() // untriaged
 @Native("PeriodicSyncEvent")
 class PeriodicSyncEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
-  factory PeriodicSyncEvent._() { throw new UnsupportedError("Not supported"); }
+  factory PeriodicSyncEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PeriodicSyncEvent.PeriodicSyncEvent')
   @DocsEditable()
@@ -26738,7 +27503,8 @@
     var init_1 = convertDartToNative_Dictionary(init);
     return PeriodicSyncEvent._create_1(type, init_1);
   }
-  static PeriodicSyncEvent _create_1(type, init) => JS('PeriodicSyncEvent', 'new PeriodicSyncEvent(#,#)', type, init);
+  static PeriodicSyncEvent _create_1(type, init) =>
+      JS('PeriodicSyncEvent', 'new PeriodicSyncEvent(#,#)', type, init);
 
   @DomName('PeriodicSyncEvent.registration')
   @DocsEditable()
@@ -26749,14 +27515,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.
 
-
 @DocsEditable()
 @DomName('PeriodicSyncManager')
 @Experimental() // untriaged
 @Native("PeriodicSyncManager")
 class PeriodicSyncManager extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PeriodicSyncManager._() { throw new UnsupportedError("Not supported"); }
+  factory PeriodicSyncManager._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PeriodicSyncManager.minPossiblePeriod')
   @DocsEditable()
@@ -26766,17 +27533,17 @@
   @DomName('PeriodicSyncManager.getRegistration')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistration(String tag) native;
+  Future getRegistration(String tag) native ;
 
   @DomName('PeriodicSyncManager.getRegistrations')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistrations() native;
+  Future getRegistrations() native ;
 
   @DomName('PeriodicSyncManager.permissionState')
   @DocsEditable()
   @Experimental() // untriaged
-  Future permissionState() native;
+  Future permissionState() native ;
 
   @DomName('PeriodicSyncManager.register')
   @DocsEditable()
@@ -26788,29 +27555,31 @@
     }
     return _register_2();
   }
+
   @JSName('register')
   @DomName('PeriodicSyncManager.register')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _register_1(options) native;
+  Future _register_1(options) native ;
   @JSName('register')
   @DomName('PeriodicSyncManager.register')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _register_2() native;
+  Future _register_2() 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.
 
-
 @DocsEditable()
 @DomName('PeriodicSyncRegistration')
 @Experimental() // untriaged
 @Native("PeriodicSyncRegistration")
 class PeriodicSyncRegistration extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PeriodicSyncRegistration._() { throw new UnsupportedError("Not supported"); }
+  factory PeriodicSyncRegistration._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PeriodicSyncRegistration.minPeriod')
   @DocsEditable()
@@ -26835,25 +27604,27 @@
   @DomName('PeriodicSyncRegistration.unregister')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregister() native;
+  Future unregister() 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.
 
-
 @DocsEditable()
 @DomName('PermissionStatus')
 @Experimental() // untriaged
 @Native("PermissionStatus")
 class PermissionStatus extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory PermissionStatus._() { throw new UnsupportedError("Not supported"); }
+  factory PermissionStatus._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PermissionStatus.changeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+  static const EventStreamProvider<Event> changeEvent =
+      const EventStreamProvider<Event>('change');
 
   @DomName('PermissionStatus.state')
   @DocsEditable()
@@ -26874,32 +27645,34 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('Permissions')
 @Experimental() // untriaged
 @Native("Permissions")
 class Permissions extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Permissions._() { throw new UnsupportedError("Not supported"); }
+  factory Permissions._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Permissions.query')
   @DocsEditable()
   @Experimental() // untriaged
-  Future query(Object permission) native;
+  Future query(Object permission) 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.
 
-
 @DocsEditable()
 @DomName('HTMLPictureElement')
 @Experimental() // untriaged
 @Native("HTMLPictureElement")
 class PictureElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory PictureElement._() { throw new UnsupportedError("Not supported"); }
+  factory PictureElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -26911,14 +27684,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.
 
-
 @DocsEditable()
 @DomName('Plugin')
 @Experimental() // non-standard
 @Native("Plugin")
 class Plugin extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Plugin._() { throw new UnsupportedError("Not supported"); }
+  factory Plugin._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Plugin.description')
   @DocsEditable()
@@ -26938,42 +27712,44 @@
 
   @DomName('Plugin.item')
   @DocsEditable()
-  MimeType item(int index) native;
+  MimeType item(int index) native ;
 
   @DomName('Plugin.namedItem')
   @DocsEditable()
-  MimeType namedItem(String name) native;
+  MimeType 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.
 
-
 @DocsEditable()
 @DomName('PluginArray')
 @Experimental() // non-standard
 @Native("PluginArray")
-class PluginArray extends Interceptor with ListMixin<Plugin>, ImmutableListMixin<Plugin> implements JavaScriptIndexingBehavior, List<Plugin> {
+class PluginArray extends Interceptor
+    with ListMixin<Plugin>, ImmutableListMixin<Plugin>
+    implements JavaScriptIndexingBehavior, List<Plugin> {
   // To suppress missing implicit constructor warnings.
-  factory PluginArray._() { throw new UnsupportedError("Not supported"); }
+  factory PluginArray._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PluginArray.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  Plugin operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  Plugin operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("Plugin", "#[#]", this, index);
   }
-  void operator[]=(int index, Plugin value) {
+
+  void operator []=(int index, Plugin value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<Plugin> mixins.
   // Plugin is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -27007,28 +27783,29 @@
 
   @DomName('PluginArray.item')
   @DocsEditable()
-  Plugin item(int index) native;
+  Plugin item(int index) native ;
 
   @DomName('PluginArray.namedItem')
   @DocsEditable()
-  Plugin namedItem(String name) native;
+  Plugin namedItem(String name) native ;
 
   @DomName('PluginArray.refresh')
   @DocsEditable()
-  void refresh(bool reload) native;
+  void refresh(bool reload) 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.
 
-
 @DocsEditable()
 @DomName('PluginPlaceholderElement')
 @Experimental() // untriaged
 @Native("PluginPlaceholderElement")
 class PluginPlaceholderElement extends DivElement {
   // To suppress missing implicit constructor warnings.
-  factory PluginPlaceholderElement._() { throw new UnsupportedError("Not supported"); }
+  factory PluginPlaceholderElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -27049,20 +27826,21 @@
   @DomName('PluginPlaceholderElement.createdCallback')
   @DocsEditable()
   @Experimental() // untriaged
-  void createdCallback() native;
+  void createdCallback() 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.
 
-
 @DocsEditable()
 @DomName('PointerEvent')
 @Experimental() // untriaged
 @Native("PointerEvent")
 class PointerEvent extends MouseEvent {
   // To suppress missing implicit constructor warnings.
-  factory PointerEvent._() { throw new UnsupportedError("Not supported"); }
+  factory PointerEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PointerEvent.PointerEvent')
   @DocsEditable()
@@ -27073,8 +27851,10 @@
     }
     return PointerEvent._create_2(type);
   }
-  static PointerEvent _create_1(type, eventInitDict) => JS('PointerEvent', 'new PointerEvent(#,#)', type, eventInitDict);
-  static PointerEvent _create_2(type) => JS('PointerEvent', 'new PointerEvent(#)', type);
+  static PointerEvent _create_1(type, eventInitDict) =>
+      JS('PointerEvent', 'new PointerEvent(#,#)', type, eventInitDict);
+  static PointerEvent _create_2(type) =>
+      JS('PointerEvent', 'new PointerEvent(#)', type);
 
   @DomName('PointerEvent.height')
   @DocsEditable()
@@ -27120,7 +27900,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.
 
-
 @DocsEditable()
 @DomName('PopStateEvent')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -27130,7 +27909,9 @@
 @Native("PopStateEvent")
 class PopStateEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory PopStateEvent._() { throw new UnsupportedError("Not supported"); }
+  factory PopStateEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PopStateEvent.PopStateEvent')
   @DocsEditable()
@@ -27141,12 +27922,15 @@
     }
     return PopStateEvent._create_2(type);
   }
-  static PopStateEvent _create_1(type, eventInitDict) => JS('PopStateEvent', 'new PopStateEvent(#,#)', type, eventInitDict);
-  static PopStateEvent _create_2(type) => JS('PopStateEvent', 'new PopStateEvent(#)', type);
+  static PopStateEvent _create_1(type, eventInitDict) =>
+      JS('PopStateEvent', 'new PopStateEvent(#,#)', type, eventInitDict);
+  static PopStateEvent _create_2(type) =>
+      JS('PopStateEvent', 'new PopStateEvent(#)', type);
 
   @DomName('PopStateEvent.state')
   @DocsEditable()
-  dynamic get state => convertNativeToDart_SerializedScriptValue(this._get_state);
+  dynamic get state =>
+      convertNativeToDart_SerializedScriptValue(this._get_state);
   @JSName('state')
   @DomName('PopStateEvent.state')
   @DocsEditable()
@@ -27160,7 +27944,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('PositionCallback')
 @Unstable()
 typedef void _PositionCallback(Geoposition position);
@@ -27168,14 +27951,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.
 
-
 @DocsEditable()
 @DomName('PositionError')
 @Unstable()
 @Native("PositionError")
 class PositionError extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PositionError._() { throw new UnsupportedError("Not supported"); }
+  factory PositionError._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PositionError.PERMISSION_DENIED')
   @DocsEditable()
@@ -27203,7 +27987,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('PositionErrorCallback')
 @Unstable()
 typedef void _PositionErrorCallback(PositionError error);
@@ -27211,41 +27994,43 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('PositionSensorVRDevice')
 @Experimental() // untriaged
 @Native("PositionSensorVRDevice")
 class PositionSensorVRDevice extends VRDevice {
   // To suppress missing implicit constructor warnings.
-  factory PositionSensorVRDevice._() { throw new UnsupportedError("Not supported"); }
+  factory PositionSensorVRDevice._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PositionSensorVRDevice.getImmediateState')
   @DocsEditable()
   @Experimental() // untriaged
-  VRPositionState getImmediateState() native;
+  VRPositionState getImmediateState() native ;
 
   @DomName('PositionSensorVRDevice.getState')
   @DocsEditable()
   @Experimental() // untriaged
-  VRPositionState getState() native;
+  VRPositionState getState() native ;
 
   @DomName('PositionSensorVRDevice.resetSensor')
   @DocsEditable()
   @Experimental() // untriaged
-  void resetSensor() native;
+  void resetSensor() 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.
 
-
 @DocsEditable()
 @DomName('HTMLPreElement')
 @Native("HTMLPreElement")
 class PreElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory PreElement._() { throw new UnsupportedError("Not supported"); }
+  factory PreElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLPreElement.HTMLPreElement')
   @DocsEditable()
@@ -27261,14 +28046,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.
 
-
 @DocsEditable()
 @DomName('Presentation')
 @Experimental() // untriaged
 @Native("Presentation")
 class Presentation extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory Presentation._() { throw new UnsupportedError("Not supported"); }
+  factory Presentation._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Presentation.session')
   @DocsEditable()
@@ -27278,35 +28064,37 @@
   @DomName('Presentation.getAvailability')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getAvailability(String url) native;
+  Future getAvailability(String url) native ;
 
   @DomName('Presentation.joinSession')
   @DocsEditable()
   @Experimental() // untriaged
-  Future joinSession(String url, String presentationId) native;
+  Future joinSession(String url, String presentationId) native ;
 
   @DomName('Presentation.startSession')
   @DocsEditable()
   @Experimental() // untriaged
-  Future startSession(String url) native;
+  Future startSession(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.
 
-
 @DocsEditable()
 @DomName('PresentationAvailability')
 @Experimental() // untriaged
 @Native("PresentationAvailability")
 class PresentationAvailability extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory PresentationAvailability._() { throw new UnsupportedError("Not supported"); }
+  factory PresentationAvailability._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PresentationAvailability.changeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+  static const EventStreamProvider<Event> changeEvent =
+      const EventStreamProvider<Event>('change');
 
   @DomName('PresentationAvailability.value')
   @DocsEditable()
@@ -27322,19 +28110,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.
 
-
 @DocsEditable()
 @DomName('PresentationSession')
 @Experimental() // untriaged
 @Native("PresentationSession")
 class PresentationSession extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory PresentationSession._() { throw new UnsupportedError("Not supported"); }
+  factory PresentationSession._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PresentationSession.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   @DomName('PresentationSession.binaryType')
   @DocsEditable()
@@ -27354,12 +28144,12 @@
   @DomName('PresentationSession.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() native;
+  void close() native ;
 
   @DomName('PresentationSession.send')
   @DocsEditable()
   @Experimental() // untriaged
-  void send(data_OR_message) native;
+  void send(data_OR_message) native ;
 
   @DomName('PresentationSession.onmessage')
   @DocsEditable()
@@ -27370,14 +28160,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.
 
-
 @DocsEditable()
 @DomName('ProcessingInstruction')
 @Unstable()
 @Native("ProcessingInstruction")
 class ProcessingInstruction extends CharacterData {
   // To suppress missing implicit constructor warnings.
-  factory ProcessingInstruction._() { throw new UnsupportedError("Not supported"); }
+  factory ProcessingInstruction._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ProcessingInstruction.sheet')
   @DocsEditable()
@@ -27392,7 +28183,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.
 
-
 @DocsEditable()
 @DomName('HTMLProgressElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -27402,7 +28192,9 @@
 @Native("HTMLProgressElement")
 class ProgressElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory ProgressElement._() { throw new UnsupportedError("Not supported"); }
+  factory ProgressElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLProgressElement.HTMLProgressElement')
   @DocsEditable()
@@ -27440,13 +28232,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.
 
-
 @DocsEditable()
 @DomName('ProgressEvent')
 @Native("ProgressEvent")
 class ProgressEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory ProgressEvent._() { throw new UnsupportedError("Not supported"); }
+  factory ProgressEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ProgressEvent.ProgressEvent')
   @DocsEditable()
@@ -27457,8 +28250,10 @@
     }
     return ProgressEvent._create_2(type);
   }
-  static ProgressEvent _create_1(type, eventInitDict) => JS('ProgressEvent', 'new ProgressEvent(#,#)', type, eventInitDict);
-  static ProgressEvent _create_2(type) => JS('ProgressEvent', 'new ProgressEvent(#)', type);
+  static ProgressEvent _create_1(type, eventInitDict) =>
+      JS('ProgressEvent', 'new ProgressEvent(#,#)', type, eventInitDict);
+  static ProgressEvent _create_2(type) =>
+      JS('ProgressEvent', 'new ProgressEvent(#)', type);
 
   @DomName('ProgressEvent.lengthComputable')
   @DocsEditable()
@@ -27476,14 +28271,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.
 
-
 @DocsEditable()
 @DomName('PromiseRejectionEvent')
 @Experimental() // untriaged
 @Native("PromiseRejectionEvent")
 class PromiseRejectionEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory PromiseRejectionEvent._() { throw new UnsupportedError("Not supported"); }
+  factory PromiseRejectionEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PromiseRejectionEvent.PromiseRejectionEvent')
   @DocsEditable()
@@ -27494,8 +28290,13 @@
     }
     return PromiseRejectionEvent._create_2(type);
   }
-  static PromiseRejectionEvent _create_1(type, eventInitDict) => JS('PromiseRejectionEvent', 'new PromiseRejectionEvent(#,#)', type, eventInitDict);
-  static PromiseRejectionEvent _create_2(type) => JS('PromiseRejectionEvent', 'new PromiseRejectionEvent(#)', type);
+  static PromiseRejectionEvent _create_1(type, eventInitDict) => JS(
+      'PromiseRejectionEvent',
+      'new PromiseRejectionEvent(#,#)',
+      type,
+      eventInitDict);
+  static PromiseRejectionEvent _create_2(type) =>
+      JS('PromiseRejectionEvent', 'new PromiseRejectionEvent(#)', type);
 
   @DomName('PromiseRejectionEvent.promise')
   @DocsEditable()
@@ -27511,14 +28312,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.
 
-
 @DocsEditable()
 @DomName('PushEvent')
 @Experimental() // untriaged
 @Native("PushEvent")
 class PushEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
-  factory PushEvent._() { throw new UnsupportedError("Not supported"); }
+  factory PushEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PushEvent.PushEvent')
   @DocsEditable()
@@ -27529,7 +28331,8 @@
     }
     return PushEvent._create_2(type);
   }
-  static PushEvent _create_1(type, eventInitDict) => JS('PushEvent', 'new PushEvent(#,#)', type, eventInitDict);
+  static PushEvent _create_1(type, eventInitDict) =>
+      JS('PushEvent', 'new PushEvent(#,#)', type, eventInitDict);
   static PushEvent _create_2(type) => JS('PushEvent', 'new PushEvent(#)', type);
 
   @DomName('PushEvent.data')
@@ -27541,19 +28344,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.
 
-
 @DocsEditable()
 @DomName('PushManager')
 @Experimental() // untriaged
 @Native("PushManager")
 class PushManager extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PushManager._() { throw new UnsupportedError("Not supported"); }
+  factory PushManager._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PushManager.getSubscription')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getSubscription() native;
+  Future getSubscription() native ;
 
   @DomName('PushManager.permissionState')
   @DocsEditable()
@@ -27565,16 +28369,17 @@
     }
     return _permissionState_2();
   }
+
   @JSName('permissionState')
   @DomName('PushManager.permissionState')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _permissionState_1(options) native;
+  Future _permissionState_1(options) native ;
   @JSName('permissionState')
   @DomName('PushManager.permissionState')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _permissionState_2() native;
+  Future _permissionState_2() native ;
 
   @DomName('PushManager.subscribe')
   @DocsEditable()
@@ -27586,69 +28391,73 @@
     }
     return _subscribe_2();
   }
+
   @JSName('subscribe')
   @DomName('PushManager.subscribe')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _subscribe_1(options) native;
+  Future _subscribe_1(options) native ;
   @JSName('subscribe')
   @DomName('PushManager.subscribe')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _subscribe_2() native;
+  Future _subscribe_2() 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.
 
-
 @DocsEditable()
 @DomName('PushMessageData')
 @Experimental() // untriaged
 @Native("PushMessageData")
 class PushMessageData extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PushMessageData._() { throw new UnsupportedError("Not supported"); }
+  factory PushMessageData._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PushMessageData.PushMessageData')
   @DocsEditable()
   factory PushMessageData(String message) {
     return PushMessageData._create_1(message);
   }
-  static PushMessageData _create_1(message) => JS('PushMessageData', 'new PushMessageData(#)', message);
+  static PushMessageData _create_1(message) =>
+      JS('PushMessageData', 'new PushMessageData(#)', message);
 
   @DomName('PushMessageData.arrayBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  ByteBuffer arrayBuffer() native;
+  ByteBuffer arrayBuffer() native ;
 
   @DomName('PushMessageData.blob')
   @DocsEditable()
   @Experimental() // untriaged
-  Blob blob() native;
+  Blob blob() native ;
 
   @DomName('PushMessageData.json')
   @DocsEditable()
   @Experimental() // untriaged
-  Object json() native;
+  Object json() native ;
 
   @DomName('PushMessageData.text')
   @DocsEditable()
   @Experimental() // untriaged
-  String text() native;
+  String text() 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.
 
-
 @DocsEditable()
 @DomName('PushSubscription')
 @Experimental() // untriaged
 @Native("PushSubscription")
 class PushSubscription extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PushSubscription._() { throw new UnsupportedError("Not supported"); }
+  factory PushSubscription._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PushSubscription.endpoint')
   @DocsEditable()
@@ -27658,19 +28467,20 @@
   @DomName('PushSubscription.unsubscribe')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unsubscribe() native;
+  Future unsubscribe() 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.
 
-
 @DocsEditable()
 @DomName('HTMLQuoteElement')
 @Native("HTMLQuoteElement")
 class QuoteElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory QuoteElement._() { throw new UnsupportedError("Not supported"); }
+  factory QuoteElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLQuoteElement.HTMLQuoteElement')
   @DocsEditable()
@@ -27692,7 +28502,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('RTCErrorCallback')
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#rtcerror
 @Experimental()
@@ -27703,7 +28512,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('RTCSessionDescriptionCallback')
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCSessionDescription
 @Experimental()
@@ -27714,7 +28522,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('RTCStatsCallback')
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCStatsCallback
 @Experimental()
@@ -27725,7 +28532,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('Range')
 @Unstable()
 @Native("Range")
@@ -27735,7 +28541,9 @@
   factory Range.fromPoint(Point point) =>
       document._caretRangeFromPoint(point.x, point.y);
   // To suppress missing implicit constructor warnings.
-  factory Range._() { throw new UnsupportedError("Not supported"); }
+  factory Range._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Range.END_TO_END')
   @DocsEditable()
@@ -27779,100 +28587,99 @@
 
   @DomName('Range.cloneContents')
   @DocsEditable()
-  DocumentFragment cloneContents() native;
+  DocumentFragment cloneContents() native ;
 
   @DomName('Range.cloneRange')
   @DocsEditable()
-  Range cloneRange() native;
+  Range cloneRange() native ;
 
   @DomName('Range.collapse')
   @DocsEditable()
-  void collapse([bool toStart]) native;
+  void collapse([bool toStart]) native ;
 
   @DomName('Range.compareBoundaryPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  int compareBoundaryPoints(int how, Range sourceRange) native;
+  int compareBoundaryPoints(int how, Range sourceRange) native ;
 
   @DomName('Range.comparePoint')
   @DocsEditable()
-  int comparePoint(Node node, int offset) native;
+  int comparePoint(Node node, int offset) native ;
 
   @DomName('Range.createContextualFragment')
   @DocsEditable()
-  DocumentFragment createContextualFragment(String fragment) native;
+  DocumentFragment createContextualFragment(String fragment) native ;
 
   @DomName('Range.deleteContents')
   @DocsEditable()
-  void deleteContents() native;
+  void deleteContents() native ;
 
   @DomName('Range.detach')
   @DocsEditable()
-  void detach() native;
+  void detach() native ;
 
   @DomName('Range.expand')
   @DocsEditable()
   @Experimental() // non-standard
-  void expand(String unit) native;
+  void expand(String unit) native ;
 
   @DomName('Range.extractContents')
   @DocsEditable()
-  DocumentFragment extractContents() native;
+  DocumentFragment extractContents() native ;
 
   @DomName('Range.getBoundingClientRect')
   @DocsEditable()
-  Rectangle getBoundingClientRect() native;
+  Rectangle getBoundingClientRect() native ;
 
   @DomName('Range.getClientRects')
   @DocsEditable()
   @Returns('_ClientRectList')
   @Creates('_ClientRectList')
-  List<Rectangle> getClientRects() native;
+  List<Rectangle> getClientRects() native ;
 
   @DomName('Range.insertNode')
   @DocsEditable()
-  void insertNode(Node node) native;
+  void insertNode(Node node) native ;
 
   @DomName('Range.isPointInRange')
   @DocsEditable()
-  bool isPointInRange(Node node, int offset) native;
+  bool isPointInRange(Node node, int offset) native ;
 
   @DomName('Range.selectNode')
   @DocsEditable()
-  void selectNode(Node node) native;
+  void selectNode(Node node) native ;
 
   @DomName('Range.selectNodeContents')
   @DocsEditable()
-  void selectNodeContents(Node node) native;
+  void selectNodeContents(Node node) native ;
 
   @DomName('Range.setEnd')
   @DocsEditable()
-  void setEnd(Node node, int offset) native;
+  void setEnd(Node node, int offset) native ;
 
   @DomName('Range.setEndAfter')
   @DocsEditable()
-  void setEndAfter(Node node) native;
+  void setEndAfter(Node node) native ;
 
   @DomName('Range.setEndBefore')
   @DocsEditable()
-  void setEndBefore(Node node) native;
+  void setEndBefore(Node node) native ;
 
   @DomName('Range.setStart')
   @DocsEditable()
-  void setStart(Node node, int offset) native;
+  void setStart(Node node, int offset) native ;
 
   @DomName('Range.setStartAfter')
   @DocsEditable()
-  void setStartAfter(Node node) native;
+  void setStartAfter(Node node) native ;
 
   @DomName('Range.setStartBefore')
   @DocsEditable()
-  void setStartBefore(Node node) native;
+  void setStartBefore(Node node) native ;
 
   @DomName('Range.surroundContents')
   @DocsEditable()
-  void surroundContents(Node newParent) native;
-
+  void surroundContents(Node newParent) native ;
 
   /**
    * Checks if createContextualFragment is supported.
@@ -27888,37 +28695,39 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('ReadableByteStream')
 @Experimental() // untriaged
 @Native("ReadableByteStream")
 class ReadableByteStream extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ReadableByteStream._() { throw new UnsupportedError("Not supported"); }
+  factory ReadableByteStream._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ReadableByteStream.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  Future cancel([Object reason]) native;
+  Future cancel([Object reason]) native ;
 
   @DomName('ReadableByteStream.getReader')
   @DocsEditable()
   @Experimental() // untriaged
-  ReadableByteStreamReader getReader() native;
+  ReadableByteStreamReader getReader() 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.
 
-
 @DocsEditable()
 @DomName('ReadableByteStreamReader')
 @Experimental() // untriaged
 @Native("ReadableByteStreamReader")
 class ReadableByteStreamReader extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ReadableByteStreamReader._() { throw new UnsupportedError("Not supported"); }
+  factory ReadableByteStreamReader._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ReadableByteStreamReader.closed')
   @DocsEditable()
@@ -27928,53 +28737,55 @@
   @DomName('ReadableByteStreamReader.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  Future cancel([Object reason]) native;
+  Future cancel([Object reason]) native ;
 
   @DomName('ReadableByteStreamReader.read')
   @DocsEditable()
   @Experimental() // untriaged
-  Future read() native;
+  Future read() native ;
 
   @DomName('ReadableByteStreamReader.releaseLock')
   @DocsEditable()
   @Experimental() // untriaged
-  void releaseLock() native;
+  void releaseLock() 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.
 
-
 @DocsEditable()
 @DomName('ReadableStream')
 @Experimental() // untriaged
 @Native("ReadableStream")
 class ReadableStream extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ReadableStream._() { throw new UnsupportedError("Not supported"); }
+  factory ReadableStream._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ReadableStream.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  Future cancel([Object reason]) native;
+  Future cancel([Object reason]) native ;
 
   @DomName('ReadableStream.getReader')
   @DocsEditable()
   @Experimental() // untriaged
-  ReadableStreamReader getReader() native;
+  ReadableStreamReader getReader() 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.
 
-
 @DocsEditable()
 @DomName('ReadableStreamReader')
 @Experimental() // untriaged
 @Native("ReadableStreamReader")
 class ReadableStreamReader extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ReadableStreamReader._() { throw new UnsupportedError("Not supported"); }
+  factory ReadableStreamReader._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ReadableStreamReader.closed')
   @DocsEditable()
@@ -27984,30 +28795,31 @@
   @DomName('ReadableStreamReader.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  Future cancel([Object reason]) native;
+  Future cancel([Object reason]) native ;
 
   @DomName('ReadableStreamReader.read')
   @DocsEditable()
   @Experimental() // untriaged
-  Future read() native;
+  Future read() native ;
 
   @DomName('ReadableStreamReader.releaseLock')
   @DocsEditable()
   @Experimental() // untriaged
-  void releaseLock() native;
+  void releaseLock() 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.
 
-
 @DocsEditable()
 @DomName('RelatedEvent')
 @Experimental() // untriaged
 @Native("RelatedEvent")
 class RelatedEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory RelatedEvent._() { throw new UnsupportedError("Not supported"); }
+  factory RelatedEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('RelatedEvent.RelatedEvent')
   @DocsEditable()
@@ -28018,13 +28830,16 @@
     }
     return RelatedEvent._create_2(type);
   }
-  static RelatedEvent _create_1(type, eventInitDict) => JS('RelatedEvent', 'new RelatedEvent(#,#)', type, eventInitDict);
-  static RelatedEvent _create_2(type) => JS('RelatedEvent', 'new RelatedEvent(#)', type);
+  static RelatedEvent _create_1(type, eventInitDict) =>
+      JS('RelatedEvent', 'new RelatedEvent(#,#)', type, eventInitDict);
+  static RelatedEvent _create_2(type) =>
+      JS('RelatedEvent', 'new RelatedEvent(#)', type);
 
   @DomName('RelatedEvent.relatedTarget')
   @DocsEditable()
   @Experimental() // untriaged
-  EventTarget get relatedTarget => _convertNativeToDart_EventTarget(this._get_relatedTarget);
+  EventTarget get relatedTarget =>
+      _convertNativeToDart_EventTarget(this._get_relatedTarget);
   @JSName('relatedTarget')
   @DomName('RelatedEvent.relatedTarget')
   @DocsEditable()
@@ -28037,14 +28852,12 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('RequestAnimationFrameCallback')
 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.
 
-
 @DocsEditable()
 @DomName('ResourceProgressEvent')
 // https://chromiumcodereview.appspot.com/14773025/
@@ -28052,7 +28865,9 @@
 @Native("ResourceProgressEvent")
 class ResourceProgressEvent extends ProgressEvent {
   // To suppress missing implicit constructor warnings.
-  factory ResourceProgressEvent._() { throw new UnsupportedError("Not supported"); }
+  factory ResourceProgressEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ResourceProgressEvent.url')
   @DocsEditable()
@@ -28062,7 +28877,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.
 
-
 @DocsEditable()
 @DomName('RTCDataChannel')
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDataChannel
@@ -28070,7 +28884,9 @@
 @Native("RTCDataChannel,DataChannel")
 class RtcDataChannel extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory RtcDataChannel._() { throw new UnsupportedError("Not supported"); }
+  factory RtcDataChannel._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `close` events to event
@@ -28080,7 +28896,8 @@
    */
   @DomName('RTCDataChannel.closeEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
+  static const EventStreamProvider<Event> closeEvent =
+      const EventStreamProvider<Event>('close');
 
   /**
    * Static factory designed to expose `error` events to event
@@ -28090,7 +28907,8 @@
    */
   @DomName('RTCDataChannel.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /**
    * Static factory designed to expose `message` events to event
@@ -28100,7 +28918,8 @@
    */
   @DomName('RTCDataChannel.messageEvent')
   @DocsEditable()
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   /**
    * Static factory designed to expose `open` events to event
@@ -28110,7 +28929,8 @@
    */
   @DomName('RTCDataChannel.openEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
+  static const EventStreamProvider<Event> openEvent =
+      const EventStreamProvider<Event>('open');
 
   @DomName('RTCDataChannel.binaryType')
   @DocsEditable()
@@ -28164,31 +28984,31 @@
 
   @DomName('RTCDataChannel.close')
   @DocsEditable()
-  void close() native;
+  void close() native ;
 
   @DomName('RTCDataChannel.send')
   @DocsEditable()
-  void send(data) native;
+  void send(data) native ;
 
   @JSName('send')
   @DomName('RTCDataChannel.send')
   @DocsEditable()
-  void sendBlob(Blob data) native;
+  void sendBlob(Blob data) native ;
 
   @JSName('send')
   @DomName('RTCDataChannel.send')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) native;
+  void sendByteBuffer(ByteBuffer data) native ;
 
   @JSName('send')
   @DomName('RTCDataChannel.send')
   @DocsEditable()
-  void sendString(String data) native;
+  void sendString(String data) native ;
 
   @JSName('send')
   @DomName('RTCDataChannel.send')
   @DocsEditable()
-  void sendTypedData(TypedData data) native;
+  void sendTypedData(TypedData data) native ;
 
   /// Stream of `close` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onclose')
@@ -28214,7 +29034,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.
 
-
 @DocsEditable()
 @DomName('RTCDataChannelEvent')
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#rtcdatachannelevent
@@ -28222,7 +29041,9 @@
 @Native("RTCDataChannelEvent")
 class RtcDataChannelEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory RtcDataChannelEvent._() { throw new UnsupportedError("Not supported"); }
+  factory RtcDataChannelEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('RTCDataChannelEvent.channel')
   @DocsEditable()
@@ -28232,7 +29053,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.
 
-
 @DocsEditable()
 @DomName('RTCDTMFSender')
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDTMFSender
@@ -28240,7 +29060,9 @@
 @Native("RTCDTMFSender")
 class RtcDtmfSender extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory RtcDtmfSender._() { throw new UnsupportedError("Not supported"); }
+  factory RtcDtmfSender._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `tonechange` events to event
@@ -28250,7 +29072,8 @@
    */
   @DomName('RTCDTMFSender.tonechangeEvent')
   @DocsEditable()
-  static const EventStreamProvider<RtcDtmfToneChangeEvent> toneChangeEvent = const EventStreamProvider<RtcDtmfToneChangeEvent>('tonechange');
+  static const EventStreamProvider<RtcDtmfToneChangeEvent> toneChangeEvent =
+      const EventStreamProvider<RtcDtmfToneChangeEvent>('tonechange');
 
   @JSName('canInsertDTMF')
   @DomName('RTCDTMFSender.canInsertDTMF')
@@ -28276,18 +29099,18 @@
   @JSName('insertDTMF')
   @DomName('RTCDTMFSender.insertDTMF')
   @DocsEditable()
-  void insertDtmf(String tones, [int duration, int interToneGap]) native;
+  void insertDtmf(String tones, [int duration, int interToneGap]) native ;
 
   /// Stream of `tonechange` events handled by this [RtcDtmfSender].
   @DomName('RTCDTMFSender.ontonechange')
   @DocsEditable()
-  Stream<RtcDtmfToneChangeEvent> get onToneChange => toneChangeEvent.forTarget(this);
+  Stream<RtcDtmfToneChangeEvent> get onToneChange =>
+      toneChangeEvent.forTarget(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.
 
-
 @DocsEditable()
 @DomName('RTCDTMFToneChangeEvent')
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDTMFToneChangeEvent
@@ -28295,7 +29118,9 @@
 @Native("RTCDTMFToneChangeEvent")
 class RtcDtmfToneChangeEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory RtcDtmfToneChangeEvent._() { throw new UnsupportedError("Not supported"); }
+  factory RtcDtmfToneChangeEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('RTCDTMFToneChangeEvent.RTCDTMFToneChangeEvent')
   @DocsEditable()
@@ -28303,7 +29128,11 @@
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
     return RtcDtmfToneChangeEvent._create_1(type, eventInitDict_1);
   }
-  static RtcDtmfToneChangeEvent _create_1(type, eventInitDict) => JS('RtcDtmfToneChangeEvent', 'new RTCDTMFToneChangeEvent(#,#)', type, eventInitDict);
+  static RtcDtmfToneChangeEvent _create_1(type, eventInitDict) => JS(
+      'RtcDtmfToneChangeEvent',
+      'new RTCDTMFToneChangeEvent(#,#)',
+      type,
+      eventInitDict);
 
   @DomName('RTCDTMFToneChangeEvent.tone')
   @DocsEditable()
@@ -28313,7 +29142,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.
 
-
 @DomName('RTCIceCandidate')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental()
@@ -28324,14 +29152,19 @@
     // TODO(efortuna): Remove this check if when you can actually construct with
     // the unprefixed RTCIceCandidate in Firefox (currently both are defined,
     // but one can't be used as a constructor).
-    var constructorName = JS('', 'window[#]',
-        Device.isFirefox ? '${Device.propertyPrefix}RTCIceCandidate' :
-        'RTCIceCandidate');
+    var constructorName = JS(
+        '',
+        'window[#]',
+        Device.isFirefox
+            ? '${Device.propertyPrefix}RTCIceCandidate'
+            : 'RTCIceCandidate');
     return JS('RtcIceCandidate', 'new #(#)', constructorName,
         convertDartToNative_SerializedScriptValue(dictionary));
   }
   // To suppress missing implicit constructor warnings.
-  factory RtcIceCandidate._() { throw new UnsupportedError("Not supported"); }
+  factory RtcIceCandidate._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('RTCIceCandidate.candidate')
   @DocsEditable()
@@ -28344,13 +29177,11 @@
   @DomName('RTCIceCandidate.sdpMid')
   @DocsEditable()
   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.
 
-
 @DocsEditable()
 @DomName('RTCIceCandidateEvent')
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#rtcicecandidate-type
@@ -28358,7 +29189,9 @@
 @Native("RTCIceCandidateEvent,RTCPeerConnectionIceEvent")
 class RtcIceCandidateEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory RtcIceCandidateEvent._() { throw new UnsupportedError("Not supported"); }
+  factory RtcIceCandidateEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('RTCIceCandidateEvent.candidate')
   @DocsEditable()
@@ -28368,7 +29201,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.
 
-
 @DomName('RTCPeerConnection')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental()
@@ -28379,7 +29211,10 @@
     var constructorName = JS('RtcPeerConnection', 'window[#]',
         '${Device.propertyPrefix}RTCPeerConnection');
     if (mediaConstraints != null) {
-      return JS('RtcPeerConnection', 'new #(#,#)', constructorName,
+      return JS(
+          'RtcPeerConnection',
+          'new #(#,#)',
+          constructorName,
           convertDartToNative_SerializedScriptValue(rtcIceServers),
           convertDartToNative_SerializedScriptValue(mediaConstraints));
     } else {
@@ -28398,36 +29233,51 @@
     // about:config. So we have to construct an element to actually test if RTC
     // is supported at the given time.
     try {
-      new RtcPeerConnection(
-          {"iceServers": [ {"url":"stun:localhost"}]});
+      new RtcPeerConnection({
+        "iceServers": [
+          {"url": "stun:localhost"}
+        ]
+      });
       return true;
-    } catch (_) { return false;}
+    } catch (_) {
+      return false;
+    }
     return false;
   }
+
   Future<RtcSessionDescription> createOffer([Map mediaConstraints]) {
     var completer = new Completer<RtcSessionDescription>();
-    _createOffer(
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); }, mediaConstraints);
+    _createOffer((value) {
+      completer.complete(value);
+    }, (error) {
+      completer.completeError(error);
+    }, mediaConstraints);
     return completer.future;
   }
 
   Future<RtcSessionDescription> createAnswer([Map mediaConstraints]) {
     var completer = new Completer<RtcSessionDescription>();
-    _createAnswer(
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); }, mediaConstraints);
+    _createAnswer((value) {
+      completer.complete(value);
+    }, (error) {
+      completer.completeError(error);
+    }, mediaConstraints);
     return completer.future;
   }
 
   @DomName('RTCPeerConnection.getStats')
   Future<RtcStatsResponse> getStats(MediaStreamTrack selector) {
     var completer = new Completer<RtcStatsResponse>();
-    _getStats((value) { completer.complete(value); }, selector);
+    _getStats((value) {
+      completer.complete(value);
+    }, selector);
     return completer.future;
   }
+
   // To suppress missing implicit constructor warnings.
-  factory RtcPeerConnection._() { throw new UnsupportedError("Not supported"); }
+  factory RtcPeerConnection._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `addstream` events to event
@@ -28437,7 +29287,8 @@
    */
   @DomName('RTCPeerConnection.addstreamEvent')
   @DocsEditable()
-  static const EventStreamProvider<MediaStreamEvent> addStreamEvent = const EventStreamProvider<MediaStreamEvent>('addstream');
+  static const EventStreamProvider<MediaStreamEvent> addStreamEvent =
+      const EventStreamProvider<MediaStreamEvent>('addstream');
 
   /**
    * Static factory designed to expose `datachannel` events to event
@@ -28447,7 +29298,8 @@
    */
   @DomName('RTCPeerConnection.datachannelEvent')
   @DocsEditable()
-  static const EventStreamProvider<RtcDataChannelEvent> dataChannelEvent = const EventStreamProvider<RtcDataChannelEvent>('datachannel');
+  static const EventStreamProvider<RtcDataChannelEvent> dataChannelEvent =
+      const EventStreamProvider<RtcDataChannelEvent>('datachannel');
 
   /**
    * Static factory designed to expose `icecandidate` events to event
@@ -28457,7 +29309,8 @@
    */
   @DomName('RTCPeerConnection.icecandidateEvent')
   @DocsEditable()
-  static const EventStreamProvider<RtcIceCandidateEvent> iceCandidateEvent = const EventStreamProvider<RtcIceCandidateEvent>('icecandidate');
+  static const EventStreamProvider<RtcIceCandidateEvent> iceCandidateEvent =
+      const EventStreamProvider<RtcIceCandidateEvent>('icecandidate');
 
   /**
    * Static factory designed to expose `iceconnectionstatechange` events to event
@@ -28467,7 +29320,8 @@
    */
   @DomName('RTCPeerConnection.iceconnectionstatechangeEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> iceConnectionStateChangeEvent = const EventStreamProvider<Event>('iceconnectionstatechange');
+  static const EventStreamProvider<Event> iceConnectionStateChangeEvent =
+      const EventStreamProvider<Event>('iceconnectionstatechange');
 
   /**
    * Static factory designed to expose `negotiationneeded` events to event
@@ -28477,7 +29331,8 @@
    */
   @DomName('RTCPeerConnection.negotiationneededEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> negotiationNeededEvent = const EventStreamProvider<Event>('negotiationneeded');
+  static const EventStreamProvider<Event> negotiationNeededEvent =
+      const EventStreamProvider<Event>('negotiationneeded');
 
   /**
    * Static factory designed to expose `removestream` events to event
@@ -28487,7 +29342,8 @@
    */
   @DomName('RTCPeerConnection.removestreamEvent')
   @DocsEditable()
-  static const EventStreamProvider<MediaStreamEvent> removeStreamEvent = const EventStreamProvider<MediaStreamEvent>('removestream');
+  static const EventStreamProvider<MediaStreamEvent> removeStreamEvent =
+      const EventStreamProvider<MediaStreamEvent>('removestream');
 
   /**
    * Static factory designed to expose `signalingstatechange` events to event
@@ -28497,7 +29353,8 @@
    */
   @DomName('RTCPeerConnection.signalingstatechangeEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> signalingStateChangeEvent = const EventStreamProvider<Event>('signalingstatechange');
+  static const EventStreamProvider<Event> signalingStateChangeEvent =
+      const EventStreamProvider<Event>('signalingstatechange');
 
   @DomName('RTCPeerConnection.iceConnectionState')
   @DocsEditable()
@@ -28521,7 +29378,8 @@
 
   @DomName('RTCPeerConnection.addIceCandidate')
   @DocsEditable()
-  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback, _RtcErrorCallback failureCallback) native;
+  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback,
+      _RtcErrorCallback failureCallback) native ;
 
   @DomName('RTCPeerConnection.addStream')
   @DocsEditable()
@@ -28534,22 +29392,24 @@
     _addStream_2(stream);
     return;
   }
+
   @JSName('addStream')
   @DomName('RTCPeerConnection.addStream')
   @DocsEditable()
-  void _addStream_1(MediaStream stream, mediaConstraints) native;
+  void _addStream_1(MediaStream stream, mediaConstraints) native ;
   @JSName('addStream')
   @DomName('RTCPeerConnection.addStream')
   @DocsEditable()
-  void _addStream_2(MediaStream stream) native;
+  void _addStream_2(MediaStream stream) native ;
 
   @DomName('RTCPeerConnection.close')
   @DocsEditable()
-  void close() native;
+  void close() native ;
 
   @DomName('RTCPeerConnection.createAnswer')
   @DocsEditable()
-  void _createAnswer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) {
+  void _createAnswer(_RtcSessionDescriptionCallback successCallback,
+      [_RtcErrorCallback failureCallback, Map mediaConstraints]) {
     if (mediaConstraints != null) {
       var mediaConstraints_1 = convertDartToNative_Dictionary(mediaConstraints);
       _createAnswer_1(successCallback, failureCallback, mediaConstraints_1);
@@ -28558,19 +29418,22 @@
     _createAnswer_2(successCallback, failureCallback);
     return;
   }
+
   @JSName('createAnswer')
   @DomName('RTCPeerConnection.createAnswer')
   @DocsEditable()
-  void _createAnswer_1(_RtcSessionDescriptionCallback successCallback, _RtcErrorCallback failureCallback, mediaConstraints) native;
+  void _createAnswer_1(_RtcSessionDescriptionCallback successCallback,
+      _RtcErrorCallback failureCallback, mediaConstraints) native ;
   @JSName('createAnswer')
   @DomName('RTCPeerConnection.createAnswer')
   @DocsEditable()
-  void _createAnswer_2(_RtcSessionDescriptionCallback successCallback, _RtcErrorCallback failureCallback) native;
+  void _createAnswer_2(_RtcSessionDescriptionCallback successCallback,
+      _RtcErrorCallback failureCallback) native ;
 
   @JSName('createDTMFSender')
   @DomName('RTCPeerConnection.createDTMFSender')
   @DocsEditable()
-  RtcDtmfSender createDtmfSender(MediaStreamTrack track) native;
+  RtcDtmfSender createDtmfSender(MediaStreamTrack track) native ;
 
   @DomName('RTCPeerConnection.createDataChannel')
   @DocsEditable()
@@ -28581,18 +29444,20 @@
     }
     return _createDataChannel_2(label);
   }
+
   @JSName('createDataChannel')
   @DomName('RTCPeerConnection.createDataChannel')
   @DocsEditable()
-  RtcDataChannel _createDataChannel_1(label, options) native;
+  RtcDataChannel _createDataChannel_1(label, options) native ;
   @JSName('createDataChannel')
   @DomName('RTCPeerConnection.createDataChannel')
   @DocsEditable()
-  RtcDataChannel _createDataChannel_2(label) native;
+  RtcDataChannel _createDataChannel_2(label) native ;
 
   @DomName('RTCPeerConnection.createOffer')
   @DocsEditable()
-  void _createOffer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map rtcOfferOptions]) {
+  void _createOffer(_RtcSessionDescriptionCallback successCallback,
+      [_RtcErrorCallback failureCallback, Map rtcOfferOptions]) {
     if (rtcOfferOptions != null) {
       var rtcOfferOptions_1 = convertDartToNative_Dictionary(rtcOfferOptions);
       _createOffer_1(successCallback, failureCallback, rtcOfferOptions_1);
@@ -28601,65 +29466,77 @@
     _createOffer_2(successCallback, failureCallback);
     return;
   }
+
   @JSName('createOffer')
   @DomName('RTCPeerConnection.createOffer')
   @DocsEditable()
-  void _createOffer_1(_RtcSessionDescriptionCallback successCallback, _RtcErrorCallback failureCallback, rtcOfferOptions) native;
+  void _createOffer_1(_RtcSessionDescriptionCallback successCallback,
+      _RtcErrorCallback failureCallback, rtcOfferOptions) native ;
   @JSName('createOffer')
   @DomName('RTCPeerConnection.createOffer')
   @DocsEditable()
-  void _createOffer_2(_RtcSessionDescriptionCallback successCallback, _RtcErrorCallback failureCallback) native;
+  void _createOffer_2(_RtcSessionDescriptionCallback successCallback,
+      _RtcErrorCallback failureCallback) native ;
 
   @DomName('RTCPeerConnection.getLocalStreams')
   @DocsEditable()
-  List<MediaStream> getLocalStreams() native;
+  List<MediaStream> getLocalStreams() native ;
 
   @DomName('RTCPeerConnection.getRemoteStreams')
   @DocsEditable()
-  List<MediaStream> getRemoteStreams() native;
+  List<MediaStream> getRemoteStreams() native ;
 
   @JSName('getStats')
   @DomName('RTCPeerConnection.getStats')
   @DocsEditable()
-  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) native;
+  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector)
+      native ;
 
   @DomName('RTCPeerConnection.getStreamById')
   @DocsEditable()
-  MediaStream getStreamById(String streamId) native;
+  MediaStream getStreamById(String streamId) native ;
 
   @DomName('RTCPeerConnection.removeStream')
   @DocsEditable()
-  void removeStream(MediaStream stream) native;
+  void removeStream(MediaStream stream) native ;
 
   @JSName('setLocalDescription')
   @DomName('RTCPeerConnection.setLocalDescription')
   @DocsEditable()
-  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) native;
+  void _setLocalDescription(RtcSessionDescription description,
+      [VoidCallback successCallback,
+      _RtcErrorCallback failureCallback]) native ;
 
   @JSName('setLocalDescription')
   @DomName('RTCPeerConnection.setLocalDescription')
   @DocsEditable()
   Future setLocalDescription(RtcSessionDescription description) {
     var completer = new Completer();
-    _setLocalDescription(description,
-        () { completer.complete(); },
-        (error) { completer.completeError(error); });
+    _setLocalDescription(description, () {
+      completer.complete();
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
   @JSName('setRemoteDescription')
   @DomName('RTCPeerConnection.setRemoteDescription')
   @DocsEditable()
-  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) native;
+  void _setRemoteDescription(RtcSessionDescription description,
+      [VoidCallback successCallback,
+      _RtcErrorCallback failureCallback]) native ;
 
   @JSName('setRemoteDescription')
   @DomName('RTCPeerConnection.setRemoteDescription')
   @DocsEditable()
   Future setRemoteDescription(RtcSessionDescription description) {
     var completer = new Completer();
-    _setRemoteDescription(description,
-        () { completer.complete(); },
-        (error) { completer.completeError(error); });
+    _setRemoteDescription(description, () {
+      completer.complete();
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
@@ -28680,18 +29557,19 @@
     _updateIce_3();
     return;
   }
+
   @JSName('updateIce')
   @DomName('RTCPeerConnection.updateIce')
   @DocsEditable()
-  void _updateIce_1(configuration, mediaConstraints) native;
+  void _updateIce_1(configuration, mediaConstraints) native ;
   @JSName('updateIce')
   @DomName('RTCPeerConnection.updateIce')
   @DocsEditable()
-  void _updateIce_2(configuration) native;
+  void _updateIce_2(configuration) native ;
   @JSName('updateIce')
   @DomName('RTCPeerConnection.updateIce')
   @DocsEditable()
-  void _updateIce_3() native;
+  void _updateIce_3() native ;
 
   /// Stream of `addstream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onaddstream')
@@ -28701,39 +29579,43 @@
   /// Stream of `datachannel` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.ondatachannel')
   @DocsEditable()
-  Stream<RtcDataChannelEvent> get onDataChannel => dataChannelEvent.forTarget(this);
+  Stream<RtcDataChannelEvent> get onDataChannel =>
+      dataChannelEvent.forTarget(this);
 
   /// Stream of `icecandidate` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onicecandidate')
   @DocsEditable()
-  Stream<RtcIceCandidateEvent> get onIceCandidate => iceCandidateEvent.forTarget(this);
+  Stream<RtcIceCandidateEvent> get onIceCandidate =>
+      iceCandidateEvent.forTarget(this);
 
   /// Stream of `iceconnectionstatechange` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.oniceconnectionstatechange')
   @DocsEditable()
-  Stream<Event> get onIceConnectionStateChange => iceConnectionStateChangeEvent.forTarget(this);
+  Stream<Event> get onIceConnectionStateChange =>
+      iceConnectionStateChangeEvent.forTarget(this);
 
   /// Stream of `negotiationneeded` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onnegotiationneeded')
   @DocsEditable()
-  Stream<Event> get onNegotiationNeeded => negotiationNeededEvent.forTarget(this);
+  Stream<Event> get onNegotiationNeeded =>
+      negotiationNeededEvent.forTarget(this);
 
   /// Stream of `removestream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onremovestream')
   @DocsEditable()
-  Stream<MediaStreamEvent> get onRemoveStream => removeStreamEvent.forTarget(this);
+  Stream<MediaStreamEvent> get onRemoveStream =>
+      removeStreamEvent.forTarget(this);
 
   /// Stream of `signalingstatechange` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onsignalingstatechange')
   @DocsEditable()
-  Stream<Event> get onSignalingStateChange => signalingStateChangeEvent.forTarget(this);
-
+  Stream<Event> get onSignalingStateChange =>
+      signalingStateChangeEvent.forTarget(this);
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for 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('RTCSessionDescription')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental()
@@ -28744,15 +29626,19 @@
     // TODO(efortuna): Remove this check if when you can actually construct with
     // the unprefixed RTCIceCandidate in Firefox (currently both are defined,
     // but one can't be used as a constructor).
-    var constructorName = JS('', 'window[#]',
-        Device.isFirefox ? '${Device.propertyPrefix}RTCSessionDescription' :
-       'RTCSessionDescription');
-    return JS('RtcSessionDescription',
-        'new #(#)', constructorName,
+    var constructorName = JS(
+        '',
+        'window[#]',
+        Device.isFirefox
+            ? '${Device.propertyPrefix}RTCSessionDescription'
+            : 'RTCSessionDescription');
+    return JS('RtcSessionDescription', 'new #(#)', constructorName,
         convertDartToNative_SerializedScriptValue(dictionary));
   }
   // To suppress missing implicit constructor warnings.
-  factory RtcSessionDescription._() { throw new UnsupportedError("Not supported"); }
+  factory RtcSessionDescription._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
@@ -28761,13 +29647,11 @@
   @DomName('RTCSessionDescription.type')
   @DocsEditable()
   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.
 
-
 @DocsEditable()
 @DomName('RTCStatsReport')
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCStatsReport
@@ -28775,7 +29659,9 @@
 @Native("RTCStatsReport")
 class RtcStatsReport extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory RtcStatsReport._() { throw new UnsupportedError("Not supported"); }
+  factory RtcStatsReport._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('RTCStatsReport.id')
   @DocsEditable()
@@ -28796,17 +29682,16 @@
 
   @DomName('RTCStatsReport.names')
   @DocsEditable()
-  List<String> names() native;
+  List<String> names() native ;
 
   @DomName('RTCStatsReport.stat')
   @DocsEditable()
-  String stat(String name) native;
+  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.
 
-
 @DocsEditable()
 @DomName('RTCStatsResponse')
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#widl-RTCStatsReport-RTCStats-getter-DOMString-id
@@ -28814,34 +29699,36 @@
 @Native("RTCStatsResponse")
 class RtcStatsResponse extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory RtcStatsResponse._() { throw new UnsupportedError("Not supported"); }
+  factory RtcStatsResponse._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('RTCStatsResponse.namedItem')
   @DocsEditable()
-  RtcStatsReport namedItem(String name) native;
+  RtcStatsReport namedItem(String name) native ;
 
   @DomName('RTCStatsResponse.result')
   @DocsEditable()
-  List<RtcStatsReport> result() native;
+  List<RtcStatsReport> result() native ;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('Screen')
 @Native("Screen")
 class Screen extends Interceptor {
-
   @DomName('Screen.availHeight')
   @DomName('Screen.availLeft')
   @DomName('Screen.availTop')
   @DomName('Screen.availWidth')
-  Rectangle get available => new Rectangle(_availLeft, _availTop, _availWidth,
-      _availHeight);
+  Rectangle get available =>
+      new Rectangle(_availLeft, _availTop, _availWidth, _availHeight);
   // To suppress missing implicit constructor warnings.
-  factory Screen._() { throw new UnsupportedError("Not supported"); }
+  factory Screen._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('availHeight')
   @DomName('Screen.availHeight')
@@ -28890,19 +29777,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.
 
-
 @DocsEditable()
 @DomName('ScreenOrientation')
 @Experimental() // untriaged
 @Native("ScreenOrientation")
 class ScreenOrientation extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory ScreenOrientation._() { throw new UnsupportedError("Not supported"); }
+  factory ScreenOrientation._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ScreenOrientation.changeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+  static const EventStreamProvider<Event> changeEvent =
+      const EventStreamProvider<Event>('change');
 
   @DomName('ScreenOrientation.angle')
   @DocsEditable()
@@ -28917,12 +29806,12 @@
   @DomName('ScreenOrientation.lock')
   @DocsEditable()
   @Experimental() // untriaged
-  Future lock(String orientation) native;
+  Future lock(String orientation) native ;
 
   @DomName('ScreenOrientation.unlock')
   @DocsEditable()
   @Experimental() // untriaged
-  void unlock() native;
+  void unlock() native ;
 
   @DomName('ScreenOrientation.onchange')
   @DocsEditable()
@@ -28933,13 +29822,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.
 
-
 @DocsEditable()
 @DomName('HTMLScriptElement')
 @Native("HTMLScriptElement")
 class ScriptElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory ScriptElement._() { throw new UnsupportedError("Not supported"); }
+  factory ScriptElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLScriptElement.HTMLScriptElement')
   @DocsEditable()
@@ -28992,29 +29882,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.
 
-
 @DocsEditable()
 @DomName('ScrollState')
 @Experimental() // untriaged
 @Native("ScrollState")
 class ScrollState extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ScrollState._() { throw new UnsupportedError("Not supported"); }
+  factory ScrollState._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ScrollState.ScrollState')
   @DocsEditable()
-  factory ScrollState([num deltaX, num deltaY, num deltaGranularity, num velocityX, num velocityY, bool inInertialPhase, bool isBeginning, bool isEnding]) {
+  factory ScrollState(
+      [num deltaX,
+      num deltaY,
+      num deltaGranularity,
+      num velocityX,
+      num velocityY,
+      bool inInertialPhase,
+      bool isBeginning,
+      bool isEnding]) {
     if (isEnding != null) {
-      return ScrollState._create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
+      return ScrollState._create_1(deltaX, deltaY, deltaGranularity, velocityX,
+          velocityY, inInertialPhase, isBeginning, isEnding);
     }
     if (isBeginning != null) {
-      return ScrollState._create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
+      return ScrollState._create_2(deltaX, deltaY, deltaGranularity, velocityX,
+          velocityY, inInertialPhase, isBeginning);
     }
     if (inInertialPhase != null) {
-      return ScrollState._create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
+      return ScrollState._create_3(deltaX, deltaY, deltaGranularity, velocityX,
+          velocityY, inInertialPhase);
     }
     if (velocityY != null) {
-      return ScrollState._create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
+      return ScrollState._create_4(
+          deltaX, deltaY, deltaGranularity, velocityX, velocityY);
     }
     if (velocityX != null) {
       return ScrollState._create_5(deltaX, deltaY, deltaGranularity, velocityX);
@@ -29030,14 +29933,44 @@
     }
     return ScrollState._create_9();
   }
-  static ScrollState _create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding) => JS('ScrollState', 'new ScrollState(#,#,#,#,#,#,#,#)', deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
-  static ScrollState _create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning) => JS('ScrollState', 'new ScrollState(#,#,#,#,#,#,#)', deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
-  static ScrollState _create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase) => JS('ScrollState', 'new ScrollState(#,#,#,#,#,#)', deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
-  static ScrollState _create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY) => JS('ScrollState', 'new ScrollState(#,#,#,#,#)', deltaX, deltaY, deltaGranularity, velocityX, velocityY);
-  static ScrollState _create_5(deltaX, deltaY, deltaGranularity, velocityX) => JS('ScrollState', 'new ScrollState(#,#,#,#)', deltaX, deltaY, deltaGranularity, velocityX);
-  static ScrollState _create_6(deltaX, deltaY, deltaGranularity) => JS('ScrollState', 'new ScrollState(#,#,#)', deltaX, deltaY, deltaGranularity);
-  static ScrollState _create_7(deltaX, deltaY) => JS('ScrollState', 'new ScrollState(#,#)', deltaX, deltaY);
-  static ScrollState _create_8(deltaX) => JS('ScrollState', 'new ScrollState(#)', deltaX);
+  static ScrollState _create_1(deltaX, deltaY, deltaGranularity, velocityX,
+          velocityY, inInertialPhase, isBeginning, isEnding) =>
+      JS(
+          'ScrollState',
+          'new ScrollState(#,#,#,#,#,#,#,#)',
+          deltaX,
+          deltaY,
+          deltaGranularity,
+          velocityX,
+          velocityY,
+          inInertialPhase,
+          isBeginning,
+          isEnding);
+  static ScrollState _create_2(deltaX, deltaY, deltaGranularity, velocityX,
+          velocityY, inInertialPhase, isBeginning) =>
+      JS('ScrollState', 'new ScrollState(#,#,#,#,#,#,#)', deltaX, deltaY,
+          deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
+  static ScrollState _create_3(deltaX, deltaY, deltaGranularity, velocityX,
+          velocityY, inInertialPhase) =>
+      JS('ScrollState', 'new ScrollState(#,#,#,#,#,#)', deltaX, deltaY,
+          deltaGranularity, velocityX, velocityY, inInertialPhase);
+  static ScrollState _create_4(
+          deltaX, deltaY, deltaGranularity, velocityX, velocityY) =>
+      JS('ScrollState', 'new ScrollState(#,#,#,#,#)', deltaX, deltaY,
+          deltaGranularity, velocityX, velocityY);
+  static ScrollState _create_5(deltaX, deltaY, deltaGranularity, velocityX) =>
+      JS('ScrollState', 'new ScrollState(#,#,#,#)', deltaX, deltaY,
+          deltaGranularity, velocityX);
+  static ScrollState _create_6(deltaX, deltaY, deltaGranularity) => JS(
+      'ScrollState',
+      'new ScrollState(#,#,#)',
+      deltaX,
+      deltaY,
+      deltaGranularity);
+  static ScrollState _create_7(deltaX, deltaY) =>
+      JS('ScrollState', 'new ScrollState(#,#)', deltaX, deltaY);
+  static ScrollState _create_8(deltaX) =>
+      JS('ScrollState', 'new ScrollState(#)', deltaX);
   static ScrollState _create_9() => JS('ScrollState', 'new ScrollState()');
 
   @DomName('ScrollState.deltaGranularity')
@@ -29093,13 +30026,12 @@
   @DomName('ScrollState.consumeDelta')
   @DocsEditable()
   @Experimental() // untriaged
-  void consumeDelta(num x, num y) native;
+  void consumeDelta(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.
 
-
 @DocsEditable()
 @DomName('SecurityPolicyViolationEvent')
 // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#securitypolicyviolationevent-events
@@ -29107,7 +30039,9 @@
 @Native("SecurityPolicyViolationEvent")
 class SecurityPolicyViolationEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory SecurityPolicyViolationEvent._() { throw new UnsupportedError("Not supported"); }
+  factory SecurityPolicyViolationEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SecurityPolicyViolationEvent.SecurityPolicyViolationEvent')
   @DocsEditable()
@@ -29118,8 +30052,15 @@
     }
     return SecurityPolicyViolationEvent._create_2(type);
   }
-  static SecurityPolicyViolationEvent _create_1(type, eventInitDict) => JS('SecurityPolicyViolationEvent', 'new SecurityPolicyViolationEvent(#,#)', type, eventInitDict);
-  static SecurityPolicyViolationEvent _create_2(type) => JS('SecurityPolicyViolationEvent', 'new SecurityPolicyViolationEvent(#)', type);
+  static SecurityPolicyViolationEvent _create_1(type, eventInitDict) => JS(
+      'SecurityPolicyViolationEvent',
+      'new SecurityPolicyViolationEvent(#,#)',
+      type,
+      eventInitDict);
+  static SecurityPolicyViolationEvent _create_2(type) => JS(
+      'SecurityPolicyViolationEvent',
+      'new SecurityPolicyViolationEvent(#)',
+      type);
 
   @JSName('blockedURI')
   @DomName('SecurityPolicyViolationEvent.blockedURI')
@@ -29168,12 +30109,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.
 
-
 @DomName('HTMLSelectElement')
 @Native("HTMLSelectElement")
 class SelectElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory SelectElement._() { throw new UnsupportedError("Not supported"); }
+  factory SelectElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLSelectElement.HTMLSelectElement')
   @DocsEditable()
@@ -29250,34 +30192,33 @@
 
   @DomName('HTMLSelectElement.__setter__')
   @DocsEditable()
-  void __setter__(int index, OptionElement option) native;
+  void __setter__(int index, OptionElement option) native ;
 
   @DomName('HTMLSelectElement.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(Object element, Object before) native;
+  void add(Object element, Object before) native ;
 
   @DomName('HTMLSelectElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native;
+  bool checkValidity() native ;
 
   @DomName('HTMLSelectElement.item')
   @DocsEditable()
-  Element item(int index) native;
+  Element item(int index) native ;
 
   @DomName('HTMLSelectElement.namedItem')
   @DocsEditable()
-  OptionElement namedItem(String name) native;
+  OptionElement namedItem(String name) native ;
 
   @DomName('HTMLSelectElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() native;
+  bool reportValidity() native ;
 
   @DomName('HTMLSelectElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) native;
-
+  void setCustomValidity(String error) native ;
 
   // Override default options, since IE returns SelectElement itself and it
   // does not operate as a List.
@@ -29300,13 +30241,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.
 
-
 @DocsEditable()
 @DomName('Selection')
 @Native("Selection")
 class Selection extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Selection._() { throw new UnsupportedError("Not supported"); }
+  factory Selection._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Selection.anchorNode')
   @DocsEditable()
@@ -29359,77 +30301,79 @@
 
   @DomName('Selection.addRange')
   @DocsEditable()
-  void addRange(Range range) native;
+  void addRange(Range range) native ;
 
   @DomName('Selection.collapse')
   @DocsEditable()
-  void collapse(Node node, [int offset]) native;
+  void collapse(Node node, [int offset]) native ;
 
   @DomName('Selection.collapseToEnd')
   @DocsEditable()
-  void collapseToEnd() native;
+  void collapseToEnd() native ;
 
   @DomName('Selection.collapseToStart')
   @DocsEditable()
-  void collapseToStart() native;
+  void collapseToStart() native ;
 
   @DomName('Selection.containsNode')
   @DocsEditable()
   @Experimental() // non-standard
-  bool containsNode(Node node, bool allowPartialContainment) native;
+  bool containsNode(Node node, bool allowPartialContainment) native ;
 
   @DomName('Selection.deleteFromDocument')
   @DocsEditable()
-  void deleteFromDocument() native;
+  void deleteFromDocument() native ;
 
   @DomName('Selection.empty')
   @DocsEditable()
   @Experimental() // non-standard
-  void empty() native;
+  void empty() native ;
 
   @DomName('Selection.extend')
   @DocsEditable()
-  void extend(Node node, [int offset]) native;
+  void extend(Node node, [int offset]) native ;
 
   @DomName('Selection.getRangeAt')
   @DocsEditable()
-  Range getRangeAt(int index) native;
+  Range getRangeAt(int index) native ;
 
   @DomName('Selection.modify')
   @DocsEditable()
   @Experimental() // non-standard
-  void modify(String alter, String direction, String granularity) native;
+  void modify(String alter, String direction, String granularity) native ;
 
   @DomName('Selection.removeAllRanges')
   @DocsEditable()
-  void removeAllRanges() native;
+  void removeAllRanges() native ;
 
   @DomName('Selection.selectAllChildren')
   @DocsEditable()
-  void selectAllChildren(Node node) native;
+  void selectAllChildren(Node node) native ;
 
   @DomName('Selection.setBaseAndExtent')
   @DocsEditable()
   @Experimental() // non-standard
-  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native;
+  void setBaseAndExtent(
+      Node baseNode, int baseOffset, Node extentNode, int extentOffset) native ;
 
   @DomName('Selection.setPosition')
   @DocsEditable()
   @Experimental() // non-standard
-  void setPosition(Node node, [int offset]) native;
+  void setPosition(Node node, [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.
 
-
 @DocsEditable()
 @DomName('ServicePort')
 @Experimental() // untriaged
 @Native("ServicePort")
 class ServicePort extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ServicePort._() { throw new UnsupportedError("Not supported"); }
+  factory ServicePort._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ServicePort.data')
   @DocsEditable()
@@ -29450,12 +30394,13 @@
   @DomName('ServicePort.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() native;
+  void close() native ;
 
   @DomName('ServicePort.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
+  void postMessage(/*SerializedScriptValue*/ message,
+      [List<MessagePort> transfer]) {
     if (transfer != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
       _postMessage_1(message_1, transfer);
@@ -29465,34 +30410,37 @@
     _postMessage_2(message_1);
     return;
   }
+
   @JSName('postMessage')
   @DomName('ServicePort.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_1(message, List<MessagePort> transfer) native;
+  void _postMessage_1(message, List<MessagePort> transfer) native ;
   @JSName('postMessage')
   @DomName('ServicePort.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void _postMessage_2(message) native;
+  void _postMessage_2(message) 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.
 
-
 @DocsEditable()
 @DomName('ServicePortCollection')
 @Experimental() // untriaged
 @Native("ServicePortCollection")
 class ServicePortCollection extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory ServicePortCollection._() { throw new UnsupportedError("Not supported"); }
+  factory ServicePortCollection._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ServicePortCollection.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   @DomName('ServicePortCollection.connect')
   @DocsEditable()
@@ -29504,16 +30452,17 @@
     }
     return _connect_2(url);
   }
+
   @JSName('connect')
   @DomName('ServicePortCollection.connect')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _connect_1(url, options) native;
+  Future _connect_1(url, options) native ;
   @JSName('connect')
   @DomName('ServicePortCollection.connect')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _connect_2(url) native;
+  Future _connect_2(url) native ;
 
   @DomName('ServicePortCollection.match')
   @DocsEditable()
@@ -29522,11 +30471,12 @@
     var options_1 = convertDartToNative_Dictionary(options);
     return _match_1(options_1);
   }
+
   @JSName('match')
   @DomName('ServicePortCollection.match')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _match_1(options) native;
+  Future _match_1(options) native ;
 
   @DomName('ServicePortCollection.matchAll')
   @DocsEditable()
@@ -29538,16 +30488,17 @@
     }
     return _matchAll_2();
   }
+
   @JSName('matchAll')
   @DomName('ServicePortCollection.matchAll')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _matchAll_1(options) native;
+  Future _matchAll_1(options) native ;
   @JSName('matchAll')
   @DomName('ServicePortCollection.matchAll')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _matchAll_2() native;
+  Future _matchAll_2() native ;
 
   @DomName('ServicePortCollection.onmessage')
   @DocsEditable()
@@ -29558,14 +30509,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.
 
-
 @DocsEditable()
 @DomName('ServicePortConnectEvent')
 @Experimental() // untriaged
 @Native("ServicePortConnectEvent")
 class ServicePortConnectEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
-  factory ServicePortConnectEvent._() { throw new UnsupportedError("Not supported"); }
+  factory ServicePortConnectEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ServicePortConnectEvent.ServicePortConnectEvent')
   @DocsEditable()
@@ -29576,8 +30528,13 @@
     }
     return ServicePortConnectEvent._create_2(type);
   }
-  static ServicePortConnectEvent _create_1(type, eventInitDict) => JS('ServicePortConnectEvent', 'new ServicePortConnectEvent(#,#)', type, eventInitDict);
-  static ServicePortConnectEvent _create_2(type) => JS('ServicePortConnectEvent', 'new ServicePortConnectEvent(#)', type);
+  static ServicePortConnectEvent _create_1(type, eventInitDict) => JS(
+      'ServicePortConnectEvent',
+      'new ServicePortConnectEvent(#,#)',
+      type,
+      eventInitDict);
+  static ServicePortConnectEvent _create_2(type) =>
+      JS('ServicePortConnectEvent', 'new ServicePortConnectEvent(#)', type);
 
   @DomName('ServicePortConnectEvent.origin')
   @DocsEditable()
@@ -29593,25 +30550,27 @@
   @DomName('ServicePortConnectEvent.respondWith')
   @DocsEditable()
   @Experimental() // untriaged
-  Future respondWith(Future response) native;
+  Future respondWith(Future response) 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.
 
-
 @DocsEditable()
 @DomName('ServiceWorkerContainer')
 @Experimental() // untriaged
 @Native("ServiceWorkerContainer")
 class ServiceWorkerContainer extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory ServiceWorkerContainer._() { throw new UnsupportedError("Not supported"); }
+  factory ServiceWorkerContainer._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ServiceWorkerContainer.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   @DomName('ServiceWorkerContainer.controller')
   @DocsEditable()
@@ -29626,12 +30585,12 @@
   @DomName('ServiceWorkerContainer.getRegistration')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistration([String documentURL]) native;
+  Future getRegistration([String documentURL]) native ;
 
   @DomName('ServiceWorkerContainer.getRegistrations')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistrations() native;
+  Future getRegistrations() native ;
 
   @DomName('ServiceWorkerContainer.register')
   @DocsEditable()
@@ -29643,16 +30602,17 @@
     }
     return _register_2(url);
   }
+
   @JSName('register')
   @DomName('ServiceWorkerContainer.register')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _register_1(url, options) native;
+  Future _register_1(url, options) native ;
   @JSName('register')
   @DomName('ServiceWorkerContainer.register')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _register_2(url) native;
+  Future _register_2(url) native ;
 
   @DomName('ServiceWorkerContainer.onmessage')
   @DocsEditable()
@@ -29663,19 +30623,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.
 
-
 @DocsEditable()
 @DomName('ServiceWorkerGlobalScope')
 @Experimental() // untriaged
 @Native("ServiceWorkerGlobalScope")
 class ServiceWorkerGlobalScope extends WorkerGlobalScope {
   // To suppress missing implicit constructor warnings.
-  factory ServiceWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+  factory ServiceWorkerGlobalScope._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ServiceWorkerGlobalScope.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   @DomName('ServiceWorkerGlobalScope.clients')
   @DocsEditable()
@@ -29695,7 +30657,7 @@
   @DomName('ServiceWorkerGlobalScope.skipWaiting')
   @DocsEditable()
   @Experimental() // untriaged
-  Future skipWaiting() native;
+  Future skipWaiting() native ;
 
   @DomName('ServiceWorkerGlobalScope.onmessage')
   @DocsEditable()
@@ -29708,14 +30670,12 @@
 
 // WARNING: Do not edit - generated code.
 
-
 // TODO(alanknight): Provide a nicer constructor that uses named parameters
 // rather than an initialization map.
 @DomName('ServiceWorkerMessageEvent')
 @Experimental() // untriaged
 @Native("ServiceWorkerMessageEvent")
 class ServiceWorkerMessageEvent extends Event {
-
   // TODO(alanknight): This really should be generated by the
   // _OutputConversion in the systemnative.py script, but that doesn't
   // use those conversions right now, so do this as a one-off.
@@ -29731,7 +30691,9 @@
   final dynamic _get_data;
 
   // To suppress missing implicit constructor warnings.
-  factory ServiceWorkerMessageEvent._() { throw new UnsupportedError("Not supported"); }
+  factory ServiceWorkerMessageEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ServiceWorkerMessageEvent.ServiceWorkerMessageEvent')
   @DocsEditable()
@@ -29742,8 +30704,13 @@
     }
     return ServiceWorkerMessageEvent._create_2(type);
   }
-  static ServiceWorkerMessageEvent _create_1(type, eventInitDict) => JS('ServiceWorkerMessageEvent', 'new ServiceWorkerMessageEvent(#,#)', type, eventInitDict);
-  static ServiceWorkerMessageEvent _create_2(type) => JS('ServiceWorkerMessageEvent', 'new ServiceWorkerMessageEvent(#)', type);
+  static ServiceWorkerMessageEvent _create_1(type, eventInitDict) => JS(
+      'ServiceWorkerMessageEvent',
+      'new ServiceWorkerMessageEvent(#,#)',
+      type,
+      eventInitDict);
+  static ServiceWorkerMessageEvent _create_2(type) =>
+      JS('ServiceWorkerMessageEvent', 'new ServiceWorkerMessageEvent(#)', type);
 
   @DomName('ServiceWorkerMessageEvent.lastEventId')
   @DocsEditable()
@@ -29766,20 +30733,20 @@
   @Creates('Null')
   @Returns('_ServiceWorker|MessagePort')
   final Object 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.
 
-
 @DocsEditable()
 @DomName('ServiceWorkerRegistration')
 @Experimental() // untriaged
 @Native("ServiceWorkerRegistration")
 class ServiceWorkerRegistration extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory ServiceWorkerRegistration._() { throw new UnsupportedError("Not supported"); }
+  factory ServiceWorkerRegistration._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ServiceWorkerRegistration.active')
   @DocsEditable()
@@ -29831,16 +30798,17 @@
     }
     return _getNotifications_2();
   }
+
   @JSName('getNotifications')
   @DomName('ServiceWorkerRegistration.getNotifications')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _getNotifications_1(filter) native;
+  Future _getNotifications_1(filter) native ;
   @JSName('getNotifications')
   @DomName('ServiceWorkerRegistration.getNotifications')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _getNotifications_2() native;
+  Future _getNotifications_2() native ;
 
   @DomName('ServiceWorkerRegistration.showNotification')
   @DocsEditable()
@@ -29852,32 +30820,32 @@
     }
     return _showNotification_2(title);
   }
+
   @JSName('showNotification')
   @DomName('ServiceWorkerRegistration.showNotification')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _showNotification_1(title, options) native;
+  Future _showNotification_1(title, options) native ;
   @JSName('showNotification')
   @DomName('ServiceWorkerRegistration.showNotification')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _showNotification_2(title) native;
+  Future _showNotification_2(title) native ;
 
   @DomName('ServiceWorkerRegistration.unregister')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregister() native;
+  Future unregister() native ;
 
   @DomName('ServiceWorkerRegistration.update')
   @DocsEditable()
   @Experimental() // untriaged
-  void update() native;
+  void update() 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.
 
-
 @DocsEditable()
 @DomName('HTMLShadowElement')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
@@ -29886,7 +30854,9 @@
 @Native("HTMLShadowElement")
 class ShadowElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory ShadowElement._() { throw new UnsupportedError("Not supported"); }
+  factory ShadowElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLShadowElement.HTMLShadowElement')
   @DocsEditable()
@@ -29906,7 +30876,7 @@
   @Experimental() // untriaged
   @Returns('NodeList')
   @Creates('NodeList')
-  List<Node> getDistributedNodes() native;
+  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
@@ -29914,7 +30884,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('ShadowRoot')
 @SupportedBrowser(SupportedBrowser.CHROME, '26')
 @Experimental()
@@ -29922,7 +30891,9 @@
 @Native("ShadowRoot")
 class ShadowRoot extends DocumentFragment {
   // To suppress missing implicit constructor warnings.
-  factory ShadowRoot._() { throw new UnsupportedError("Not supported"); }
+  factory ShadowRoot._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ShadowRoot.activeElement')
   @DocsEditable()
@@ -29958,24 +30929,25 @@
   @JSName('cloneNode')
   @DomName('ShadowRoot.cloneNode')
   @DocsEditable()
-  Node clone(bool deep) native;
+  Node clone(bool deep) native ;
 
   @DomName('ShadowRoot.elementFromPoint')
   @DocsEditable()
-  Element elementFromPoint(int x, int y) native;
+  Element elementFromPoint(int x, int y) native ;
 
   @DomName('ShadowRoot.elementsFromPoint')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Element> elementsFromPoint(int x, int y) native;
+  List<Element> elementsFromPoint(int x, int y) native ;
 
   @DomName('ShadowRoot.getSelection')
   @DocsEditable()
-  Selection getSelection() native;
+  Selection getSelection() native ;
 
-  static bool get supported =>
-      JS('bool', '!!(Element.prototype.createShadowRoot||'
-                 'Element.prototype.webkitCreateShadowRoot)');
+  static bool get supported => JS(
+      'bool',
+      '!!(Element.prototype.createShadowRoot||'
+      'Element.prototype.webkitCreateShadowRoot)');
 
   static bool _shadowRootDeprecationReported = false;
   static void _shadowRootDeprecationReport() {
@@ -30016,14 +30988,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.
 
-
 @DocsEditable()
 @DomName('SharedArrayBuffer')
 @Experimental() // untriaged
 @Native("SharedArrayBuffer")
 class SharedArrayBuffer extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory SharedArrayBuffer._() { throw new UnsupportedError("Not supported"); }
+  factory SharedArrayBuffer._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SharedArrayBuffer.byteLength')
   @DocsEditable()
@@ -30034,7 +31007,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.
 
-
 @DocsEditable()
 @DomName('SharedWorker')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworker-interface
@@ -30042,12 +31014,15 @@
 @Native("SharedWorker")
 class SharedWorker extends EventTarget implements AbstractWorker {
   // To suppress missing implicit constructor warnings.
-  factory SharedWorker._() { throw new UnsupportedError("Not supported"); }
+  factory SharedWorker._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SharedWorker.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   @DomName('SharedWorker.SharedWorker')
   @DocsEditable()
@@ -30057,8 +31032,10 @@
     }
     return SharedWorker._create_2(scriptURL);
   }
-  static SharedWorker _create_1(scriptURL, name) => JS('SharedWorker', 'new SharedWorker(#,#)', scriptURL, name);
-  static SharedWorker _create_2(scriptURL) => JS('SharedWorker', 'new SharedWorker(#)', scriptURL);
+  static SharedWorker _create_1(scriptURL, name) =>
+      JS('SharedWorker', 'new SharedWorker(#,#)', scriptURL, name);
+  static SharedWorker _create_2(scriptURL) =>
+      JS('SharedWorker', 'new SharedWorker(#)', scriptURL);
 
   @DomName('SharedWorker.port')
   @DocsEditable()
@@ -30078,14 +31055,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.
 
-
 @DocsEditable()
 @DomName('SharedWorkerGlobalScope')
 @Experimental() // untriaged
 @Native("SharedWorkerGlobalScope")
 class SharedWorkerGlobalScope extends WorkerGlobalScope {
   // To suppress missing implicit constructor warnings.
-  factory SharedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+  factory SharedWorkerGlobalScope._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `connect` events to event
@@ -30096,7 +31074,8 @@
   @DomName('SharedWorkerGlobalScope.connectEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> connectEvent = const EventStreamProvider<Event>('connect');
+  static const EventStreamProvider<Event> connectEvent =
+      const EventStreamProvider<Event>('connect');
 
   @DomName('SharedWorkerGlobalScope.name')
   @DocsEditable()
@@ -30113,7 +31092,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.
 
-
 @DocsEditable()
 @DomName('SourceBuffer')
 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebuffer
@@ -30121,7 +31099,9 @@
 @Native("SourceBuffer")
 class SourceBuffer extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory SourceBuffer._() { throw new UnsupportedError("Not supported"); }
+  factory SourceBuffer._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
@@ -30158,60 +31138,62 @@
 
   @DomName('SourceBuffer.abort')
   @DocsEditable()
-  void abort() native;
+  void abort() native ;
 
   @DomName('SourceBuffer.appendBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendBuffer(ByteBuffer data) native;
+  void appendBuffer(ByteBuffer data) native ;
 
   @DomName('SourceBuffer.appendStream')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendStream(FileStream stream, [int maxSize]) native;
+  void appendStream(FileStream stream, [int maxSize]) native ;
 
   @JSName('appendBuffer')
   @DomName('SourceBuffer.appendBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendTypedData(TypedData data) native;
+  void appendTypedData(TypedData data) native ;
 
   @DomName('SourceBuffer.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(num start, num end) native;
+  void remove(num start, num 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.
 
-
 @DocsEditable()
 @DomName('SourceBufferList')
 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebufferlist
 @Experimental()
 @Native("SourceBufferList")
-class SourceBufferList extends EventTarget with ListMixin<SourceBuffer>, ImmutableListMixin<SourceBuffer> implements JavaScriptIndexingBehavior, List<SourceBuffer> {
+class SourceBufferList extends EventTarget
+    with ListMixin<SourceBuffer>, ImmutableListMixin<SourceBuffer>
+    implements JavaScriptIndexingBehavior, List<SourceBuffer> {
   // To suppress missing implicit constructor warnings.
-  factory SourceBufferList._() { throw new UnsupportedError("Not supported"); }
+  factory SourceBufferList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SourceBufferList.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  SourceBuffer operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  SourceBuffer operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("SourceBuffer", "#[#]", this, index);
   }
-  void operator[]=(int index, SourceBuffer value) {
+
+  void operator []=(int index, SourceBuffer value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<SourceBuffer> mixins.
   // SourceBuffer is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -30245,19 +31227,20 @@
 
   @DomName('SourceBufferList.item')
   @DocsEditable()
-  SourceBuffer item(int index) native;
+  SourceBuffer 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.
 
-
 @DocsEditable()
 @DomName('HTMLSourceElement')
 @Native("HTMLSourceElement")
 class SourceElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory SourceElement._() { throw new UnsupportedError("Not supported"); }
+  factory SourceElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLSourceElement.HTMLSourceElement')
   @DocsEditable()
@@ -30295,14 +31278,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.
 
-
 @DocsEditable()
 @DomName('SourceInfo')
 @Experimental() // untriaged
 @Native("SourceInfo")
 class SourceInfo extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory SourceInfo._() { throw new UnsupportedError("Not supported"); }
+  factory SourceInfo._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SourceInfo.facing')
   @DocsEditable()
@@ -30328,13 +31312,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.
 
-
 @DocsEditable()
 @DomName('HTMLSpanElement')
 @Native("HTMLSpanElement")
 class SpanElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory SpanElement._() { throw new UnsupportedError("Not supported"); }
+  factory SpanElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLSpanElement.HTMLSpanElement')
   @DocsEditable()
@@ -30350,7 +31335,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.
 
-
 @DocsEditable()
 @DomName('SpeechGrammar')
 // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#dfn-speechgrammar
@@ -30358,14 +31342,17 @@
 @Native("SpeechGrammar")
 class SpeechGrammar extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory SpeechGrammar._() { throw new UnsupportedError("Not supported"); }
+  factory SpeechGrammar._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SpeechGrammar.SpeechGrammar')
   @DocsEditable()
   factory SpeechGrammar() {
     return SpeechGrammar._create_1();
   }
-  static SpeechGrammar _create_1() => JS('SpeechGrammar', 'new SpeechGrammar()');
+  static SpeechGrammar _create_1() =>
+      JS('SpeechGrammar', 'new SpeechGrammar()');
 
   @DomName('SpeechGrammar.src')
   @DocsEditable()
@@ -30379,40 +31366,43 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('SpeechGrammarList')
 // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#dfn-speechgrammarlist
 @Experimental()
 @Native("SpeechGrammarList")
-class SpeechGrammarList extends Interceptor with ListMixin<SpeechGrammar>, ImmutableListMixin<SpeechGrammar> implements JavaScriptIndexingBehavior, List<SpeechGrammar> {
+class SpeechGrammarList extends Interceptor
+    with ListMixin<SpeechGrammar>, ImmutableListMixin<SpeechGrammar>
+    implements JavaScriptIndexingBehavior, List<SpeechGrammar> {
   // To suppress missing implicit constructor warnings.
-  factory SpeechGrammarList._() { throw new UnsupportedError("Not supported"); }
+  factory SpeechGrammarList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SpeechGrammarList.SpeechGrammarList')
   @DocsEditable()
   factory SpeechGrammarList() {
     return SpeechGrammarList._create_1();
   }
-  static SpeechGrammarList _create_1() => JS('SpeechGrammarList', 'new SpeechGrammarList()');
+  static SpeechGrammarList _create_1() =>
+      JS('SpeechGrammarList', 'new SpeechGrammarList()');
 
   @DomName('SpeechGrammarList.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  SpeechGrammar operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  SpeechGrammar operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("SpeechGrammar", "#[#]", this, index);
   }
-  void operator[]=(int index, SpeechGrammar value) {
+
+  void operator []=(int index, SpeechGrammar value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<SpeechGrammar> mixins.
   // SpeechGrammar is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -30446,21 +31436,20 @@
 
   @DomName('SpeechGrammarList.addFromString')
   @DocsEditable()
-  void addFromString(String string, [num weight]) native;
+  void addFromString(String string, [num weight]) native ;
 
   @DomName('SpeechGrammarList.addFromUri')
   @DocsEditable()
-  void addFromUri(String src, [num weight]) native;
+  void addFromUri(String src, [num weight]) native ;
 
   @DomName('SpeechGrammarList.item')
   @DocsEditable()
-  SpeechGrammar item(int index) native;
+  SpeechGrammar item(int index) native ;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for 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('SpeechRecognition')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Experimental()
@@ -30468,7 +31457,9 @@
 @Native("SpeechRecognition")
 class SpeechRecognition extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory SpeechRecognition._() { throw new UnsupportedError("Not supported"); }
+  factory SpeechRecognition._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `audioend` events to event
@@ -30478,7 +31469,8 @@
    */
   @DomName('SpeechRecognition.audioendEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> audioEndEvent = const EventStreamProvider<Event>('audioend');
+  static const EventStreamProvider<Event> audioEndEvent =
+      const EventStreamProvider<Event>('audioend');
 
   /**
    * Static factory designed to expose `audiostart` events to event
@@ -30488,7 +31480,8 @@
    */
   @DomName('SpeechRecognition.audiostartEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> audioStartEvent = const EventStreamProvider<Event>('audiostart');
+  static const EventStreamProvider<Event> audioStartEvent =
+      const EventStreamProvider<Event>('audiostart');
 
   /**
    * Static factory designed to expose `end` events to event
@@ -30498,7 +31491,8 @@
    */
   @DomName('SpeechRecognition.endEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> endEvent = const EventStreamProvider<Event>('end');
+  static const EventStreamProvider<Event> endEvent =
+      const EventStreamProvider<Event>('end');
 
   /**
    * Static factory designed to expose `error` events to event
@@ -30508,7 +31502,8 @@
    */
   @DomName('SpeechRecognition.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<SpeechRecognitionError> errorEvent = const EventStreamProvider<SpeechRecognitionError>('error');
+  static const EventStreamProvider<SpeechRecognitionError> errorEvent =
+      const EventStreamProvider<SpeechRecognitionError>('error');
 
   /**
    * Static factory designed to expose `nomatch` events to event
@@ -30518,7 +31513,8 @@
    */
   @DomName('SpeechRecognition.nomatchEvent')
   @DocsEditable()
-  static const EventStreamProvider<SpeechRecognitionEvent> noMatchEvent = const EventStreamProvider<SpeechRecognitionEvent>('nomatch');
+  static const EventStreamProvider<SpeechRecognitionEvent> noMatchEvent =
+      const EventStreamProvider<SpeechRecognitionEvent>('nomatch');
 
   /**
    * Static factory designed to expose `result` events to event
@@ -30528,7 +31524,8 @@
    */
   @DomName('SpeechRecognition.resultEvent')
   @DocsEditable()
-  static const EventStreamProvider<SpeechRecognitionEvent> resultEvent = const EventStreamProvider<SpeechRecognitionEvent>('result');
+  static const EventStreamProvider<SpeechRecognitionEvent> resultEvent =
+      const EventStreamProvider<SpeechRecognitionEvent>('result');
 
   /**
    * Static factory designed to expose `soundend` events to event
@@ -30538,7 +31535,8 @@
    */
   @DomName('SpeechRecognition.soundendEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> soundEndEvent = const EventStreamProvider<Event>('soundend');
+  static const EventStreamProvider<Event> soundEndEvent =
+      const EventStreamProvider<Event>('soundend');
 
   /**
    * Static factory designed to expose `soundstart` events to event
@@ -30548,7 +31546,8 @@
    */
   @DomName('SpeechRecognition.soundstartEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> soundStartEvent = const EventStreamProvider<Event>('soundstart');
+  static const EventStreamProvider<Event> soundStartEvent =
+      const EventStreamProvider<Event>('soundstart');
 
   /**
    * Static factory designed to expose `speechend` events to event
@@ -30558,7 +31557,8 @@
    */
   @DomName('SpeechRecognition.speechendEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> speechEndEvent = const EventStreamProvider<Event>('speechend');
+  static const EventStreamProvider<Event> speechEndEvent =
+      const EventStreamProvider<Event>('speechend');
 
   /**
    * Static factory designed to expose `speechstart` events to event
@@ -30568,7 +31568,8 @@
    */
   @DomName('SpeechRecognition.speechstartEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> speechStartEvent = const EventStreamProvider<Event>('speechstart');
+  static const EventStreamProvider<Event> speechStartEvent =
+      const EventStreamProvider<Event>('speechstart');
 
   /**
    * Static factory designed to expose `start` events to event
@@ -30578,10 +31579,12 @@
    */
   @DomName('SpeechRecognition.startEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> startEvent = const EventStreamProvider<Event>('start');
+  static const EventStreamProvider<Event> startEvent =
+      const EventStreamProvider<Event>('start');
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => JS('bool', '!!(window.SpeechRecognition || window.webkitSpeechRecognition)');
+  static bool get supported => JS(
+      'bool', '!!(window.SpeechRecognition || window.webkitSpeechRecognition)');
 
   @DomName('SpeechRecognition.audioTrack')
   @DocsEditable()
@@ -30616,15 +31619,15 @@
 
   @DomName('SpeechRecognition.abort')
   @DocsEditable()
-  void abort() native;
+  void abort() native ;
 
   @DomName('SpeechRecognition.start')
   @DocsEditable()
-  void start() native;
+  void start() native ;
 
   @DomName('SpeechRecognition.stop')
   @DocsEditable()
-  void stop() native;
+  void stop() native ;
 
   /// Stream of `audioend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudioend')
@@ -30690,7 +31693,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.
 
-
 @DocsEditable()
 @DomName('SpeechRecognitionAlternative')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
@@ -30699,7 +31701,9 @@
 @Native("SpeechRecognitionAlternative")
 class SpeechRecognitionAlternative extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory SpeechRecognitionAlternative._() { throw new UnsupportedError("Not supported"); }
+  factory SpeechRecognitionAlternative._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SpeechRecognitionAlternative.confidence')
   @DocsEditable()
@@ -30713,7 +31717,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.
 
-
 @DocsEditable()
 @DomName('SpeechRecognitionError')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
@@ -30722,7 +31725,9 @@
 @Native("SpeechRecognitionError")
 class SpeechRecognitionError extends Event {
   // To suppress missing implicit constructor warnings.
-  factory SpeechRecognitionError._() { throw new UnsupportedError("Not supported"); }
+  factory SpeechRecognitionError._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SpeechRecognitionError.SpeechRecognitionError')
   @DocsEditable()
@@ -30733,8 +31738,13 @@
     }
     return SpeechRecognitionError._create_2(type);
   }
-  static SpeechRecognitionError _create_1(type, initDict) => JS('SpeechRecognitionError', 'new SpeechRecognitionError(#,#)', type, initDict);
-  static SpeechRecognitionError _create_2(type) => JS('SpeechRecognitionError', 'new SpeechRecognitionError(#)', type);
+  static SpeechRecognitionError _create_1(type, initDict) => JS(
+      'SpeechRecognitionError',
+      'new SpeechRecognitionError(#,#)',
+      type,
+      initDict);
+  static SpeechRecognitionError _create_2(type) =>
+      JS('SpeechRecognitionError', 'new SpeechRecognitionError(#)', type);
 
   @DomName('SpeechRecognitionError.error')
   @DocsEditable()
@@ -30748,7 +31758,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.
 
-
 @DocsEditable()
 @DomName('SpeechRecognitionEvent')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
@@ -30757,7 +31766,9 @@
 @Native("SpeechRecognitionEvent")
 class SpeechRecognitionEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory SpeechRecognitionEvent._() { throw new UnsupportedError("Not supported"); }
+  factory SpeechRecognitionEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SpeechRecognitionEvent.SpeechRecognitionEvent')
   @DocsEditable()
@@ -30768,8 +31779,13 @@
     }
     return SpeechRecognitionEvent._create_2(type);
   }
-  static SpeechRecognitionEvent _create_1(type, initDict) => JS('SpeechRecognitionEvent', 'new SpeechRecognitionEvent(#,#)', type, initDict);
-  static SpeechRecognitionEvent _create_2(type) => JS('SpeechRecognitionEvent', 'new SpeechRecognitionEvent(#)', type);
+  static SpeechRecognitionEvent _create_1(type, initDict) => JS(
+      'SpeechRecognitionEvent',
+      'new SpeechRecognitionEvent(#,#)',
+      type,
+      initDict);
+  static SpeechRecognitionEvent _create_2(type) =>
+      JS('SpeechRecognitionEvent', 'new SpeechRecognitionEvent(#)', type);
 
   @DomName('SpeechRecognitionEvent.emma')
   @DocsEditable()
@@ -30793,7 +31809,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.
 
-
 @DocsEditable()
 @DomName('SpeechRecognitionResult')
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
@@ -30802,7 +31817,9 @@
 @Native("SpeechRecognitionResult")
 class SpeechRecognitionResult extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory SpeechRecognitionResult._() { throw new UnsupportedError("Not supported"); }
+  factory SpeechRecognitionResult._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SpeechRecognitionResult.isFinal')
   @DocsEditable()
@@ -30814,13 +31831,12 @@
 
   @DomName('SpeechRecognitionResult.item')
   @DocsEditable()
-  SpeechRecognitionAlternative item(int index) native;
+  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.
 
-
 @DocsEditable()
 @DomName('SpeechSynthesis')
 // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
@@ -30828,7 +31844,9 @@
 @Native("SpeechSynthesis")
 class SpeechSynthesis extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory SpeechSynthesis._() { throw new UnsupportedError("Not supported"); }
+  factory SpeechSynthesis._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SpeechSynthesis.paused')
   @DocsEditable()
@@ -30844,29 +31862,28 @@
 
   @DomName('SpeechSynthesis.cancel')
   @DocsEditable()
-  void cancel() native;
+  void cancel() native ;
 
   @DomName('SpeechSynthesis.getVoices')
   @DocsEditable()
-  List<SpeechSynthesisVoice> getVoices() native;
+  List<SpeechSynthesisVoice> getVoices() native ;
 
   @DomName('SpeechSynthesis.pause')
   @DocsEditable()
-  void pause() native;
+  void pause() native ;
 
   @DomName('SpeechSynthesis.resume')
   @DocsEditable()
-  void resume() native;
+  void resume() native ;
 
   @DomName('SpeechSynthesis.speak')
   @DocsEditable()
-  void speak(SpeechSynthesisUtterance utterance) native;
+  void speak(SpeechSynthesisUtterance utterance) 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.
 
-
 @DocsEditable()
 @DomName('SpeechSynthesisEvent')
 // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
@@ -30874,7 +31891,9 @@
 @Native("SpeechSynthesisEvent")
 class SpeechSynthesisEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory SpeechSynthesisEvent._() { throw new UnsupportedError("Not supported"); }
+  factory SpeechSynthesisEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SpeechSynthesisEvent.charIndex')
   @DocsEditable()
@@ -30897,7 +31916,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.
 
-
 @DocsEditable()
 @DomName('SpeechSynthesisUtterance')
 // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
@@ -30905,7 +31923,9 @@
 @Native("SpeechSynthesisUtterance")
 class SpeechSynthesisUtterance extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory SpeechSynthesisUtterance._() { throw new UnsupportedError("Not supported"); }
+  factory SpeechSynthesisUtterance._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `boundary` events to event
@@ -30915,7 +31935,8 @@
    */
   @DomName('SpeechSynthesisUtterance.boundaryEvent')
   @DocsEditable()
-  static const EventStreamProvider<SpeechSynthesisEvent> boundaryEvent = const EventStreamProvider<SpeechSynthesisEvent>('boundary');
+  static const EventStreamProvider<SpeechSynthesisEvent> boundaryEvent =
+      const EventStreamProvider<SpeechSynthesisEvent>('boundary');
 
   /**
    * Static factory designed to expose `end` events to event
@@ -30925,7 +31946,8 @@
    */
   @DomName('SpeechSynthesisUtterance.endEvent')
   @DocsEditable()
-  static const EventStreamProvider<SpeechSynthesisEvent> endEvent = const EventStreamProvider<SpeechSynthesisEvent>('end');
+  static const EventStreamProvider<SpeechSynthesisEvent> endEvent =
+      const EventStreamProvider<SpeechSynthesisEvent>('end');
 
   /**
    * Static factory designed to expose `error` events to event
@@ -30935,7 +31957,8 @@
    */
   @DomName('SpeechSynthesisUtterance.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /**
    * Static factory designed to expose `mark` events to event
@@ -30945,7 +31968,8 @@
    */
   @DomName('SpeechSynthesisUtterance.markEvent')
   @DocsEditable()
-  static const EventStreamProvider<SpeechSynthesisEvent> markEvent = const EventStreamProvider<SpeechSynthesisEvent>('mark');
+  static const EventStreamProvider<SpeechSynthesisEvent> markEvent =
+      const EventStreamProvider<SpeechSynthesisEvent>('mark');
 
   /**
    * Static factory designed to expose `pause` events to event
@@ -30955,7 +31979,8 @@
    */
   @DomName('SpeechSynthesisUtterance.pauseEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
+  static const EventStreamProvider<Event> pauseEvent =
+      const EventStreamProvider<Event>('pause');
 
   /**
    * Static factory designed to expose `resume` events to event
@@ -30965,7 +31990,8 @@
    */
   @DomName('SpeechSynthesisUtterance.resumeEvent')
   @DocsEditable()
-  static const EventStreamProvider<SpeechSynthesisEvent> resumeEvent = const EventStreamProvider<SpeechSynthesisEvent>('resume');
+  static const EventStreamProvider<SpeechSynthesisEvent> resumeEvent =
+      const EventStreamProvider<SpeechSynthesisEvent>('resume');
 
   /**
    * Static factory designed to expose `start` events to event
@@ -30975,7 +32001,8 @@
    */
   @DomName('SpeechSynthesisUtterance.startEvent')
   @DocsEditable()
-  static const EventStreamProvider<SpeechSynthesisEvent> startEvent = const EventStreamProvider<SpeechSynthesisEvent>('start');
+  static const EventStreamProvider<SpeechSynthesisEvent> startEvent =
+      const EventStreamProvider<SpeechSynthesisEvent>('start');
 
   @DomName('SpeechSynthesisUtterance.SpeechSynthesisUtterance')
   @DocsEditable()
@@ -30985,8 +32012,10 @@
     }
     return SpeechSynthesisUtterance._create_2();
   }
-  static SpeechSynthesisUtterance _create_1(text) => JS('SpeechSynthesisUtterance', 'new SpeechSynthesisUtterance(#)', text);
-  static SpeechSynthesisUtterance _create_2() => JS('SpeechSynthesisUtterance', 'new SpeechSynthesisUtterance()');
+  static SpeechSynthesisUtterance _create_1(text) =>
+      JS('SpeechSynthesisUtterance', 'new SpeechSynthesisUtterance(#)', text);
+  static SpeechSynthesisUtterance _create_2() =>
+      JS('SpeechSynthesisUtterance', 'new SpeechSynthesisUtterance()');
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
@@ -31051,7 +32080,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.
 
-
 @DocsEditable()
 @DomName('SpeechSynthesisVoice')
 // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
@@ -31059,7 +32087,9 @@
 @Native("SpeechSynthesisVoice")
 class SpeechSynthesisVoice extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory SpeechSynthesisVoice._() { throw new UnsupportedError("Not supported"); }
+  factory SpeechSynthesisVoice._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('default')
   @DomName('SpeechSynthesisVoice.default')
@@ -31087,14 +32117,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.
 
-
 @DocsEditable()
 @DomName('StashedMessagePort')
 @Experimental() // untriaged
 @Native("StashedMessagePort")
 class StashedMessagePort extends MessagePort {
   // To suppress missing implicit constructor warnings.
-  factory StashedMessagePort._() { throw new UnsupportedError("Not supported"); }
+  factory StashedMessagePort._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('StashedMessagePort.name')
   @DocsEditable()
@@ -31105,24 +32136,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.
 
-
 @DocsEditable()
 @DomName('StashedPortCollection')
 @Experimental() // untriaged
 @Native("StashedPortCollection")
 class StashedPortCollection extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory StashedPortCollection._() { throw new UnsupportedError("Not supported"); }
+  factory StashedPortCollection._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('StashedPortCollection.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   @DomName('StashedPortCollection.add')
   @DocsEditable()
   @Experimental() // untriaged
-  StashedMessagePort add(String name, MessagePort port) native;
+  StashedMessagePort add(String name, MessagePort port) native ;
 
   @DomName('StashedPortCollection.onmessage')
   @DocsEditable()
@@ -31133,7 +32166,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.
 
-
 /**
  * The type used by the
  * [Window.localStorage] and [Window.sessionStorage] properties.
@@ -31162,11 +32194,11 @@
 @DomName('Storage')
 @Unstable()
 @Native("Storage")
-class Storage extends Interceptor
-    implements Map<String, String> {
-
+class Storage extends Interceptor implements Map<String, String> {
   void addAll(Map<String, String> other) {
-    other.forEach((k, v) { this[k] = v; });
+    other.forEach((k, v) {
+      this[k] = v;
+    });
   }
 
   // TODO(nweiz): update this when maps support lazy iteration
@@ -31176,7 +32208,9 @@
 
   String operator [](Object key) => _getItem(key);
 
-  void operator []=(String key, String value) { _setItem(key, value); }
+  void operator []=(String key, String value) {
+    _setItem(key, value);
+  }
 
   String putIfAbsent(String key, String ifAbsent()) {
     if (!containsKey(key)) this[key] = ifAbsent();
@@ -31218,7 +32252,9 @@
 
   bool get isNotEmpty => !isEmpty;
   // To suppress missing implicit constructor warnings.
-  factory Storage._() { throw new UnsupportedError("Not supported"); }
+  factory Storage._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('length')
   @DomName('Storage.length')
@@ -31227,41 +32263,40 @@
 
   @DomName('Storage.__delete__')
   @DocsEditable()
-  bool __delete__(index_OR_name) native;
+  bool __delete__(index_OR_name) native ;
 
   @DomName('Storage.__getter__')
   @DocsEditable()
-  String __getter__(index_OR_name) native;
+  String __getter__(index_OR_name) native ;
 
   @DomName('Storage.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, String value) native;
+  void __setter__(index_OR_name, String value) native ;
 
   @JSName('clear')
   @DomName('Storage.clear')
   @DocsEditable()
-  void _clear() native;
+  void _clear() native ;
 
   @JSName('getItem')
   @DomName('Storage.getItem')
   @DocsEditable()
-  String _getItem(String key) native;
+  String _getItem(String key) native ;
 
   @JSName('key')
   @DomName('Storage.key')
   @DocsEditable()
-  String _key(int index) native;
+  String _key(int index) native ;
 
   @JSName('removeItem')
   @DomName('Storage.removeItem')
   @DocsEditable()
-  void _removeItem(String key) native;
+  void _removeItem(String key) native ;
 
   @JSName('setItem')
   @DomName('Storage.setItem')
   @DocsEditable()
-  void _setItem(String key, String data) native;
-
+  void _setItem(String key, String 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
@@ -31269,7 +32304,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('StorageErrorCallback')
 // http://www.w3.org/TR/quota-api/#storageerrorcallback-callback
 @Experimental()
@@ -31280,18 +32314,21 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('StorageEvent')
 @Unstable()
 @Native("StorageEvent")
 class StorageEvent extends Event {
   factory StorageEvent(String type,
-    {bool canBubble: false, bool cancelable: false, String key, String oldValue,
-    String newValue, String url, Storage storageArea}) {
-
+      {bool canBubble: false,
+      bool cancelable: false,
+      String key,
+      String oldValue,
+      String newValue,
+      String url,
+      Storage storageArea}) {
     StorageEvent e = document._createEvent("StorageEvent");
-    e._initStorageEvent(type, canBubble, cancelable, key, oldValue,
-        newValue, url, storageArea);
+    e._initStorageEvent(
+        type, canBubble, cancelable, key, oldValue, newValue, url, storageArea);
     return e;
   }
 
@@ -31304,8 +32341,10 @@
     }
     return StorageEvent._create_2(type);
   }
-  static StorageEvent _create_1(type, eventInitDict) => JS('StorageEvent', 'new StorageEvent(#,#)', type, eventInitDict);
-  static StorageEvent _create_2(type) => JS('StorageEvent', 'new StorageEvent(#)', type);
+  static StorageEvent _create_1(type, eventInitDict) =>
+      JS('StorageEvent', 'new StorageEvent(#,#)', type, eventInitDict);
+  static StorageEvent _create_2(type) =>
+      JS('StorageEvent', 'new StorageEvent(#)', type);
 
   @DomName('StorageEvent.key')
   @DocsEditable()
@@ -31330,14 +32369,20 @@
   @JSName('initStorageEvent')
   @DomName('StorageEvent.initStorageEvent')
   @DocsEditable()
-  void _initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) native;
-
+  void _initStorageEvent(
+      String typeArg,
+      bool canBubbleArg,
+      bool cancelableArg,
+      String keyArg,
+      String oldValueArg,
+      String newValueArg,
+      String urlArg,
+      Storage 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.
 
-
 @DocsEditable()
 @DomName('StorageInfo')
 // http://www.w3.org/TR/file-system-api/
@@ -31345,7 +32390,9 @@
 @Native("StorageInfo")
 class StorageInfo extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory StorageInfo._() { throw new UnsupportedError("Not supported"); }
+  factory StorageInfo._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('StorageInfo.quota')
   @DocsEditable()
@@ -31361,7 +32408,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.
 
-
 @DocsEditable()
 @DomName('StorageQuota')
 // http://www.w3.org/TR/quota-api/#idl-def-StorageQuota
@@ -31369,7 +32415,9 @@
 @Native("StorageQuota")
 class StorageQuota extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory StorageQuota._() { throw new UnsupportedError("Not supported"); }
+  factory StorageQuota._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('StorageQuota.supportedTypes')
   @DocsEditable()
@@ -31379,12 +32427,12 @@
   @DomName('StorageQuota.queryInfo')
   @DocsEditable()
   @Experimental() // untriaged
-  Future queryInfo(String type) native;
+  Future queryInfo(String type) native ;
 
   @DomName('StorageQuota.requestPersistentQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requestPersistentQuota(int newQuota) native;
+  Future requestPersistentQuota(int newQuota) 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
@@ -31392,7 +32440,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('StorageQuotaCallback')
 // http://www.w3.org/TR/quota-api/#idl-def-StorageQuotaCallback
 @Experimental()
@@ -31403,18 +32450,17 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('StorageUsageCallback')
 // http://www.w3.org/TR/quota-api/#idl-def-StorageUsageCallback
 @Experimental()
-typedef void StorageUsageCallback(int currentUsageInBytes, int currentQuotaInBytes);
+typedef void StorageUsageCallback(
+    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.
 
-
 @DomName('StringCallback')
 // http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html#the-datatransferitem-interface
 @Experimental()
@@ -31423,13 +32469,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.
 
-
 @DocsEditable()
 @DomName('HTMLStyleElement')
 @Native("HTMLStyleElement")
 class StyleElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory StyleElement._() { throw new UnsupportedError("Not supported"); }
+  factory StyleElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLStyleElement.HTMLStyleElement')
   @DocsEditable()
@@ -31461,7 +32508,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.
 
-
 @DocsEditable()
 @DomName('StyleMedia')
 // http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
@@ -31469,7 +32515,9 @@
 @Native("StyleMedia")
 class StyleMedia extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory StyleMedia._() { throw new UnsupportedError("Not supported"); }
+  factory StyleMedia._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('StyleMedia.type')
   @DocsEditable()
@@ -31477,19 +32525,20 @@
 
   @DomName('StyleMedia.matchMedium')
   @DocsEditable()
-  bool matchMedium(String mediaquery) native;
+  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.
 
-
 @DocsEditable()
 @DomName('StyleSheet')
 @Native("StyleSheet")
 class StyleSheet extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory StyleSheet._() { throw new UnsupportedError("Not supported"); }
+  factory StyleSheet._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('StyleSheet.disabled')
   @DocsEditable()
@@ -31523,14 +32572,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.
 
-
 @DocsEditable()
 @DomName('SyncEvent')
 @Experimental() // untriaged
 @Native("SyncEvent")
 class SyncEvent extends ExtendableEvent {
   // To suppress missing implicit constructor warnings.
-  factory SyncEvent._() { throw new UnsupportedError("Not supported"); }
+  factory SyncEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SyncEvent.SyncEvent')
   @DocsEditable()
@@ -31538,7 +32588,8 @@
     var init_1 = convertDartToNative_Dictionary(init);
     return SyncEvent._create_1(type, init_1);
   }
-  static SyncEvent _create_1(type, init) => JS('SyncEvent', 'new SyncEvent(#,#)', type, init);
+  static SyncEvent _create_1(type, init) =>
+      JS('SyncEvent', 'new SyncEvent(#,#)', type, init);
 
   @DomName('SyncEvent.registration')
   @DocsEditable()
@@ -31549,29 +32600,30 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('SyncManager')
 @Experimental() // untriaged
 @Native("SyncManager")
 class SyncManager extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory SyncManager._() { throw new UnsupportedError("Not supported"); }
+  factory SyncManager._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SyncManager.getRegistration')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistration(String tag) native;
+  Future getRegistration(String tag) native ;
 
   @DomName('SyncManager.getRegistrations')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistrations() native;
+  Future getRegistrations() native ;
 
   @DomName('SyncManager.permissionState')
   @DocsEditable()
   @Experimental() // untriaged
-  Future permissionState() native;
+  Future permissionState() native ;
 
   @DomName('SyncManager.register')
   @DocsEditable()
@@ -31583,29 +32635,31 @@
     }
     return _register_2();
   }
+
   @JSName('register')
   @DomName('SyncManager.register')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _register_1(options) native;
+  Future _register_1(options) native ;
   @JSName('register')
   @DomName('SyncManager.register')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _register_2() native;
+  Future _register_2() 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.
 
-
 @DocsEditable()
 @DomName('SyncRegistration')
 @Experimental() // untriaged
 @Native("SyncRegistration")
 class SyncRegistration extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory SyncRegistration._() { throw new UnsupportedError("Not supported"); }
+  factory SyncRegistration._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SyncRegistration.tag')
   @DocsEditable()
@@ -31615,19 +32669,20 @@
   @DomName('SyncRegistration.unregister')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregister() native;
+  Future unregister() 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.
 
-
 @DocsEditable()
 @DomName('HTMLTableCaptionElement')
 @Native("HTMLTableCaptionElement")
 class TableCaptionElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory TableCaptionElement._() { throw new UnsupportedError("Not supported"); }
+  factory TableCaptionElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLTableCaptionElement.HTMLTableCaptionElement')
   @DocsEditable()
@@ -31643,13 +32698,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.
 
-
 @DocsEditable()
 @DomName('HTMLTableCellElement')
-@Native("HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement")
+@Native(
+    "HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement")
 class TableCellElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory TableCellElement._() { throw new UnsupportedError("Not supported"); }
+  factory TableCellElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLTableCellElement.HTMLTableCellElement')
   @DocsEditable()
@@ -31681,13 +32738,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.
 
-
 @DocsEditable()
 @DomName('HTMLTableColElement')
 @Native("HTMLTableColElement")
 class TableColElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory TableColElement._() { throw new UnsupportedError("Not supported"); }
+  factory TableColElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLTableColElement.HTMLTableColElement')
   @DocsEditable()
@@ -31707,19 +32765,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.
 
-
 @DocsEditable()
 @DomName('HTMLTableElement')
 @Native("HTMLTableElement")
 class TableElement extends HtmlElement {
-
   @DomName('HTMLTableElement.tBodies')
   List<TableSectionElement> get tBodies =>
-  new _WrappedList<TableSectionElement>(_tBodies);
+      new _WrappedList<TableSectionElement>(_tBodies);
 
   @DomName('HTMLTableElement.rows')
-  List<TableRowElement> get rows =>
-      new _WrappedList<TableRowElement>(_rows);
+  List<TableRowElement> get rows => new _WrappedList<TableRowElement>(_rows);
 
   TableRowElement addRow() {
     return insertRow(-1);
@@ -31741,18 +32796,18 @@
   }
 
   @JSName('createTBody')
-  TableSectionElement _nativeCreateTBody() native;
+  TableSectionElement _nativeCreateTBody() native ;
 
   DocumentFragment createFragment(String html,
       {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
     if (Range.supportsCreateContextualFragment) {
-      return super.createFragment(
-          html, validator: validator, treeSanitizer: treeSanitizer);
+      return super.createFragment(html,
+          validator: validator, treeSanitizer: treeSanitizer);
     }
     // IE9 workaround which does not support innerHTML on Table elements.
     var contextualHtml = '<table>$html</table>';
-    var table = new Element.html(contextualHtml, validator: validator,
-        treeSanitizer: treeSanitizer);
+    var table = new Element.html(contextualHtml,
+        validator: validator, treeSanitizer: treeSanitizer);
     var fragment = new DocumentFragment();
     fragment.nodes.addAll(table.nodes);
 
@@ -31760,7 +32815,9 @@
   }
 
   // To suppress missing implicit constructor warnings.
-  factory TableElement._() { throw new UnsupportedError("Not supported"); }
+  factory TableElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLTableElement.HTMLTableElement')
   @DocsEditable()
@@ -31801,49 +32858,47 @@
   @JSName('createCaption')
   @DomName('HTMLTableElement.createCaption')
   @DocsEditable()
-  HtmlElement _createCaption() native;
+  HtmlElement _createCaption() native ;
 
   @JSName('createTFoot')
   @DomName('HTMLTableElement.createTFoot')
   @DocsEditable()
-  HtmlElement _createTFoot() native;
+  HtmlElement _createTFoot() native ;
 
   @JSName('createTHead')
   @DomName('HTMLTableElement.createTHead')
   @DocsEditable()
-  HtmlElement _createTHead() native;
+  HtmlElement _createTHead() native ;
 
   @DomName('HTMLTableElement.deleteCaption')
   @DocsEditable()
-  void deleteCaption() native;
+  void deleteCaption() native ;
 
   @DomName('HTMLTableElement.deleteRow')
   @DocsEditable()
-  void deleteRow(int index) native;
+  void deleteRow(int index) native ;
 
   @DomName('HTMLTableElement.deleteTFoot')
   @DocsEditable()
-  void deleteTFoot() native;
+  void deleteTFoot() native ;
 
   @DomName('HTMLTableElement.deleteTHead')
   @DocsEditable()
-  void deleteTHead() native;
+  void deleteTHead() native ;
 
   @JSName('insertRow')
   @DomName('HTMLTableElement.insertRow')
   @DocsEditable()
-  HtmlElement _insertRow([int index]) native;
+  HtmlElement _insertRow([int index]) native ;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('HTMLTableRowElement')
 @Native("HTMLTableRowElement")
 class TableRowElement extends HtmlElement {
-
   @DomName('HTMLTableRowElement.cells')
   List<TableCellElement> get cells =>
       new _WrappedList<TableCellElement>(_cells);
@@ -31857,20 +32912,25 @@
   DocumentFragment createFragment(String html,
       {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
     if (Range.supportsCreateContextualFragment) {
-      return super.createFragment(
-          html, validator: validator, treeSanitizer: treeSanitizer);
+      return super.createFragment(html,
+          validator: validator, treeSanitizer: treeSanitizer);
     }
     // IE9 workaround which does not support innerHTML on Table elements.
     var fragment = new DocumentFragment();
-    var section = new TableElement().createFragment(
-        html, validator: validator, treeSanitizer: treeSanitizer).nodes.single;
+    var section = new TableElement()
+        .createFragment(html,
+            validator: validator, treeSanitizer: treeSanitizer)
+        .nodes
+        .single;
     var row = section.nodes.single;
     fragment.nodes.addAll(row.nodes);
     return fragment;
   }
 
   // To suppress missing implicit constructor warnings.
-  factory TableRowElement._() { throw new UnsupportedError("Not supported"); }
+  factory TableRowElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLTableRowElement.HTMLTableRowElement')
   @DocsEditable()
@@ -31899,26 +32959,23 @@
 
   @DomName('HTMLTableRowElement.deleteCell')
   @DocsEditable()
-  void deleteCell(int index) native;
+  void deleteCell(int index) native ;
 
   @JSName('insertCell')
   @DomName('HTMLTableRowElement.insertCell')
   @DocsEditable()
-  HtmlElement _insertCell([int index]) native;
+  HtmlElement _insertCell([int index]) native ;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('HTMLTableSectionElement')
 @Native("HTMLTableSectionElement")
 class TableSectionElement extends HtmlElement {
-
   @DomName('HTMLTableSectionElement.rows')
-  List<TableRowElement> get rows =>
-    new _WrappedList<TableRowElement>(_rows);
+  List<TableRowElement> get rows => new _WrappedList<TableRowElement>(_rows);
 
   TableRowElement addRow() {
     return insertRow(-1);
@@ -31929,19 +32986,24 @@
   DocumentFragment createFragment(String html,
       {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
     if (Range.supportsCreateContextualFragment) {
-      return super.createFragment(
-          html, validator: validator, treeSanitizer: treeSanitizer);
+      return super.createFragment(html,
+          validator: validator, treeSanitizer: treeSanitizer);
     }
     // IE9 workaround which does not support innerHTML on Table elements.
     var fragment = new DocumentFragment();
-    var section = new TableElement().createFragment(
-        html, validator: validator, treeSanitizer: treeSanitizer).nodes.single;
+    var section = new TableElement()
+        .createFragment(html,
+            validator: validator, treeSanitizer: treeSanitizer)
+        .nodes
+        .single;
     fragment.nodes.addAll(section.nodes);
     return fragment;
   }
 
   // To suppress missing implicit constructor warnings.
-  factory TableSectionElement._() { throw new UnsupportedError("Not supported"); }
+  factory TableSectionElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -31958,12 +33020,12 @@
 
   @DomName('HTMLTableSectionElement.deleteRow')
   @DocsEditable()
-  void deleteRow(int index) native;
+  void deleteRow(int index) native ;
 
   @JSName('insertRow')
   @DomName('HTMLTableSectionElement.insertRow')
   @DocsEditable()
-  HtmlElement _insertRow([int index]) native;
+  HtmlElement _insertRow([int index]) native ;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -31971,7 +33033,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @Experimental()
 @DomName('HTMLTemplateElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -31980,7 +33041,9 @@
 @Native("HTMLTemplateElement")
 class TemplateElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory TemplateElement._() { throw new UnsupportedError("Not supported"); }
+  factory TemplateElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLTemplateElement.HTMLTemplateElement')
   @DocsEditable()
@@ -31999,7 +33062,6 @@
   @DocsEditable()
   final DocumentFragment content;
 
-
   /**
    * An override to place the contents into content rather than as child nodes.
    *
@@ -32008,10 +33070,10 @@
    * * <https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#innerhtml-on-templates>
    */
   void setInnerHtml(String html,
-    {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+      {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
     text = null;
-    var fragment = createFragment(
-        html, validator: validator, treeSanitizer: treeSanitizer);
+    var fragment = createFragment(html,
+        validator: validator, treeSanitizer: treeSanitizer);
 
     content.append(fragment);
   }
@@ -32022,13 +33084,14 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('Text')
 @Native("Text")
 class Text extends CharacterData {
   factory Text(String data) => document._createTextNode(data);
   // To suppress missing implicit constructor warnings.
-  factory Text._() { throw new UnsupportedError("Not supported"); }
+  factory Text._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Text.wholeText')
   @DocsEditable()
@@ -32039,24 +33102,24 @@
   @Experimental() // untriaged
   @Returns('NodeList')
   @Creates('NodeList')
-  List<Node> getDestinationInsertionPoints() native;
+  List<Node> getDestinationInsertionPoints() native ;
 
   @DomName('Text.splitText')
   @DocsEditable()
-  Text splitText(int offset) native;
-
+  Text 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.
 
-
 @DocsEditable()
 @DomName('HTMLTextAreaElement')
 @Native("HTMLTextAreaElement")
 class TextAreaElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory TextAreaElement._() { throw new UnsupportedError("Not supported"); }
+  factory TextAreaElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLTextAreaElement.HTMLTextAreaElement')
   @DocsEditable()
@@ -32182,30 +33245,31 @@
 
   @DomName('HTMLTextAreaElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() native;
+  bool checkValidity() native ;
 
   @DomName('HTMLTextAreaElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() native;
+  bool reportValidity() native ;
 
   @DomName('HTMLTextAreaElement.select')
   @DocsEditable()
-  void select() native;
+  void select() native ;
 
   @DomName('HTMLTextAreaElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) native;
+  void setCustomValidity(String error) native ;
 
   @DomName('HTMLTextAreaElement.setRangeText')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#dom-textarea/input-setrangetext
   @Experimental()
-  void setRangeText(String replacement, {int start, int end, String selectionMode}) native;
+  void setRangeText(String replacement,
+      {int start, int end, String selectionMode}) native ;
 
   @DomName('HTMLTextAreaElement.setSelectionRange')
   @DocsEditable()
-  void setSelectionRange(int start, int end, [String direction]) native;
+  void setSelectionRange(int start, int end, [String direction]) native ;
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -32213,13 +33277,15 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('TextEvent')
 @Unstable()
 @Native("TextEvent")
 class TextEvent extends UIEvent {
   factory TextEvent(String type,
-    {bool canBubble: false, bool cancelable: false, Window view, String data}) {
+      {bool canBubble: false,
+      bool cancelable: false,
+      Window view,
+      String data}) {
     if (view == null) {
       view = window;
     }
@@ -32228,7 +33294,9 @@
     return e;
   }
   // To suppress missing implicit constructor warnings.
-  factory TextEvent._() { throw new UnsupportedError("Not supported"); }
+  factory TextEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('TextEvent.data')
   @DocsEditable()
@@ -32237,20 +33305,21 @@
   @JSName('initTextEvent')
   @DomName('TextEvent.initTextEvent')
   @DocsEditable()
-  void _initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) native;
-
+  void _initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg,
+      Window 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.
 
-
 @DocsEditable()
 @DomName('TextMetrics')
 @Native("TextMetrics")
 class TextMetrics extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory TextMetrics._() { throw new UnsupportedError("Not supported"); }
+  factory TextMetrics._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('TextMetrics.actualBoundingBoxAscent')
   @DocsEditable()
@@ -32315,7 +33384,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.
 
-
 @DocsEditable()
 @DomName('TextTrack')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrack
@@ -32323,7 +33391,9 @@
 @Native("TextTrack")
 class TextTrack extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory TextTrack._() { throw new UnsupportedError("Not supported"); }
+  factory TextTrack._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `cuechange` events to event
@@ -32333,7 +33403,8 @@
    */
   @DomName('TextTrack.cuechangeEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> cueChangeEvent = const EventStreamProvider<Event>('cuechange');
+  static const EventStreamProvider<Event> cueChangeEvent =
+      const EventStreamProvider<Event>('cuechange');
 
   @DomName('TextTrack.activeCues')
   @DocsEditable()
@@ -32371,21 +33442,21 @@
 
   @DomName('TextTrack.addCue')
   @DocsEditable()
-  void addCue(TextTrackCue cue) native;
+  void addCue(TextTrackCue cue) native ;
 
   @DomName('TextTrack.addRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void addRegion(VttRegion region) native;
+  void addRegion(VttRegion region) native ;
 
   @DomName('TextTrack.removeCue')
   @DocsEditable()
-  void removeCue(TextTrackCue cue) native;
+  void removeCue(TextTrackCue cue) native ;
 
   @DomName('TextTrack.removeRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeRegion(VttRegion region) native;
+  void removeRegion(VttRegion region) native ;
 
   /// Stream of `cuechange` events handled by this [TextTrack].
   @DomName('TextTrack.oncuechange')
@@ -32396,7 +33467,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.
 
-
 @DocsEditable()
 @DomName('TextTrackCue')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrackcue
@@ -32404,7 +33474,9 @@
 @Native("TextTrackCue")
 class TextTrackCue extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory TextTrackCue._() { throw new UnsupportedError("Not supported"); }
+  factory TextTrackCue._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `enter` events to event
@@ -32414,7 +33486,8 @@
    */
   @DomName('TextTrackCue.enterEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> enterEvent = const EventStreamProvider<Event>('enter');
+  static const EventStreamProvider<Event> enterEvent =
+      const EventStreamProvider<Event>('enter');
 
   /**
    * Static factory designed to expose `exit` events to event
@@ -32424,7 +33497,8 @@
    */
   @DomName('TextTrackCue.exitEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> exitEvent = const EventStreamProvider<Event>('exit');
+  static const EventStreamProvider<Event> exitEvent =
+      const EventStreamProvider<Event>('exit');
 
   @DomName('TextTrackCue.endTime')
   @DocsEditable()
@@ -32460,33 +33534,35 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('TextTrackCueList')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrackcuelist
 @Experimental()
 @Native("TextTrackCueList")
-class TextTrackCueList extends Interceptor with ListMixin<TextTrackCue>, ImmutableListMixin<TextTrackCue> implements List<TextTrackCue>, JavaScriptIndexingBehavior {
+class TextTrackCueList extends Interceptor
+    with ListMixin<TextTrackCue>, ImmutableListMixin<TextTrackCue>
+    implements List<TextTrackCue>, JavaScriptIndexingBehavior {
   // To suppress missing implicit constructor warnings.
-  factory TextTrackCueList._() { throw new UnsupportedError("Not supported"); }
+  factory TextTrackCueList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('TextTrackCueList.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  TextTrackCue operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  TextTrackCue operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("TextTrackCue", "#[#]", this, index);
   }
-  void operator[]=(int index, TextTrackCue value) {
+
+  void operator []=(int index, TextTrackCue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<TextTrackCue> mixins.
   // TextTrackCue is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -32520,25 +33596,28 @@
 
   @DomName('TextTrackCueList.getCueById')
   @DocsEditable()
-  TextTrackCue getCueById(String id) native;
+  TextTrackCue getCueById(String id) native ;
 
   @DomName('TextTrackCueList.item')
   @DocsEditable()
-  TextTrackCue item(int index) native;
+  TextTrackCue 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.
 
-
 @DocsEditable()
 @DomName('TextTrackList')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttracklist
 @Experimental()
 @Native("TextTrackList")
-class TextTrackList extends EventTarget with ListMixin<TextTrack>, ImmutableListMixin<TextTrack> implements JavaScriptIndexingBehavior, List<TextTrack> {
+class TextTrackList extends EventTarget
+    with ListMixin<TextTrack>, ImmutableListMixin<TextTrack>
+    implements JavaScriptIndexingBehavior, List<TextTrack> {
   // To suppress missing implicit constructor warnings.
-  factory TextTrackList._() { throw new UnsupportedError("Not supported"); }
+  factory TextTrackList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `addtrack` events to event
@@ -32548,30 +33627,31 @@
    */
   @DomName('TextTrackList.addtrackEvent')
   @DocsEditable()
-  static const EventStreamProvider<TrackEvent> addTrackEvent = const EventStreamProvider<TrackEvent>('addtrack');
+  static const EventStreamProvider<TrackEvent> addTrackEvent =
+      const EventStreamProvider<TrackEvent>('addtrack');
 
   @DomName('TextTrackList.changeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+  static const EventStreamProvider<Event> changeEvent =
+      const EventStreamProvider<Event>('change');
 
   @DomName('TextTrackList.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  TextTrack operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  TextTrack operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("TextTrack", "#[#]", this, index);
   }
-  void operator[]=(int index, TextTrack value) {
+
+  void operator []=(int index, TextTrack value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<TextTrack> mixins.
   // TextTrack is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -32606,11 +33686,11 @@
   @DomName('TextTrackList.getTrackById')
   @DocsEditable()
   @Experimental() // untriaged
-  TextTrack getTrackById(String id) native;
+  TextTrack getTrackById(String id) native ;
 
   @DomName('TextTrackList.item')
   @DocsEditable()
-  TextTrack item(int index) native;
+  TextTrack item(int index) native ;
 
   /// Stream of `addtrack` events handled by this [TextTrackList].
   @DomName('TextTrackList.onaddtrack')
@@ -32626,14 +33706,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.
 
-
 @DocsEditable()
 @DomName('TimeRanges')
 @Unstable()
 @Native("TimeRanges")
 class TimeRanges extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory TimeRanges._() { throw new UnsupportedError("Not supported"); }
+  factory TimeRanges._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('TimeRanges.length')
   @DocsEditable()
@@ -32641,11 +33722,11 @@
 
   @DomName('TimeRanges.end')
   @DocsEditable()
-  double end(int index) native;
+  double end(int index) native ;
 
   @DomName('TimeRanges.start')
   @DocsEditable()
-  double start(int index) native;
+  double 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
@@ -32653,20 +33734,20 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('TimeoutHandler')
 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.
 
-
 @DocsEditable()
 @DomName('HTMLTitleElement')
 @Native("HTMLTitleElement")
 class TitleElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory TitleElement._() { throw new UnsupportedError("Not supported"); }
+  factory TitleElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLTitleElement.HTMLTitleElement')
   @DocsEditable()
@@ -32682,7 +33763,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.
 
-
 @DocsEditable()
 @DomName('Touch')
 // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
@@ -32690,7 +33770,9 @@
 @Native("Touch")
 class Touch extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Touch._() { throw new UnsupportedError("Not supported"); }
+  factory Touch._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('clientX')
   @DomName('Touch.clientX')
@@ -32758,7 +33840,6 @@
   @Returns('Element|Document')
   final dynamic _get_target;
 
-
 // As of Chrome 37, these all changed from long to double.  This code
 // preserves backwards compatability for the time being.
   int get __clientX => JS('num', '#.clientX', this).round();
@@ -32795,7 +33876,6 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   int get radiusY => __radiusY;
-
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -32803,7 +33883,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('TouchEvent')
 // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
 @Experimental()
@@ -32811,9 +33890,15 @@
 class TouchEvent extends UIEvent {
   factory TouchEvent(TouchList touches, TouchList targetTouches,
       TouchList changedTouches, String type,
-      {Window view, int screenX: 0, int screenY: 0, int clientX: 0,
-      int clientY: 0, bool ctrlKey: false, bool altKey: false,
-      bool shiftKey: false, bool metaKey: false}) {
+      {Window view,
+      int screenX: 0,
+      int screenY: 0,
+      int clientX: 0,
+      int clientY: 0,
+      bool ctrlKey: false,
+      bool altKey: false,
+      bool shiftKey: false,
+      bool metaKey: false}) {
     if (view == null) {
       view = window;
     }
@@ -32823,7 +33908,9 @@
     return e;
   }
   // To suppress missing implicit constructor warnings.
-  factory TouchEvent._() { throw new UnsupportedError("Not supported"); }
+  factory TouchEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('TouchEvent.altKey')
   @DocsEditable()
@@ -32856,8 +33943,20 @@
   @JSName('initTouchEvent')
   @DomName('TouchEvent.initTouchEvent')
   @DocsEditable()
-  void _initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int unused1, int unused2, int unused3, int unused4, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native;
-
+  void _initTouchEvent(
+      TouchList touches,
+      TouchList targetTouches,
+      TouchList changedTouches,
+      String type,
+      Window view,
+      int unused1,
+      int unused2,
+      int unused3,
+      int unused4,
+      bool ctrlKey,
+      bool altKey,
+      bool shiftKey,
+      bool metaKey) native ;
 
   /**
    * Checks if touch events supported on the current platform.
@@ -32873,19 +33972,22 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('TouchList')
 // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
 @Experimental()
 @Native("TouchList")
-class TouchList extends Interceptor with ListMixin<Touch>, ImmutableListMixin<Touch> implements JavaScriptIndexingBehavior, List<Touch> {
+class TouchList extends Interceptor
+    with ListMixin<Touch>, ImmutableListMixin<Touch>
+    implements JavaScriptIndexingBehavior, List<Touch> {
   /// NB: This constructor likely does not work as you might expect it to! This
   /// constructor will simply fail (returning null) if you are not on a device
   /// with touch enabled. See dartbug.com/8314.
   // TODO(5760): createTouchList now uses varargs.
-  factory TouchList() => null;//document._createTouchList();
+  factory TouchList() => null; //document._createTouchList();
   // To suppress missing implicit constructor warnings.
-  factory TouchList._() { throw new UnsupportedError("Not supported"); }
+  factory TouchList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!document.createTouchList');
@@ -32894,19 +33996,18 @@
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  Touch operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  Touch operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("Touch", "#[#]", this, index);
   }
-  void operator[]=(int index, Touch value) {
+
+  void operator []=(int index, Touch value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<Touch> mixins.
   // Touch is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -32940,34 +34041,46 @@
 
   @DomName('TouchList.item')
   @DocsEditable()
-  Touch item(int index) native;
-
+  Touch 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.
 
-
 @DocsEditable()
 @DomName('TrackDefault')
 @Experimental() // untriaged
 @Native("TrackDefault")
 class TrackDefault extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory TrackDefault._() { throw new UnsupportedError("Not supported"); }
+  factory TrackDefault._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('TrackDefault.TrackDefault')
   @DocsEditable()
-  factory TrackDefault(String type, String language, String label, List<String> kinds, [String byteStreamTrackID]) {
+  factory TrackDefault(
+      String type, String language, String label, List<String> kinds,
+      [String byteStreamTrackID]) {
     if (byteStreamTrackID != null) {
       List kinds_1 = convertDartToNative_StringArray(kinds);
-      return TrackDefault._create_1(type, language, label, kinds_1, byteStreamTrackID);
+      return TrackDefault._create_1(
+          type, language, label, kinds_1, byteStreamTrackID);
     }
     List kinds_1 = convertDartToNative_StringArray(kinds);
     return TrackDefault._create_2(type, language, label, kinds_1);
   }
-  static TrackDefault _create_1(type, language, label, kinds, byteStreamTrackID) => JS('TrackDefault', 'new TrackDefault(#,#,#,#,#)', type, language, label, kinds, byteStreamTrackID);
-  static TrackDefault _create_2(type, language, label, kinds) => JS('TrackDefault', 'new TrackDefault(#,#,#,#)', type, language, label, kinds);
+  static TrackDefault _create_1(
+          type, language, label, kinds, byteStreamTrackID) =>
+      JS('TrackDefault', 'new TrackDefault(#,#,#,#,#)', type, language, label,
+          kinds, byteStreamTrackID);
+  static TrackDefault _create_2(type, language, label, kinds) => JS(
+      'TrackDefault',
+      'new TrackDefault(#,#,#,#)',
+      type,
+      language,
+      label,
+      kinds);
 
   @DomName('TrackDefault.byteStreamTrackID')
   @DocsEditable()
@@ -32998,14 +34111,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.
 
-
 @DocsEditable()
 @DomName('TrackDefaultList')
 @Experimental() // untriaged
 @Native("TrackDefaultList")
 class TrackDefaultList extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory TrackDefaultList._() { throw new UnsupportedError("Not supported"); }
+  factory TrackDefaultList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('TrackDefaultList.TrackDefaultList')
   @DocsEditable()
@@ -33015,8 +34129,10 @@
     }
     return TrackDefaultList._create_2();
   }
-  static TrackDefaultList _create_1(trackDefaults) => JS('TrackDefaultList', 'new TrackDefaultList(#)', trackDefaults);
-  static TrackDefaultList _create_2() => JS('TrackDefaultList', 'new TrackDefaultList()');
+  static TrackDefaultList _create_1(trackDefaults) =>
+      JS('TrackDefaultList', 'new TrackDefaultList(#)', trackDefaults);
+  static TrackDefaultList _create_2() =>
+      JS('TrackDefaultList', 'new TrackDefaultList()');
 
   @DomName('TrackDefaultList.length')
   @DocsEditable()
@@ -33026,13 +34142,12 @@
   @DomName('TrackDefaultList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  TrackDefault item(int index) native;
+  TrackDefault 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.
 
-
 @DocsEditable()
 @DomName('HTMLTrackElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -33043,7 +34158,9 @@
 @Native("HTMLTrackElement")
 class TrackElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory TrackElement._() { throw new UnsupportedError("Not supported"); }
+  factory TrackElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLTrackElement.HTMLTrackElement')
   @DocsEditable()
@@ -33107,14 +34224,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.
 
-
 @DocsEditable()
 @DomName('TrackEvent')
 @Unstable()
 @Native("TrackEvent")
 class TrackEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory TrackEvent._() { throw new UnsupportedError("Not supported"); }
+  factory TrackEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('TrackEvent.TrackEvent')
   @DocsEditable()
@@ -33125,8 +34243,10 @@
     }
     return TrackEvent._create_2(type);
   }
-  static TrackEvent _create_1(type, eventInitDict) => JS('TrackEvent', 'new TrackEvent(#,#)', type, eventInitDict);
-  static TrackEvent _create_2(type) => JS('TrackEvent', 'new TrackEvent(#)', type);
+  static TrackEvent _create_1(type, eventInitDict) =>
+      JS('TrackEvent', 'new TrackEvent(#,#)', type, eventInitDict);
+  static TrackEvent _create_2(type) =>
+      JS('TrackEvent', 'new TrackEvent(#)', type);
 
   @DomName('TrackEvent.track')
   @DocsEditable()
@@ -33137,13 +34257,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.
 
-
 @DocsEditable()
 @DomName('TransitionEvent')
 @Native("TransitionEvent,WebKitTransitionEvent")
 class TransitionEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory TransitionEvent._() { throw new UnsupportedError("Not supported"); }
+  factory TransitionEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('TransitionEvent.TransitionEvent')
   @DocsEditable()
@@ -33154,8 +34275,10 @@
     }
     return TransitionEvent._create_2(type);
   }
-  static TransitionEvent _create_1(type, eventInitDict) => JS('TransitionEvent', 'new TransitionEvent(#,#)', type, eventInitDict);
-  static TransitionEvent _create_2(type) => JS('TransitionEvent', 'new TransitionEvent(#)', type);
+  static TransitionEvent _create_1(type, eventInitDict) =>
+      JS('TransitionEvent', 'new TransitionEvent(#,#)', type, eventInitDict);
+  static TransitionEvent _create_2(type) =>
+      JS('TransitionEvent', 'new TransitionEvent(#)', type);
 
   @DomName('TransitionEvent.elapsedTime')
   @DocsEditable()
@@ -33173,7 +34296,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.
 
-
 @DomName('TreeWalker')
 @Unstable()
 @Native("TreeWalker")
@@ -33182,7 +34304,9 @@
     return document._createTreeWalker(root, whatToShow, null);
   }
   // To suppress missing implicit constructor warnings.
-  factory TreeWalker._() { throw new UnsupportedError("Not supported"); }
+  factory TreeWalker._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('TreeWalker.currentNode')
   @DocsEditable()
@@ -33202,32 +34326,31 @@
 
   @DomName('TreeWalker.firstChild')
   @DocsEditable()
-  Node firstChild() native;
+  Node firstChild() native ;
 
   @DomName('TreeWalker.lastChild')
   @DocsEditable()
-  Node lastChild() native;
+  Node lastChild() native ;
 
   @DomName('TreeWalker.nextNode')
   @DocsEditable()
-  Node nextNode() native;
+  Node nextNode() native ;
 
   @DomName('TreeWalker.nextSibling')
   @DocsEditable()
-  Node nextSibling() native;
+  Node nextSibling() native ;
 
   @DomName('TreeWalker.parentNode')
   @DocsEditable()
-  Node parentNode() native;
+  Node parentNode() native ;
 
   @DomName('TreeWalker.previousNode')
   @DocsEditable()
-  Node previousNode() native;
+  Node previousNode() native ;
 
   @DomName('TreeWalker.previousSibling')
   @DocsEditable()
-  Node previousSibling() native;
-
+  Node 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
@@ -33235,7 +34358,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('UIEvent')
 @Native("UIEvent")
 class UIEvent extends Event {
@@ -33246,7 +34368,9 @@
   // Contrary to JS, we default canBubble and cancelable to true, since that's
   // what people want most of the time anyway.
   factory UIEvent(String type,
-      {Window view, int detail: 0, bool canBubble: true,
+      {Window view,
+      int detail: 0,
+      bool canBubble: true,
       bool cancelable: true}) {
     if (view == null) {
       view = window;
@@ -33265,7 +34389,8 @@
     }
     return UIEvent._create_2(type);
   }
-  static UIEvent _create_1(type, eventInitDict) => JS('UIEvent', 'new UIEvent(#,#)', type, eventInitDict);
+  static UIEvent _create_1(type, eventInitDict) =>
+      JS('UIEvent', 'new UIEvent(#,#)', type, eventInitDict);
   static UIEvent _create_2(type) => JS('UIEvent', 'new UIEvent(#)', type);
 
   @JSName('charCode')
@@ -33308,20 +34433,21 @@
   @JSName('initUIEvent')
   @DomName('UIEvent.initUIEvent')
   @DocsEditable()
-  void _initUIEvent(String type, bool bubbles, bool cancelable, Window view, int detail) native;
-
+  void _initUIEvent(String type, bool bubbles, bool cancelable, Window 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.
 
-
 @DocsEditable()
 @DomName('HTMLUListElement')
 @Native("HTMLUListElement")
 class UListElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory UListElement._() { throw new UnsupportedError("Not supported"); }
+  factory UListElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLUListElement.HTMLUListElement')
   @DocsEditable()
@@ -33337,13 +34463,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.
 
-
 @DocsEditable()
 @DomName('HTMLUnknownElement')
 @Native("HTMLUnknownElement")
 class UnknownElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory UnknownElement._() { throw new UnsupportedError("Not supported"); }
+  factory UnknownElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -33355,35 +34482,34 @@
 // for 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('URL')
 @Native("URL")
 class Url extends Interceptor implements UrlUtils {
-
-  static String createObjectUrl(blob_OR_source_OR_stream) =>
-      JS('String',
-         '(self.URL || self.webkitURL).createObjectURL(#)',
-          blob_OR_source_OR_stream);
+  static String createObjectUrl(blob_OR_source_OR_stream) => JS(
+      'String',
+      '(self.URL || self.webkitURL).createObjectURL(#)',
+      blob_OR_source_OR_stream);
 
   static String createObjectUrlFromSource(MediaSource source) =>
       JS('String', '(self.URL || self.webkitURL).createObjectURL(#)', source);
-  
+
   static String createObjectUrlFromStream(MediaStream stream) =>
       JS('String', '(self.URL || self.webkitURL).createObjectURL(#)', stream);
-  
+
   static String createObjectUrlFromBlob(Blob blob) =>
       JS('String', '(self.URL || self.webkitURL).createObjectURL(#)', blob);
 
   static void revokeObjectUrl(String url) =>
-      JS('void',
-         '(self.URL || self.webkitURL).revokeObjectURL(#)', url);
+      JS('void', '(self.URL || self.webkitURL).revokeObjectURL(#)', url);
 
   @DomName('URL.toString')
   @DocsEditable()
   String toString() => JS('String', 'String(#)', this);
 
   // To suppress missing implicit constructor warnings.
-  factory Url._() { throw new UnsupportedError("Not supported"); }
+  factory Url._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   // From URLUtils
 
@@ -33441,19 +34567,19 @@
   @DocsEditable()
   @Experimental() // untriaged
   String username;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('URLUtils')
 @Experimental() // untriaged
 abstract class UrlUtils extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory UrlUtils._() { throw new UnsupportedError("Not supported"); }
+  factory UrlUtils._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   String hash;
 
@@ -33483,13 +34609,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.
 
-
 @DocsEditable()
 @DomName('URLUtilsReadOnly')
 @Experimental() // untriaged
 abstract class UrlUtilsReadOnly extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory UrlUtilsReadOnly._() { throw new UnsupportedError("Not supported"); }
+  factory UrlUtilsReadOnly._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   final String hash;
 
@@ -33515,14 +34642,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.
 
-
 @DocsEditable()
 @DomName('VRDevice')
 @Experimental() // untriaged
 @Native("VRDevice")
 class VRDevice extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory VRDevice._() { throw new UnsupportedError("Not supported"); }
+  factory VRDevice._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('VRDevice.deviceId')
   @DocsEditable()
@@ -33543,14 +34671,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.
 
-
 @DocsEditable()
 @DomName('VREyeParameters')
 @Experimental() // untriaged
 @Native("VREyeParameters")
 class VREyeParameters extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory VREyeParameters._() { throw new UnsupportedError("Not supported"); }
+  factory VREyeParameters._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('VREyeParameters.currentFieldOfView')
   @DocsEditable()
@@ -33586,14 +34715,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.
 
-
 @DocsEditable()
 @DomName('VRFieldOfView')
 @Experimental() // untriaged
 @Native("VRFieldOfView")
 class VRFieldOfView extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory VRFieldOfView._() { throw new UnsupportedError("Not supported"); }
+  factory VRFieldOfView._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('VRFieldOfView.VRFieldOfView')
   @DocsEditable()
@@ -33604,8 +34734,10 @@
     }
     return VRFieldOfView._create_2();
   }
-  static VRFieldOfView _create_1(fov) => JS('VRFieldOfView', 'new VRFieldOfView(#)', fov);
-  static VRFieldOfView _create_2() => JS('VRFieldOfView', 'new VRFieldOfView()');
+  static VRFieldOfView _create_1(fov) =>
+      JS('VRFieldOfView', 'new VRFieldOfView(#)', fov);
+  static VRFieldOfView _create_2() =>
+      JS('VRFieldOfView', 'new VRFieldOfView()');
 
   @DomName('VRFieldOfView.downDegrees')
   @DocsEditable()
@@ -33631,14 +34763,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.
 
-
 @DocsEditable()
 @DomName('VRPositionState')
 @Experimental() // untriaged
 @Native("VRPositionState")
 class VRPositionState extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory VRPositionState._() { throw new UnsupportedError("Not supported"); }
+  factory VRPositionState._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('VRPositionState.angularAcceleration')
   @DocsEditable()
@@ -33679,13 +34812,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.
 
-
 @DocsEditable()
 @DomName('ValidityState')
 @Native("ValidityState")
 class ValidityState extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ValidityState._() { throw new UnsupportedError("Not supported"); }
+  factory ValidityState._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ValidityState.badInput')
   @DocsEditable()
@@ -33736,12 +34870,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.
 
-
 @DomName('HTMLVideoElement')
 @Native("HTMLVideoElement")
 class VideoElement extends MediaElement implements CanvasImageSource {
   // To suppress missing implicit constructor warnings.
-  factory VideoElement._() { throw new UnsupportedError("Not supported"); }
+  factory VideoElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('HTMLVideoElement.HTMLVideoElement')
   @DocsEditable()
@@ -33792,7 +34927,7 @@
   @DomName('HTMLVideoElement.getVideoPlaybackQuality')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoPlaybackQuality getVideoPlaybackQuality() native;
+  VideoPlaybackQuality getVideoPlaybackQuality() native ;
 
   @JSName('webkitEnterFullscreen')
   @DomName('HTMLVideoElement.webkitEnterFullscreen')
@@ -33801,7 +34936,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  void enterFullscreen() native;
+  void enterFullscreen() native ;
 
   @JSName('webkitExitFullscreen')
   @DomName('HTMLVideoElement.webkitExitFullscreen')
@@ -33810,21 +34945,21 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
-  void exitFullscreen() native;
-
+  void exitFullscreen() 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.
 
-
 @DocsEditable()
 @DomName('VideoPlaybackQuality')
 @Experimental() // untriaged
 @Native("VideoPlaybackQuality")
 class VideoPlaybackQuality extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory VideoPlaybackQuality._() { throw new UnsupportedError("Not supported"); }
+  factory VideoPlaybackQuality._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('VideoPlaybackQuality.corruptedVideoFrames')
   @DocsEditable()
@@ -33850,14 +34985,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.
 
-
 @DocsEditable()
 @DomName('VideoTrack')
 @Experimental() // untriaged
 @Native("VideoTrack")
 class VideoTrack extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory VideoTrack._() { throw new UnsupportedError("Not supported"); }
+  factory VideoTrack._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('VideoTrack.id')
   @DocsEditable()
@@ -33888,19 +35024,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.
 
-
 @DocsEditable()
 @DomName('VideoTrackList')
 @Experimental() // untriaged
 @Native("VideoTrackList")
 class VideoTrackList extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory VideoTrackList._() { throw new UnsupportedError("Not supported"); }
+  factory VideoTrackList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('VideoTrackList.changeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+  static const EventStreamProvider<Event> changeEvent =
+      const EventStreamProvider<Event>('change');
 
   @DomName('VideoTrackList.length')
   @DocsEditable()
@@ -33915,12 +35053,12 @@
   @DomName('VideoTrackList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoTrack __getter__(int index) native;
+  VideoTrack __getter__(int index) native ;
 
   @DomName('VideoTrackList.getTrackById')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoTrack getTrackById(String id) native;
+  VideoTrack getTrackById(String id) native ;
 
   @DomName('VideoTrackList.onchange')
   @DocsEditable()
@@ -33933,7 +35071,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('VoidCallback')
 // http://www.w3.org/TR/file-system-api/#the-voidcallback-interface
 @Experimental()
@@ -33942,21 +35079,23 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('VTTCue')
 @Experimental() // untriaged
 @Native("VTTCue")
 class VttCue extends TextTrackCue {
   // To suppress missing implicit constructor warnings.
-  factory VttCue._() { throw new UnsupportedError("Not supported"); }
+  factory VttCue._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('VTTCue.VTTCue')
   @DocsEditable()
   factory VttCue(num startTime, num endTime, String text) {
     return VttCue._create_1(startTime, endTime, text);
   }
-  static VttCue _create_1(startTime, endTime, text) => JS('VttCue', 'new VTTCue(#,#,#)', startTime, endTime, text);
+  static VttCue _create_1(startTime, endTime, text) =>
+      JS('VttCue', 'new VTTCue(#,#,#)', startTime, endTime, text);
 
   @DomName('VTTCue.align')
   @DocsEditable()
@@ -34006,20 +35145,21 @@
   @DomName('VTTCue.getCueAsHTML')
   @DocsEditable()
   @Experimental() // untriaged
-  DocumentFragment getCueAsHtml() native;
+  DocumentFragment getCueAsHtml() 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.
 
-
 @DocsEditable()
 @DomName('VTTRegion')
 @Experimental() // untriaged
 @Native("VTTRegion")
 class VttRegion extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory VttRegion._() { throw new UnsupportedError("Not supported"); }
+  factory VttRegion._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('VTTRegion.VTTRegion')
   @DocsEditable()
@@ -34077,14 +35217,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.
 
-
 @DocsEditable()
 @DomName('VTTRegionList')
 @Experimental() // untriaged
 @Native("VTTRegionList")
 class VttRegionList extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory VttRegionList._() { throw new UnsupportedError("Not supported"); }
+  factory VttRegionList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('VTTRegionList.length')
   @DocsEditable()
@@ -34094,18 +35235,17 @@
   @DomName('VTTRegionList.getRegionById')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion getRegionById(String id) native;
+  VttRegion getRegionById(String id) native ;
 
   @DomName('VTTRegionList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion item(int index) native;
+  VttRegion 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.
 
-
 @DocsEditable()
 /**
  * Use the WebSocket interface to connect to a WebSocket,
@@ -34150,7 +35290,9 @@
 @Native("WebSocket")
 class WebSocket extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory WebSocket._() { throw new UnsupportedError("Not supported"); }
+  factory WebSocket._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `close` events to event
@@ -34160,7 +35302,8 @@
    */
   @DomName('WebSocket.closeEvent')
   @DocsEditable()
-  static const EventStreamProvider<CloseEvent> closeEvent = const EventStreamProvider<CloseEvent>('close');
+  static const EventStreamProvider<CloseEvent> closeEvent =
+      const EventStreamProvider<CloseEvent>('close');
 
   /**
    * Static factory designed to expose `error` events to event
@@ -34170,7 +35313,8 @@
    */
   @DomName('WebSocket.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /**
    * Static factory designed to expose `message` events to event
@@ -34180,7 +35324,8 @@
    */
   @DomName('WebSocket.messageEvent')
   @DocsEditable()
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   /**
    * Static factory designed to expose `open` events to event
@@ -34190,7 +35335,8 @@
    */
   @DomName('WebSocket.openEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
+  static const EventStreamProvider<Event> openEvent =
+      const EventStreamProvider<Event>('open');
 
   @DomName('WebSocket.WebSocket')
   @DocsEditable()
@@ -34200,11 +35346,13 @@
     }
     return WebSocket._create_2(url);
   }
-  static WebSocket _create_1(url, protocols) => JS('WebSocket', 'new WebSocket(#,#)', url, protocols);
+  static WebSocket _create_1(url, protocols) =>
+      JS('WebSocket', 'new WebSocket(#,#)', url, protocols);
   static WebSocket _create_2(url) => JS('WebSocket', 'new WebSocket(#)', url);
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => JS('bool', 'typeof window.WebSocket != "undefined"');
+  static bool get supported =>
+      JS('bool', 'typeof window.WebSocket != "undefined"');
 
   @DomName('WebSocket.CLOSED')
   @DocsEditable()
@@ -34248,7 +35396,7 @@
 
   @DomName('WebSocket.close')
   @DocsEditable()
-  void close([int code, String reason]) native;
+  void close([int code, String reason]) native ;
 
   /**
    * Transmit data to the server over this connection.
@@ -34259,7 +35407,7 @@
    */
   @DomName('WebSocket.send')
   @DocsEditable()
-  void send(data) native;
+  void send(data) native ;
 
   @JSName('send')
   /**
@@ -34271,7 +35419,7 @@
    */
   @DomName('WebSocket.send')
   @DocsEditable()
-  void sendBlob(Blob data) native;
+  void sendBlob(Blob data) native ;
 
   @JSName('send')
   /**
@@ -34283,7 +35431,7 @@
    */
   @DomName('WebSocket.send')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) native;
+  void sendByteBuffer(ByteBuffer data) native ;
 
   @JSName('send')
   /**
@@ -34295,7 +35443,7 @@
    */
   @DomName('WebSocket.send')
   @DocsEditable()
-  void sendString(String data) native;
+  void sendString(String data) native ;
 
   @JSName('send')
   /**
@@ -34307,7 +35455,7 @@
    */
   @DomName('WebSocket.send')
   @DocsEditable()
-  void sendTypedData(TypedData data) native;
+  void sendTypedData(TypedData data) native ;
 
   /// Stream of `close` events handled by this [WebSocket].
   @DomName('WebSocket.onclose')
@@ -34333,19 +35481,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.
 
-
 @DomName('WheelEvent')
 @Native("WheelEvent")
 class WheelEvent extends MouseEvent {
-
   factory WheelEvent(String type,
-      {Window view, num deltaX: 0, num deltaY: 0, num deltaZ: 0,
+      {Window view,
+      num deltaX: 0,
+      num deltaY: 0,
+      num deltaZ: 0,
       int deltaMode: 0,
-      int detail: 0, int screenX: 0, int screenY: 0, int clientX: 0,
-      int clientY: 0, int button: 0, bool canBubble: true,
-      bool cancelable: true, bool ctrlKey: false, bool altKey: false,
-      bool shiftKey: false, bool metaKey: false, EventTarget relatedTarget}) {
-
+      int detail: 0,
+      int screenX: 0,
+      int screenY: 0,
+      int clientX: 0,
+      int clientY: 0,
+      int button: 0,
+      bool canBubble: true,
+      bool cancelable: true,
+      bool ctrlKey: false,
+      bool altKey: false,
+      bool shiftKey: false,
+      bool metaKey: false,
+      EventTarget relatedTarget}) {
     var options = {
       'view': view,
       'deltaMode': deltaMode,
@@ -34371,12 +35528,10 @@
       view = window;
     }
 
-    return JS('WheelEvent', 'new WheelEvent(#, #)',
-        type, convertDartToNative_Dictionary(options));
-
+    return JS('WheelEvent', 'new WheelEvent(#, #)', type,
+        convertDartToNative_Dictionary(options));
   }
 
-
   @DomName('WheelEvent.WheelEvent')
   @DocsEditable()
   factory WheelEvent._(String type, [Map eventInitDict]) {
@@ -34386,8 +35541,10 @@
     }
     return WheelEvent._create_2(type);
   }
-  static WheelEvent _create_1(type, eventInitDict) => JS('WheelEvent', 'new WheelEvent(#,#)', type, eventInitDict);
-  static WheelEvent _create_2(type) => JS('WheelEvent', 'new WheelEvent(#)', type);
+  static WheelEvent _create_1(type, eventInitDict) =>
+      JS('WheelEvent', 'new WheelEvent(#,#)', type, eventInitDict);
+  static WheelEvent _create_2(type) =>
+      JS('WheelEvent', 'new WheelEvent(#)', type);
 
   @DomName('WheelEvent.DOM_DELTA_LINE')
   @DocsEditable()
@@ -34415,7 +35572,6 @@
   @DocsEditable()
   final double deltaZ;
 
-
   /**
    * The amount that is expected to scroll vertically, in units determined by
    * [deltaMode].
@@ -34430,8 +35586,7 @@
       // W3C WheelEvent
       return this._deltaY;
     }
-    throw new UnsupportedError(
-        'deltaY is not supported');
+    throw new UnsupportedError('deltaY is not supported');
   }
 
   /**
@@ -34448,8 +35603,7 @@
       // W3C WheelEvent
       return this._deltaX;
     }
-    throw new UnsupportedError(
-        'deltaX is not supported');
+    throw new UnsupportedError('deltaX is not supported');
   }
 
   @DomName('WheelEvent.deltaMode')
@@ -34485,10 +35639,9 @@
       bool metaKey,
       int button,
       EventTarget relatedTarget,
-      int axis) native;
+      int axis) native ;
 
-  bool get _hasInitWheelEvent =>
-      JS('bool', '!!(#.initWheelEvent)', this);
+  bool get _hasInitWheelEvent => JS('bool', '!!(#.initWheelEvent)', this);
   @JSName('initWheelEvent')
   void _initWheelEvent(
       String eventType,
@@ -34506,14 +35659,12 @@
       int deltaX,
       int deltaY,
       int deltaZ,
-      int deltaMode) native;
-
+      int deltaMode) 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.
 
-
 @DocsEditable()
 /**
  * Top-level container for the current browser tab or window.
@@ -34550,8 +35701,13 @@
  */
 @DomName('Window')
 @Native("Window,DOMWindow")
-class Window extends EventTarget implements WindowEventHandlers, WindowBase, GlobalEventHandlers, _WindowTimers, WindowBase64 {
-
+class Window extends EventTarget
+    implements
+        WindowEventHandlers,
+        WindowBase,
+        GlobalEventHandlers,
+        _WindowTimers,
+        WindowBase64 {
   /**
    * Returns a Future that completes just before the window is about to
    * repaint so the user can draw an animation frame.
@@ -34671,18 +35827,18 @@
   }
 
   @JSName('requestAnimationFrame')
-  int _requestAnimationFrame(FrameRequestCallback callback) native;
+  int _requestAnimationFrame(FrameRequestCallback callback) native ;
 
   @JSName('cancelAnimationFrame')
-  void _cancelAnimationFrame(int id) native;
+  void _cancelAnimationFrame(int id) native ;
 
   _ensureRequestAnimationFrame() {
-    if (JS('bool',
-           '!!(#.requestAnimationFrame && #.cancelAnimationFrame)', this, this))
-      return;
+    if (JS('bool', '!!(#.requestAnimationFrame && #.cancelAnimationFrame)',
+        this, this)) return;
 
-    JS('void',
-       r"""
+    JS(
+        'void',
+        r"""
   (function($this) {
    var vendors = ['ms', 'moz', 'webkit', 'o'];
    for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
@@ -34699,7 +35855,7 @@
    };
    $this.cancelAnimationFrame = function(id) { clearTimeout(id); }
   })(#)""",
-       this);
+        this);
   }
 
   /**
@@ -34712,16 +35868,17 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX, '15.0')
   @SupportedBrowser(SupportedBrowser.IE, '10.0')
   @Experimental()
-  IdbFactory get indexedDB =>
-      JS('IdbFactory|Null',  // If not supported, returns null.
-         '#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
-         this, this, this);
+  IdbFactory get indexedDB => JS(
+      'IdbFactory|Null', // If not supported, returns null.
+      '#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
+      this,
+      this,
+      this);
 
   /// The debugging console for this window.
   @DomName('Window.console')
   Console get console => Console._safeConsole;
 
-
   /**
    * Access a sandboxed file system of the specified `size`. If `persistent` is
    * true, the application will request permission from the user to create
@@ -34731,7 +35888,7 @@
    * applications cannot access file systems created in other web pages.
    */
   Future<FileSystem> requestFileSystem(int size, {bool persistent: false}) {
-    return _requestFileSystem(persistent? 1 : 0, size);
+    return _requestFileSystem(persistent ? 1 : 0, size);
   }
 
   /**
@@ -34740,7 +35897,9 @@
    */
   static bool get supportsPointConversions => DomPoint.supported;
   // To suppress missing implicit constructor warnings.
-  factory Window._() { throw new UnsupportedError("Not supported"); }
+  factory Window._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `contentloaded` events to event
@@ -34750,7 +35909,8 @@
    */
   @DomName('Window.DOMContentLoadedEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
+  static const EventStreamProvider<Event> contentLoadedEvent =
+      const EventStreamProvider<Event>('DOMContentLoaded');
 
   /**
    * Static factory designed to expose `devicemotion` events to event
@@ -34762,7 +35922,8 @@
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
-  static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent = const EventStreamProvider<DeviceMotionEvent>('devicemotion');
+  static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent =
+      const EventStreamProvider<DeviceMotionEvent>('devicemotion');
 
   /**
    * Static factory designed to expose `deviceorientation` events to event
@@ -34774,7 +35935,9 @@
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
-  static const EventStreamProvider<DeviceOrientationEvent> deviceOrientationEvent = const EventStreamProvider<DeviceOrientationEvent>('deviceorientation');
+  static const EventStreamProvider<DeviceOrientationEvent>
+      deviceOrientationEvent =
+      const EventStreamProvider<DeviceOrientationEvent>('deviceorientation');
 
   /**
    * Static factory designed to expose `hashchange` events to event
@@ -34784,11 +35947,13 @@
    */
   @DomName('Window.hashchangeEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');
+  static const EventStreamProvider<Event> hashChangeEvent =
+      const EventStreamProvider<Event>('hashchange');
 
   @DomName('Window.loadstartEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> loadStartEvent = const EventStreamProvider<Event>('loadstart');
+  static const EventStreamProvider<Event> loadStartEvent =
+      const EventStreamProvider<Event>('loadstart');
 
   /**
    * Static factory designed to expose `message` events to event
@@ -34798,7 +35963,8 @@
    */
   @DomName('Window.messageEvent')
   @DocsEditable()
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   /**
    * Static factory designed to expose `offline` events to event
@@ -34808,7 +35974,8 @@
    */
   @DomName('Window.offlineEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
+  static const EventStreamProvider<Event> offlineEvent =
+      const EventStreamProvider<Event>('offline');
 
   /**
    * Static factory designed to expose `online` events to event
@@ -34818,7 +35985,8 @@
    */
   @DomName('Window.onlineEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
+  static const EventStreamProvider<Event> onlineEvent =
+      const EventStreamProvider<Event>('online');
 
   /**
    * Static factory designed to expose `pagehide` events to event
@@ -34828,7 +35996,8 @@
    */
   @DomName('Window.pagehideEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> pageHideEvent = const EventStreamProvider<Event>('pagehide');
+  static const EventStreamProvider<Event> pageHideEvent =
+      const EventStreamProvider<Event>('pagehide');
 
   /**
    * Static factory designed to expose `pageshow` events to event
@@ -34838,7 +36007,8 @@
    */
   @DomName('Window.pageshowEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> pageShowEvent = const EventStreamProvider<Event>('pageshow');
+  static const EventStreamProvider<Event> pageShowEvent =
+      const EventStreamProvider<Event>('pageshow');
 
   /**
    * Static factory designed to expose `popstate` events to event
@@ -34848,11 +36018,13 @@
    */
   @DomName('Window.popstateEvent')
   @DocsEditable()
-  static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
+  static const EventStreamProvider<PopStateEvent> popStateEvent =
+      const EventStreamProvider<PopStateEvent>('popstate');
 
   @DomName('Window.progressEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> progressEvent = const EventStreamProvider<Event>('progress');
+  static const EventStreamProvider<Event> progressEvent =
+      const EventStreamProvider<Event>('progress');
 
   /**
    * Static factory designed to expose `storage` events to event
@@ -34862,7 +36034,8 @@
    */
   @DomName('Window.storageEvent')
   @DocsEditable()
-  static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
+  static const EventStreamProvider<StorageEvent> storageEvent =
+      const EventStreamProvider<StorageEvent>('storage');
 
   /**
    * Static factory designed to expose `unload` events to event
@@ -34872,7 +36045,8 @@
    */
   @DomName('Window.unloadEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
+  static const EventStreamProvider<Event> unloadEvent =
+      const EventStreamProvider<Event>('unload');
 
   /**
    * Static factory designed to expose `animationend` events to event
@@ -34885,7 +36059,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  static const EventStreamProvider<AnimationEvent> animationEndEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');
+  static const EventStreamProvider<AnimationEvent> animationEndEvent =
+      const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');
 
   /**
    * Static factory designed to expose `animationiteration` events to event
@@ -34898,7 +36073,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  static const EventStreamProvider<AnimationEvent> animationIterationEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');
+  static const EventStreamProvider<AnimationEvent> animationIterationEvent =
+      const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');
 
   /**
    * Static factory designed to expose `animationstart` events to event
@@ -34911,7 +36087,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  static const EventStreamProvider<AnimationEvent> animationStartEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationStart');
+  static const EventStreamProvider<AnimationEvent> animationStartEvent =
+      const EventStreamProvider<AnimationEvent>('webkitAnimationStart');
 
   /**
    * Indicates that file system data cannot be cleared unless given user
@@ -35463,18 +36640,19 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+
   @JSName('__getter__')
   @DomName('Window.__getter__')
   @DocsEditable()
   @Creates('Window|=Object')
   @Returns('Window|=Object')
-  __getter___1(int index) native;
+  __getter___1(int index) native ;
   @JSName('__getter__')
   @DomName('Window.__getter__')
   @DocsEditable()
   @Creates('Window|=Object')
   @Returns('Window|=Object')
-  __getter___2(String name) native;
+  __getter___2(String name) native ;
 
   /**
    * Displays a modal alert to the user.
@@ -35486,11 +36664,11 @@
    */
   @DomName('Window.alert')
   @DocsEditable()
-  void alert([String message]) native;
+  void alert([String message]) native ;
 
   @DomName('Window.close')
   @DocsEditable()
-  void close() native;
+  void close() native ;
 
   /**
    * Displays a modal OK/Cancel prompt to the user.
@@ -35502,7 +36680,7 @@
    */
   @DomName('Window.confirm')
   @DocsEditable()
-  bool confirm([String message]) native;
+  bool confirm([String message]) native ;
 
   @DomName('Window.fetch')
   @DocsEditable()
@@ -35514,16 +36692,17 @@
     }
     return _fetch_2(input);
   }
+
   @JSName('fetch')
   @DomName('Window.fetch')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _fetch_1(input, init) native;
+  Future _fetch_1(input, init) native ;
   @JSName('fetch')
   @DomName('Window.fetch')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _fetch_2(input) native;
+  Future _fetch_2(input) native ;
 
   /**
    * Finds text in this window.
@@ -35536,12 +36715,13 @@
   @DomName('Window.find')
   @DocsEditable()
   @Experimental() // non-standard
-  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native;
+  bool find(String string, bool caseSensitive, bool backwards, bool wrap,
+      bool wholeWord, bool searchInFrames, bool showDialog) native ;
 
   @JSName('getComputedStyle')
   @DomName('Window.getComputedStyle')
   @DocsEditable()
-  CssStyleDeclaration _getComputedStyle(Element elt, String pseudoElt) native;
+  CssStyleDeclaration _getComputedStyle(Element elt, String pseudoElt) native ;
 
   @JSName('getMatchedCSSRules')
   /**
@@ -35552,7 +36732,8 @@
   @Experimental() // non-standard
   @Returns('_CssRuleList')
   @Creates('_CssRuleList')
-  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) native;
+  List<CssRule> getMatchedCssRules(Element element, String pseudoElement)
+      native ;
 
   /**
    * Returns the currently selected text.
@@ -35564,7 +36745,7 @@
    */
   @DomName('Window.getSelection')
   @DocsEditable()
-  Selection getSelection() native;
+  Selection getSelection() native ;
 
   /**
    * Returns a list of media queries for the given query string.
@@ -35579,7 +36760,7 @@
    */
   @DomName('Window.matchMedia')
   @DocsEditable()
-  MediaQueryList matchMedia(String query) native;
+  MediaQueryList matchMedia(String query) native ;
 
   /**
    * Moves this window.
@@ -35594,12 +36775,12 @@
    */
   @DomName('Window.moveBy')
   @DocsEditable()
-  void moveBy(int x, int y) native;
+  void moveBy(int x, int y) native ;
 
   @JSName('moveTo')
   @DomName('Window.moveTo')
   @DocsEditable()
-  void _moveTo(int x, int y) native;
+  void _moveTo(int x, int y) native ;
 
   /// *Deprecated.*
   @DomName('Window.openDatabase')
@@ -35610,11 +36791,14 @@
   // http://www.w3.org/TR/webdatabase/
   @Experimental() // deprecated
   @Creates('SqlDatabase')
-  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
+  SqlDatabase openDatabase(
+      String name, String version, String displayName, int estimatedSize,
+      [DatabaseCallback creationCallback]) native ;
 
   @DomName('Window.postMessage')
   @DocsEditable()
-  void postMessage(/*any*/ message, String targetOrigin, [List<MessagePort> transfer]) {
+  void postMessage(/*any*/ message, String targetOrigin,
+      [List<MessagePort> transfer]) {
     if (transfer != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
       _postMessage_1(message_1, targetOrigin, transfer);
@@ -35624,14 +36808,16 @@
     _postMessage_2(message_1, targetOrigin);
     return;
   }
+
   @JSName('postMessage')
   @DomName('Window.postMessage')
   @DocsEditable()
-  void _postMessage_1(message, targetOrigin, List<MessagePort> transfer) native;
+  void _postMessage_1(message, targetOrigin, List<MessagePort> transfer)
+      native ;
   @JSName('postMessage')
   @DomName('Window.postMessage')
   @DocsEditable()
-  void _postMessage_2(message, targetOrigin) native;
+  void _postMessage_2(message, targetOrigin) native ;
 
   /**
    * Opens the print dialog for this window.
@@ -35643,7 +36829,7 @@
    */
   @DomName('Window.print')
   @DocsEditable()
-  void print() native;
+  void print() native ;
 
   /**
    * Resizes this window by an offset.
@@ -35655,7 +36841,7 @@
    */
   @DomName('Window.resizeBy')
   @DocsEditable()
-  void resizeBy(int x, int y) native;
+  void resizeBy(int x, int y) native ;
 
   /**
    * Resizes this window to a specific width and height.
@@ -35667,7 +36853,7 @@
    */
   @DomName('Window.resizeTo')
   @DocsEditable()
-  void resizeTo(int x, int y) native;
+  void resizeTo(int x, int y) native ;
 
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -35706,6 +36892,7 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+
   @JSName('scroll')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -35719,7 +36906,7 @@
    */
   @DomName('Window.scroll')
   @DocsEditable()
-  void _scroll_1() native;
+  void _scroll_1() native ;
   @JSName('scroll')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -35733,7 +36920,7 @@
    */
   @DomName('Window.scroll')
   @DocsEditable()
-  void _scroll_2(options) native;
+  void _scroll_2(options) native ;
   @JSName('scroll')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -35747,7 +36934,7 @@
    */
   @DomName('Window.scroll')
   @DocsEditable()
-  void _scroll_3(num x, num y) native;
+  void _scroll_3(num x, num y) native ;
   @JSName('scroll')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -35761,7 +36948,7 @@
    */
   @DomName('Window.scroll')
   @DocsEditable()
-  void _scroll_4(int x, int y) native;
+  void _scroll_4(int x, int y) native ;
   @JSName('scroll')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -35775,7 +36962,7 @@
    */
   @DomName('Window.scroll')
   @DocsEditable()
-  void _scroll_5(int x, int y, scrollOptions) native;
+  void _scroll_5(int x, int y, scrollOptions) native ;
 
   /**
    * Scrolls the page horizontally and vertically by an offset.
@@ -35812,6 +36999,7 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+
   @JSName('scrollBy')
   /**
    * Scrolls the page horizontally and vertically by an offset.
@@ -35823,7 +37011,7 @@
    */
   @DomName('Window.scrollBy')
   @DocsEditable()
-  void _scrollBy_1() native;
+  void _scrollBy_1() native ;
   @JSName('scrollBy')
   /**
    * Scrolls the page horizontally and vertically by an offset.
@@ -35835,7 +37023,7 @@
    */
   @DomName('Window.scrollBy')
   @DocsEditable()
-  void _scrollBy_2(options) native;
+  void _scrollBy_2(options) native ;
   @JSName('scrollBy')
   /**
    * Scrolls the page horizontally and vertically by an offset.
@@ -35847,7 +37035,7 @@
    */
   @DomName('Window.scrollBy')
   @DocsEditable()
-  void _scrollBy_3(num x, num y) native;
+  void _scrollBy_3(num x, num y) native ;
   @JSName('scrollBy')
   /**
    * Scrolls the page horizontally and vertically by an offset.
@@ -35859,7 +37047,7 @@
    */
   @DomName('Window.scrollBy')
   @DocsEditable()
-  void _scrollBy_4(int x, int y) native;
+  void _scrollBy_4(int x, int y) native ;
   @JSName('scrollBy')
   /**
    * Scrolls the page horizontally and vertically by an offset.
@@ -35871,7 +37059,7 @@
    */
   @DomName('Window.scrollBy')
   @DocsEditable()
-  void _scrollBy_5(int x, int y, scrollOptions) native;
+  void _scrollBy_5(int x, int y, scrollOptions) native ;
 
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -35910,6 +37098,7 @@
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
+
   @JSName('scrollTo')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -35923,7 +37112,7 @@
    */
   @DomName('Window.scrollTo')
   @DocsEditable()
-  void _scrollTo_1() native;
+  void _scrollTo_1() native ;
   @JSName('scrollTo')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -35937,7 +37126,7 @@
    */
   @DomName('Window.scrollTo')
   @DocsEditable()
-  void _scrollTo_2(options) native;
+  void _scrollTo_2(options) native ;
   @JSName('scrollTo')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -35951,7 +37140,7 @@
    */
   @DomName('Window.scrollTo')
   @DocsEditable()
-  void _scrollTo_3(num x, num y) native;
+  void _scrollTo_3(num x, num y) native ;
   @JSName('scrollTo')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -35965,7 +37154,7 @@
    */
   @DomName('Window.scrollTo')
   @DocsEditable()
-  void _scrollTo_4(int x, int y) native;
+  void _scrollTo_4(int x, int y) native ;
   @JSName('scrollTo')
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -35979,7 +37168,7 @@
    */
   @DomName('Window.scrollTo')
   @DocsEditable()
-  void _scrollTo_5(int x, int y, scrollOptions) native;
+  void _scrollTo_5(int x, int y, scrollOptions) native ;
 
   /**
    * Stops the window from loading.
@@ -35992,7 +37181,7 @@
    */
   @DomName('Window.stop')
   @DocsEditable()
-  void stop() native;
+  void stop() native ;
 
   @JSName('webkitRequestFileSystem')
   @DomName('Window.webkitRequestFileSystem')
@@ -36000,7 +37189,9 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
-  void __requestFileSystem(int type, int size, _FileSystemCallback successCallback, [_ErrorCallback errorCallback]) native;
+  void __requestFileSystem(
+      int type, int size, _FileSystemCallback successCallback,
+      [_ErrorCallback errorCallback]) native ;
 
   @JSName('webkitRequestFileSystem')
   @DomName('Window.webkitRequestFileSystem')
@@ -36010,9 +37201,11 @@
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   Future<FileSystem> _requestFileSystem(int type, int size) {
     var completer = new Completer<FileSystem>();
-    __requestFileSystem(type, size,
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
+    __requestFileSystem(type, size, (value) {
+      completer.complete(value);
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
@@ -36031,7 +37224,8 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
-  void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) native;
+  void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback,
+      [_ErrorCallback errorCallback]) native ;
 
   @JSName('webkitResolveLocalFileSystemURL')
   /**
@@ -36050,9 +37244,11 @@
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
   Future<Entry> resolveLocalFileSystemUrl(String url) {
     var completer = new Completer<Entry>();
-    _resolveLocalFileSystemUrl(url,
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
+    _resolveLocalFileSystemUrl(url, (value) {
+      completer.complete(value);
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
@@ -36060,43 +37256,45 @@
 
   @DomName('Window.atob')
   @DocsEditable()
-  String atob(String atob) native;
+  String atob(String atob) native ;
 
   @DomName('Window.btoa')
   @DocsEditable()
-  String btoa(String btoa) native;
+  String btoa(String btoa) native ;
 
   // From WindowTimers
 
   @JSName('setInterval')
   @DomName('Window.setInterval')
   @DocsEditable()
-  int _setInterval_String(String handler, [int timeout, Object arguments]) native;
+  int _setInterval_String(String handler, [int timeout, Object arguments])
+      native ;
 
   @JSName('setTimeout')
   @DomName('Window.setTimeout')
   @DocsEditable()
-  int _setTimeout_String(String handler, [int timeout, Object arguments]) native;
+  int _setTimeout_String(String handler, [int timeout, Object arguments])
+      native ;
 
   @JSName('clearInterval')
   @DomName('Window.clearInterval')
   @DocsEditable()
-  void _clearInterval([int handle]) native;
+  void _clearInterval([int handle]) native ;
 
   @JSName('clearTimeout')
   @DomName('Window.clearTimeout')
   @DocsEditable()
-  void _clearTimeout([int handle]) native;
+  void _clearTimeout([int handle]) native ;
 
   @JSName('setInterval')
   @DomName('Window.setInterval')
   @DocsEditable()
-  int _setInterval(Object handler, [int timeout]) native;
+  int _setInterval(Object handler, [int timeout]) native ;
 
   @JSName('setTimeout')
   @DomName('Window.setTimeout')
   @DocsEditable()
-  int _setTimeout(Object handler, [int timeout]) native;
+  int _setTimeout(Object handler, [int timeout]) native ;
 
   /// Stream of `contentloaded` events handled by this [Window].
   @DomName('Window.onDOMContentLoaded')
@@ -36119,7 +37317,8 @@
 
   @DomName('Window.oncanplaythrough')
   @DocsEditable()
-  Stream<Event> get onCanPlayThrough => Element.canPlayThroughEvent.forTarget(this);
+  Stream<Event> get onCanPlayThrough =>
+      Element.canPlayThroughEvent.forTarget(this);
 
   /// Stream of `change` events handled by this [Window].
   @DomName('Window.onchange')
@@ -36134,7 +37333,8 @@
   /// Stream of `contextmenu` events handled by this [Window].
   @DomName('Window.oncontextmenu')
   @DocsEditable()
-  Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);
+  Stream<MouseEvent> get onContextMenu =>
+      Element.contextMenuEvent.forTarget(this);
 
   /// Stream of `doubleclick` events handled by this [Window].
   @DomName('Window.ondblclick')
@@ -36146,14 +37346,16 @@
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
-  Stream<DeviceMotionEvent> get onDeviceMotion => deviceMotionEvent.forTarget(this);
+  Stream<DeviceMotionEvent> get onDeviceMotion =>
+      deviceMotionEvent.forTarget(this);
 
   /// Stream of `deviceorientation` events handled by this [Window].
   @DomName('Window.ondeviceorientation')
   @DocsEditable()
   // http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion
   @Experimental()
-  Stream<DeviceOrientationEvent> get onDeviceOrientation => deviceOrientationEvent.forTarget(this);
+  Stream<DeviceOrientationEvent> get onDeviceOrientation =>
+      deviceOrientationEvent.forTarget(this);
 
   /// Stream of `drag` events handled by this [Window].
   @DomName('Window.ondrag')
@@ -36192,7 +37394,8 @@
 
   @DomName('Window.ondurationchange')
   @DocsEditable()
-  Stream<Event> get onDurationChange => Element.durationChangeEvent.forTarget(this);
+  Stream<Event> get onDurationChange =>
+      Element.durationChangeEvent.forTarget(this);
 
   @DomName('Window.onemptied')
   @DocsEditable()
@@ -36253,7 +37456,8 @@
 
   @DomName('Window.onloadedmetadata')
   @DocsEditable()
-  Stream<Event> get onLoadedMetadata => Element.loadedMetadataEvent.forTarget(this);
+  Stream<Event> get onLoadedMetadata =>
+      Element.loadedMetadataEvent.forTarget(this);
 
   @DomName('Window.onloadstart')
   @DocsEditable()
@@ -36273,13 +37477,15 @@
   @DomName('Window.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
-  Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseEnter =>
+      Element.mouseEnterEvent.forTarget(this);
 
   /// Stream of `mouseleave` events handled by this [Window].
   @DomName('Window.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
-  Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
+  Stream<MouseEvent> get onMouseLeave =>
+      Element.mouseLeaveEvent.forTarget(this);
 
   /// Stream of `mousemove` events handled by this [Window].
   @DomName('Window.onmousemove')
@@ -36304,7 +37510,8 @@
   /// Stream of `mousewheel` events handled by this [Window].
   @DomName('Window.onmousewheel')
   @DocsEditable()
-  Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);
+  Stream<WheelEvent> get onMouseWheel =>
+      Element.mouseWheelEvent.forTarget(this);
 
   /// Stream of `offline` events handled by this [Window].
   @DomName('Window.onoffline')
@@ -36413,7 +37620,8 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchCancel =>
+      Element.touchCancelEvent.forTarget(this);
 
   /// Stream of `touchend` events handled by this [Window].
   @DomName('Window.ontouchend')
@@ -36434,12 +37642,14 @@
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);
+  Stream<TouchEvent> get onTouchStart =>
+      Element.touchStartEvent.forTarget(this);
 
   /// Stream of `transitionend` events handled by this [Window].
   @DomName('Window.ontransitionend')
   @DocsEditable()
-  Stream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent.forTarget(this);
+  Stream<TransitionEvent> get onTransitionEnd =>
+      Element.transitionEndEvent.forTarget(this);
 
   /// Stream of `unload` events handled by this [Window].
   @DomName('Window.onunload')
@@ -36458,20 +37668,22 @@
   @DomName('Window.onwebkitAnimationEnd')
   @DocsEditable()
   @Experimental()
-  Stream<AnimationEvent> get onAnimationEnd => animationEndEvent.forTarget(this);
+  Stream<AnimationEvent> get onAnimationEnd =>
+      animationEndEvent.forTarget(this);
 
   /// Stream of `animationiteration` events handled by this [Window].
   @DomName('Window.onwebkitAnimationIteration')
   @DocsEditable()
   @Experimental()
-  Stream<AnimationEvent> get onAnimationIteration => animationIterationEvent.forTarget(this);
+  Stream<AnimationEvent> get onAnimationIteration =>
+      animationIterationEvent.forTarget(this);
 
   /// Stream of `animationstart` events handled by this [Window].
   @DomName('Window.onwebkitAnimationStart')
   @DocsEditable()
   @Experimental()
-  Stream<AnimationEvent> get onAnimationStart => animationStartEvent.forTarget(this);
-
+  Stream<AnimationEvent> get onAnimationStart =>
+      animationStartEvent.forTarget(this);
 
   /**
    * Static factory designed to expose `beforeunload` events to event
@@ -36523,9 +37735,9 @@
    */
   @DomName('Window.scrollX')
   @DocsEditable()
-  int get scrollX => JS('bool', '("scrollX" in #)', this) ?
-      JS('num', '#.scrollX', this).round() :
-      document.documentElement.scrollLeft;
+  int get scrollX => JS('bool', '("scrollX" in #)', this)
+      ? JS('num', '#.scrollX', this).round()
+      : document.documentElement.scrollLeft;
 
   /**
    * The distance this window has been scrolled vertically.
@@ -36539,15 +37751,15 @@
    */
   @DomName('Window.scrollY')
   @DocsEditable()
-  int get scrollY => JS('bool', '("scrollY" in #)', this) ?
-      JS('num', '#.scrollY', this).round() :
-      document.documentElement.scrollTop;
+  int get scrollY => JS('bool', '("scrollY" in #)', this)
+      ? JS('num', '#.scrollY', this).round()
+      : document.documentElement.scrollTop;
 }
 
 class _BeforeUnloadEvent extends _WrappedEvent implements BeforeUnloadEvent {
   String _returnValue;
 
-  _BeforeUnloadEvent(Event base): super(base);
+  _BeforeUnloadEvent(Event base) : super(base);
 
   String get returnValue => _returnValue;
 
@@ -36561,8 +37773,8 @@
   }
 }
 
-class _BeforeUnloadEventStreamProvider implements
-    EventStreamProvider<BeforeUnloadEvent> {
+class _BeforeUnloadEventStreamProvider
+    implements EventStreamProvider<BeforeUnloadEvent> {
   final String _eventType;
 
   const _BeforeUnloadEventStreamProvider(this._eventType);
@@ -36585,30 +37797,34 @@
     return _eventType;
   }
 
-  ElementStream<BeforeUnloadEvent> forElement(Element e, {bool useCapture: false}) {
+  ElementStream<BeforeUnloadEvent> forElement(Element e,
+      {bool useCapture: false}) {
     // Specify the generic type for _ElementEventStreamImpl only in dart2js to
     // avoid checked mode errors in dartium.
-    return new _ElementEventStreamImpl<BeforeUnloadEvent>(e, _eventType, useCapture);
+    return new _ElementEventStreamImpl<BeforeUnloadEvent>(
+        e, _eventType, useCapture);
   }
 
   ElementStream<BeforeUnloadEvent> _forElementList(ElementList e,
       {bool useCapture: false}) {
     // Specify the generic type for _ElementEventStreamImpl only in dart2js to
     // avoid checked mode errors in dartium.
-    return new _ElementListEventStreamImpl<BeforeUnloadEvent>(e, _eventType, useCapture);
+    return new _ElementListEventStreamImpl<BeforeUnloadEvent>(
+        e, _eventType, 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.
 
-
 @DocsEditable()
 @DomName('WindowBase64')
 @Experimental() // untriaged
 abstract class WindowBase64 extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory WindowBase64._() { throw new UnsupportedError("Not supported"); }
+  factory WindowBase64._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   String atob(String atob);
 
@@ -36618,14 +37834,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.
 
-
 @DocsEditable()
 @DomName('WindowClient')
 @Experimental() // untriaged
 @Native("WindowClient")
 class WindowClient extends Client {
   // To suppress missing implicit constructor warnings.
-  factory WindowClient._() { throw new UnsupportedError("Not supported"); }
+  factory WindowClient._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WindowClient.focused')
   @DocsEditable()
@@ -36640,54 +37857,62 @@
   @DomName('WindowClient.focus')
   @DocsEditable()
   @Experimental() // untriaged
-  Future focus() native;
+  Future focus() 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.
 
-
 @DocsEditable()
 @DomName('WindowEventHandlers')
 @Experimental() // untriaged
 abstract class WindowEventHandlers extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory WindowEventHandlers._() { throw new UnsupportedError("Not supported"); }
+  factory WindowEventHandlers._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WindowEventHandlers.hashchangeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');
+  static const EventStreamProvider<Event> hashChangeEvent =
+      const EventStreamProvider<Event>('hashchange');
 
   @DomName('WindowEventHandlers.messageEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   @DomName('WindowEventHandlers.offlineEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');
+  static const EventStreamProvider<Event> offlineEvent =
+      const EventStreamProvider<Event>('offline');
 
   @DomName('WindowEventHandlers.onlineEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');
+  static const EventStreamProvider<Event> onlineEvent =
+      const EventStreamProvider<Event>('online');
 
   @DomName('WindowEventHandlers.popstateEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');
+  static const EventStreamProvider<PopStateEvent> popStateEvent =
+      const EventStreamProvider<PopStateEvent>('popstate');
 
   @DomName('WindowEventHandlers.storageEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');
+  static const EventStreamProvider<StorageEvent> storageEvent =
+      const EventStreamProvider<StorageEvent>('storage');
 
   @DomName('WindowEventHandlers.unloadEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
+  static const EventStreamProvider<Event> unloadEvent =
+      const EventStreamProvider<Event>('unload');
 
   @DomName('WindowEventHandlers.onhashchange')
   @DocsEditable()
@@ -36728,7 +37953,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.
 
-
 @DocsEditable()
 @DomName('Worker')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -36740,7 +37964,9 @@
 @Native("Worker")
 class Worker extends EventTarget implements AbstractWorker {
   // To suppress missing implicit constructor warnings.
-  factory Worker._() { throw new UnsupportedError("Not supported"); }
+  factory Worker._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `error` events to event
@@ -36751,7 +37977,8 @@
   @DomName('Worker.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /**
    * Static factory designed to expose `message` events to event
@@ -36761,21 +37988,25 @@
    */
   @DomName('Worker.messageEvent')
   @DocsEditable()
-  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+  static const EventStreamProvider<MessageEvent> messageEvent =
+      const EventStreamProvider<MessageEvent>('message');
 
   @DomName('Worker.Worker')
   @DocsEditable()
   factory Worker(String scriptUrl) {
     return Worker._create_1(scriptUrl);
   }
-  static Worker _create_1(scriptUrl) => JS('Worker', 'new Worker(#)', scriptUrl);
+  static Worker _create_1(scriptUrl) =>
+      JS('Worker', 'new Worker(#)', scriptUrl);
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => JS('bool', '(typeof window.Worker != "undefined")');
+  static bool get supported =>
+      JS('bool', '(typeof window.Worker != "undefined")');
 
   @DomName('Worker.postMessage')
   @DocsEditable()
-  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
+  void postMessage(/*SerializedScriptValue*/ message,
+      [List<MessagePort> transfer]) {
     if (transfer != null) {
       var message_1 = convertDartToNative_SerializedScriptValue(message);
       _postMessage_1(message_1, transfer);
@@ -36785,18 +38016,19 @@
     _postMessage_2(message_1);
     return;
   }
+
   @JSName('postMessage')
   @DomName('Worker.postMessage')
   @DocsEditable()
-  void _postMessage_1(message, List<MessagePort> transfer) native;
+  void _postMessage_1(message, List<MessagePort> transfer) native ;
   @JSName('postMessage')
   @DomName('Worker.postMessage')
   @DocsEditable()
-  void _postMessage_2(message) native;
+  void _postMessage_2(message) native ;
 
   @DomName('Worker.terminate')
   @DocsEditable()
-  void terminate() native;
+  void terminate() native ;
 
   /// Stream of `error` events handled by this [Worker].
   @DomName('Worker.onerror')
@@ -36813,27 +38045,30 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('WorkerConsole')
 @Experimental() // untriaged
 @Native("WorkerConsole")
 class WorkerConsole extends ConsoleBase {
   // To suppress missing implicit constructor warnings.
-  factory WorkerConsole._() { throw new UnsupportedError("Not supported"); }
+  factory WorkerConsole._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('WorkerGlobalScope')
 @Experimental() // untriaged
 @Native("WorkerGlobalScope")
-class WorkerGlobalScope extends EventTarget implements _WindowTimers, WindowBase64 {
+class WorkerGlobalScope extends EventTarget
+    implements _WindowTimers, WindowBase64 {
   // To suppress missing implicit constructor warnings.
-  factory WorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+  factory WorkerGlobalScope._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `error` events to event
@@ -36844,7 +38079,8 @@
   @DomName('WorkerGlobalScope.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   @DomName('WorkerGlobalScope.PERSISTENT')
   @DocsEditable()
@@ -36899,7 +38135,7 @@
   @DomName('WorkerGlobalScope.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() native;
+  void close() native ;
 
   @DomName('WorkerGlobalScope.fetch')
   @DocsEditable()
@@ -36911,27 +38147,30 @@
     }
     return _fetch_2(input);
   }
+
   @JSName('fetch')
   @DomName('WorkerGlobalScope.fetch')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _fetch_1(input, init) native;
+  Future _fetch_1(input, init) native ;
   @JSName('fetch')
   @DomName('WorkerGlobalScope.fetch')
   @DocsEditable()
   @Experimental() // untriaged
-  Future _fetch_2(input) native;
+  Future _fetch_2(input) native ;
 
   @DomName('WorkerGlobalScope.importScripts')
   @DocsEditable()
   @Experimental() // untriaged
-  void importScripts(String urls) native;
+  void importScripts(String urls) native ;
 
   @JSName('webkitRequestFileSystem')
   @DomName('WorkerGlobalScope.webkitRequestFileSystem')
   @DocsEditable()
   @Experimental() // untriaged
-  void _webkitRequestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) native;
+  void _webkitRequestFileSystem(int type, int size,
+      [_FileSystemCallback successCallback,
+      _ErrorCallback errorCallback]) native ;
 
   @JSName('webkitRequestFileSystem')
   @DomName('WorkerGlobalScope.webkitRequestFileSystem')
@@ -36939,9 +38178,11 @@
   @Experimental() // untriaged
   Future<FileSystem> webkitRequestFileSystem(int type, int size) {
     var completer = new Completer<FileSystem>();
-    _webkitRequestFileSystem(type, size,
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
+    _webkitRequestFileSystem(type, size, (value) {
+      completer.complete(value);
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
@@ -36952,7 +38193,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _DOMFileSystemSync requestFileSystemSync(int type, int size) native;
+  _DOMFileSystemSync requestFileSystemSync(int type, int size) native ;
 
   @JSName('webkitResolveLocalFileSystemSyncURL')
   @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemSyncURL')
@@ -36961,13 +38202,15 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _EntrySync resolveLocalFileSystemSyncUrl(String url) native;
+  _EntrySync resolveLocalFileSystemSyncUrl(String url) native ;
 
   @JSName('webkitResolveLocalFileSystemURL')
   @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemURL')
   @DocsEditable()
   @Experimental() // untriaged
-  void _webkitResolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) native;
+  void _webkitResolveLocalFileSystemUrl(
+      String url, _EntryCallback successCallback,
+      [_ErrorCallback errorCallback]) native ;
 
   @JSName('webkitResolveLocalFileSystemURL')
   @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemURL')
@@ -36975,9 +38218,11 @@
   @Experimental() // untriaged
   Future<Entry> webkitResolveLocalFileSystemUrl(String url) {
     var completer = new Completer<Entry>();
-    _webkitResolveLocalFileSystemUrl(url,
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
+    _webkitResolveLocalFileSystemUrl(url, (value) {
+      completer.complete(value);
+    }, (error) {
+      completer.completeError(error);
+    });
     return completer.future;
   }
 
@@ -36986,12 +38231,12 @@
   @DomName('WorkerGlobalScope.atob')
   @DocsEditable()
   @Experimental() // untriaged
-  String atob(String atob) native;
+  String atob(String atob) native ;
 
   @DomName('WorkerGlobalScope.btoa')
   @DocsEditable()
   @Experimental() // untriaged
-  String btoa(String btoa) native;
+  String btoa(String btoa) native ;
 
   // From WindowTimers
 
@@ -36999,37 +38244,39 @@
   @DomName('WorkerGlobalScope.setInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setInterval_String(String handler, [int timeout, Object arguments]) native;
+  int _setInterval_String(String handler, [int timeout, Object arguments])
+      native ;
 
   @JSName('setTimeout')
   @DomName('WorkerGlobalScope.setTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setTimeout_String(String handler, [int timeout, Object arguments]) native;
+  int _setTimeout_String(String handler, [int timeout, Object arguments])
+      native ;
 
   @JSName('clearInterval')
   @DomName('WorkerGlobalScope.clearInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearInterval([int handle]) native;
+  void _clearInterval([int handle]) native ;
 
   @JSName('clearTimeout')
   @DomName('WorkerGlobalScope.clearTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearTimeout([int handle]) native;
+  void _clearTimeout([int handle]) native ;
 
   @JSName('setInterval')
   @DomName('WorkerGlobalScope.setInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setInterval(Object handler, [int timeout]) native;
+  int _setInterval(Object handler, [int timeout]) native ;
 
   @JSName('setTimeout')
   @DomName('WorkerGlobalScope.setTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setTimeout(Object handler, [int timeout]) native;
+  int _setTimeout(Object handler, [int timeout]) native ;
 
   /// Stream of `error` events handled by this [WorkerGlobalScope].
   @DomName('WorkerGlobalScope.onerror')
@@ -37041,14 +38288,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.
 
-
 @DocsEditable()
 @DomName('WorkerPerformance')
 @Experimental() // untriaged
 @Native("WorkerPerformance")
 class WorkerPerformance extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory WorkerPerformance._() { throw new UnsupportedError("Not supported"); }
+  factory WorkerPerformance._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WorkerPerformance.memory')
   @DocsEditable()
@@ -37058,42 +38306,43 @@
   @DomName('WorkerPerformance.clearMarks')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearMarks(String markName) native;
+  void clearMarks(String markName) native ;
 
   @DomName('WorkerPerformance.clearMeasures')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearMeasures(String measureName) native;
+  void clearMeasures(String measureName) native ;
 
   @DomName('WorkerPerformance.getEntries')
   @DocsEditable()
   @Experimental() // untriaged
-  List<PerformanceEntry> getEntries() native;
+  List<PerformanceEntry> getEntries() native ;
 
   @DomName('WorkerPerformance.getEntriesByName')
   @DocsEditable()
   @Experimental() // untriaged
-  List<PerformanceEntry> getEntriesByName(String name, String entryType) native;
+  List<PerformanceEntry> getEntriesByName(String name, String entryType)
+      native ;
 
   @DomName('WorkerPerformance.getEntriesByType')
   @DocsEditable()
   @Experimental() // untriaged
-  List<PerformanceEntry> getEntriesByType(String entryType) native;
+  List<PerformanceEntry> getEntriesByType(String entryType) native ;
 
   @DomName('WorkerPerformance.mark')
   @DocsEditable()
   @Experimental() // untriaged
-  void mark(String markName) native;
+  void mark(String markName) native ;
 
   @DomName('WorkerPerformance.measure')
   @DocsEditable()
   @Experimental() // untriaged
-  void measure(String measureName, String startMark, String endMark) native;
+  void measure(String measureName, String startMark, String endMark) native ;
 
   @DomName('WorkerPerformance.now')
   @DocsEditable()
   @Experimental() // untriaged
-  double now() native;
+  double now() native ;
 
   @JSName('webkitClearResourceTimings')
   @DomName('WorkerPerformance.webkitClearResourceTimings')
@@ -37102,7 +38351,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  void clearResourceTimings() native;
+  void clearResourceTimings() native ;
 
   @JSName('webkitSetResourceTimingBufferSize')
   @DomName('WorkerPerformance.webkitSetResourceTimingBufferSize')
@@ -37111,13 +38360,12 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  void setResourceTimingBufferSize(int maxSize) native;
+  void setResourceTimingBufferSize(int maxSize) 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.
 
-
 @DocsEditable()
 @DomName('XPathEvaluator')
 // http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator
@@ -37125,32 +38373,37 @@
 @Native("XPathEvaluator")
 class XPathEvaluator extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory XPathEvaluator._() { throw new UnsupportedError("Not supported"); }
+  factory XPathEvaluator._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('XPathEvaluator.XPathEvaluator')
   @DocsEditable()
   factory XPathEvaluator() {
     return XPathEvaluator._create_1();
   }
-  static XPathEvaluator _create_1() => JS('XPathEvaluator', 'new XPathEvaluator()');
+  static XPathEvaluator _create_1() =>
+      JS('XPathEvaluator', 'new XPathEvaluator()');
 
   @DomName('XPathEvaluator.createExpression')
   @DocsEditable()
-  XPathExpression createExpression(String expression, XPathNSResolver resolver) native;
+  XPathExpression createExpression(String expression, XPathNSResolver resolver)
+      native ;
 
   @DomName('XPathEvaluator.createNSResolver')
   @DocsEditable()
-  XPathNSResolver createNSResolver(Node nodeResolver) native;
+  XPathNSResolver createNSResolver(Node nodeResolver) native ;
 
   @DomName('XPathEvaluator.evaluate')
   @DocsEditable()
-  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, [int type, Object inResult]) native;
+  XPathResult evaluate(
+      String expression, Node contextNode, XPathNSResolver resolver,
+      [int type, Object 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.
 
-
 @DocsEditable()
 @DomName('XPathExpression')
 // http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathExpression
@@ -37158,17 +38411,18 @@
 @Native("XPathExpression")
 class XPathExpression extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory XPathExpression._() { throw new UnsupportedError("Not supported"); }
+  factory XPathExpression._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('XPathExpression.evaluate')
   @DocsEditable()
-  XPathResult evaluate(Node contextNode, [int type, Object inResult]) native;
+  XPathResult evaluate(Node contextNode, [int type, Object 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.
 
-
 @DocsEditable()
 @DomName('XPathNSResolver')
 // http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathNSResolver
@@ -37176,18 +38430,19 @@
 @Native("XPathNSResolver")
 class XPathNSResolver extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory XPathNSResolver._() { throw new UnsupportedError("Not supported"); }
+  factory XPathNSResolver._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('lookupNamespaceURI')
   @DomName('XPathNSResolver.lookupNamespaceURI')
   @DocsEditable()
-  String lookupNamespaceUri(String prefix) native;
+  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.
 
-
 @DocsEditable()
 @DomName('XPathResult')
 // http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult
@@ -37195,7 +38450,9 @@
 @Native("XPathResult")
 class XPathResult extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory XPathResult._() { throw new UnsupportedError("Not supported"); }
+  factory XPathResult._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('XPathResult.ANY_TYPE')
   @DocsEditable()
@@ -37267,30 +38524,30 @@
 
   @DomName('XPathResult.iterateNext')
   @DocsEditable()
-  Node iterateNext() native;
+  Node iterateNext() native ;
 
   @DomName('XPathResult.snapshotItem')
   @DocsEditable()
-  Node snapshotItem(int index) native;
+  Node 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.
 
-
 @DocsEditable()
 @DomName('XMLDocument')
 @Experimental() // untriaged
 @Native("XMLDocument")
 class XmlDocument extends Document {
   // To suppress missing implicit constructor warnings.
-  factory XmlDocument._() { throw new UnsupportedError("Not supported"); }
+  factory XmlDocument._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('XMLSerializer')
 // http://domparsing.spec.whatwg.org/#the-xmlserializer-interface
@@ -37298,24 +38555,26 @@
 @Native("XMLSerializer")
 class XmlSerializer extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory XmlSerializer._() { throw new UnsupportedError("Not supported"); }
+  factory XmlSerializer._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('XMLSerializer.XMLSerializer')
   @DocsEditable()
   factory XmlSerializer() {
     return XmlSerializer._create_1();
   }
-  static XmlSerializer _create_1() => JS('XmlSerializer', 'new XMLSerializer()');
+  static XmlSerializer _create_1() =>
+      JS('XmlSerializer', 'new XMLSerializer()');
 
   @DomName('XMLSerializer.serializeToString')
   @DocsEditable()
-  String serializeToString(Node root) native;
+  String serializeToString(Node root) 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.
 
-
 @DocsEditable()
 @DomName('XSLTProcessor')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -37325,61 +38584,66 @@
 @Native("XSLTProcessor")
 class XsltProcessor extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory XsltProcessor._() { throw new UnsupportedError("Not supported"); }
+  factory XsltProcessor._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('XSLTProcessor.XSLTProcessor')
   @DocsEditable()
   factory XsltProcessor() {
     return XsltProcessor._create_1();
   }
-  static XsltProcessor _create_1() => JS('XsltProcessor', 'new XSLTProcessor()');
+  static XsltProcessor _create_1() =>
+      JS('XsltProcessor', 'new XSLTProcessor()');
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.XSLTProcessor)');
 
   @DomName('XSLTProcessor.clearParameters')
   @DocsEditable()
-  void clearParameters() native;
+  void clearParameters() native ;
 
   @DomName('XSLTProcessor.getParameter')
   @DocsEditable()
-  String getParameter(String namespaceURI, String localName) native;
+  String getParameter(String namespaceURI, String localName) native ;
 
   @DomName('XSLTProcessor.importStylesheet')
   @DocsEditable()
-  void importStylesheet(Node style) native;
+  void importStylesheet(Node style) native ;
 
   @DomName('XSLTProcessor.removeParameter')
   @DocsEditable()
-  void removeParameter(String namespaceURI, String localName) native;
+  void removeParameter(String namespaceURI, String localName) native ;
 
   @DomName('XSLTProcessor.reset')
   @DocsEditable()
-  void reset() native;
+  void reset() native ;
 
   @DomName('XSLTProcessor.setParameter')
   @DocsEditable()
-  void setParameter(String namespaceURI, String localName, String value) native;
+  void setParameter(String namespaceURI, String localName, String value)
+      native ;
 
   @DomName('XSLTProcessor.transformToDocument')
   @DocsEditable()
-  Document transformToDocument(Node source) native;
+  Document transformToDocument(Node source) native ;
 
   @DomName('XSLTProcessor.transformToFragment')
   @DocsEditable()
-  DocumentFragment transformToFragment(Node source, Document output) native;
+  DocumentFragment transformToFragment(Node source, Document 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.
 
-
 @DocsEditable()
 @DomName('Attr')
 @Native("Attr")
 class _Attr extends Node {
   // To suppress missing implicit constructor warnings.
-  factory _Attr._() { throw new UnsupportedError("Not supported"); }
+  factory _Attr._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   // Use implementation from Node.
   // final String _localName;
@@ -37402,50 +38666,52 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('Cache')
 @Experimental() // untriaged
 @Native("Cache")
 abstract class _Cache extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _Cache._() { throw new UnsupportedError("Not supported"); }
+  factory _Cache._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('CanvasPathMethods')
 @Experimental() // untriaged
 abstract class _CanvasPathMethods extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _CanvasPathMethods._() { throw new UnsupportedError("Not supported"); }
+  factory _CanvasPathMethods._() {
+    throw new UnsupportedError("Not supported");
+  }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('ClientRect')
 @Native("ClientRect")
 class _ClientRect extends Interceptor implements Rectangle {
-
   // NOTE! All code below should be common with RectangleBase.
-   String toString() {
+  String toString() {
     return 'Rectangle ($left, $top) $width x $height';
   }
 
   bool operator ==(other) {
-    if (other is !Rectangle) return false;
-    return left == other.left && top == other.top && width == other.width &&
+    if (other is! Rectangle) return false;
+    return left == other.left &&
+        top == other.top &&
+        width == other.width &&
         height == other.height;
   }
 
-  int get hashCode => _JenkinsSmiHash.hash4(left.hashCode, top.hashCode,
-      width.hashCode, height.hashCode);
+  int get hashCode => _JenkinsSmiHash.hash4(
+      left.hashCode, top.hashCode, width.hashCode, height.hashCode);
 
   /**
    * Computes the intersection of `this` and [other].
@@ -37471,7 +38737,6 @@
     return null;
   }
 
-
   /**
    * Returns true if `this` intersects [other].
    */
@@ -37500,9 +38765,9 @@
    */
   bool containsRectangle(Rectangle<num> another) {
     return left <= another.left &&
-           left + width >= another.left + another.width &&
-           top <= another.top &&
-           top + height >= another.top + another.height;
+        left + width >= another.left + another.width &&
+        top <= another.top &&
+        top + height >= another.top + another.height;
   }
 
   /**
@@ -37510,20 +38775,21 @@
    */
   bool containsPoint(Point<num> another) {
     return another.x >= left &&
-           another.x <= left + width &&
-           another.y >= top &&
-           another.y <= top + height;
+        another.x <= left + width &&
+        another.y >= top &&
+        another.y <= top + height;
   }
 
   Point get topLeft => new Point/*<num>*/(this.left, this.top);
   Point get topRight => new Point/*<num>*/(this.left + this.width, this.top);
-  Point get bottomRight => new Point/*<num>*/(this.left + this.width,
-      this.top + this.height);
-  Point get bottomLeft => new Point/*<num>*/(this.left,
-      this.top + this.height);
+  Point get bottomRight =>
+      new Point/*<num>*/(this.left + this.width, this.top + this.height);
+  Point get bottomLeft => new Point/*<num>*/(this.left, this.top + this.height);
 
-    // To suppress missing implicit constructor warnings.
-  factory _ClientRect._() { throw new UnsupportedError("Not supported"); }
+  // To suppress missing implicit constructor warnings.
+  factory _ClientRect._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ClientRect.bottom')
   @DocsEditable()
@@ -37576,7 +38842,7 @@
   }
 
   static int finish(int hash) {
-    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) <<  3));
+    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
     hash = hash ^ (hash >> 11);
     return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
   }
@@ -37590,31 +38856,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.
 
-
 @DocsEditable()
 @DomName('ClientRectList')
 @Native("ClientRectList,DOMRectList")
-class _ClientRectList extends Interceptor with ListMixin<Rectangle>, ImmutableListMixin<Rectangle> implements List<Rectangle> {
+class _ClientRectList extends Interceptor
+    with ListMixin<Rectangle>, ImmutableListMixin<Rectangle>
+    implements List<Rectangle> {
   // To suppress missing implicit constructor warnings.
-  factory _ClientRectList._() { throw new UnsupportedError("Not supported"); }
+  factory _ClientRectList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ClientRectList.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  Rectangle operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  Rectangle operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return this.item(index);
   }
-  void operator[]=(int index, Rectangle value) {
+
+  void operator []=(int index, Rectangle value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<Rectangle> mixins.
   // Rectangle is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -37649,41 +38917,43 @@
   @DomName('ClientRectList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  Rectangle __getter__(int index) native;
+  Rectangle __getter__(int index) native ;
 
   @DomName('ClientRectList.item')
   @DocsEditable()
-  Rectangle item(int index) native;
+  Rectangle 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.
 
-
 @DocsEditable()
 @DomName('CSSRuleList')
 @Native("CSSRuleList")
-class _CssRuleList extends Interceptor with ListMixin<CssRule>, ImmutableListMixin<CssRule> implements JavaScriptIndexingBehavior, List<CssRule> {
+class _CssRuleList extends Interceptor
+    with ListMixin<CssRule>, ImmutableListMixin<CssRule>
+    implements JavaScriptIndexingBehavior, List<CssRule> {
   // To suppress missing implicit constructor warnings.
-  factory _CssRuleList._() { throw new UnsupportedError("Not supported"); }
+  factory _CssRuleList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('CSSRuleList.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  CssRule operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  CssRule operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("CssRule", "#[#]", this, index);
   }
-  void operator[]=(int index, CssRule value) {
+
+  void operator []=(int index, CssRule value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<CssRule> mixins.
   // CssRule is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -37717,13 +38987,12 @@
 
   @DomName('CSSRuleList.item')
   @DocsEditable()
-  CssRule item(int index) native;
+  CssRule 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.
 
-
 @DocsEditable()
 @DomName('DOMFileSystemSync')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -37732,13 +39001,14 @@
 @Native("DOMFileSystemSync")
 abstract class _DOMFileSystemSync extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _DOMFileSystemSync._() { throw new UnsupportedError("Not supported"); }
+  factory _DOMFileSystemSync._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('DirectoryEntrySync')
 // http://www.w3.org/TR/file-system-api/#the-directoryentrysync-interface
@@ -37746,13 +39016,14 @@
 @Native("DirectoryEntrySync")
 abstract class _DirectoryEntrySync extends _EntrySync {
   // To suppress missing implicit constructor warnings.
-  factory _DirectoryEntrySync._() { throw new UnsupportedError("Not supported"); }
+  factory _DirectoryEntrySync._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('DirectoryReaderSync')
 // http://www.w3.org/TR/file-system-api/#idl-def-DirectoryReaderSync
@@ -37760,13 +39031,14 @@
 @Native("DirectoryReaderSync")
 abstract class _DirectoryReaderSync extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _DirectoryReaderSync._() { throw new UnsupportedError("Not supported"); }
+  factory _DirectoryReaderSync._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('DocumentType')
 // http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-412266927
@@ -37774,7 +39046,9 @@
 @Native("DocumentType")
 abstract class _DocumentType extends Node implements ChildNode {
   // To suppress missing implicit constructor warnings.
-  factory _DocumentType._() { throw new UnsupportedError("Not supported"); }
+  factory _DocumentType._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   // From ChildNode
 
@@ -37784,14 +39058,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.
 
-
 @DocsEditable()
 @DomName('DOMRect')
 @Experimental() // untriaged
 @Native("DOMRect")
 class _DomRect extends DomRectReadOnly {
   // To suppress missing implicit constructor warnings.
-  factory _DomRect._() { throw new UnsupportedError("Not supported"); }
+  factory _DomRect._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DOMRect.DOMRect')
   @DocsEditable()
@@ -37810,8 +39085,10 @@
     }
     return _DomRect._create_5();
   }
-  static _DomRect _create_1(x, y, width, height) => JS('_DomRect', 'new DOMRect(#,#,#,#)', x, y, width, height);
-  static _DomRect _create_2(x, y, width) => JS('_DomRect', 'new DOMRect(#,#,#)', x, y, width);
+  static _DomRect _create_1(x, y, width, height) =>
+      JS('_DomRect', 'new DOMRect(#,#,#,#)', x, y, width, height);
+  static _DomRect _create_2(x, y, width) =>
+      JS('_DomRect', 'new DOMRect(#,#,#)', x, y, width);
   static _DomRect _create_3(x, y) => JS('_DomRect', 'new DOMRect(#,#)', x, y);
   static _DomRect _create_4(x) => JS('_DomRect', 'new DOMRect(#)', x);
   static _DomRect _create_5() => JS('_DomRect', 'new DOMRect()');
@@ -37848,7 +39125,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.
 
-
 @DocsEditable()
 @DomName('EntrySync')
 // http://www.w3.org/TR/file-system-api/#idl-def-EntrySync
@@ -37856,13 +39132,14 @@
 @Native("EntrySync")
 abstract class _EntrySync extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _EntrySync._() { throw new UnsupportedError("Not supported"); }
+  factory _EntrySync._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('FileEntrySync')
 // http://www.w3.org/TR/file-system-api/#the-fileentrysync-interface
@@ -37870,13 +39147,14 @@
 @Native("FileEntrySync")
 abstract class _FileEntrySync extends _EntrySync {
   // To suppress missing implicit constructor warnings.
-  factory _FileEntrySync._() { throw new UnsupportedError("Not supported"); }
+  factory _FileEntrySync._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('FileReaderSync')
 // http://www.w3.org/TR/FileAPI/#FileReaderSync
@@ -37884,20 +39162,22 @@
 @Native("FileReaderSync")
 abstract class _FileReaderSync extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _FileReaderSync._() { throw new UnsupportedError("Not supported"); }
+  factory _FileReaderSync._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('FileReaderSync.FileReaderSync')
   @DocsEditable()
   factory _FileReaderSync() {
     return _FileReaderSync._create_1();
   }
-  static _FileReaderSync _create_1() => JS('_FileReaderSync', 'new FileReaderSync()');
+  static _FileReaderSync _create_1() =>
+      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.
 
-
 @DocsEditable()
 @DomName('FileWriterSync')
 // http://www.w3.org/TR/file-writer-api/#idl-def-FileWriterSync
@@ -37905,39 +39185,43 @@
 @Native("FileWriterSync")
 abstract class _FileWriterSync extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _FileWriterSync._() { throw new UnsupportedError("Not supported"); }
+  factory _FileWriterSync._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('GamepadList')
 // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html
 @Experimental()
 @Native("GamepadList")
-class _GamepadList extends Interceptor with ListMixin<Gamepad>, ImmutableListMixin<Gamepad> implements JavaScriptIndexingBehavior, List<Gamepad> {
+class _GamepadList extends Interceptor
+    with ListMixin<Gamepad>, ImmutableListMixin<Gamepad>
+    implements JavaScriptIndexingBehavior, List<Gamepad> {
   // To suppress missing implicit constructor warnings.
-  factory _GamepadList._() { throw new UnsupportedError("Not supported"); }
+  factory _GamepadList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('GamepadList.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  Gamepad operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  Gamepad operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("Gamepad", "#[#]", this, index);
   }
-  void operator[]=(int index, Gamepad value) {
+
+  void operator []=(int index, Gamepad value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<Gamepad> mixins.
   // Gamepad is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -37971,13 +39255,12 @@
 
   @DomName('GamepadList.item')
   @DocsEditable()
-  Gamepad item(int index) native;
+  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.
 
-
 @DocsEditable()
 @DomName('HTMLAllCollection')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dom-document-all
@@ -37985,18 +39268,19 @@
 @Native("HTMLAllCollection")
 abstract class _HTMLAllCollection extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _HTMLAllCollection._() { throw new UnsupportedError("Not supported"); }
+  factory _HTMLAllCollection._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @JSName('item')
   @DomName('HTMLAllCollection.item')
   @DocsEditable()
-  Element _item(int index) native;
+  Element _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.
 
-
 @DocsEditable()
 @DomName('HTMLAppletElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-applet-element
@@ -38004,7 +39288,9 @@
 @Native("HTMLAppletElement")
 abstract class _HTMLAppletElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory _HTMLAppletElement._() { throw new UnsupportedError("Not supported"); }
+  factory _HTMLAppletElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -38016,7 +39302,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.
 
-
 @DocsEditable()
 @DomName('HTMLDirectoryElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dir
@@ -38024,7 +39309,9 @@
 @Native("HTMLDirectoryElement")
 abstract class _HTMLDirectoryElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory _HTMLDirectoryElement._() { throw new UnsupportedError("Not supported"); }
+  factory _HTMLDirectoryElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -38036,7 +39323,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.
 
-
 @DocsEditable()
 @DomName('HTMLFontElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlfontelement
@@ -38044,7 +39330,9 @@
 @Native("HTMLFontElement")
 abstract class _HTMLFontElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory _HTMLFontElement._() { throw new UnsupportedError("Not supported"); }
+  factory _HTMLFontElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -38056,7 +39344,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.
 
-
 @DocsEditable()
 @DomName('HTMLFrameElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlframeelement
@@ -38064,7 +39351,9 @@
 @Native("HTMLFrameElement")
 abstract class _HTMLFrameElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory _HTMLFrameElement._() { throw new UnsupportedError("Not supported"); }
+  factory _HTMLFrameElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -38076,29 +39365,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('HTMLFrameSetElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#frameset
 @deprecated // deprecated
 @Native("HTMLFrameSetElement")
-abstract class _HTMLFrameSetElement extends HtmlElement implements WindowEventHandlers {
+abstract class _HTMLFrameSetElement extends HtmlElement
+    implements WindowEventHandlers {
   // To suppress missing implicit constructor warnings.
-  factory _HTMLFrameSetElement._() { throw new UnsupportedError("Not supported"); }
+  factory _HTMLFrameSetElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
    * This can only be called by subclasses from their created constructor.
    */
   _HTMLFrameSetElement.created() : super.created();
-
 }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('HTMLMarqueeElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-marquee-element
@@ -38106,7 +39395,9 @@
 @Native("HTMLMarqueeElement")
 abstract class _HTMLMarqueeElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
-  factory _HTMLMarqueeElement._() { throw new UnsupportedError("Not supported"); }
+  factory _HTMLMarqueeElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -38118,33 +39409,35 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('NamedNodeMap')
 // http://dom.spec.whatwg.org/#namednodemap
 @deprecated // deprecated
 @Native("NamedNodeMap,MozNamedAttrMap")
-class _NamedNodeMap extends Interceptor with ListMixin<Node>, ImmutableListMixin<Node> implements JavaScriptIndexingBehavior, List<Node> {
+class _NamedNodeMap extends Interceptor
+    with ListMixin<Node>, ImmutableListMixin<Node>
+    implements JavaScriptIndexingBehavior, List<Node> {
   // To suppress missing implicit constructor warnings.
-  factory _NamedNodeMap._() { throw new UnsupportedError("Not supported"); }
+  factory _NamedNodeMap._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('NamedNodeMap.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  Node operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  Node operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("Node", "#[#]", this, index);
   }
-  void operator[]=(int index, Node value) {
+
+  void operator []=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<Node> mixins.
   // Node is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -38178,50 +39471,50 @@
 
   @DomName('NamedNodeMap.getNamedItem')
   @DocsEditable()
-  _Attr getNamedItem(String name) native;
+  _Attr getNamedItem(String name) native ;
 
   @DomName('NamedNodeMap.getNamedItemNS')
   @DocsEditable()
-  _Attr getNamedItemNS(String namespaceURI, String localName) native;
+  _Attr getNamedItemNS(String namespaceURI, String localName) native ;
 
   @DomName('NamedNodeMap.item')
   @DocsEditable()
-  _Attr item(int index) native;
+  _Attr item(int index) native ;
 
   @DomName('NamedNodeMap.removeNamedItem')
   @DocsEditable()
-  _Attr removeNamedItem(String name) native;
+  _Attr removeNamedItem(String name) native ;
 
   @DomName('NamedNodeMap.removeNamedItemNS')
   @DocsEditable()
-  _Attr removeNamedItemNS(String namespaceURI, String localName) native;
+  _Attr removeNamedItemNS(String namespaceURI, String localName) native ;
 
   @DomName('NamedNodeMap.setNamedItem')
   @DocsEditable()
-  _Attr setNamedItem(_Attr attr) native;
+  _Attr setNamedItem(_Attr attr) native ;
 
   @DomName('NamedNodeMap.setNamedItemNS')
   @DocsEditable()
-  _Attr setNamedItemNS(_Attr attr) native;
+  _Attr setNamedItemNS(_Attr attr) 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.
 
-
 @DocsEditable()
 @DomName('PagePopupController')
 @deprecated // nonstandard
 @Native("PagePopupController")
 abstract class _PagePopupController extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _PagePopupController._() { throw new UnsupportedError("Not supported"); }
+  factory _PagePopupController._() {
+    throw new UnsupportedError("Not supported");
+  }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 // Omit RadioNodeList for dart2js.  The Dart Form and FieldSet APIs don't
 // currently expose an API the returns RadioNodeList.  The only use of a
 // RadioNodeList is to get the selected value and it will be cleaner to
@@ -38230,14 +39523,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.
 
-
 @DocsEditable()
 @DomName('Request')
 @Experimental() // untriaged
 @Native("Request")
 class _Request extends Body {
   // To suppress missing implicit constructor warnings.
-  factory _Request._() { throw new UnsupportedError("Not supported"); }
+  factory _Request._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Request.Request')
   @DocsEditable()
@@ -38248,7 +39542,8 @@
     }
     return _Request._create_2(input);
   }
-  static _Request _create_1(input, requestInitDict) => JS('_Request', 'new Request(#,#)', input, requestInitDict);
+  static _Request _create_1(input, requestInitDict) =>
+      JS('_Request', 'new Request(#,#)', input, requestInitDict);
   static _Request _create_2(input) => JS('_Request', 'new Request(#)', input);
 
   @DomName('Request.context')
@@ -38284,20 +39579,21 @@
   @DomName('Request.clone')
   @DocsEditable()
   @Experimental() // untriaged
-  _Request clone() native;
+  _Request clone() 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.
 
-
 @DocsEditable()
 @DomName('Response')
 @Experimental() // untriaged
 @Native("Response")
 abstract class _Response extends Body {
   // To suppress missing implicit constructor warnings.
-  factory _Response._() { throw new UnsupportedError("Not supported"); }
+  factory _Response._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('Response.Response')
   @DocsEditable()
@@ -38311,7 +39607,8 @@
     }
     return _Response._create_3();
   }
-  static _Response _create_1(body, responseInitDict) => JS('_Response', 'new Response(#,#)', body, responseInitDict);
+  static _Response _create_1(body, responseInitDict) =>
+      JS('_Response', 'new Response(#,#)', body, responseInitDict);
   static _Response _create_2(body) => JS('_Response', 'new Response(#)', body);
   static _Response _create_3() => JS('_Response', 'new Response()');
 }
@@ -38319,48 +39616,52 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('ServiceWorker')
 @Experimental() // untriaged
 @Native("ServiceWorker")
 abstract class _ServiceWorker extends EventTarget implements AbstractWorker {
   // To suppress missing implicit constructor warnings.
-  factory _ServiceWorker._() { throw new UnsupportedError("Not supported"); }
-
+  factory _ServiceWorker._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('SpeechRecognitionResultList')
 // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechrecognitionresultlist
 @Experimental()
 @Native("SpeechRecognitionResultList")
-class _SpeechRecognitionResultList extends Interceptor with ListMixin<SpeechRecognitionResult>, ImmutableListMixin<SpeechRecognitionResult> implements JavaScriptIndexingBehavior, List<SpeechRecognitionResult> {
+class _SpeechRecognitionResultList extends Interceptor
+    with
+        ListMixin<SpeechRecognitionResult>,
+        ImmutableListMixin<SpeechRecognitionResult>
+    implements JavaScriptIndexingBehavior, List<SpeechRecognitionResult> {
   // To suppress missing implicit constructor warnings.
-  factory _SpeechRecognitionResultList._() { throw new UnsupportedError("Not supported"); }
+  factory _SpeechRecognitionResultList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SpeechRecognitionResultList.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  SpeechRecognitionResult operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  SpeechRecognitionResult operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("SpeechRecognitionResult", "#[#]", this, index);
   }
-  void operator[]=(int index, SpeechRecognitionResult value) {
+
+  void operator []=(int index, SpeechRecognitionResult value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<SpeechRecognitionResult> mixins.
   // SpeechRecognitionResult is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -38394,37 +39695,39 @@
 
   @DomName('SpeechRecognitionResultList.item')
   @DocsEditable()
-  SpeechRecognitionResult item(int index) native;
+  SpeechRecognitionResult 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.
 
-
 @DocsEditable()
 @DomName('StyleSheetList')
 @Native("StyleSheetList")
-class _StyleSheetList extends Interceptor with ListMixin<StyleSheet>, ImmutableListMixin<StyleSheet> implements JavaScriptIndexingBehavior, List<StyleSheet> {
+class _StyleSheetList extends Interceptor
+    with ListMixin<StyleSheet>, ImmutableListMixin<StyleSheet>
+    implements JavaScriptIndexingBehavior, List<StyleSheet> {
   // To suppress missing implicit constructor warnings.
-  factory _StyleSheetList._() { throw new UnsupportedError("Not supported"); }
+  factory _StyleSheetList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('StyleSheetList.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  StyleSheet operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  StyleSheet operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return JS("StyleSheet", "#[#]", this, index);
   }
-  void operator[]=(int index, StyleSheet value) {
+
+  void operator []=(int index, StyleSheet value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<StyleSheet> mixins.
   // StyleSheet is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -38458,30 +39761,30 @@
 
   @DomName('StyleSheetList.__getter__')
   @DocsEditable()
-  CssStyleSheet __getter__(String name) native;
+  CssStyleSheet __getter__(String name) native ;
 
   @DomName('StyleSheetList.item')
   @DocsEditable()
-  StyleSheet item(int index) native;
+  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.
 
-
 @DocsEditable()
 @DomName('SubtleCrypto')
 @Experimental() // untriaged
 @Native("SubtleCrypto")
 abstract class _SubtleCrypto extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _SubtleCrypto._() { throw new UnsupportedError("Not supported"); }
+  factory _SubtleCrypto._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('WebKitCSSMatrix')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -38492,7 +39795,9 @@
 @Native("WebKitCSSMatrix")
 abstract class _WebKitCSSMatrix extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _WebKitCSSMatrix._() { throw new UnsupportedError("Not supported"); }
+  factory _WebKitCSSMatrix._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
   @DocsEditable()
@@ -38502,20 +39807,23 @@
     }
     return _WebKitCSSMatrix._create_2();
   }
-  static _WebKitCSSMatrix _create_1(cssValue) => JS('_WebKitCSSMatrix', 'new WebKitCSSMatrix(#)', cssValue);
-  static _WebKitCSSMatrix _create_2() => JS('_WebKitCSSMatrix', 'new WebKitCSSMatrix()');
+  static _WebKitCSSMatrix _create_1(cssValue) =>
+      JS('_WebKitCSSMatrix', 'new WebKitCSSMatrix(#)', cssValue);
+  static _WebKitCSSMatrix _create_2() =>
+      JS('_WebKitCSSMatrix', 'new WebKitCSSMatrix()');
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('WindowTimers')
 @Experimental() // untriaged
 abstract class _WindowTimers extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _WindowTimers._() { throw new UnsupportedError("Not supported"); }
+  factory _WindowTimers._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   int _setInterval_String(String handler, [int timeout, Object arguments]);
 
@@ -38533,7 +39841,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.
 
-
 @DocsEditable()
 @DomName('WorkerLocation')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workerlocation
@@ -38541,7 +39848,9 @@
 @Native("WorkerLocation")
 abstract class _WorkerLocation extends Interceptor implements UrlUtilsReadOnly {
   // To suppress missing implicit constructor warnings.
-  factory _WorkerLocation._() { throw new UnsupportedError("Not supported"); }
+  factory _WorkerLocation._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   // From URLUtilsReadOnly
 
@@ -38551,15 +39860,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.
 
-
 @DocsEditable()
 @DomName('WorkerNavigator')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workernavigator
 @Experimental()
 @Native("WorkerNavigator")
-abstract class _WorkerNavigator extends Interceptor implements NavigatorCpu, NavigatorOnLine, NavigatorID {
+abstract class _WorkerNavigator extends Interceptor
+    implements NavigatorCpu, NavigatorOnLine, NavigatorID {
   // To suppress missing implicit constructor warnings.
-  factory _WorkerNavigator._() { throw new UnsupportedError("Not supported"); }
+  factory _WorkerNavigator._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   // From NavigatorCPU
 
@@ -38573,27 +39884,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('XMLHttpRequestProgressEvent')
 @Experimental() // nonstandard
 @Native("XMLHttpRequestProgressEvent")
 abstract class _XMLHttpRequestProgressEvent extends ProgressEvent {
   // To suppress missing implicit constructor warnings.
-  factory _XMLHttpRequestProgressEvent._() { throw new UnsupportedError("Not supported"); }
+  factory _XMLHttpRequestProgressEvent._() {
+    throw new UnsupportedError("Not 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.
 
-
 abstract class _AttributeMap implements Map<String, String> {
   final Element _element;
 
   _AttributeMap(this._element);
 
   void addAll(Map<String, String> other) {
-    other.forEach((k, v) { this[k] = v; });
+    other.forEach((k, v) {
+      this[k] = v;
+    });
   }
 
   bool containsValue(Object value) {
@@ -38673,8 +39986,7 @@
  * Wrapper to expose [Element.attributes] as a typed map.
  */
 class _ElementAttributeMap extends _AttributeMap {
-
-  _ElementAttributeMap(Element element): super(element);
+  _ElementAttributeMap(Element element) : super(element);
 
   bool containsKey(Object key) {
     return _element._hasAttribute(key);
@@ -38708,10 +40020,9 @@
  * Wrapper to expose namespaced attributes as a typed map.
  */
 class _NamespacedAttributeMap extends _AttributeMap {
-
   final String _namespace;
 
-  _NamespacedAttributeMap(Element element, this._namespace): super(element);
+  _NamespacedAttributeMap(Element element, this._namespace) : super(element);
 
   bool containsKey(Object key) {
     return _element._hasAttributeNS(_namespace, key);
@@ -38741,13 +40052,11 @@
   bool _matches(Node node) => node._namespaceUri == _namespace;
 }
 
-
 /**
  * Provides a Map abstraction on top of data-* attributes, similar to the
  * dataSet in the old DOM.
  */
 class _DataAttributeMap implements Map<String, String> {
-
   final Map<String, String> _attributes;
 
   _DataAttributeMap(this._attributes);
@@ -38755,7 +40064,9 @@
   // interface Map
 
   void addAll(Map<String, String> other) {
-    other.forEach((k, v) { this[k] = v; });
+    other.forEach((k, v) {
+      this[k] = v;
+    });
   }
 
   // TODO: Use lazy iterator when it is available on Map.
@@ -38770,7 +40081,7 @@
   }
 
   String putIfAbsent(String key, String ifAbsent()) =>
-    _attributes.putIfAbsent(_attr(key), ifAbsent);
+      _attributes.putIfAbsent(_attr(key), ifAbsent);
 
   String remove(Object key) => _attributes.remove(_attr(key));
 
@@ -38854,7 +40165,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.
 
-
 /**
  * An object that can be drawn to a 2D canvas rendering context.
  *
@@ -38895,7 +40205,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.
 
-
 /**
  * Top-level container for a browser tab or window.
  *
@@ -39031,7 +40340,8 @@
    * * [Cross-document messaging](https://html.spec.whatwg.org/multipage/comms.html#web-messaging)
    *   from WHATWG.
    */
-  void postMessage(var message, String targetOrigin, [List<MessagePort> messagePorts]);
+  void postMessage(var message, String targetOrigin,
+      [List<MessagePort> messagePorts]);
 }
 
 abstract class LocationBase {
@@ -39047,10 +40357,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.
 
-
 /** A Set that stores the CSS class names for an element. */
 abstract class CssClassSet implements Set<String> {
-
   /**
    * Adds the class [value] to the element if it is not on it, removes it if it
    * is.
@@ -39158,20 +40466,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.
 
-
 /**
  * A rectangle representing all the content of the element in the
  * [box model](http://www.w3.org/TR/CSS2/box.html).
  */
 class _ContentCssRect extends CssRect {
-
   _ContentCssRect(Element element) : super(element);
 
-  num get height => _element.offsetHeight +
-      _addOrSubtractToBoxModel(_HEIGHT, _CONTENT);
+  num get height =>
+      _element.offsetHeight + _addOrSubtractToBoxModel(_HEIGHT, _CONTENT);
 
-  num get width => _element.offsetWidth +
-      _addOrSubtractToBoxModel(_WIDTH, _CONTENT);
+  num get width =>
+      _element.offsetWidth + _addOrSubtractToBoxModel(_WIDTH, _CONTENT);
 
   /**
    * Set the height to `newHeight`.
@@ -39214,9 +40520,11 @@
     }
   }
 
-  num get left => _element.getBoundingClientRect().left -
+  num get left =>
+      _element.getBoundingClientRect().left -
       _addOrSubtractToBoxModel(['left'], _CONTENT);
-  num get top => _element.getBoundingClientRect().top -
+  num get top =>
+      _element.getBoundingClientRect().top -
       _addOrSubtractToBoxModel(['top'], _CONTENT);
 }
 
@@ -39261,14 +40569,16 @@
  */
 class _PaddingCssRect extends CssRect {
   _PaddingCssRect(element) : super(element);
-  num get height => _element.offsetHeight +
-      _addOrSubtractToBoxModel(_HEIGHT, _PADDING);
-  num get width => _element.offsetWidth +
-      _addOrSubtractToBoxModel(_WIDTH, _PADDING);
+  num get height =>
+      _element.offsetHeight + _addOrSubtractToBoxModel(_HEIGHT, _PADDING);
+  num get width =>
+      _element.offsetWidth + _addOrSubtractToBoxModel(_WIDTH, _PADDING);
 
-  num get left => _element.getBoundingClientRect().left -
+  num get left =>
+      _element.getBoundingClientRect().left -
       _addOrSubtractToBoxModel(['left'], _PADDING);
-  num get top => _element.getBoundingClientRect().top -
+  num get top =>
+      _element.getBoundingClientRect().top -
       _addOrSubtractToBoxModel(['top'], _PADDING);
 }
 
@@ -39293,14 +40603,16 @@
  */
 class _MarginCssRect extends CssRect {
   _MarginCssRect(element) : super(element);
-  num get height => _element.offsetHeight +
-      _addOrSubtractToBoxModel(_HEIGHT, _MARGIN);
+  num get height =>
+      _element.offsetHeight + _addOrSubtractToBoxModel(_HEIGHT, _MARGIN);
   num get width =>
       _element.offsetWidth + _addOrSubtractToBoxModel(_WIDTH, _MARGIN);
 
-  num get left => _element.getBoundingClientRect().left -
+  num get left =>
+      _element.getBoundingClientRect().left -
       _addOrSubtractToBoxModel(['left'], _MARGIN);
-  num get top => _element.getBoundingClientRect().top -
+  num get top =>
+      _element.getBoundingClientRect().top -
       _addOrSubtractToBoxModel(['top'], _MARGIN);
 }
 
@@ -39380,8 +40692,8 @@
    * to augmentingMeasurement, we may need to add or subtract margin, padding,
    * or border values, depending on the measurement we're trying to obtain.
    */
-  num _addOrSubtractToBoxModel(List<String> dimensions,
-      String augmentingMeasurement) {
+  num _addOrSubtractToBoxModel(
+      List<String> dimensions, String augmentingMeasurement) {
     // getComputedStyle always returns pixel values (hence, computed), so we're
     // always dealing with pixels in this method.
     var styles = _element.getComputedStyle();
@@ -39392,22 +40704,25 @@
       // The border-box and default box model both exclude margin in the regular
       // height/width calculation, so add it if we want it for this measurement.
       if (augmentingMeasurement == _MARGIN) {
-        val += new Dimension.css(styles.getPropertyValue(
-            '$augmentingMeasurement-$measurement')).value;
+        val += new Dimension.css(
+                styles.getPropertyValue('$augmentingMeasurement-$measurement'))
+            .value;
       }
 
       // The border-box includes padding and border, so remove it if we want
       // just the content itself.
       if (augmentingMeasurement == _CONTENT) {
-      	val -= new Dimension.css(
-            styles.getPropertyValue('${_PADDING}-$measurement')).value;
+        val -= new Dimension.css(
+                styles.getPropertyValue('${_PADDING}-$measurement'))
+            .value;
       }
 
       // At this point, we don't wan't to augment with border or margin,
       // so remove border.
       if (augmentingMeasurement != _MARGIN) {
-	      val -= new Dimension.css(styles.getPropertyValue(
-            'border-${measurement}-width')).value;
+        val -= new Dimension.css(
+                styles.getPropertyValue('border-${measurement}-width'))
+            .value;
       }
     }
     return val;
@@ -39426,13 +40741,15 @@
   }
 
   bool operator ==(other) {
-    if (other is !Rectangle) return false;
-    return left == other.left && top == other.top && right == other.right &&
+    if (other is! Rectangle) return false;
+    return left == other.left &&
+        top == other.top &&
+        right == other.right &&
         bottom == other.bottom;
   }
 
-  int get hashCode => _JenkinsSmiHash.hash4(left.hashCode, top.hashCode,
-      right.hashCode, bottom.hashCode);
+  int get hashCode => _JenkinsSmiHash.hash4(
+      left.hashCode, top.hashCode, right.hashCode, bottom.hashCode);
 
   /**
    * Computes the intersection of `this` and [other].
@@ -39458,7 +40775,6 @@
     return null;
   }
 
-
   /**
    * Returns true if `this` intersects [other].
    */
@@ -39487,9 +40803,9 @@
    */
   bool containsRectangle(Rectangle<num> another) {
     return left <= another.left &&
-           left + width >= another.left + another.width &&
-           top <= another.top &&
-           top + height >= another.top + another.height;
+        left + width >= another.left + another.width &&
+        top <= another.top &&
+        top + height >= another.top + another.height;
   }
 
   /**
@@ -39497,17 +40813,17 @@
    */
   bool containsPoint(Point<num> another) {
     return another.x >= left &&
-           another.x <= left + width &&
-           another.y >= top &&
-           another.y <= top + height;
+        another.x <= left + width &&
+        another.y >= top &&
+        another.y <= top + height;
   }
 
   Point<num> get topLeft => new Point<num>(this.left, this.top);
   Point<num> get topRight => new Point<num>(this.left + this.width, this.top);
-  Point<num> get bottomRight => new Point<num>(this.left + this.width,
-      this.top + this.height);
-  Point<num> get bottomLeft => new Point<num>(this.left,
-      this.top + this.height);
+  Point<num> get bottomRight =>
+      new Point<num>(this.left + this.width, this.top + this.height);
+  Point<num> get bottomLeft =>
+      new Point<num>(this.left, this.top + this.height);
 }
 
 final _HEIGHT = ['top', 'bottom'];
@@ -39519,7 +40835,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.
 
-
 /**
  * A set (union) of the CSS classes that are present in a set of elements.
  * Implemented separately from _ElementCssClassSet for performance.
@@ -39531,8 +40846,8 @@
   final List<CssClassSetImpl> _sets;
 
   factory _MultiElementCssClassSet(Iterable<Element> elements) {
-    return new _MultiElementCssClassSet._(elements,
-        elements.map((Element e) => e.classes).toList());
+    return new _MultiElementCssClassSet._(
+        elements, elements.map((Element e) => e.classes).toList());
   }
 
   _MultiElementCssClassSet._(this._elementIterable, this._sets);
@@ -39559,7 +40874,7 @@
    *   After f returns, the modified set is written to the
    *       className property of this element.
    */
-  modify( f(Set<String> s)) {
+  modify(f(Set<String> s)) {
     _sets.forEach((CssClassSetImpl e) => e.modify(f));
   }
 
@@ -39570,10 +40885,10 @@
    * TODO(sra): It seems wrong to collect a 'changed' flag like this when the
    * underlying toggle returns an 'is set' flag.
    */
-  bool toggle(String value, [bool shouldAdd]) =>
-      _sets.fold(false,
-          (bool changed, CssClassSetImpl e) =>
-              e.toggle(value, shouldAdd) || changed);
+  bool toggle(String value, [bool shouldAdd]) => _sets.fold(
+      false,
+      (bool changed, CssClassSetImpl e) =>
+          e.toggle(value, shouldAdd) || changed);
 
   /**
    * Remove the class [value] from element, and return true on successful
@@ -39582,8 +40897,8 @@
    * This is the Dart equivalent of jQuery's
    * [removeClass](http://api.jquery.com/removeClass/).
    */
-  bool remove(Object value) => _sets.fold(false,
-      (bool changed, CssClassSetImpl e) => e.remove(value) || changed);
+  bool remove(Object value) => _sets.fold(
+      false, (bool changed, CssClassSetImpl e) => e.remove(value) || changed);
 }
 
 class _ElementCssClassSet extends CssClassSetImpl {
@@ -39732,19 +41047,19 @@
   // work-around for the lack of annotations to express the full behaviour of
   // the DomTokenList methods.
 
-  static DomTokenList _classListOf(Element e) =>
-      JS('returns:DomTokenList;creates:DomTokenList;effects:none;depends:all;',
-         '#.classList', e);
+  static DomTokenList _classListOf(Element e) => JS(
+      'returns:DomTokenList;creates:DomTokenList;effects:none;depends:all;',
+      '#.classList',
+      e);
 
   static int _classListLength(DomTokenList list) =>
       JS('returns:JSUInt31;effects:none;depends:all;', '#.length', list);
 
   static bool _classListContains(DomTokenList list, String value) =>
-      JS('returns:bool;effects:none;depends:all',
-          '#.contains(#)', list, value);
+      JS('returns:bool;effects:none;depends:all', '#.contains(#)', list, value);
 
   static bool _classListContainsBeforeAddOrRemove(
-      DomTokenList list, String value) =>
+          DomTokenList list, String value) =>
       // 'throws:never' is a lie, since 'contains' will throw on an illegal
       // token.  However, we always call this function immediately prior to
       // add/remove/toggle with the same token.  Often the result of 'contains'
@@ -39839,8 +41154,8 @@
       _unit = cssValue.substring(cssValue.length - 2);
     }
     if (cssValue.contains('.')) {
-      _value = double.parse(cssValue.substring(0,
-          cssValue.length - _unit.length));
+      _value =
+          double.parse(cssValue.substring(0, cssValue.length - _unit.length));
     } else {
       _value = int.parse(cssValue.substring(0, cssValue.length - _unit.length));
     }
@@ -39858,13 +41173,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.
 
-
 typedef EventListener(Event event);
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for 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 factory to expose DOM events as Streams.
  */
@@ -39895,7 +41208,7 @@
    * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
    */
   Stream<T> forTarget(EventTarget e, {bool useCapture: false}) =>
-    new _EventStream<T>(e, _eventType, useCapture);
+      new _EventStream<T>(e, _eventType, useCapture);
 
   /**
    * Gets an [ElementEventStream] for this event type, on the specified element.
@@ -39990,16 +41303,14 @@
   _EventStream(this._target, this._eventType, this._useCapture);
 
   // DOM events are inherently multi-subscribers.
-  Stream<T> asBroadcastStream({void onListen(StreamSubscription<T> subscription),
-                               void onCancel(StreamSubscription<T> subscription)})
-      => this;
+  Stream<T> asBroadcastStream(
+          {void onListen(StreamSubscription<T> subscription),
+          void onCancel(StreamSubscription<T> subscription)}) =>
+      this;
   bool get isBroadcast => true;
 
   StreamSubscription<T> listen(void onData(T event),
-      { Function onError,
-        void onDone(),
-        bool cancelOnError}) {
-
+      {Function onError, void onDone(), bool cancelOnError}) {
     return new _EventStreamSubscription<T>(
         this._target, this._eventType, onData, this._useCapture);
   }
@@ -40016,18 +41327,18 @@
  */
 class _ElementEventStreamImpl<T extends Event> extends _EventStream<T>
     implements ElementStream<T> {
-  _ElementEventStreamImpl(target, eventType, useCapture) :
-      super(target, eventType, useCapture);
+  _ElementEventStreamImpl(target, eventType, useCapture)
+      : super(target, eventType, useCapture);
 
-  Stream<T> matches(String selector) => this.where(
-      (event) => _matchesWithAncestors(event, selector)).map((e) {
+  Stream<T> matches(String selector) =>
+      this.where((event) => _matchesWithAncestors(event, selector)).map((e) {
         e._selector = selector;
         return e;
       });
 
   StreamSubscription<T> capture(void onData(T event)) =>
-    new _EventStreamSubscription<T>(
-        this._target, this._eventType, onData, true);
+      new _EventStreamSubscription<T>(
+          this._target, this._eventType, onData, true);
 }
 
 /**
@@ -40043,23 +41354,21 @@
   _ElementListEventStreamImpl(
       this._targetList, this._eventType, this._useCapture);
 
-  Stream<T> matches(String selector) => this.where(
-      (event) => _matchesWithAncestors(event, selector)).map((e) {
+  Stream<T> matches(String selector) =>
+      this.where((event) => _matchesWithAncestors(event, selector)).map((e) {
         e._selector = selector;
         return e;
       });
 
   // Delegate all regular Stream behavior to a wrapped Stream.
   StreamSubscription<T> listen(void onData(T event),
-      { Function onError,
-        void onDone(),
-        bool cancelOnError}) {
+      {Function onError, void onDone(), bool cancelOnError}) {
     var pool = new _StreamPool<T>.broadcast();
     for (var target in _targetList) {
       pool.add(new _EventStream<T>(target, _eventType, _useCapture));
     }
-    return pool.stream.listen(onData, onError: onError, onDone: onDone,
-          cancelOnError: cancelOnError);
+    return pool.stream.listen(onData,
+        onError: onError, onDone: onDone, cancelOnError: cancelOnError);
   }
 
   StreamSubscription<T> capture(void onData(T event)) {
@@ -40070,9 +41379,10 @@
     return pool.stream.listen(onData);
   }
 
-  Stream<T> asBroadcastStream({void onListen(StreamSubscription<T> subscription),
-                               void onCancel(StreamSubscription<T> subscription)})
-      => this;
+  Stream<T> asBroadcastStream(
+          {void onListen(StreamSubscription<T> subscription),
+          void onCancel(StreamSubscription<T> subscription)}) =>
+      this;
   bool get isBroadcast => true;
 }
 
@@ -40096,12 +41406,11 @@
   // use a more general listener, without causing as much slowdown for things
   // which are typed correctly.  But this currently runs afoul of restrictions
   // on is checks for compatibility with the VM.
-  _EventStreamSubscription(this._target, this._eventType, void onData(T event),
-                           this._useCapture) :
-      _onData = onData == null
-      ? null
-      : _wrapZone/*<Event, dynamic>*/((e) => (onData as dynamic)(e))
-  {
+  _EventStreamSubscription(
+      this._target, this._eventType, void onData(T event), this._useCapture)
+      : _onData = onData == null
+            ? null
+            : _wrapZone/*<Event, dynamic>*/((e) => (onData as dynamic)(e)) {
     _tryResume();
   }
 
@@ -40195,16 +41504,15 @@
 
   // Delegate all regular Stream behavior to our wrapped Stream.
   StreamSubscription<T> listen(void onData(T event),
-      { Function onError,
-        void onDone(),
-        bool cancelOnError}) {
-    return _streamController.stream.listen(onData, onError: onError,
-        onDone: onDone, cancelOnError: cancelOnError);
+      {Function onError, void onDone(), bool cancelOnError}) {
+    return _streamController.stream.listen(onData,
+        onError: onError, onDone: onDone, cancelOnError: cancelOnError);
   }
 
-  Stream<T> asBroadcastStream({void onListen(StreamSubscription<T> subscription),
-                               void onCancel(StreamSubscription<T> subscription)})
-      => _streamController.stream;
+  Stream<T> asBroadcastStream(
+          {void onListen(StreamSubscription<T> subscription),
+          void onCancel(StreamSubscription<T> subscription)}) =>
+      _streamController.stream;
 
   bool get isBroadcast => true;
 
@@ -40244,8 +41552,8 @@
    * regardless of whether [stream] has any subscribers.
    */
   _StreamPool.broadcast() {
-    _controller = new StreamController<T>.broadcast(sync: true,
-        onCancel: close);
+    _controller =
+        new StreamController<T>.broadcast(sync: true, onCancel: close);
   }
 
   /**
@@ -40263,8 +41571,7 @@
   void add(Stream<T> stream) {
     if (_subscriptions.containsKey(stream)) return;
     _subscriptions[stream] = stream.listen(_controller.add,
-        onError: _controller.addError,
-        onDone: () => remove(stream));
+        onError: _controller.addError, onDone: () => remove(stream));
   }
 
   /** Removes [stream] as a member of this pool. */
@@ -40289,7 +41596,6 @@
  */
 class _CustomEventStreamProvider<T extends Event>
     implements EventStreamProvider<T> {
-
   final _eventTypeGetter;
   const _CustomEventStreamProvider(this._eventTypeGetter);
 
@@ -40301,9 +41607,9 @@
     return new _ElementEventStreamImpl<T>(e, _eventTypeGetter(e), useCapture);
   }
 
-  ElementStream<T> _forElementList(ElementList e,
-      {bool useCapture: false}) {
-    return new _ElementListEventStreamImpl<T>(e, _eventTypeGetter(e), useCapture);
+  ElementStream<T> _forElementList(ElementList e, {bool useCapture: false}) {
+    return new _ElementListEventStreamImpl<T>(
+        e, _eventTypeGetter(e), useCapture);
   }
 
   String getEventType(EventTarget target) {
@@ -40319,7 +41625,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.
 
-
 /**
  * A Dart DOM validator generated from Caja whitelists.
  *
@@ -40331,7 +41636,6 @@
  * * <https://code.google.com/p/google-caja/wiki/CajaWhitelists>
  */
 class _Html5NodeValidator implements NodeValidator {
-
   static final Set<String> _allowedElements = new Set.from([
     'A',
     'ABBR',
@@ -40724,8 +42028,7 @@
    * [uriPolicy] is null then a default UriPolicy will be used.
    */
   _Html5NodeValidator({UriPolicy uriPolicy})
-      :uriPolicy = uriPolicy != null ? uriPolicy : new UriPolicy() {
-
+      : uriPolicy = uriPolicy != null ? uriPolicy : new UriPolicy() {
     if (_attributeValidators.isEmpty) {
       for (var attr in _standardAttributes) {
         _attributeValidators[attr] = _standardAttributeValidator;
@@ -40767,7 +42070,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.
 
-
 abstract class ImmutableListMixin<E> implements List<E> {
   // From Iterable<$E>:
   Iterator<E> get iterator {
@@ -40847,7 +42149,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.
 
-
 /**
  * Defines the keycode values for keys that are returned by
  * KeyboardEvent.keyCode.
@@ -41060,13 +42361,24 @@
       return true;
     }
 
-    return (keyCode == SPACE || keyCode == QUESTION_MARK || keyCode == NUM_PLUS
-        || keyCode == NUM_MINUS || keyCode == NUM_PERIOD ||
-        keyCode == NUM_DIVISION || keyCode == SEMICOLON ||
-        keyCode == FF_SEMICOLON || keyCode == DASH || keyCode == EQUALS ||
-        keyCode == FF_EQUALS || keyCode == COMMA || keyCode == PERIOD ||
-        keyCode == SLASH || keyCode == APOSTROPHE || keyCode == SINGLE_QUOTE ||
-        keyCode == OPEN_SQUARE_BRACKET || keyCode == BACKSLASH ||
+    return (keyCode == SPACE ||
+        keyCode == QUESTION_MARK ||
+        keyCode == NUM_PLUS ||
+        keyCode == NUM_MINUS ||
+        keyCode == NUM_PERIOD ||
+        keyCode == NUM_DIVISION ||
+        keyCode == SEMICOLON ||
+        keyCode == FF_SEMICOLON ||
+        keyCode == DASH ||
+        keyCode == EQUALS ||
+        keyCode == FF_EQUALS ||
+        keyCode == COMMA ||
+        keyCode == PERIOD ||
+        keyCode == SLASH ||
+        keyCode == APOSTROPHE ||
+        keyCode == SINGLE_QUOTE ||
+        keyCode == OPEN_SQUARE_BRACKET ||
+        keyCode == BACKSLASH ||
         keyCode == CLOSE_SQUARE_BRACKET);
   }
 
@@ -41078,49 +42390,86 @@
    * follow the DOM3 spec.
    */
   static String _convertKeyCodeToKeyName(int keyCode) {
-    switch(keyCode) {
-      case KeyCode.ALT: return _KeyName.ALT;
-      case KeyCode.BACKSPACE: return _KeyName.BACKSPACE;
-      case KeyCode.CAPS_LOCK: return _KeyName.CAPS_LOCK;
-      case KeyCode.CTRL: return _KeyName.CONTROL;
-      case KeyCode.DELETE: return _KeyName.DEL;
-      case KeyCode.DOWN: return _KeyName.DOWN;
-      case KeyCode.END: return _KeyName.END;
-      case KeyCode.ENTER: return _KeyName.ENTER;
-      case KeyCode.ESC: return _KeyName.ESC;
-      case KeyCode.F1: return _KeyName.F1;
-      case KeyCode.F2: return _KeyName.F2;
-      case KeyCode.F3: return _KeyName.F3;
-      case KeyCode.F4: return _KeyName.F4;
-      case KeyCode.F5: return _KeyName.F5;
-      case KeyCode.F6: return _KeyName.F6;
-      case KeyCode.F7: return _KeyName.F7;
-      case KeyCode.F8: return _KeyName.F8;
-      case KeyCode.F9: return _KeyName.F9;
-      case KeyCode.F10: return _KeyName.F10;
-      case KeyCode.F11: return _KeyName.F11;
-      case KeyCode.F12: return _KeyName.F12;
-      case KeyCode.HOME: return _KeyName.HOME;
-      case KeyCode.INSERT: return _KeyName.INSERT;
-      case KeyCode.LEFT: return _KeyName.LEFT;
-      case KeyCode.META: return _KeyName.META;
-      case KeyCode.NUMLOCK: return _KeyName.NUM_LOCK;
-      case KeyCode.PAGE_DOWN: return _KeyName.PAGE_DOWN;
-      case KeyCode.PAGE_UP: return _KeyName.PAGE_UP;
-      case KeyCode.PAUSE: return _KeyName.PAUSE;
-      case KeyCode.PRINT_SCREEN: return _KeyName.PRINT_SCREEN;
-      case KeyCode.RIGHT: return _KeyName.RIGHT;
-      case KeyCode.SCROLL_LOCK: return _KeyName.SCROLL;
-      case KeyCode.SHIFT: return _KeyName.SHIFT;
-      case KeyCode.SPACE: return _KeyName.SPACEBAR;
-      case KeyCode.TAB: return _KeyName.TAB;
-      case KeyCode.UP: return _KeyName.UP;
+    switch (keyCode) {
+      case KeyCode.ALT:
+        return _KeyName.ALT;
+      case KeyCode.BACKSPACE:
+        return _KeyName.BACKSPACE;
+      case KeyCode.CAPS_LOCK:
+        return _KeyName.CAPS_LOCK;
+      case KeyCode.CTRL:
+        return _KeyName.CONTROL;
+      case KeyCode.DELETE:
+        return _KeyName.DEL;
+      case KeyCode.DOWN:
+        return _KeyName.DOWN;
+      case KeyCode.END:
+        return _KeyName.END;
+      case KeyCode.ENTER:
+        return _KeyName.ENTER;
+      case KeyCode.ESC:
+        return _KeyName.ESC;
+      case KeyCode.F1:
+        return _KeyName.F1;
+      case KeyCode.F2:
+        return _KeyName.F2;
+      case KeyCode.F3:
+        return _KeyName.F3;
+      case KeyCode.F4:
+        return _KeyName.F4;
+      case KeyCode.F5:
+        return _KeyName.F5;
+      case KeyCode.F6:
+        return _KeyName.F6;
+      case KeyCode.F7:
+        return _KeyName.F7;
+      case KeyCode.F8:
+        return _KeyName.F8;
+      case KeyCode.F9:
+        return _KeyName.F9;
+      case KeyCode.F10:
+        return _KeyName.F10;
+      case KeyCode.F11:
+        return _KeyName.F11;
+      case KeyCode.F12:
+        return _KeyName.F12;
+      case KeyCode.HOME:
+        return _KeyName.HOME;
+      case KeyCode.INSERT:
+        return _KeyName.INSERT;
+      case KeyCode.LEFT:
+        return _KeyName.LEFT;
+      case KeyCode.META:
+        return _KeyName.META;
+      case KeyCode.NUMLOCK:
+        return _KeyName.NUM_LOCK;
+      case KeyCode.PAGE_DOWN:
+        return _KeyName.PAGE_DOWN;
+      case KeyCode.PAGE_UP:
+        return _KeyName.PAGE_UP;
+      case KeyCode.PAUSE:
+        return _KeyName.PAUSE;
+      case KeyCode.PRINT_SCREEN:
+        return _KeyName.PRINT_SCREEN;
+      case KeyCode.RIGHT:
+        return _KeyName.RIGHT;
+      case KeyCode.SCROLL_LOCK:
+        return _KeyName.SCROLL;
+      case KeyCode.SHIFT:
+        return _KeyName.SHIFT;
+      case KeyCode.SPACE:
+        return _KeyName.SPACEBAR;
+      case KeyCode.TAB:
+        return _KeyName.TAB;
+      case KeyCode.UP:
+        return _KeyName.UP;
       case KeyCode.WIN_IME:
       case KeyCode.WIN_KEY:
       case KeyCode.WIN_KEY_LEFT:
       case KeyCode.WIN_KEY_RIGHT:
         return _KeyName.WIN;
-      default: return _KeyName.UNIDENTIFIED;
+      default:
+        return _KeyName.UNIDENTIFIED;
     }
     return _KeyName.UNIDENTIFIED;
   }
@@ -41129,13 +42478,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.
 
-
 /**
  * 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
@@ -41175,14 +42522,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.
 
-
 /**
  * Defines the standard keyboard identifier names for keys that are returned
  * by KeyboardEvent.getKeyboardIdentifier when the key does not have a direct
  * unicode mapping.
  */
 abstract class _KeyName {
-
   /** The Accept (Commit, OK) key */
   static const String ACCEPT = "Accept";
 
@@ -41289,7 +42634,7 @@
   static const String ENTER = "Enter";
 
   /** The Erase EOF key */
-  static const String ERASE_EOF= "EraseEof";
+  static const String ERASE_EOF = "EraseEof";
 
   /** The Execute key */
   static const String EXECUTE = "Execute";
@@ -41657,7 +43002,7 @@
    * The Combining Katakana-Hiragana Semi-Voiced Sound Mark (Dead Semivoiced
    * Sound) key
    */
-  static const String DEC_SEMIVOICED_SOUND= "DeadSemivoicedSound";
+  static const String DEC_SEMIVOICED_SOUND = "DeadSemivoicedSound";
 
   /**
    * Key value used when an implementation is unable to identify another key
@@ -41669,7 +43014,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.
 
-
 /**
  * Internal class that does the actual calculations to determine keyCode and
  * charCode for keydown, keypress, and keyup events for all browsers.
@@ -41732,8 +43076,8 @@
   /** Return a stream for KeyEvents for the specified target. */
   // Note: this actually functions like a factory constructor.
   CustomStream<KeyEvent> forTarget(EventTarget e, {bool useCapture: false}) {
-    var handler = new _KeyboardEventHandler.initializeAllEventListeners(
-        _type, e);
+    var handler =
+        new _KeyboardEventHandler.initializeAllEventListeners(_type, e);
     return handler._stream;
   }
 
@@ -41741,22 +43085,26 @@
    * General constructor, performs basic initialization for our improved
    * KeyboardEvent controller.
    */
-  _KeyboardEventHandler(this._type):
-      _stream = new _CustomKeyEventStreamImpl('event'), _target = null,
-      super(_EVENT_TYPE);
+  _KeyboardEventHandler(this._type)
+      : _stream = new _CustomKeyEventStreamImpl('event'),
+        _target = null,
+        super(_EVENT_TYPE);
 
   /**
    * Hook up all event listeners under the covers so we can estimate keycodes
    * and charcodes when they are not provided.
    */
-  _KeyboardEventHandler.initializeAllEventListeners(this._type, this._target) :
-      super(_EVENT_TYPE) {
-    Element.keyDownEvent.forTarget(_target, useCapture: true).listen(
-        processKeyDown);
-    Element.keyPressEvent.forTarget(_target, useCapture: true).listen(
-        processKeyPress);
-    Element.keyUpEvent.forTarget(_target, useCapture: true).listen(
-        processKeyUp);
+  _KeyboardEventHandler.initializeAllEventListeners(this._type, this._target)
+      : super(_EVENT_TYPE) {
+    Element.keyDownEvent
+        .forTarget(_target, useCapture: true)
+        .listen(processKeyDown);
+    Element.keyPressEvent
+        .forTarget(_target, useCapture: true)
+        .listen(processKeyPress);
+    Element.keyUpEvent
+        .forTarget(_target, useCapture: true)
+        .listen(processKeyUp);
     _stream = new _CustomKeyEventStreamImpl(_type);
   }
 
@@ -41778,9 +43126,11 @@
       if (prevEvent._shadowCharCode == event.charCode) {
         return prevEvent.keyCode;
       }
-      if ((event.shiftKey || _capsLockOn) && event.charCode >= "A".codeUnits[0]
-          && event.charCode <= "Z".codeUnits[0] && event.charCode +
-          _ROMAN_ALPHABET_OFFSET == prevEvent._shadowCharCode) {
+      if ((event.shiftKey || _capsLockOn) &&
+          event.charCode >= "A".codeUnits[0] &&
+          event.charCode <= "Z".codeUnits[0] &&
+          event.charCode + _ROMAN_ALPHABET_OFFSET ==
+              prevEvent._shadowCharCode) {
         return prevEvent.keyCode;
       }
     }
@@ -41794,7 +43144,8 @@
    * keypress events.
    */
   int _findCharCodeKeyDown(KeyboardEvent event) {
-    if (event.keyLocation == 3) { // Numpad keys.
+    if (event.keyLocation == 3) {
+      // Numpad keys.
       switch (event.keyCode) {
         case KeyCode.NUM_ZERO:
           // Even though this function returns _charCodes_, for some cases the
@@ -41836,7 +43187,7 @@
       // keyCode locations and other information during the keyPress event.
       return event.keyCode + _ROMAN_ALPHABET_OFFSET;
     }
-    switch(event.keyCode) {
+    switch (event.keyCode) {
       case KeyCode.SEMICOLON:
         return KeyCode.FF_SEMICOLON;
       case KeyCode.EQUALS:
@@ -41883,23 +43234,28 @@
     // Saves Ctrl or Alt + key for IE and WebKit, which won't fire keypress.
     if (!event.shiftKey &&
         (_keyDownList.last.keyCode == KeyCode.CTRL ||
-         _keyDownList.last.keyCode == KeyCode.ALT ||
-         Device.userAgent.contains('Mac') &&
-         _keyDownList.last.keyCode == KeyCode.META)) {
+            _keyDownList.last.keyCode == KeyCode.ALT ||
+            Device.userAgent.contains('Mac') &&
+                _keyDownList.last.keyCode == KeyCode.META)) {
       return false;
     }
 
     // Some keys with Ctrl/Shift do not issue keypress in WebKit.
-    if (Device.isWebKit && event.ctrlKey && event.shiftKey && (
-        event.keyCode == KeyCode.BACKSLASH ||
-        event.keyCode == KeyCode.OPEN_SQUARE_BRACKET ||
-        event.keyCode == KeyCode.CLOSE_SQUARE_BRACKET ||
-        event.keyCode == KeyCode.TILDE ||
-        event.keyCode == KeyCode.SEMICOLON || event.keyCode == KeyCode.DASH ||
-        event.keyCode == KeyCode.EQUALS || event.keyCode == KeyCode.COMMA ||
-        event.keyCode == KeyCode.PERIOD || event.keyCode == KeyCode.SLASH ||
-        event.keyCode == KeyCode.APOSTROPHE ||
-        event.keyCode == KeyCode.SINGLE_QUOTE)) {
+    if (Device.isWebKit &&
+        event.ctrlKey &&
+        event.shiftKey &&
+        (event.keyCode == KeyCode.BACKSLASH ||
+            event.keyCode == KeyCode.OPEN_SQUARE_BRACKET ||
+            event.keyCode == KeyCode.CLOSE_SQUARE_BRACKET ||
+            event.keyCode == KeyCode.TILDE ||
+            event.keyCode == KeyCode.SEMICOLON ||
+            event.keyCode == KeyCode.DASH ||
+            event.keyCode == KeyCode.EQUALS ||
+            event.keyCode == KeyCode.COMMA ||
+            event.keyCode == KeyCode.PERIOD ||
+            event.keyCode == KeyCode.SLASH ||
+            event.keyCode == KeyCode.APOSTROPHE ||
+            event.keyCode == KeyCode.SINGLE_QUOTE)) {
       return false;
     }
 
@@ -41921,7 +43277,7 @@
   int _normalizeKeyCodes(KeyboardEvent event) {
     // Note: This may change once we get input about non-US keyboards.
     if (Device.isFirefox) {
-      switch(event.keyCode) {
+      switch (event.keyCode) {
         case KeyCode.FF_EQUALS:
           return KeyCode.EQUALS;
         case KeyCode.FF_SEMICOLON:
@@ -41942,9 +43298,10 @@
     // we reset the state.
     if (_keyDownList.length > 0 &&
         (_keyDownList.last.keyCode == KeyCode.CTRL && !e.ctrlKey ||
-         _keyDownList.last.keyCode == KeyCode.ALT && !e.altKey ||
-         Device.userAgent.contains('Mac') &&
-         _keyDownList.last.keyCode == KeyCode.META && !e.metaKey)) {
+            _keyDownList.last.keyCode == KeyCode.ALT && !e.altKey ||
+            Device.userAgent.contains('Mac') &&
+                _keyDownList.last.keyCode == KeyCode.META &&
+                !e.metaKey)) {
       _keyDownList.clear();
     }
 
@@ -41955,7 +43312,8 @@
     // as much information as possible on keypress about keycode and also
     // charCode.
     event._shadowCharCode = _findCharCodeKeyDown(event);
-    if (_keyDownList.length > 0 && event.keyCode != _keyDownList.last.keyCode &&
+    if (_keyDownList.length > 0 &&
+        event.keyCode != _keyDownList.last.keyCode &&
         !_firesKeyPressEvent(event)) {
       // Some browsers have quirks not firing keypress events where all other
       // browsers do. This makes them more consistent.
@@ -42016,7 +43374,6 @@
   }
 }
 
-
 /**
  * Records KeyboardEvents that occur on a particular element, and provides a
  * stream of outgoing KeyEvents with cross-browser consistent keyCode and
@@ -42033,7 +43390,6 @@
  * possible. Bugs welcome!
  */
 class KeyboardEventStream {
-
   /** Named constructor to produce a stream for onKeyPress events. */
   static CustomStream<KeyEvent> onKeyPress(EventTarget target) =>
       new _KeyboardEventHandler('keypress').forTarget(target);
@@ -42050,7 +43406,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.
 
-
 /**
  * Class which helps construct standard node validation policies.
  *
@@ -42201,9 +43556,9 @@
       Iterable<String> uriAttributes}) {
     var tagNameUpper = tagName.toUpperCase();
     var attrs = attributes
-        ?.map /*<String>*/ ((name) => '$tagNameUpper::${name.toLowerCase()}');
+        ?.map/*<String>*/((name) => '$tagNameUpper::${name.toLowerCase()}');
     var uriAttrs = uriAttributes
-        ?.map /*<String>*/ ((name) => '$tagNameUpper::${name.toLowerCase()}');
+        ?.map/*<String>*/((name) => '$tagNameUpper::${name.toLowerCase()}');
     if (uriPolicy == null) {
       uriPolicy = new UriPolicy();
     }
@@ -42227,9 +43582,9 @@
     var baseNameUpper = baseName.toUpperCase();
     var tagNameUpper = tagName.toUpperCase();
     var attrs = attributes
-        ?.map /*<String>*/ ((name) => '$baseNameUpper::${name.toLowerCase()}');
+        ?.map/*<String>*/((name) => '$baseNameUpper::${name.toLowerCase()}');
     var uriAttrs = uriAttributes
-        ?.map /*<String>*/ ((name) => '$baseNameUpper::${name.toLowerCase()}');
+        ?.map/*<String>*/((name) => '$baseNameUpper::${name.toLowerCase()}');
     if (uriPolicy == null) {
       uriPolicy = new UriPolicy();
     }
@@ -42503,7 +43858,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.
 
-
 /**
  * Contains the set of standard values returned by HTMLDocument.getReadyState.
  */
@@ -42528,7 +43882,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.
 
-
 /**
  * A list which just wraps another list, for either intercepting list calls or
  * retyping the list (for example, from List<A> to List<B> where B extends A).
@@ -42547,25 +43900,37 @@
 
   // Collection APIs
 
-  void add(E element) { _list.add(element); }
+  void add(E element) {
+    _list.add(element);
+  }
 
   bool remove(Object element) => _list.remove(element);
 
-  void clear() { _list.clear(); }
+  void clear() {
+    _list.clear();
+  }
 
   // List APIs
 
   E operator [](int index) => _downcast/*<Node, E>*/(_list[index]);
 
-  void operator []=(int index, E value) { _list[index] = value; }
+  void operator []=(int index, E value) {
+    _list[index] = value;
+  }
 
-  set length(int newLength) { _list.length = newLength; }
+  set length(int newLength) {
+    _list.length = newLength;
+  }
 
-  void sort([int compare(E a, E b)]) { _list.sort((Node a, Node b) => compare(_downcast/*<Node, E>*/(a), _downcast/*<Node, E>*/(b))); }
+  void sort([int compare(E a, E b)]) {
+    _list.sort((Node a, Node b) =>
+        compare(_downcast/*<Node, E>*/(a), _downcast/*<Node, E>*/(b)));
+  }
 
   int indexOf(Object element, [int start = 0]) => _list.indexOf(element, start);
 
-  int lastIndexOf(Object element, [int start]) => _list.lastIndexOf(element, start);
+  int lastIndexOf(Object element, [int start]) =>
+      _list.lastIndexOf(element, start);
 
   void insert(int index, E element) => _list.insert(index, element);
 
@@ -42575,7 +43940,9 @@
     _list.setRange(start, end, iterable, skipCount);
   }
 
-  void removeRange(int start, int end) { _list.removeRange(start, end); }
+  void removeRange(int start, int end) {
+    _list.removeRange(start, end);
+  }
 
   void replaceRange(int start, int end, Iterable<E> iterable) {
     _list.replaceRange(start, end, iterable);
@@ -42604,18 +43971,15 @@
 }
 
 // ignore: STRONG_MODE_DOWN_CAST_COMPOSITE
-/*=To*/ _downcast/*<From, To extends From>*/(dynamic /*=From*/ x) => x;
+/*=To*/ _downcast/*<From, To extends From>*/(dynamic/*=From*/ x) => 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.
 
-
 class _HttpRequestUtils {
-
   // Helper for factory HttpRequest.get
-  static HttpRequest get(String url,
-                            onComplete(HttpRequest request),
-                            bool withCredentials) {
+  static HttpRequest get(
+      String url, onComplete(HttpRequest request), bool withCredentials) {
     final request = new HttpRequest();
     request.open('GET', url, async: true);
 
@@ -42636,14 +44000,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.
 
-
 // Iterator for arrays with fixed size.
 class FixedSizeListIterator<T> implements Iterator<T> {
   final List<T> _array;
-  final int _length;  // Cache array length for faster access.
+  final int _length; // Cache array length for faster access.
   int _position;
   T _current;
-  
+
   FixedSizeListIterator(List<T> array)
       : _array = array,
         _position = -1,
@@ -42692,14 +44055,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.
 
-
 // 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.
 
-
 WindowBase _convertNativeToDart_Window(win) {
   if (win == null) return null;
   return _DOMWindowCrossFrame._createSafe(win);
@@ -42719,8 +44080,7 @@
       return window;
     }
     return null;
-  }
-  else
+  } else
     return e;
 }
 
@@ -42742,7 +44102,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.
 
-
 _callConstructor(constructor, interceptor) {
   return (receiver) {
     setNativeSubclassDispatchRecord(receiver, interceptor);
@@ -42762,12 +44121,14 @@
 _callDetached(receiver) {
   return receiver.detached();
 }
- _callAttributeChanged(receiver, name, oldValue, newValue) {
+
+_callAttributeChanged(receiver, name, oldValue, newValue) {
   return receiver.attributeChanged(name, oldValue, newValue);
 }
 
 _makeCallbackMethod(callback) {
-  return JS('',
+  return JS(
+      '',
       '''((function(invokeCallback) {
              return function() {
                return invokeCallback(this);
@@ -42777,7 +44138,8 @@
 }
 
 _makeCallbackMethod3(callback) {
-  return JS('',
+  return JS(
+      '',
       '''((function(invokeCallback) {
              return function(arg1, arg2, arg3) {
                return invokeCallback(this, arg1, arg2, arg3);
@@ -42786,8 +44148,8 @@
       convertDartClosureToJS(callback, 4));
 }
 
-void _registerCustomElement(context, document, String tag, Type type,
-    String extendsTagName) {
+void _registerCustomElement(
+    context, document, String tag, Type type, String extendsTagName) {
   // Function follows the same pattern as the following JavaScript code for
   // registering a custom element.
   //
@@ -42829,8 +44191,8 @@
           'native class is not HtmlElement');
     }
   } else {
-    if (!JS('bool', '(#.createElement(#) instanceof window[#])',
-        document, extendsTagName, baseClassName)) {
+    if (!JS('bool', '(#.createElement(#) instanceof window[#])', document,
+        extendsTagName, baseClassName)) {
       throw new UnsupportedError('extendsTag does not match base native class');
     }
   }
@@ -42839,7 +44201,10 @@
 
   var properties = JS('=Object', '{}');
 
-  JS('void', '#.createdCallback = #', properties,
+  JS(
+      'void',
+      '#.createdCallback = #',
+      properties,
       JS('=Object', '{value: #}',
           _makeCallbackMethod(_callConstructor(constructor, interceptor))));
   JS('void', '#.attachedCallback = #', properties,
@@ -42902,8 +44267,7 @@
       _nativeType = HtmlElement;
     } else {
       var element = document.createElement(extendsTag);
-      if (!JS('bool', '(# instanceof window[#])',
-          element, baseClassName)) {
+      if (!JS('bool', '(# instanceof window[#])', element, baseClassName)) {
         throw new UnsupportedError(
             'extendsTag does not match base native class');
       }
@@ -42928,7 +44292,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.
 
-
 // TODO(vsm): Unify with Dartium version.
 class _DOMWindowCrossFrame implements WindowBase {
   // Private window.  Note, this is a window in another frame, so it
@@ -42938,9 +44301,9 @@
 
   // Fields.
   HistoryBase get history =>
-    _HistoryCrossFrame._createSafe(JS('HistoryBase', '#.history', _window));
-  LocationBase get location =>
-    _LocationCrossFrame._createSafe(JS('LocationBase', '#.location', _window));
+      _HistoryCrossFrame._createSafe(JS('HistoryBase', '#.history', _window));
+  LocationBase get location => _LocationCrossFrame
+      ._createSafe(JS('LocationBase', '#.location', _window));
 
   // TODO(vsm): Add frames to navigate subframes.  See 2312.
 
@@ -42955,13 +44318,18 @@
   // Methods.
   void close() => JS('void', '#.close()', _window);
 
-  void postMessage(var message, String targetOrigin, [List messagePorts = null]) {
+  void postMessage(var message, String targetOrigin,
+      [List messagePorts = null]) {
     if (messagePorts == null) {
       JS('void', '#.postMessage(#,#)', _window,
           convertDartToNative_SerializedScriptValue(message), targetOrigin);
     } else {
-      JS('void', '#.postMessage(#,#,#)', _window,
-          convertDartToNative_SerializedScriptValue(message), targetOrigin,
+      JS(
+          'void',
+          '#.postMessage(#,#,#)',
+          _window,
+          convertDartToNative_SerializedScriptValue(message),
+          targetOrigin,
           messagePorts);
     }
   }
@@ -42980,25 +44348,29 @@
 
   // TODO(efortuna): Remove this method. dartbug.com/16814
   Events get on => throw new UnsupportedError(
-    'You can only attach EventListeners to your own window.');
+      'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
-  void _addEventListener(String type, EventListener listener, [bool useCapture])
-      => throw new UnsupportedError(
-    'You can only attach EventListeners to your own window.');
+  void _addEventListener(String type, EventListener listener,
+          [bool useCapture]) =>
+      throw new UnsupportedError(
+          'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
-  void addEventListener(String type, EventListener listener, [bool useCapture])
-      => throw new UnsupportedError(
-        'You can only attach EventListeners to your own window.');
+  void addEventListener(String type, EventListener listener,
+          [bool useCapture]) =>
+      throw new UnsupportedError(
+          'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
   bool dispatchEvent(Event event) => throw new UnsupportedError(
-    'You can only attach EventListeners to your own window.');
+      'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
   void _removeEventListener(String type, EventListener listener,
-      [bool useCapture]) => throw new UnsupportedError(
-    'You can only attach EventListeners to your own window.');
+          [bool useCapture]) =>
+      throw new UnsupportedError(
+          'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
   void removeEventListener(String type, EventListener listener,
-      [bool useCapture]) => throw new UnsupportedError(
+          [bool useCapture]) =>
+      throw new UnsupportedError(
           'You can only attach EventListeners to your own window.');
 }
 
@@ -43050,6 +44422,7 @@
     }
   }
 }
+
 /**
  * A custom KeyboardEvent that attempts to eliminate cross-browser
  * inconsistencies, and also provide both keyCode and charCode information
@@ -43128,7 +44501,7 @@
   }
 
   /** Construct a KeyEvent with [parent] as the event we're emulating. */
-  KeyEvent.wrap(KeyboardEvent parent): super(parent) {
+  KeyEvent.wrap(KeyboardEvent parent) : super(parent) {
     _parent = parent;
     _shadowAltKey = _realAltKey;
     _shadowCharCode = _realCharCode;
@@ -43138,9 +44511,16 @@
 
   /** Programmatically create a new KeyEvent (and KeyboardEvent). */
   factory KeyEvent(String type,
-      {Window view, bool canBubble: true, bool cancelable: true, int keyCode: 0,
-      int charCode: 0, int keyLocation: 1, bool ctrlKey: false,
-      bool altKey: false, bool shiftKey: false, bool metaKey: false,
+      {Window view,
+      bool canBubble: true,
+      bool cancelable: true,
+      int keyCode: 0,
+      int charCode: 0,
+      int keyLocation: 1,
+      bool ctrlKey: false,
+      bool altKey: false,
+      bool shiftKey: false,
+      bool metaKey: false,
       EventTarget currentTarget}) {
     if (view == null) {
       view = window;
@@ -43180,12 +44560,21 @@
           canBubble: canBubble, cancelable: cancelable);
 
       // Chromium Hack
-      JS('void', "Object.defineProperty(#, 'keyCode', {"
-          "  get : function() { return this.keyCodeVal; } })",  eventObj);
-      JS('void', "Object.defineProperty(#, 'which', {"
-          "  get : function() { return this.keyCodeVal; } })",  eventObj);
-      JS('void', "Object.defineProperty(#, 'charCode', {"
-          "  get : function() { return this.charCodeVal; } })",  eventObj);
+      JS(
+          'void',
+          "Object.defineProperty(#, 'keyCode', {"
+          "  get : function() { return this.keyCodeVal; } })",
+          eventObj);
+      JS(
+          'void',
+          "Object.defineProperty(#, 'which', {"
+          "  get : function() { return this.keyCodeVal; } })",
+          eventObj);
+      JS(
+          'void',
+          "Object.defineProperty(#, 'charCode', {"
+          "  get : function() { return this.charCodeVal; } })",
+          eventObj);
 
       var keyIdentifier = _convertToHexString(charCode, keyCode);
       eventObj._initKeyboardEvent(type, canBubble, cancelable, view,
@@ -43204,10 +44593,10 @@
   }
 
   // Currently known to work on all browsers but IE.
-  static bool get canUseDispatchEvent =>
-      JS('bool',
-         '(typeof document.body.dispatchEvent == "function")'
-         '&& document.body.dispatchEvent.length > 0');
+  static bool get canUseDispatchEvent => JS(
+      'bool',
+      '(typeof document.body.dispatchEvent == "function")'
+      '&& document.body.dispatchEvent.length > 0');
 
   /** The currently registered target for this event. */
   EventTarget get currentTarget => _currentTarget;
@@ -43254,10 +44643,11 @@
   bool get shiftKey => _parent.shiftKey;
   InputDevice get sourceDevice => _parent.sourceDevice;
   Window get view => _parent.view;
-  void _initUIEvent(String type, bool canBubble, bool cancelable,
-      Window view, int detail) {
+  void _initUIEvent(
+      String type, bool canBubble, bool cancelable, Window view, int detail) {
     throw new UnsupportedError("Cannot initialize a UI Event from a KeyEvent.");
   }
+
   String get _shadowKeyIdentifier => JS('String', '#.keyIdentifier', _parent);
 
   int get _charCode => charCode;
@@ -43267,12 +44657,22 @@
   String get _keyIdentifier {
     throw new UnsupportedError("keyIdentifier is unsupported.");
   }
-  void _initKeyboardEvent(String type, bool canBubble, bool cancelable,
-      Window view, String keyIdentifier, int keyLocation, bool ctrlKey,
-      bool altKey, bool shiftKey, bool metaKey) {
+
+  void _initKeyboardEvent(
+      String type,
+      bool canBubble,
+      bool cancelable,
+      Window view,
+      String keyIdentifier,
+      int keyLocation,
+      bool ctrlKey,
+      bool altKey,
+      bool shiftKey,
+      bool metaKey) {
     throw new UnsupportedError(
         "Cannot initialize a KeyboardEvent from a KeyEvent.");
   }
+
   @Experimental() // untriaged
   bool getModifierState(String keyArgument) => throw new UnimplementedError();
   @Experimental() // untriaged
@@ -43285,7 +44685,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.
 
-
 class Platform {
   /**
    * Returns true if dart:typed_data types are supported on this
@@ -43305,7 +44704,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.
 
-
 /**
  * Helper class to implement custom events which wrap DOM events.
  */
@@ -43333,10 +44731,8 @@
 
   String get type => wrapped.type;
 
-  void _initEvent(String eventTypeArg, bool canBubbleArg,
-      bool cancelableArg) {
-    throw new UnsupportedError(
-        'Cannot initialize this Event.');
+  void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) {
+    throw new UnsupportedError('Cannot initialize this Event.');
   }
 
   void preventDefault() {
@@ -43392,22 +44788,24 @@
 // for 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): remove these typedefs when dart:async supports generic types.
 typedef R _wrapZoneCallback<A, R>(A a);
 typedef R _wrapZoneBinaryCallback<A, B, R>(A a, B b);
 
-_wrapZoneCallback/*<A, R>*/ _wrapZone/*<A, R>*/(_wrapZoneCallback/*<A, R>*/ callback) {
+_wrapZoneCallback/*<A, R>*/ _wrapZone/*<A, R>*/(
+    _wrapZoneCallback/*<A, R>*/ callback) {
   // For performance reasons avoid wrapping if we are in the root zone.
   if (Zone.current == Zone.ROOT) return callback;
   if (callback == null) return null;
   return Zone.current.bindUnaryCallback/*<R, A>*/(callback, runGuarded: true);
 }
 
-_wrapZoneBinaryCallback/*<A, B, R>*/ _wrapBinaryZone/*<A, B, R>*/(_wrapZoneBinaryCallback/*<A, B, R>*/ callback) {
+_wrapZoneBinaryCallback/*<A, B, R>*/ _wrapBinaryZone/*<A, B, R>*/(
+    _wrapZoneBinaryCallback/*<A, B, R>*/ callback) {
   if (Zone.current == Zone.ROOT) return callback;
   if (callback == null) return null;
-  return Zone.current.bindBinaryCallback/*<R, A, B>*/(callback, runGuarded: true);
+  return Zone.current
+      .bindBinaryCallback/*<R, A, B>*/(callback, runGuarded: true);
 }
 
 /**
@@ -43423,7 +44821,8 @@
  */
 @deprecated
 @Experimental()
-ElementList<Element> queryAll(String relativeSelectors) => document.queryAll(relativeSelectors);
+ElementList<Element> queryAll(String relativeSelectors) =>
+    document.queryAll(relativeSelectors);
 
 /**
  * Finds the first descendant element of this document that matches the
@@ -43460,7 +44859,8 @@
  * For details about CSS selector syntax, see the
  * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
  */
-ElementList<Element> querySelectorAll(String selectors) => document.querySelectorAll(selectors);
+ElementList<Element> querySelectorAll(String selectors) =>
+    document.querySelectorAll(selectors);
 
 /// A utility for changing the Dart wrapper type for elements.
 abstract class ElementUpgrader {
@@ -43474,8 +44874,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.
 
-
-
 /**
  * Interface used to validate that only accepted elements and attributes are
  * allowed while parsing HTML strings into DOM nodes.
@@ -43485,7 +44883,6 @@
  * implementing validation rules.
  */
 abstract class NodeValidator {
-
   /**
    * Construct a default NodeValidator which only accepts whitelisted HTML5
    * elements and attributes.
@@ -43523,7 +44920,6 @@
  * tree sanitization.
  */
 abstract class NodeTreeSanitizer {
-
   /**
    * Constructs a default tree sanitizer which will remove all elements and
    * attributes which are not allowed by the provided validator.
@@ -43596,15 +44992,14 @@
     _hiddenAnchor.href = uri;
     // IE leaves an empty hostname for same-origin URIs.
     return (_hiddenAnchor.hostname == _loc.hostname &&
-        _hiddenAnchor.port == _loc.port &&
-        _hiddenAnchor.protocol == _loc.protocol) ||
+            _hiddenAnchor.port == _loc.port &&
+            _hiddenAnchor.protocol == _loc.protocol) ||
         (_hiddenAnchor.hostname == '' &&
-        _hiddenAnchor.port == '' &&
-        (_hiddenAnchor.protocol == ':' || _hiddenAnchor.protocol == ''));
+            _hiddenAnchor.port == '' &&
+            (_hiddenAnchor.protocol == ':' || _hiddenAnchor.protocol == ''));
   }
 }
 
-
 class _ThrowsNodeValidator implements NodeValidator {
   final NodeValidator validator;
 
@@ -43619,12 +45014,12 @@
 
   bool allowsAttribute(Element element, String attributeName, String value) {
     if (!validator.allowsAttribute(element, attributeName, value)) {
-      throw new ArgumentError('${Element._safeTagName(element)}[$attributeName="$value"]');
+      throw new ArgumentError(
+          '${Element._safeTagName(element)}[$attributeName="$value"]');
     }
   }
 }
 
-
 /**
  * Standard tree sanitizer which validates a node tree against the provided
  * validator and removes any nodes or attributes which are not allowed.
@@ -43645,6 +45040,7 @@
         child = nextChild;
       }
     }
+
     walk(node, null);
   }
 
@@ -43685,19 +45081,23 @@
       // On IE, erratically, the hasCorruptedAttributes test can return false,
       // even though it clearly is corrupted. A separate copy of the test
       // inlining just the basic check seems to help.
-      corrupted = corruptedTest1 ? true : Element._hasCorruptedAttributesAdditionalCheck(element);
-    } catch(e) {}
+      corrupted = corruptedTest1
+          ? true
+          : Element._hasCorruptedAttributesAdditionalCheck(element);
+    } catch (e) {}
     var elementText = 'element unprintable';
     try {
       elementText = element.toString();
-    } catch(e) {}
+    } catch (e) {}
     try {
       var elementTagName = Element._safeTagName(element);
       _sanitizeElement(element, parent, corrupted, elementText, elementTagName,
           attrs, isAttr);
-    } on ArgumentError { // Thrown by _ThrowsNodeValidator
+    } on ArgumentError {
+      // Thrown by _ThrowsNodeValidator
       rethrow;
-    } catch(e) {  // Unexpected exception sanitizing -> remove
+    } catch (e) {
+      // Unexpected exception sanitizing -> remove
       _removeNode(element, parent);
       window.console.warn('Removing corrupted element $elementText');
     }
@@ -43709,15 +45109,14 @@
   void _sanitizeElement(Element element, Node parent, bool corrupted,
       String text, String tag, Map attrs, String isAttr) {
     if (false != corrupted) {
-       _removeNode(element, parent);
-      window.console.warn(
-          'Removing element due to corrupted attributes on <$text>');
-       return;
+      _removeNode(element, parent);
+      window.console
+          .warn('Removing element due to corrupted attributes on <$text>');
+      return;
     }
     if (!validator.allowsElement(element)) {
       _removeNode(element, parent);
-      window.console.warn(
-          'Removing disallowed element <$tag> from $parent');
+      window.console.warn('Removing disallowed element <$tag> from $parent');
       return;
     }
 
@@ -43735,8 +45134,8 @@
     var keys = attrs.keys.toList();
     for (var i = attrs.length - 1; i >= 0; --i) {
       var name = keys[i];
-      if (!validator.allowsAttribute(element, name.toLowerCase(),
-          attrs[name])) {
+      if (!validator.allowsAttribute(
+          element, name.toLowerCase(), attrs[name])) {
         window.console.warn('Removing disallowed attribute '
             '<$tag $name="${attrs[name]}">');
         attrs.remove(name);
@@ -43746,7 +45145,7 @@
     if (element is TemplateElement) {
       TemplateElement template = element;
       sanitizeTree(template.content);
-     }
+    }
   }
 
   /// Sanitize the node and its children recursively.
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/conversions.dart b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/conversions.dart
index 4b2cff3..22f0181 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/conversions.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/conversions.dart
@@ -2,7 +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.
 
-
 // Conversions for IDBKey.
 //
 // Per http://www.w3.org/TR/IndexedDB/#key-construct
@@ -39,7 +38,6 @@
   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.
@@ -57,10 +55,9 @@
  * its output, the result may share structure with the input [value].
  */
 abstract class _StructuredClone {
-
   // TODO(sra): Replace slots with identity hash table.
   var values = [];
-  var copies = [];  // initially 'null', 'true' during initial DFS, then a copy.
+  var copies = []; // initially 'null', 'true' during initial DFS, then a copy.
 
   int findSlot(value) {
     int length = values.length;
@@ -71,9 +68,13 @@
     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.
+  writeSlot(int i, x) {
+    copies[i] = x;
+  }
+
+  cleanupSlots() {} // Will be needed if we mark objects with a property.
   bool cloneNotRequired(object);
   newJsMap();
   List newJsList(length);
@@ -141,7 +142,7 @@
     int length = e.length;
     var copy = newJsList(length);
     writeSlot(slot, copy);
-    for ( ; i < length; i++) {
+    for (; i < length; i++) {
       copy[i] = walk(e[i]);
     }
     return copy;
@@ -173,10 +174,9 @@
  * the value as seen from the JavaScript listeners.
  */
 abstract class _AcceptStructuredClone {
-
   // TODO(sra): Replace slots with identity hash table.
   var values = [];
-  var copies = [];  // initially 'null', 'true' during initial DFS, then a copy.
+  var copies = []; // initially 'null', 'true' during initial DFS, then a copy.
   bool mustCopy = false;
 
   int findSlot(value) {
@@ -193,7 +193,9 @@
   /// wrappers may not be identical, but their underlying Js Object might be.
   bool identicalInJs(a, b);
   readSlot(int i) => copies[i];
-  writeSlot(int i, x) { copies[i] = x; }
+  writeSlot(int i, x) {
+    copies[i] = x;
+  }
 
   /// Iterate over the JS properties.
   forEachJsField(object, action(key, value));
@@ -276,9 +278,14 @@
   bool stencil;
   bool failIfMajorPerformanceCaveat;
 
-  ContextAttributes(this.alpha, this.antialias, this.depth,
-      this.failIfMajorPerformanceCaveat, this.premultipliedAlpha,
-      this.preserveDrawingBuffer, this.stencil);
+  ContextAttributes(
+      this.alpha,
+      this.antialias,
+      this.depth,
+      this.failIfMajorPerformanceCaveat,
+      this.premultipliedAlpha,
+      this.preserveDrawingBuffer,
+      this.stencil);
 }
 
 convertNativeToDart_ContextAttributes(nativeContextAttributes) {
@@ -308,7 +315,6 @@
 }
 
 ImageData convertNativeToDart_ImageData(nativeImageData) {
-
   // None of the native getters that return ImageData are declared as returning
   // [ImageData] since that is incorrect for FireFox, which returns a plain
   // Object.  So we need something that tells the compiler that the ImageData
@@ -318,7 +324,6 @@
   JS('ImageData', '0');
 
   if (nativeImageData is ImageData) {
-
     // Fix for Issue 16069: on IE, the `data` field is a CanvasPixelArray which
     // has Array as the constructor property.  This interferes with finding the
     // correct interceptor.  Fix it by overwriting the constructor property.
@@ -347,14 +352,13 @@
 // with native names.
 convertDartToNative_ImageData(ImageData imageData) {
   if (imageData is _TypedImageData) {
-    return JS('', '{data: #, height: #, width: #}',
-        imageData.data, imageData.height, imageData.width);
+    return JS('', '{data: #, height: #, width: #}', imageData.data,
+        imageData.height, imageData.width);
   }
   return imageData;
 }
 
-const String _serializedScriptValue =
-    'num|String|bool|'
+const String _serializedScriptValue = 'num|String|bool|'
     'JSExtendableArray|=Object|'
     'Blob|File|NativeByteBuffer|NativeTypedData'
     // TODO(sra): Add Date, RegExp.
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/conversions_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/conversions_dart2js.dart
index 3cab380..0f146d7 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/conversions_dart2js.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/conversions_dart2js.dart
@@ -20,12 +20,11 @@
     postCreate(object);
   }
   dict.forEach((String key, value) {
-      JS('void', '#[#] = #', object, key, value);
-    });
+    JS('void', '#[#] = #', object, key, value);
+  });
   return object;
 }
 
-
 /**
  * Ensures that the input is a JavaScript Array.
  *
@@ -46,10 +45,12 @@
 }
 
 convertDartToNative_PrepareForStructuredClone(value) =>
-    new _StructuredCloneDart2Js().convertDartToNative_PrepareForStructuredClone(value);
+    new _StructuredCloneDart2Js()
+        .convertDartToNative_PrepareForStructuredClone(value);
 
 convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false}) =>
-    new _AcceptStructuredCloneDart2Js().convertNativeToDart_AcceptStructuredClone(object, mustCopy: mustCopy);
+    new _AcceptStructuredCloneDart2Js()
+        .convertNativeToDart_AcceptStructuredClone(object, mustCopy: mustCopy);
 
 class _StructuredCloneDart2Js extends _StructuredClone {
   newJsMap() => JS('var', '{}');
@@ -59,15 +60,14 @@
 }
 
 class _AcceptStructuredCloneDart2Js extends _AcceptStructuredClone {
-
   List newJsList(length) => JS('JSExtendableArray', 'new Array(#)', length);
   List newDartList(length) => newJsList(length);
   bool identicalInJs(a, b) => identical(a, b);
 
   void forEachJsField(object, action(key, value)) {
-      for (final key in JS('JSExtendableArray', 'Object.keys(#)', object)) {
-        action(key, JS('var', '#[#]', object, key));
-      }
+    for (final key in JS('JSExtendableArray', 'Object.keys(#)', object)) {
+      action(key, JS('var', '#[#]', object, key));
+    }
   }
 }
 
@@ -79,6 +79,7 @@
   return JS('bool', '# === Object.prototype', proto) ||
       JS('bool', '# === null', proto);
 }
+
 bool isImmutableJavaScriptArray(value) =>
     JS('bool', r'!!(#.immutable$list)', value);
 bool isJavaScriptPromise(value) =>
@@ -87,7 +88,8 @@
 Future convertNativePromiseToDartFuture(promise) {
   var completer = new Completer();
   var then = convertDartClosureToJS((result) => completer.complete(result), 1);
-  var error = convertDartClosureToJS((result) => completer.completeError(result), 1);
+  var error =
+      convertDartClosureToJS((result) => completer.completeError(result), 1);
   var newPromise = JS('', '#.then(#)["catch"](#)', promise, then, error);
   return completer.future;
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/css_class_set.dart b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/css_class_set.dart
index 3e72600..61b9863 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/css_class_set.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/css_class_set.dart
@@ -5,7 +5,6 @@
 part of html_common;
 
 abstract class CssClassSetImpl implements CssClassSet {
-
   static final RegExp _validTokenRE = new RegExp(r'^\S+$');
 
   String _validateToken(String value) {
@@ -56,8 +55,7 @@
 
   String join([String separator = ""]) => readClasses().join(separator);
 
-  Iterable/*<T>*/ map/*<T>*/(/*=T*/ f(String e)) =>
-      readClasses().map/*<T>*/(f);
+  Iterable/*<T>*/ map/*<T>*/(/*=T*/ f(String e)) => readClasses().map/*<T>*/(f);
 
   Iterable<String> where(bool f(String element)) => readClasses().where(f);
 
@@ -178,21 +176,19 @@
   }
 
   bool containsAll(Iterable<Object> collection) =>
-    readClasses().containsAll(collection);
+      readClasses().containsAll(collection);
 
   Set<String> intersection(Set<Object> other) =>
-    readClasses().intersection(other);
+      readClasses().intersection(other);
 
-  Set<String> union(Set<String> other) =>
-    readClasses().union(other);
+  Set<String> union(Set<String> other) => readClasses().union(other);
 
-  Set<String> difference(Set<Object> other) =>
-    readClasses().difference(other);
+  Set<String> difference(Set<Object> other) => readClasses().difference(other);
 
   String get first => readClasses().first;
   String get last => readClasses().last;
   String get single => readClasses().single;
-  List<String> toList({ bool growable: true }) =>
+  List<String> toList({bool growable: true}) =>
       readClasses().toList(growable: growable);
   Set<String> toSet() => readClasses().toSet();
   Iterable<String> take(int n) => readClasses().take(n);
@@ -201,9 +197,9 @@
   Iterable<String> skip(int n) => readClasses().skip(n);
   Iterable<String> skipWhile(bool test(String value)) =>
       readClasses().skipWhile(test);
-  String firstWhere(bool test(String value), { String orElse() }) =>
+  String firstWhere(bool test(String value), {String orElse()}) =>
       readClasses().firstWhere(test, orElse: orElse);
-  String lastWhere(bool test(String value), { String orElse()}) =>
+  String lastWhere(bool test(String value), {String orElse()}) =>
       readClasses().lastWhere(test, orElse: orElse);
   String singleWhere(bool test(String value)) =>
       readClasses().singleWhere(test);
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/device.dart b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/device.dart
index d36339b..123a5db 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/device.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/device.dart
@@ -106,7 +106,7 @@
     try {
       var e = new Event.eventType(eventType, '');
       return e is Event;
-    } catch (_) { }
+    } catch (_) {}
     return false;
   }
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/filtered_element_list.dart b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/filtered_element_list.dart
index d4d40ae..f70d820 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/filtered_element_list.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/filtered_element_list.dart
@@ -26,8 +26,9 @@
 
   // We can't memoize this, since it's possible that children will be messed
   // with externally to this class.
-  Iterable<Element> get _iterable =>
-      _childNodes.where((n) => n is Element).map/*<Element>*/((n) => n as Element);
+  Iterable<Element> get _iterable => _childNodes
+      .where((n) => n is Element)
+      .map/*<Element>*/((n) => n as Element);
   List<Element> get _filtered =>
       new List<Element>.from(_iterable, growable: false);
 
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/html_common.dart b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/html_common.dart
index c2e1644..7e7bbcc 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/html_common.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/html_common.dart
@@ -1,4 +1,3 @@
-
 // for 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/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/lists.dart b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/lists.dart
index f33d64a..c7abc41 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/lists.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/lists.dart
@@ -5,16 +5,12 @@
 part of html_common;
 
 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) {
+  static int indexOf(List a, Object element, int startIndex, int endIndex) {
     if (startIndex >= a.length) {
       return -1;
     }
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/metadata.dart b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/metadata.dart
index 9b0e56d..b5542dc 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/metadata.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/html/html_common/metadata.dart
@@ -20,6 +20,7 @@
 
   /// The name of the browser.
   final String browserName;
+
   /// The minimum version of the browser that supports the feature, or null
   /// if supported on all versions.
   final String minimumVersion;
@@ -27,7 +28,6 @@
   const SupportedBrowser(this.browserName, [this.minimumVersion]);
 }
 
-
 /**
  * An annotation used to mark an API as being experimental.
  *
@@ -42,7 +42,6 @@
   const Experimental();
 }
 
-
 /**
  * Annotation that specifies that a member is editable through generate files.
  *
@@ -55,7 +54,6 @@
   const DomName(this.name);
 }
 
-
 /**
  * Metadata that specifies that that member is editable through generated
  * files.
@@ -64,7 +62,6 @@
   const DocsEditable();
 }
 
-
 /**
  * Annotation that indicates that an API is not expected to change but has
  * not undergone enough testing to be considered stable.
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index 65ebfc6..001b219 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -88,27 +88,24 @@
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:svg library.
 
-
-
-
-
 class _KeyRangeFactoryProvider {
-
   static KeyRange createKeyRange_only(/*Key*/ value) =>
       _only(_class(), _translateKey(value));
 
   static KeyRange createKeyRange_lowerBound(
-      /*Key*/ bound, [bool open = false]) =>
+          /*Key*/ bound,
+          [bool open = false]) =>
       _lowerBound(_class(), _translateKey(bound), open);
 
   static KeyRange createKeyRange_upperBound(
-      /*Key*/ bound, [bool open = false]) =>
+          /*Key*/ bound,
+          [bool open = false]) =>
       _upperBound(_class(), _translateKey(bound), open);
 
   static KeyRange createKeyRange_bound(/*Key*/ lower, /*Key*/ upper,
-      [bool lowerOpen = false, bool upperOpen = false]) =>
-      _bound(_class(), _translateKey(lower), _translateKey(upper),
-             lowerOpen, upperOpen);
+          [bool lowerOpen = false, bool upperOpen = false]) =>
+      _bound(_class(), _translateKey(lower), _translateKey(upper), lowerOpen,
+          upperOpen);
 
   static var _cachedClass;
 
@@ -117,25 +114,29 @@
     return _cachedClass = _uncachedClass();
   }
 
-  static _uncachedClass() =>
-    JS('var',
-       '''window.webkitIDBKeyRange || window.mozIDBKeyRange ||
+  static _uncachedClass() => JS(
+      'var',
+      '''window.webkitIDBKeyRange || window.mozIDBKeyRange ||
           window.msIDBKeyRange || window.IDBKeyRange''');
 
-  static _translateKey(idbkey) => idbkey;  // TODO: fixme.
+  static _translateKey(idbkey) => idbkey; // TODO: fixme.
 
-  static KeyRange _only(cls, value) =>
-       JS('KeyRange', '#.only(#)', cls, value);
+  static KeyRange _only(cls, value) => JS('KeyRange', '#.only(#)', cls, value);
 
   static KeyRange _lowerBound(cls, bound, open) =>
-       JS('KeyRange', '#.lowerBound(#, #)', cls, bound, open);
+      JS('KeyRange', '#.lowerBound(#, #)', cls, bound, open);
 
   static KeyRange _upperBound(cls, bound, open) =>
-       JS('KeyRange', '#.upperBound(#, #)', cls, bound, open);
+      JS('KeyRange', '#.upperBound(#, #)', cls, bound, open);
 
-  static KeyRange _bound(cls, lower, upper, lowerOpen, upperOpen) =>
-       JS('KeyRange', '#.bound(#, #, #, #)',
-          cls, lower, upper, lowerOpen, upperOpen);
+  static KeyRange _bound(cls, lower, upper, lowerOpen, upperOpen) => JS(
+      'KeyRange',
+      '#.bound(#, #, #, #)',
+      cls,
+      lower,
+      upper,
+      lowerOpen,
+      upperOpen);
 }
 
 // Conversions for IDBKey.
@@ -155,7 +156,6 @@
 // What is required is to ensure that an Lists in the key are actually
 // JavaScript arrays, and any Dates are JavaScript Dates.
 
-
 /**
  * Converts a native IDBKey into a Dart object.
  *
@@ -173,8 +173,9 @@
         if (containsDate(object[i])) return true;
       }
     }
-    return false;  // number, string.
+    return false; // number, string.
   }
+
   if (containsDate(nativeKey)) {
     throw new UnimplementedError('Key containing DateTime');
   }
@@ -195,8 +196,6 @@
   return dartKey;
 }
 
-
-
 /// May modify original.  If so, action is idempotent.
 _convertNativeToDart_IDBAny(object) {
   return convertNativeToDart_AcceptStructuredClone(object, mustCopy: false);
@@ -210,14 +209,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.
 
-
 @DomName('IDBCursor')
 @Unstable()
 @Native("IDBCursor")
 class Cursor extends Interceptor {
   @DomName('IDBCursor.delete')
   Future delete() {
-   try {
+    try {
       return _completeRequest(_delete());
     } catch (e, stacktrace) {
       return new Future.error(e, stacktrace);
@@ -226,7 +224,7 @@
 
   @DomName('IDBCursor.value')
   Future update(value) {
-   try {
+    try {
       return _completeRequest(_update(value));
     } catch (e, stacktrace) {
       return new Future.error(e, stacktrace);
@@ -242,8 +240,11 @@
       JS('void', '#.continue(#)', this, key);
     }
   }
-    // To suppress missing implicit constructor warnings.
-  factory Cursor._() { throw new UnsupportedError("Not supported"); }
+
+  // To suppress missing implicit constructor warnings.
+  factory Cursor._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('IDBCursor.direction')
   @DocsEditable()
@@ -269,17 +270,17 @@
 
   @DomName('IDBCursor.advance')
   @DocsEditable()
-  void advance(int count) native;
+  void advance(int count) native ;
 
   @DomName('IDBCursor.continuePrimaryKey')
   @DocsEditable()
   @Experimental() // untriaged
-  void continuePrimaryKey(Object key, Object primaryKey) native;
+  void continuePrimaryKey(Object key, Object primaryKey) native ;
 
   @JSName('delete')
   @DomName('IDBCursor.delete')
   @DocsEditable()
-  Request _delete() native;
+  Request _delete() native ;
 
   @DomName('IDBCursor.update')
   @DocsEditable()
@@ -287,24 +288,25 @@
     var value_1 = convertDartToNative_SerializedScriptValue(value);
     return _update_1(value_1);
   }
+
   @JSName('update')
   @DomName('IDBCursor.update')
   @DocsEditable()
-  Request _update_1(value) native;
-
+  Request _update_1(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.
 
-
 @DocsEditable()
 @DomName('IDBCursorWithValue')
 @Unstable()
 @Native("IDBCursorWithValue")
 class CursorWithValue extends Cursor {
   // To suppress missing implicit constructor warnings.
-  factory CursorWithValue._() { throw new UnsupportedError("Not supported"); }
+  factory CursorWithValue._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('IDBCursorWithValue.value')
   @DocsEditable()
@@ -320,7 +322,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.
 
-
 @DocsEditable()
 /**
  * An indexed database object for storing client-side data
@@ -389,10 +390,12 @@
   }
 
   @JSName('transaction')
-  Transaction _transaction(stores, mode) native;
+  Transaction _transaction(stores, mode) native ;
 
   // To suppress missing implicit constructor warnings.
-  factory Database._() { throw new UnsupportedError("Not supported"); }
+  factory Database._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `abort` events to event
@@ -402,7 +405,8 @@
    */
   @DomName('IDBDatabase.abortEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
+  static const EventStreamProvider<Event> abortEvent =
+      const EventStreamProvider<Event>('abort');
 
   /**
    * Static factory designed to expose `close` events to event
@@ -414,7 +418,8 @@
   @DocsEditable()
   // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
   @Experimental()
-  static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
+  static const EventStreamProvider<Event> closeEvent =
+      const EventStreamProvider<Event>('close');
 
   /**
    * Static factory designed to expose `error` events to event
@@ -424,7 +429,8 @@
    */
   @DomName('IDBDatabase.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /**
    * Static factory designed to expose `versionchange` events to event
@@ -434,7 +440,8 @@
    */
   @DomName('IDBDatabase.versionchangeEvent')
   @DocsEditable()
-  static const EventStreamProvider<VersionChangeEvent> versionChangeEvent = const EventStreamProvider<VersionChangeEvent>('versionchange');
+  static const EventStreamProvider<VersionChangeEvent> versionChangeEvent =
+      const EventStreamProvider<VersionChangeEvent>('versionchange');
 
   @DomName('IDBDatabase.name')
   @DocsEditable()
@@ -454,7 +461,7 @@
 
   @DomName('IDBDatabase.close')
   @DocsEditable()
-  void close() native;
+  void close() native ;
 
   @DomName('IDBDatabase.createObjectStore')
   @DocsEditable()
@@ -465,18 +472,19 @@
     }
     return _createObjectStore_2(name);
   }
+
   @JSName('createObjectStore')
   @DomName('IDBDatabase.createObjectStore')
   @DocsEditable()
-  ObjectStore _createObjectStore_1(name, options) native;
+  ObjectStore _createObjectStore_1(name, options) native ;
   @JSName('createObjectStore')
   @DomName('IDBDatabase.createObjectStore')
   @DocsEditable()
-  ObjectStore _createObjectStore_2(name) native;
+  ObjectStore _createObjectStore_2(name) native ;
 
   @DomName('IDBDatabase.deleteObjectStore')
   @DocsEditable()
-  void deleteObjectStore(String name) native;
+  void deleteObjectStore(String name) native ;
 
   /// Stream of `abort` events handled by this [Database].
   @DomName('IDBDatabase.onabort')
@@ -498,13 +506,13 @@
   /// Stream of `versionchange` events handled by this [Database].
   @DomName('IDBDatabase.onversionchange')
   @DocsEditable()
-  Stream<VersionChangeEvent> get onVersionChange => versionChangeEvent.forTarget(this);
+  Stream<VersionChangeEvent> get onVersionChange =>
+      versionChangeEvent.forTarget(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.
 
-
 @DomName('IDBFactory')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
@@ -517,7 +525,8 @@
    * Checks to see if Indexed DB is supported on the current platform.
    */
   static bool get supported {
-    return JS('bool',
+    return JS(
+        'bool',
         '!!(window.indexedDB || '
         'window.webkitIndexedDB || '
         'window.mozIndexedDB)');
@@ -525,7 +534,8 @@
 
   @DomName('IDBFactory.open')
   Future<Database> open(String name,
-      {int version, void onUpgradeNeeded(VersionChangeEvent),
+      {int version,
+      void onUpgradeNeeded(VersionChangeEvent),
       void onBlocked(Event)}) {
     if ((version == null) != (onUpgradeNeeded == null)) {
       return new Future.error(new ArgumentError(
@@ -552,8 +562,7 @@
   }
 
   @DomName('IDBFactory.deleteDatabase')
-  Future<IdbFactory> deleteDatabase(String name,
-      {void onBlocked(Event e)}) {
+  Future<IdbFactory> deleteDatabase(String name, {void onBlocked(Event e)}) {
     try {
       var request = _deleteDatabase(name);
 
@@ -588,21 +597,24 @@
    * Checks to see if getDatabaseNames is supported by the current platform.
    */
   bool get supportsDatabaseNames {
-    return supported && JS('bool',
-        '!!(#.getDatabaseNames || #.webkitGetDatabaseNames)', this, this);
+    return supported &&
+        JS('bool', '!!(#.getDatabaseNames || #.webkitGetDatabaseNames)', this,
+            this);
   }
 
   // To suppress missing implicit constructor warnings.
-  factory IdbFactory._() { throw new UnsupportedError("Not supported"); }
+  factory IdbFactory._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('IDBFactory.cmp')
   @DocsEditable()
-  int cmp(Object first, Object second) native;
+  int cmp(Object first, Object second) native ;
 
   @JSName('deleteDatabase')
   @DomName('IDBFactory.deleteDatabase')
   @DocsEditable()
-  OpenDBRequest _deleteDatabase(String name) native;
+  OpenDBRequest _deleteDatabase(String name) native ;
 
   @JSName('open')
   @DomName('IDBFactory.open')
@@ -610,7 +622,7 @@
   @Returns('Request')
   @Creates('Request')
   @Creates('Database')
-  OpenDBRequest _open(String name, [int version]) native;
+  OpenDBRequest _open(String name, [int version]) native ;
 
   @JSName('webkitGetDatabaseNames')
   @DomName('IDBFactory.webkitGetDatabaseNames')
@@ -621,17 +633,15 @@
   @Returns('Request')
   @Creates('Request')
   @Creates('DomStringList')
-  Request _webkitGetDatabaseNames() native;
-
+  Request _webkitGetDatabaseNames() native ;
 }
 
-
 /**
  * Ties a request to a completer, so the completer is completed when it succeeds
  * and errors out when the request errors.
  */
 Future/*<T>*/ _completeRequest/*<T>*/(Request request) {
-  var completer = new Completer/*<T>*/.sync();
+  var completer = new Completer/*<T>*/ .sync();
   // TODO: make sure that completer.complete is synchronous as transactions
   // may be committed if the result is not processed immediately.
   request.onSuccess.listen((e) {
@@ -645,14 +655,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.
 
-
 @DomName('IDBIndex')
 @Unstable()
 @Native("IDBIndex")
 class Index extends Interceptor {
   @DomName('IDBIndex.count')
   Future<int> count([key_OR_range]) {
-   try {
+    try {
       var request = _count(key_OR_range);
       return _completeRequest(request);
     } catch (e, stacktrace) {
@@ -689,8 +698,8 @@
    *
    * * [ObjectStore.openCursor]
    */
-  Stream<CursorWithValue> openCursor({key, KeyRange range, String direction,
-      bool autoAdvance}) {
+  Stream<CursorWithValue> openCursor(
+      {key, KeyRange range, String direction, bool autoAdvance}) {
     var key_OR_range = null;
     if (key != null) {
       if (range != null) {
@@ -717,8 +726,8 @@
    *
    * * [ObjectStore.openCursor]
    */
-  Stream<Cursor> openKeyCursor({key, KeyRange range, String direction,
-      bool autoAdvance}) {
+  Stream<Cursor> openKeyCursor(
+      {key, KeyRange range, String direction, bool autoAdvance}) {
     var key_OR_range = null;
     if (key != null) {
       if (range != null) {
@@ -738,8 +747,10 @@
     return ObjectStore._cursorStreamFromResult(request, autoAdvance);
   }
 
-    // To suppress missing implicit constructor warnings.
-  factory Index._() { throw new UnsupportedError("Not supported"); }
+  // To suppress missing implicit constructor warnings.
+  factory Index._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('IDBIndex.keyPath')
   @DocsEditable()
@@ -765,7 +776,7 @@
   @JSName('count')
   @DomName('IDBIndex.count')
   @DocsEditable()
-  Request _count(Object key) native;
+  Request _count(Object key) native ;
 
   @JSName('get')
   @DomName('IDBIndex.get')
@@ -773,17 +784,17 @@
   @Returns('Request')
   @Creates('Request')
   @annotation_Creates_SerializedScriptValue
-  Request _get(Object key) native;
+  Request _get(Object key) native ;
 
   @DomName('IDBIndex.getAll')
   @DocsEditable()
   @Experimental() // untriaged
-  Request getAll(Object range, [int maxCount]) native;
+  Request getAll(Object range, [int maxCount]) native ;
 
   @DomName('IDBIndex.getAllKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  Request getAllKeys(Object range, [int maxCount]) native;
+  Request getAllKeys(Object range, [int maxCount]) native ;
 
   @JSName('getKey')
   @DomName('IDBIndex.getKey')
@@ -792,7 +803,7 @@
   @Creates('Request')
   @annotation_Creates_SerializedScriptValue
   @Creates('ObjectStore')
-  Request _getKey(Object key) native;
+  Request _getKey(Object key) native ;
 
   @JSName('openCursor')
   @DomName('IDBIndex.openCursor')
@@ -800,7 +811,7 @@
   @Returns('Request')
   @Creates('Request')
   @Creates('Cursor')
-  Request _openCursor(Object range, [String direction]) native;
+  Request _openCursor(Object range, [String direction]) native ;
 
   @JSName('openKeyCursor')
   @DomName('IDBIndex.openKeyCursor')
@@ -808,14 +819,12 @@
   @Returns('Request')
   @Creates('Request')
   @Creates('Cursor')
-  Request _openKeyCursor(Object range, [String direction]) native;
-
+  Request _openKeyCursor(Object range, [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.
 
-
 @DomName('IDBKeyRange')
 @Unstable()
 @Native("IDBKeyRange")
@@ -834,12 +843,14 @@
 
   @DomName('KeyRange.bound')
   factory KeyRange.bound(/*Key*/ lower, /*Key*/ upper,
-                            [bool lowerOpen = false, bool upperOpen = false]) =>
+          [bool lowerOpen = false, bool upperOpen = false]) =>
       _KeyRangeFactoryProvider.createKeyRange_bound(
           lower, upper, lowerOpen, upperOpen);
 
   // To suppress missing implicit constructor warnings.
-  factory KeyRange._() { throw new UnsupportedError("Not supported"); }
+  factory KeyRange._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('IDBKeyRange.lower')
   @DocsEditable()
@@ -862,34 +873,32 @@
   @JSName('bound')
   @DomName('IDBKeyRange.bound')
   @DocsEditable()
-  static KeyRange bound_(Object lower, Object upper, [bool lowerOpen, bool upperOpen]) native;
+  static KeyRange bound_(Object lower, Object upper,
+      [bool lowerOpen, bool upperOpen]) native ;
 
   @JSName('lowerBound')
   @DomName('IDBKeyRange.lowerBound')
   @DocsEditable()
-  static KeyRange lowerBound_(Object bound, [bool open]) native;
+  static KeyRange lowerBound_(Object bound, [bool open]) native ;
 
   @JSName('only')
   @DomName('IDBKeyRange.only')
   @DocsEditable()
-  static KeyRange only_(Object value) native;
+  static KeyRange only_(Object value) native ;
 
   @JSName('upperBound')
   @DomName('IDBKeyRange.upperBound')
   @DocsEditable()
-  static KeyRange upperBound_(Object bound, [bool open]) native;
-
+  static KeyRange upperBound_(Object bound, [bool open]) 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('IDBObjectStore')
 @Unstable()
 @Native("IDBObjectStore")
 class ObjectStore extends Interceptor {
-
   @DomName('IDBObjectStore.add')
   Future add(value, [key]) {
     try {
@@ -915,7 +924,7 @@
   }
 
   @DomName('IDBObjectStore.delete')
-  Future delete(key_OR_keyRange){
+  Future delete(key_OR_keyRange) {
     try {
       return _completeRequest(_delete(key_OR_keyRange));
     } catch (e, stacktrace) {
@@ -925,7 +934,7 @@
 
   @DomName('IDBObjectStore.count')
   Future<int> count([key_OR_range]) {
-   try {
+    try {
       var request = _count(key_OR_range);
       return _completeRequest(request);
     } catch (e, stacktrace) {
@@ -981,8 +990,8 @@
    * the current transaction.
    */
   @DomName('IDBObjectStore.openCursor')
-  Stream<CursorWithValue> openCursor({key, KeyRange range, String direction,
-      bool autoAdvance}) {
+  Stream<CursorWithValue> openCursor(
+      {key, KeyRange range, String direction, bool autoAdvance}) {
     var key_OR_range = null;
     if (key != null) {
       if (range != null) {
@@ -1017,7 +1026,9 @@
   }
 
   // To suppress missing implicit constructor warnings.
-  factory ObjectStore._() { throw new UnsupportedError("Not supported"); }
+  factory ObjectStore._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('IDBObjectStore.autoIncrement')
   @DocsEditable()
@@ -1056,30 +1067,31 @@
     var value_1 = convertDartToNative_SerializedScriptValue(value);
     return _add_2(value_1);
   }
+
   @JSName('add')
   @DomName('IDBObjectStore.add')
   @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @_annotation_Creates_IDBKey
-  Request _add_1(value, key) native;
+  Request _add_1(value, key) native ;
   @JSName('add')
   @DomName('IDBObjectStore.add')
   @DocsEditable()
   @Returns('Request')
   @Creates('Request')
   @_annotation_Creates_IDBKey
-  Request _add_2(value) native;
+  Request _add_2(value) native ;
 
   @JSName('clear')
   @DomName('IDBObjectStore.clear')
   @DocsEditable()
-  Request _clear() native;
+  Request _clear() native ;
 
   @JSName('count')
   @DomName('IDBObjectStore.count')
   @DocsEditable()
-  Request _count(Object key) native;
+  Request _count(Object key) native ;
 
   @DomName('IDBObjectStore.createIndex')
   @DocsEditable()
@@ -1090,23 +1102,24 @@
     }
     return _createIndex_2(name, keyPath);
   }
+
   @JSName('createIndex')
   @DomName('IDBObjectStore.createIndex')
   @DocsEditable()
-  Index _createIndex_1(name, keyPath, options) native;
+  Index _createIndex_1(name, keyPath, options) native ;
   @JSName('createIndex')
   @DomName('IDBObjectStore.createIndex')
   @DocsEditable()
-  Index _createIndex_2(name, keyPath) native;
+  Index _createIndex_2(name, keyPath) native ;
 
   @JSName('delete')
   @DomName('IDBObjectStore.delete')
   @DocsEditable()
-  Request _delete(Object key) native;
+  Request _delete(Object key) native ;
 
   @DomName('IDBObjectStore.deleteIndex')
   @DocsEditable()
-  void deleteIndex(String name) native;
+  void deleteIndex(String name) native ;
 
   @JSName('get')
   @DomName('IDBObjectStore.get')
@@ -1114,21 +1127,21 @@
   @Returns('Request')
   @Creates('Request')
   @annotation_Creates_SerializedScriptValue
-  Request _get(Object key) native;
+  Request _get(Object key) native ;
 
   @DomName('IDBObjectStore.getAll')
   @DocsEditable()
   @Experimental() // untriaged
-  Request getAll(Object range, [int maxCount]) native;
+  Request getAll(Object range, [int maxCount]) native ;
 
   @DomName('IDBObjectStore.getAllKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  Request getAllKeys(Object range, [int maxCount]) native;
+  Request getAllKeys(Object range, [int maxCount]) native ;
 
   @DomName('IDBObjectStore.index')
   @DocsEditable()
-  Index index(String name) native;
+  Index index(String name) native ;
 
   @JSName('openCursor')
   @DomName('IDBObjectStore.openCursor')
@@ -1136,12 +1149,12 @@
   @Returns('Request')
   @Creates('Request')
   @Creates('Cursor')
-  Request _openCursor(Object range, [String direction]) native;
+  Request _openCursor(Object range, [String direction]) native ;
 
   @DomName('IDBObjectStore.openKeyCursor')
   @DocsEditable()
   @Experimental() // untriaged
-  Request openKeyCursor(Object range, [String direction]) native;
+  Request openKeyCursor(Object range, [String direction]) native ;
 
   @DomName('IDBObjectStore.put')
   @DocsEditable()
@@ -1157,27 +1170,27 @@
     var value_1 = convertDartToNative_SerializedScriptValue(value);
     return _put_2(value_1);
   }
-  @JSName('put')
-  @DomName('IDBObjectStore.put')
-  @DocsEditable()
-  @Returns('Request')
-  @Creates('Request')
-  @_annotation_Creates_IDBKey
-  Request _put_1(value, key) native;
-  @JSName('put')
-  @DomName('IDBObjectStore.put')
-  @DocsEditable()
-  @Returns('Request')
-  @Creates('Request')
-  @_annotation_Creates_IDBKey
-  Request _put_2(value) native;
 
+  @JSName('put')
+  @DomName('IDBObjectStore.put')
+  @DocsEditable()
+  @Returns('Request')
+  @Creates('Request')
+  @_annotation_Creates_IDBKey
+  Request _put_1(value, key) native ;
+  @JSName('put')
+  @DomName('IDBObjectStore.put')
+  @DocsEditable()
+  @Returns('Request')
+  @Creates('Request')
+  @_annotation_Creates_IDBKey
+  Request _put_2(value) native ;
 
   /**
    * Helper for iterating over cursors in a request.
    */
-  static Stream/*<T>*/ _cursorStreamFromResult/*<T extends Cursor>*/(Request request,
-      bool autoAdvance) {
+  static Stream/*<T>*/ _cursorStreamFromResult/*<T extends Cursor>*/(
+      Request request, bool autoAdvance) {
     // TODO: need to guarantee that the controller provides the values
     // immediately as waiting until the next tick will cause the transaction to
     // close.
@@ -1207,14 +1220,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.
 
-
 @DocsEditable()
 @DomName('IDBOpenDBRequest')
 @Unstable()
 @Native("IDBOpenDBRequest,IDBVersionChangeRequest")
 class OpenDBRequest extends Request {
   // To suppress missing implicit constructor warnings.
-  factory OpenDBRequest._() { throw new UnsupportedError("Not supported"); }
+  factory OpenDBRequest._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `blocked` events to event
@@ -1224,7 +1238,8 @@
    */
   @DomName('IDBOpenDBRequest.blockedEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> blockedEvent = const EventStreamProvider<Event>('blocked');
+  static const EventStreamProvider<Event> blockedEvent =
+      const EventStreamProvider<Event>('blocked');
 
   /**
    * Static factory designed to expose `upgradeneeded` events to event
@@ -1234,7 +1249,8 @@
    */
   @DomName('IDBOpenDBRequest.upgradeneededEvent')
   @DocsEditable()
-  static const EventStreamProvider<VersionChangeEvent> upgradeNeededEvent = const EventStreamProvider<VersionChangeEvent>('upgradeneeded');
+  static const EventStreamProvider<VersionChangeEvent> upgradeNeededEvent =
+      const EventStreamProvider<VersionChangeEvent>('upgradeneeded');
 
   /// Stream of `blocked` events handled by this [OpenDBRequest].
   @DomName('IDBOpenDBRequest.onblocked')
@@ -1244,20 +1260,22 @@
   /// Stream of `upgradeneeded` events handled by this [OpenDBRequest].
   @DomName('IDBOpenDBRequest.onupgradeneeded')
   @DocsEditable()
-  Stream<VersionChangeEvent> get onUpgradeNeeded => upgradeNeededEvent.forTarget(this);
+  Stream<VersionChangeEvent> get onUpgradeNeeded =>
+      upgradeNeededEvent.forTarget(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.
 
-
 @DocsEditable()
 @DomName('IDBRequest')
 @Unstable()
 @Native("IDBRequest")
 class Request extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory Request._() { throw new UnsupportedError("Not supported"); }
+  factory Request._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `error` events to event
@@ -1267,7 +1285,8 @@
    */
   @DomName('IDBRequest.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   /**
    * Static factory designed to expose `success` events to event
@@ -1277,7 +1296,8 @@
    */
   @DomName('IDBRequest.successEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> successEvent = const EventStreamProvider<Event>('success');
+  static const EventStreamProvider<Event> successEvent =
+      const EventStreamProvider<Event>('success');
 
   @DomName('IDBRequest.error')
   @DocsEditable()
@@ -1319,12 +1339,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.
 
-
 @DomName('IDBTransaction')
 @Unstable()
 @Native("IDBTransaction")
 class Transaction extends EventTarget {
-
   /**
    * Provides a Future which will be completed once the transaction has
    * completed.
@@ -1354,7 +1372,9 @@
   }
 
   // To suppress missing implicit constructor warnings.
-  factory Transaction._() { throw new UnsupportedError("Not supported"); }
+  factory Transaction._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `abort` events to event
@@ -1364,7 +1384,8 @@
    */
   @DomName('IDBTransaction.abortEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
+  static const EventStreamProvider<Event> abortEvent =
+      const EventStreamProvider<Event>('abort');
 
   /**
    * Static factory designed to expose `complete` events to event
@@ -1374,7 +1395,8 @@
    */
   @DomName('IDBTransaction.completeEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
+  static const EventStreamProvider<Event> completeEvent =
+      const EventStreamProvider<Event>('complete');
 
   /**
    * Static factory designed to expose `error` events to event
@@ -1384,7 +1406,8 @@
    */
   @DomName('IDBTransaction.errorEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   @DomName('IDBTransaction.db')
   @DocsEditable()
@@ -1407,11 +1430,11 @@
 
   @DomName('IDBTransaction.abort')
   @DocsEditable()
-  void abort() native;
+  void abort() native ;
 
   @DomName('IDBTransaction.objectStore')
   @DocsEditable()
-  ObjectStore objectStore(String name) native;
+  ObjectStore objectStore(String name) native ;
 
   /// Stream of `abort` events handled by this [Transaction].
   @DomName('IDBTransaction.onabort')
@@ -1427,20 +1450,20 @@
   @DomName('IDBTransaction.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(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.
 
-
 @DocsEditable()
 @DomName('IDBVersionChangeEvent')
 @Unstable()
 @Native("IDBVersionChangeEvent")
 class VersionChangeEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory VersionChangeEvent._() { throw new UnsupportedError("Not supported"); }
+  factory VersionChangeEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('IDBVersionChangeEvent.IDBVersionChangeEvent')
   @DocsEditable()
@@ -1451,8 +1474,13 @@
     }
     return VersionChangeEvent._create_2(type);
   }
-  static VersionChangeEvent _create_1(type, eventInitDict) => JS('VersionChangeEvent', 'new IDBVersionChangeEvent(#,#)', type, eventInitDict);
-  static VersionChangeEvent _create_2(type) => JS('VersionChangeEvent', 'new IDBVersionChangeEvent(#)', type);
+  static VersionChangeEvent _create_1(type, eventInitDict) => JS(
+      'VersionChangeEvent',
+      'new IDBVersionChangeEvent(#,#)',
+      type,
+      eventInitDict);
+  static VersionChangeEvent _create_2(type) =>
+      JS('VersionChangeEvent', 'new IDBVersionChangeEvent(#)', type);
 
   @DomName('IDBVersionChangeEvent.dataLoss')
   @DocsEditable()
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
index eb15560..3b9fbad 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/js/dart2js/js_dart2js.dart
@@ -284,19 +284,24 @@
  * Proxies a JavaScript Function object.
  */
 class JsFunction extends JsObject {
-
   /**
    * Returns a [JsFunction] that captures its 'this' binding and calls [f]
    * with the value of this passed as the first argument.
    */
   factory JsFunction.withThis(Function f) {
-    return new JsFunction._fromJs(JS('', 'function(/*...arguments*/) {'
+    return new JsFunction._fromJs(JS(
+        '',
+        'function(/*...arguments*/) {'
         '  let args = [#(this)];'
         '  for (let arg of arguments) {'
         '    args.push(#(arg));'
         '  }'
         '  return #(#(...args));'
-        '}', _convertToDart, _convertToDart, _convertToJS, f));
+        '}',
+        _convertToDart,
+        _convertToDart,
+        _convertToJS,
+        f));
   }
 
   JsFunction._fromJs(jsObject) : super._fromJs(jsObject);
@@ -305,15 +310,17 @@
    * Invokes the JavaScript function with arguments [args]. If [thisArg] is
    * supplied it is the value of `this` for the invocation.
    */
-  dynamic apply(List args, {thisArg}) => _convertToDart(JS('', '#.apply(#, #)',
-      _jsObject, _convertToJS(thisArg),
+  dynamic apply(List args, {thisArg}) => _convertToDart(JS(
+      '',
+      '#.apply(#, #)',
+      _jsObject,
+      _convertToJS(thisArg),
       args == null ? null : new List.from(args.map(_convertToJS))));
 }
 
 // TODO(jmesserly): this is totally unnecessary in dev_compiler.
 /** A [List] that proxies a JavaScript array. */
 class JsArray<E> extends JsObject with ListMixin<E> {
-
   /**
    * Creates a new JavaScript array.
    */
@@ -421,7 +428,8 @@
     int length = end - start;
     if (length == 0) return;
     if (skipCount < 0) throw new ArgumentError(skipCount);
-    var args = <Object>[start, length]..addAll(iterable.skip(skipCount).take(length));
+    var args = <Object>[start, length]
+      ..addAll(iterable.skip(skipCount).take(length));
     callMethod('splice', args);
   }
 
@@ -435,7 +443,8 @@
 // We include the the instanceof Object test to filter out cross frame objects
 // on FireFox. Surprisingly on FireFox the instanceof Window test succeeds for
 // cross frame windows while the instanceof Object test fails.
-bool _isBrowserType(o) => JS('bool',
+bool _isBrowserType(o) => JS(
+    'bool',
     '# instanceof Object && ('
     '# instanceof Blob || '
     '# instanceof Event || '
@@ -445,7 +454,16 @@
     '# instanceof Node || '
     // Int8Array.__proto__ is TypedArray.
     '(window.Int8Array && # instanceof Int8Array.__proto__) || '
-    '# instanceof Window)', o, o, o, o, o, o, o, o, o);
+    '# instanceof Window)',
+    o,
+    o,
+    o,
+    o,
+    o,
+    o,
+    o,
+    o,
+    o);
 
 class _DartObject {
   final _dartObj;
@@ -453,11 +471,7 @@
 }
 
 dynamic _convertToJS(dynamic o) {
-  if (o == null ||
-      o is String ||
-      o is num ||
-      o is bool ||
-      _isBrowserType(o)) {
+  if (o == null || o is String || o is num || o is bool || _isBrowserType(o)) {
     return o;
   } else if (o is DateTime) {
     return Primitives.lazyAsJsDate(o);
@@ -473,10 +487,15 @@
 }
 
 dynamic _wrapDartFunction(f) {
-  var wrapper = JS('', 'function(/*...arguments*/) {'
+  var wrapper = JS(
+      '',
+      'function(/*...arguments*/) {'
       '  let args = Array.prototype.map.call(arguments, #);'
       '  return #(#(...args));'
-      '}', _convertToDart, _convertToJS, f);
+      '}',
+      _convertToDart,
+      _convertToJS,
+      f);
   JS('', '#.set(#, #)', _dartProxies, wrapper, f);
 
   return wrapper;
@@ -495,7 +514,7 @@
     var ms = JS('num', '#.getTime()', o);
     return new DateTime.fromMillisecondsSinceEpoch(ms);
   } else if (o is _DartObject &&
-             JS('bool', 'dart.jsobject != dart.getReifiedType(#)', o)) {
+      JS('bool', 'dart.jsobject != dart.getReifiedType(#)', o)) {
     return o._dartObj;
   } else {
     return _wrapToDart(o);
@@ -541,7 +560,7 @@
 /// JavaScript. We may remove the need to call this method completely in the
 /// future if Dart2Js is refactored so that its function calling conventions
 /// are more compatible with JavaScript.
-Function /*=F*/ allowInterop/*<F extends Function>*/(Function /*=F*/ f) => f;
+Function/*=F*/ allowInterop/*<F extends Function>*/(Function/*=F*/ f) => f;
 
 Expando<Function> _interopCaptureThisExpando = new Expando<Function>();
 
@@ -554,7 +573,8 @@
 Function allowInteropCaptureThis(Function f) {
   var ret = _interopCaptureThisExpando[f];
   if (ret == null) {
-    ret = JS('',
+    ret = JS(
+        '',
         'function(/*...arguments*/) {'
         '  let args = [this];'
         '  for (let arg of arguments) {'
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/svg/dart2js/svg_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/svg/dart2js/svg_dart2js.dart
index 60974c5..6b54fe3 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -20,19 +20,14 @@
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:svg library.
 
-
-
-
-
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for 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 _SvgElementFactoryProvider {
   static SvgElement createSvgElement_tag(String tag) {
     final Element temp =
-      document.createElementNS("http://www.w3.org/2000/svg", tag);
+        document.createElementNS("http://www.w3.org/2000/svg", tag);
     return temp;
   }
 }
@@ -40,14 +35,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.
 
-
 @DocsEditable()
 @DomName('SVGAElement')
 @Unstable()
 @Native("SVGAElement")
 class AElement extends GraphicsElement implements UriReference {
   // To suppress missing implicit constructor warnings.
-  factory AElement._() { throw new UnsupportedError("Not supported"); }
+  factory AElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAElement.SVGAElement')
   @DocsEditable()
@@ -73,14 +69,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.
 
-
 @DocsEditable()
 @DomName('SVGAngle')
 @Unstable()
 @Native("SVGAngle")
 class Angle extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Angle._() { throw new UnsupportedError("Not supported"); }
+  factory Angle._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAngle.SVG_ANGLETYPE_DEG')
   @DocsEditable()
@@ -120,17 +117,16 @@
 
   @DomName('SVGAngle.convertToSpecifiedUnits')
   @DocsEditable()
-  void convertToSpecifiedUnits(int unitType) native;
+  void convertToSpecifiedUnits(int unitType) native ;
 
   @DomName('SVGAngle.newValueSpecifiedUnits')
   @DocsEditable()
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) 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.
 
-
 @DocsEditable()
 @DomName('SVGAnimateElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -140,11 +136,14 @@
 @Native("SVGAnimateElement")
 class AnimateElement extends AnimationElement {
   // To suppress missing implicit constructor warnings.
-  factory AnimateElement._() { throw new UnsupportedError("Not supported"); }
+  factory AnimateElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimateElement.SVGAnimateElement')
   @DocsEditable()
-  factory AnimateElement() => _SvgElementFactoryProvider.createSvgElement_tag("animate");
+  factory AnimateElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("animate");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -153,13 +152,14 @@
   AnimateElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('animate') && (new SvgElement.tag('animate') is AnimateElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('animate') &&
+      (new SvgElement.tag('animate') is AnimateElement);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('SVGAnimateMotionElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -169,11 +169,14 @@
 @Native("SVGAnimateMotionElement")
 class AnimateMotionElement extends AnimationElement {
   // To suppress missing implicit constructor warnings.
-  factory AnimateMotionElement._() { throw new UnsupportedError("Not supported"); }
+  factory AnimateMotionElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimateMotionElement.SVGAnimateMotionElement')
   @DocsEditable()
-  factory AnimateMotionElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateMotion");
+  factory AnimateMotionElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("animateMotion");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -182,13 +185,14 @@
   AnimateMotionElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('animateMotion') && (new SvgElement.tag('animateMotion') is AnimateMotionElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('animateMotion') &&
+      (new SvgElement.tag('animateMotion') is AnimateMotionElement);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('SVGAnimateTransformElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -198,11 +202,14 @@
 @Native("SVGAnimateTransformElement")
 class AnimateTransformElement extends AnimationElement {
   // To suppress missing implicit constructor warnings.
-  factory AnimateTransformElement._() { throw new UnsupportedError("Not supported"); }
+  factory AnimateTransformElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimateTransformElement.SVGAnimateTransformElement')
   @DocsEditable()
-  factory AnimateTransformElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateTransform");
+  factory AnimateTransformElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("animateTransform");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -211,20 +218,23 @@
   AnimateTransformElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('animateTransform') && (new SvgElement.tag('animateTransform') is AnimateTransformElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('animateTransform') &&
+      (new SvgElement.tag('animateTransform') is AnimateTransformElement);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('SVGAnimatedAngle')
 @Unstable()
 @Native("SVGAnimatedAngle")
 class AnimatedAngle extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimatedAngle._() { throw new UnsupportedError("Not supported"); }
+  factory AnimatedAngle._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimatedAngle.animVal')
   @DocsEditable()
@@ -238,14 +248,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.
 
-
 @DocsEditable()
 @DomName('SVGAnimatedBoolean')
 @Unstable()
 @Native("SVGAnimatedBoolean")
 class AnimatedBoolean extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimatedBoolean._() { throw new UnsupportedError("Not supported"); }
+  factory AnimatedBoolean._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimatedBoolean.animVal')
   @DocsEditable()
@@ -259,14 +270,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.
 
-
 @DocsEditable()
 @DomName('SVGAnimatedEnumeration')
 @Unstable()
 @Native("SVGAnimatedEnumeration")
 class AnimatedEnumeration extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimatedEnumeration._() { throw new UnsupportedError("Not supported"); }
+  factory AnimatedEnumeration._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimatedEnumeration.animVal')
   @DocsEditable()
@@ -280,14 +292,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.
 
-
 @DocsEditable()
 @DomName('SVGAnimatedInteger')
 @Unstable()
 @Native("SVGAnimatedInteger")
 class AnimatedInteger extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimatedInteger._() { throw new UnsupportedError("Not supported"); }
+  factory AnimatedInteger._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimatedInteger.animVal')
   @DocsEditable()
@@ -301,14 +314,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.
 
-
 @DocsEditable()
 @DomName('SVGAnimatedLength')
 @Unstable()
 @Native("SVGAnimatedLength")
 class AnimatedLength extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimatedLength._() { throw new UnsupportedError("Not supported"); }
+  factory AnimatedLength._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimatedLength.animVal')
   @DocsEditable()
@@ -322,14 +336,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.
 
-
 @DocsEditable()
 @DomName('SVGAnimatedLengthList')
 @Unstable()
 @Native("SVGAnimatedLengthList")
 class AnimatedLengthList extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimatedLengthList._() { throw new UnsupportedError("Not supported"); }
+  factory AnimatedLengthList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimatedLengthList.animVal')
   @DocsEditable()
@@ -343,14 +358,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.
 
-
 @DocsEditable()
 @DomName('SVGAnimatedNumber')
 @Unstable()
 @Native("SVGAnimatedNumber")
 class AnimatedNumber extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimatedNumber._() { throw new UnsupportedError("Not supported"); }
+  factory AnimatedNumber._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimatedNumber.animVal')
   @DocsEditable()
@@ -364,14 +380,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.
 
-
 @DocsEditable()
 @DomName('SVGAnimatedNumberList')
 @Unstable()
 @Native("SVGAnimatedNumberList")
 class AnimatedNumberList extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimatedNumberList._() { throw new UnsupportedError("Not supported"); }
+  factory AnimatedNumberList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimatedNumberList.animVal')
   @DocsEditable()
@@ -385,14 +402,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.
 
-
 @DocsEditable()
 @DomName('SVGAnimatedPreserveAspectRatio')
 @Unstable()
 @Native("SVGAnimatedPreserveAspectRatio")
 class AnimatedPreserveAspectRatio extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimatedPreserveAspectRatio._() { throw new UnsupportedError("Not supported"); }
+  factory AnimatedPreserveAspectRatio._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimatedPreserveAspectRatio.animVal')
   @DocsEditable()
@@ -406,14 +424,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.
 
-
 @DocsEditable()
 @DomName('SVGAnimatedRect')
 @Unstable()
 @Native("SVGAnimatedRect")
 class AnimatedRect extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimatedRect._() { throw new UnsupportedError("Not supported"); }
+  factory AnimatedRect._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimatedRect.animVal')
   @DocsEditable()
@@ -427,14 +446,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.
 
-
 @DocsEditable()
 @DomName('SVGAnimatedString')
 @Unstable()
 @Native("SVGAnimatedString")
 class AnimatedString extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimatedString._() { throw new UnsupportedError("Not supported"); }
+  factory AnimatedString._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimatedString.animVal')
   @DocsEditable()
@@ -448,14 +468,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.
 
-
 @DocsEditable()
 @DomName('SVGAnimatedTransformList')
 @Unstable()
 @Native("SVGAnimatedTransformList")
 class AnimatedTransformList extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AnimatedTransformList._() { throw new UnsupportedError("Not supported"); }
+  factory AnimatedTransformList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimatedTransformList.animVal')
   @DocsEditable()
@@ -469,18 +490,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.
 
-
 @DocsEditable()
 @DomName('SVGAnimationElement')
 @Unstable()
 @Native("SVGAnimationElement")
 class AnimationElement extends SvgElement implements Tests {
   // To suppress missing implicit constructor warnings.
-  factory AnimationElement._() { throw new UnsupportedError("Not supported"); }
+  factory AnimationElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGAnimationElement.SVGAnimationElement')
   @DocsEditable()
-  factory AnimationElement() => _SvgElementFactoryProvider.createSvgElement_tag("animation");
+  factory AnimationElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("animation");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -494,31 +517,31 @@
 
   @DomName('SVGAnimationElement.beginElement')
   @DocsEditable()
-  void beginElement() native;
+  void beginElement() native ;
 
   @DomName('SVGAnimationElement.beginElementAt')
   @DocsEditable()
-  void beginElementAt(num offset) native;
+  void beginElementAt(num offset) native ;
 
   @DomName('SVGAnimationElement.endElement')
   @DocsEditable()
-  void endElement() native;
+  void endElement() native ;
 
   @DomName('SVGAnimationElement.endElementAt')
   @DocsEditable()
-  void endElementAt(num offset) native;
+  void endElementAt(num offset) native ;
 
   @DomName('SVGAnimationElement.getCurrentTime')
   @DocsEditable()
-  double getCurrentTime() native;
+  double getCurrentTime() native ;
 
   @DomName('SVGAnimationElement.getSimpleDuration')
   @DocsEditable()
-  double getSimpleDuration() native;
+  double getSimpleDuration() native ;
 
   @DomName('SVGAnimationElement.getStartTime')
   @DocsEditable()
-  double getStartTime() native;
+  double getStartTime() native ;
 
   // From SVGTests
 
@@ -536,24 +559,26 @@
 
   @DomName('SVGAnimationElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) native;
+  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.
 
-
 @DocsEditable()
 @DomName('SVGCircleElement')
 @Unstable()
 @Native("SVGCircleElement")
 class CircleElement extends GeometryElement {
   // To suppress missing implicit constructor warnings.
-  factory CircleElement._() { throw new UnsupportedError("Not supported"); }
+  factory CircleElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGCircleElement.SVGCircleElement')
   @DocsEditable()
-  factory CircleElement() => _SvgElementFactoryProvider.createSvgElement_tag("circle");
+  factory CircleElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("circle");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -577,18 +602,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.
 
-
 @DocsEditable()
 @DomName('SVGClipPathElement')
 @Unstable()
 @Native("SVGClipPathElement")
 class ClipPathElement extends GraphicsElement {
   // To suppress missing implicit constructor warnings.
-  factory ClipPathElement._() { throw new UnsupportedError("Not supported"); }
+  factory ClipPathElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGClipPathElement.SVGClipPathElement')
   @DocsEditable()
-  factory ClipPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("clipPath");
+  factory ClipPathElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("clipPath");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -604,18 +631,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.
 
-
 @DocsEditable()
 @DomName('SVGDefsElement')
 @Unstable()
 @Native("SVGDefsElement")
 class DefsElement extends GraphicsElement {
   // To suppress missing implicit constructor warnings.
-  factory DefsElement._() { throw new UnsupportedError("Not supported"); }
+  factory DefsElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGDefsElement.SVGDefsElement')
   @DocsEditable()
-  factory DefsElement() => _SvgElementFactoryProvider.createSvgElement_tag("defs");
+  factory DefsElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("defs");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -627,18 +656,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.
 
-
 @DocsEditable()
 @DomName('SVGDescElement')
 @Unstable()
 @Native("SVGDescElement")
 class DescElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
-  factory DescElement._() { throw new UnsupportedError("Not supported"); }
+  factory DescElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGDescElement.SVGDescElement')
   @DocsEditable()
-  factory DescElement() => _SvgElementFactoryProvider.createSvgElement_tag("desc");
+  factory DescElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("desc");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -650,14 +681,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.
 
-
 @DocsEditable()
 @DomName('SVGDiscardElement')
 @Experimental() // untriaged
 @Native("SVGDiscardElement")
 class DiscardElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
-  factory DiscardElement._() { throw new UnsupportedError("Not supported"); }
+  factory DiscardElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -669,18 +701,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.
 
-
 @DocsEditable()
 @DomName('SVGEllipseElement')
 @Unstable()
 @Native("SVGEllipseElement")
 class EllipseElement extends GeometryElement {
   // To suppress missing implicit constructor warnings.
-  factory EllipseElement._() { throw new UnsupportedError("Not supported"); }
+  factory EllipseElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGEllipseElement.SVGEllipseElement')
   @DocsEditable()
-  factory EllipseElement() => _SvgElementFactoryProvider.createSvgElement_tag("ellipse");
+  factory EllipseElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("ellipse");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -708,7 +742,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.
 
-
 @DocsEditable()
 @DomName('SVGFEBlendElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -717,13 +750,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFEBlendElement")
-class FEBlendElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FEBlendElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FEBlendElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEBlendElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEBlendElement.SVGFEBlendElement')
   @DocsEditable()
-  factory FEBlendElement() => _SvgElementFactoryProvider.createSvgElement_tag("feBlend");
+  factory FEBlendElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feBlend");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -732,7 +769,9 @@
   FEBlendElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feBlend') && (new SvgElement.tag('feBlend') is FEBlendElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feBlend') &&
+      (new SvgElement.tag('feBlend') is FEBlendElement);
 
   @DomName('SVGFEBlendElement.SVG_FEBLEND_MODE_DARKEN')
   @DocsEditable()
@@ -796,7 +835,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.
 
-
 @DocsEditable()
 @DomName('SVGFEColorMatrixElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -805,13 +843,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFEColorMatrixElement")
-class FEColorMatrixElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FEColorMatrixElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FEColorMatrixElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEColorMatrixElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEColorMatrixElement.SVGFEColorMatrixElement')
   @DocsEditable()
-  factory FEColorMatrixElement() => _SvgElementFactoryProvider.createSvgElement_tag("feColorMatrix");
+  factory FEColorMatrixElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feColorMatrix");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -820,7 +862,9 @@
   FEColorMatrixElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feColorMatrix') && (new SvgElement.tag('feColorMatrix') is FEColorMatrixElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feColorMatrix') &&
+      (new SvgElement.tag('feColorMatrix') is FEColorMatrixElement);
 
   @DomName('SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE')
   @DocsEditable()
@@ -880,7 +924,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.
 
-
 @DocsEditable()
 @DomName('SVGFEComponentTransferElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -889,13 +932,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFEComponentTransferElement")
-class FEComponentTransferElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FEComponentTransferElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FEComponentTransferElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEComponentTransferElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEComponentTransferElement.SVGFEComponentTransferElement')
   @DocsEditable()
-  factory FEComponentTransferElement() => _SvgElementFactoryProvider.createSvgElement_tag("feComponentTransfer");
+  factory FEComponentTransferElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feComponentTransfer");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -904,7 +951,9 @@
   FEComponentTransferElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feComponentTransfer') && (new SvgElement.tag('feComponentTransfer') is FEComponentTransferElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feComponentTransfer') &&
+      (new SvgElement.tag('feComponentTransfer') is FEComponentTransferElement);
 
   @DomName('SVGFEComponentTransferElement.in1')
   @DocsEditable()
@@ -936,14 +985,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.
 
-
 @DocsEditable()
 @DomName('SVGFECompositeElement')
 @Unstable()
 @Native("SVGFECompositeElement")
-class FECompositeElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FECompositeElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FECompositeElement._() { throw new UnsupportedError("Not supported"); }
+  factory FECompositeElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1033,7 +1084,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.
 
-
 @DocsEditable()
 @DomName('SVGFEConvolveMatrixElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1042,13 +1092,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFEConvolveMatrixElement")
-class FEConvolveMatrixElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FEConvolveMatrixElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FEConvolveMatrixElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEConvolveMatrixElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEConvolveMatrixElement.SVGFEConvolveMatrixElement')
   @DocsEditable()
-  factory FEConvolveMatrixElement() => _SvgElementFactoryProvider.createSvgElement_tag("feConvolveMatrix");
+  factory FEConvolveMatrixElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feConvolveMatrix");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1057,7 +1111,9 @@
   FEConvolveMatrixElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feConvolveMatrix') && (new SvgElement.tag('feConvolveMatrix') is FEConvolveMatrixElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feConvolveMatrix') &&
+      (new SvgElement.tag('feConvolveMatrix') is FEConvolveMatrixElement);
 
   @DomName('SVGFEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE')
   @DocsEditable()
@@ -1149,7 +1205,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.
 
-
 @DocsEditable()
 @DomName('SVGFEDiffuseLightingElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1158,13 +1213,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFEDiffuseLightingElement")
-class FEDiffuseLightingElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FEDiffuseLightingElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FEDiffuseLightingElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEDiffuseLightingElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEDiffuseLightingElement.SVGFEDiffuseLightingElement')
   @DocsEditable()
-  factory FEDiffuseLightingElement() => _SvgElementFactoryProvider.createSvgElement_tag("feDiffuseLighting");
+  factory FEDiffuseLightingElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feDiffuseLighting");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1173,7 +1232,9 @@
   FEDiffuseLightingElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feDiffuseLighting') && (new SvgElement.tag('feDiffuseLighting') is FEDiffuseLightingElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feDiffuseLighting') &&
+      (new SvgElement.tag('feDiffuseLighting') is FEDiffuseLightingElement);
 
   @DomName('SVGFEDiffuseLightingElement.diffuseConstant')
   @DocsEditable()
@@ -1221,7 +1282,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.
 
-
 @DocsEditable()
 @DomName('SVGFEDisplacementMapElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1230,13 +1290,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFEDisplacementMapElement")
-class FEDisplacementMapElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FEDisplacementMapElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FEDisplacementMapElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEDisplacementMapElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEDisplacementMapElement.SVGFEDisplacementMapElement')
   @DocsEditable()
-  factory FEDisplacementMapElement() => _SvgElementFactoryProvider.createSvgElement_tag("feDisplacementMap");
+  factory FEDisplacementMapElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feDisplacementMap");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1245,7 +1309,9 @@
   FEDisplacementMapElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feDisplacementMap') && (new SvgElement.tag('feDisplacementMap') is FEDisplacementMapElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feDisplacementMap') &&
+      (new SvgElement.tag('feDisplacementMap') is FEDisplacementMapElement);
 
   @DomName('SVGFEDisplacementMapElement.SVG_CHANNEL_A')
   @DocsEditable()
@@ -1313,7 +1379,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.
 
-
 @DocsEditable()
 @DomName('SVGFEDistantLightElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1324,11 +1389,14 @@
 @Native("SVGFEDistantLightElement")
 class FEDistantLightElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
-  factory FEDistantLightElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEDistantLightElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEDistantLightElement.SVGFEDistantLightElement')
   @DocsEditable()
-  factory FEDistantLightElement() => _SvgElementFactoryProvider.createSvgElement_tag("feDistantLight");
+  factory FEDistantLightElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feDistantLight");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1337,7 +1405,9 @@
   FEDistantLightElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feDistantLight') && (new SvgElement.tag('feDistantLight') is FEDistantLightElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feDistantLight') &&
+      (new SvgElement.tag('feDistantLight') is FEDistantLightElement);
 
   @DomName('SVGFEDistantLightElement.azimuth')
   @DocsEditable()
@@ -1351,7 +1421,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.
 
-
 @DocsEditable()
 @DomName('SVGFEFloodElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1360,13 +1429,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFEFloodElement")
-class FEFloodElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FEFloodElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FEFloodElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEFloodElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEFloodElement.SVGFEFloodElement')
   @DocsEditable()
-  factory FEFloodElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFlood");
+  factory FEFloodElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feFlood");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1375,7 +1448,9 @@
   FEFloodElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feFlood') && (new SvgElement.tag('feFlood') is FEFloodElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feFlood') &&
+      (new SvgElement.tag('feFlood') is FEFloodElement);
 
   // From SVGFilterPrimitiveStandardAttributes
 
@@ -1403,7 +1478,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.
 
-
 @DocsEditable()
 @DomName('SVGFEFuncAElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1414,11 +1488,14 @@
 @Native("SVGFEFuncAElement")
 class FEFuncAElement extends _SVGComponentTransferFunctionElement {
   // To suppress missing implicit constructor warnings.
-  factory FEFuncAElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEFuncAElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEFuncAElement.SVGFEFuncAElement')
   @DocsEditable()
-  factory FEFuncAElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFuncA");
+  factory FEFuncAElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feFuncA");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1427,13 +1504,14 @@
   FEFuncAElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feFuncA') && (new SvgElement.tag('feFuncA') is FEFuncAElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feFuncA') &&
+      (new SvgElement.tag('feFuncA') is FEFuncAElement);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('SVGFEFuncBElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1444,11 +1522,14 @@
 @Native("SVGFEFuncBElement")
 class FEFuncBElement extends _SVGComponentTransferFunctionElement {
   // To suppress missing implicit constructor warnings.
-  factory FEFuncBElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEFuncBElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEFuncBElement.SVGFEFuncBElement')
   @DocsEditable()
-  factory FEFuncBElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFuncB");
+  factory FEFuncBElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feFuncB");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1457,13 +1538,14 @@
   FEFuncBElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feFuncB') && (new SvgElement.tag('feFuncB') is FEFuncBElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feFuncB') &&
+      (new SvgElement.tag('feFuncB') is FEFuncBElement);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('SVGFEFuncGElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1474,11 +1556,14 @@
 @Native("SVGFEFuncGElement")
 class FEFuncGElement extends _SVGComponentTransferFunctionElement {
   // To suppress missing implicit constructor warnings.
-  factory FEFuncGElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEFuncGElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEFuncGElement.SVGFEFuncGElement')
   @DocsEditable()
-  factory FEFuncGElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFuncG");
+  factory FEFuncGElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feFuncG");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1487,13 +1572,14 @@
   FEFuncGElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feFuncG') && (new SvgElement.tag('feFuncG') is FEFuncGElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feFuncG') &&
+      (new SvgElement.tag('feFuncG') is FEFuncGElement);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('SVGFEFuncRElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1504,11 +1590,14 @@
 @Native("SVGFEFuncRElement")
 class FEFuncRElement extends _SVGComponentTransferFunctionElement {
   // To suppress missing implicit constructor warnings.
-  factory FEFuncRElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEFuncRElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEFuncRElement.SVGFEFuncRElement')
   @DocsEditable()
-  factory FEFuncRElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFuncR");
+  factory FEFuncRElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feFuncR");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1517,13 +1606,14 @@
   FEFuncRElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feFuncR') && (new SvgElement.tag('feFuncR') is FEFuncRElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feFuncR') &&
+      (new SvgElement.tag('feFuncR') is FEFuncRElement);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('SVGFEGaussianBlurElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1532,13 +1622,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFEGaussianBlurElement")
-class FEGaussianBlurElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FEGaussianBlurElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FEGaussianBlurElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEGaussianBlurElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEGaussianBlurElement.SVGFEGaussianBlurElement')
   @DocsEditable()
-  factory FEGaussianBlurElement() => _SvgElementFactoryProvider.createSvgElement_tag("feGaussianBlur");
+  factory FEGaussianBlurElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feGaussianBlur");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1547,7 +1641,9 @@
   FEGaussianBlurElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feGaussianBlur') && (new SvgElement.tag('feGaussianBlur') is FEGaussianBlurElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feGaussianBlur') &&
+      (new SvgElement.tag('feGaussianBlur') is FEGaussianBlurElement);
 
   @DomName('SVGFEGaussianBlurElement.in1')
   @DocsEditable()
@@ -1563,7 +1659,7 @@
 
   @DomName('SVGFEGaussianBlurElement.setStdDeviation')
   @DocsEditable()
-  void setStdDeviation(num stdDeviationX, num stdDeviationY) native;
+  void setStdDeviation(num stdDeviationX, num stdDeviationY) native ;
 
   // From SVGFilterPrimitiveStandardAttributes
 
@@ -1591,7 +1687,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.
 
-
 @DocsEditable()
 @DomName('SVGFEImageElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1600,13 +1695,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFEImageElement")
-class FEImageElement extends SvgElement implements FilterPrimitiveStandardAttributes, UriReference {
+class FEImageElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes, UriReference {
   // To suppress missing implicit constructor warnings.
-  factory FEImageElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEImageElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEImageElement.SVGFEImageElement')
   @DocsEditable()
-  factory FEImageElement() => _SvgElementFactoryProvider.createSvgElement_tag("feImage");
+  factory FEImageElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feImage");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1615,7 +1714,9 @@
   FEImageElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feImage') && (new SvgElement.tag('feImage') is FEImageElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feImage') &&
+      (new SvgElement.tag('feImage') is FEImageElement);
 
   @DomName('SVGFEImageElement.preserveAspectRatio')
   @DocsEditable()
@@ -1653,7 +1754,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.
 
-
 @DocsEditable()
 @DomName('SVGFEMergeElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1662,13 +1762,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFEMergeElement")
-class FEMergeElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FEMergeElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FEMergeElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEMergeElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEMergeElement.SVGFEMergeElement')
   @DocsEditable()
-  factory FEMergeElement() => _SvgElementFactoryProvider.createSvgElement_tag("feMerge");
+  factory FEMergeElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feMerge");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1677,7 +1781,9 @@
   FEMergeElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feMerge') && (new SvgElement.tag('feMerge') is FEMergeElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feMerge') &&
+      (new SvgElement.tag('feMerge') is FEMergeElement);
 
   // From SVGFilterPrimitiveStandardAttributes
 
@@ -1705,7 +1811,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.
 
-
 @DocsEditable()
 @DomName('SVGFEMergeNodeElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1716,11 +1821,14 @@
 @Native("SVGFEMergeNodeElement")
 class FEMergeNodeElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
-  factory FEMergeNodeElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEMergeNodeElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEMergeNodeElement.SVGFEMergeNodeElement')
   @DocsEditable()
-  factory FEMergeNodeElement() => _SvgElementFactoryProvider.createSvgElement_tag("feMergeNode");
+  factory FEMergeNodeElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feMergeNode");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1729,7 +1837,9 @@
   FEMergeNodeElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feMergeNode') && (new SvgElement.tag('feMergeNode') is FEMergeNodeElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feMergeNode') &&
+      (new SvgElement.tag('feMergeNode') is FEMergeNodeElement);
 
   @DomName('SVGFEMergeNodeElement.in1')
   @DocsEditable()
@@ -1739,7 +1849,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.
 
-
 @DocsEditable()
 @DomName('SVGFEMorphologyElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1748,9 +1857,12 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFEMorphologyElement")
-class FEMorphologyElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FEMorphologyElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FEMorphologyElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEMorphologyElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1812,7 +1924,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.
 
-
 @DocsEditable()
 @DomName('SVGFEOffsetElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1821,13 +1932,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFEOffsetElement")
-class FEOffsetElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FEOffsetElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FEOffsetElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEOffsetElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEOffsetElement.SVGFEOffsetElement')
   @DocsEditable()
-  factory FEOffsetElement() => _SvgElementFactoryProvider.createSvgElement_tag("feOffset");
+  factory FEOffsetElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feOffset");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1836,7 +1951,9 @@
   FEOffsetElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feOffset') && (new SvgElement.tag('feOffset') is FEOffsetElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feOffset') &&
+      (new SvgElement.tag('feOffset') is FEOffsetElement);
 
   @DomName('SVGFEOffsetElement.dx')
   @DocsEditable()
@@ -1876,7 +1993,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.
 
-
 @DocsEditable()
 @DomName('SVGFEPointLightElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1887,11 +2003,14 @@
 @Native("SVGFEPointLightElement")
 class FEPointLightElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
-  factory FEPointLightElement._() { throw new UnsupportedError("Not supported"); }
+  factory FEPointLightElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFEPointLightElement.SVGFEPointLightElement')
   @DocsEditable()
-  factory FEPointLightElement() => _SvgElementFactoryProvider.createSvgElement_tag("fePointLight");
+  factory FEPointLightElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("fePointLight");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1900,7 +2019,9 @@
   FEPointLightElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('fePointLight') && (new SvgElement.tag('fePointLight') is FEPointLightElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('fePointLight') &&
+      (new SvgElement.tag('fePointLight') is FEPointLightElement);
 
   @DomName('SVGFEPointLightElement.x')
   @DocsEditable()
@@ -1918,7 +2039,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.
 
-
 @DocsEditable()
 @DomName('SVGFESpecularLightingElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -1927,13 +2047,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFESpecularLightingElement")
-class FESpecularLightingElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FESpecularLightingElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FESpecularLightingElement._() { throw new UnsupportedError("Not supported"); }
+  factory FESpecularLightingElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFESpecularLightingElement.SVGFESpecularLightingElement')
   @DocsEditable()
-  factory FESpecularLightingElement() => _SvgElementFactoryProvider.createSvgElement_tag("feSpecularLighting");
+  factory FESpecularLightingElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feSpecularLighting");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1942,7 +2066,9 @@
   FESpecularLightingElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feSpecularLighting') && (new SvgElement.tag('feSpecularLighting') is FESpecularLightingElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feSpecularLighting') &&
+      (new SvgElement.tag('feSpecularLighting') is FESpecularLightingElement);
 
   @DomName('SVGFESpecularLightingElement.in1')
   @DocsEditable()
@@ -1996,7 +2122,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.
 
-
 @DocsEditable()
 @DomName('SVGFESpotLightElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -2007,11 +2132,14 @@
 @Native("SVGFESpotLightElement")
 class FESpotLightElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
-  factory FESpotLightElement._() { throw new UnsupportedError("Not supported"); }
+  factory FESpotLightElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFESpotLightElement.SVGFESpotLightElement')
   @DocsEditable()
-  factory FESpotLightElement() => _SvgElementFactoryProvider.createSvgElement_tag("feSpotLight");
+  factory FESpotLightElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feSpotLight");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2020,7 +2148,9 @@
   FESpotLightElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feSpotLight') && (new SvgElement.tag('feSpotLight') is FESpotLightElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feSpotLight') &&
+      (new SvgElement.tag('feSpotLight') is FESpotLightElement);
 
   @DomName('SVGFESpotLightElement.limitingConeAngle')
   @DocsEditable()
@@ -2058,7 +2188,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.
 
-
 @DocsEditable()
 @DomName('SVGFETileElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -2067,13 +2196,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFETileElement")
-class FETileElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FETileElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FETileElement._() { throw new UnsupportedError("Not supported"); }
+  factory FETileElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFETileElement.SVGFETileElement')
   @DocsEditable()
-  factory FETileElement() => _SvgElementFactoryProvider.createSvgElement_tag("feTile");
+  factory FETileElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feTile");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2082,7 +2215,9 @@
   FETileElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feTile') && (new SvgElement.tag('feTile') is FETileElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feTile') &&
+      (new SvgElement.tag('feTile') is FETileElement);
 
   @DomName('SVGFETileElement.in1')
   @DocsEditable()
@@ -2114,7 +2249,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.
 
-
 @DocsEditable()
 @DomName('SVGFETurbulenceElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -2123,13 +2257,17 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
 @Native("SVGFETurbulenceElement")
-class FETurbulenceElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class FETurbulenceElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory FETurbulenceElement._() { throw new UnsupportedError("Not supported"); }
+  factory FETurbulenceElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFETurbulenceElement.SVGFETurbulenceElement')
   @DocsEditable()
-  factory FETurbulenceElement() => _SvgElementFactoryProvider.createSvgElement_tag("feTurbulence");
+  factory FETurbulenceElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("feTurbulence");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2138,7 +2276,9 @@
   FETurbulenceElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('feTurbulence') && (new SvgElement.tag('feTurbulence') is FETurbulenceElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('feTurbulence') &&
+      (new SvgElement.tag('feTurbulence') is FETurbulenceElement);
 
   @DomName('SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH')
   @DocsEditable()
@@ -2214,7 +2354,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.
 
-
 @DocsEditable()
 @DomName('SVGFilterElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -2225,11 +2364,14 @@
 @Native("SVGFilterElement")
 class FilterElement extends SvgElement implements UriReference {
   // To suppress missing implicit constructor warnings.
-  factory FilterElement._() { throw new UnsupportedError("Not supported"); }
+  factory FilterElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGFilterElement.SVGFilterElement')
   @DocsEditable()
-  factory FilterElement() => _SvgElementFactoryProvider.createSvgElement_tag("filter");
+  factory FilterElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("filter");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2238,7 +2380,9 @@
   FilterElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('filter') && (new SvgElement.tag('filter') is FilterElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('filter') &&
+      (new SvgElement.tag('filter') is FilterElement);
 
   @DomName('SVGFilterElement.filterUnits')
   @DocsEditable()
@@ -2274,13 +2418,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.
 
-
 @DocsEditable()
 @DomName('SVGFilterPrimitiveStandardAttributes')
 @Unstable()
 abstract class FilterPrimitiveStandardAttributes extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory FilterPrimitiveStandardAttributes._() { throw new UnsupportedError("Not supported"); }
+  factory FilterPrimitiveStandardAttributes._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   final AnimatedLength height;
 
@@ -2296,13 +2441,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.
 
-
 @DocsEditable()
 @DomName('SVGFitToViewBox')
 @Unstable()
 abstract class FitToViewBox extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory FitToViewBox._() { throw new UnsupportedError("Not supported"); }
+  factory FitToViewBox._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   final AnimatedPreserveAspectRatio preserveAspectRatio;
 
@@ -2312,7 +2458,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.
 
-
 @DocsEditable()
 @DomName('SVGForeignObjectElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -2322,11 +2467,14 @@
 @Native("SVGForeignObjectElement")
 class ForeignObjectElement extends GraphicsElement {
   // To suppress missing implicit constructor warnings.
-  factory ForeignObjectElement._() { throw new UnsupportedError("Not supported"); }
+  factory ForeignObjectElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGForeignObjectElement.SVGForeignObjectElement')
   @DocsEditable()
-  factory ForeignObjectElement() => _SvgElementFactoryProvider.createSvgElement_tag("foreignObject");
+  factory ForeignObjectElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("foreignObject");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2335,7 +2483,9 @@
   ForeignObjectElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('foreignObject') && (new SvgElement.tag('foreignObject') is ForeignObjectElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('foreignObject') &&
+      (new SvgElement.tag('foreignObject') is ForeignObjectElement);
 
   @DomName('SVGForeignObjectElement.height')
   @DocsEditable()
@@ -2357,14 +2507,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.
 
-
 @DocsEditable()
 @DomName('SVGGElement')
 @Unstable()
 @Native("SVGGElement")
 class GElement extends GraphicsElement {
   // To suppress missing implicit constructor warnings.
-  factory GElement._() { throw new UnsupportedError("Not supported"); }
+  factory GElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGGElement.SVGGElement')
   @DocsEditable()
@@ -2380,14 +2531,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.
 
-
 @DocsEditable()
 @DomName('SVGGeometryElement')
 @Experimental() // untriaged
 @Native("SVGGeometryElement")
 class GeometryElement extends GraphicsElement {
   // To suppress missing implicit constructor warnings.
-  factory GeometryElement._() { throw new UnsupportedError("Not supported"); }
+  factory GeometryElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2398,25 +2550,26 @@
   @DomName('SVGGeometryElement.isPointInFill')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isPointInFill(Point point) native;
+  bool isPointInFill(Point point) native ;
 
   @DomName('SVGGeometryElement.isPointInStroke')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isPointInStroke(Point point) native;
+  bool isPointInStroke(Point point) 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.
 
-
 @DocsEditable()
 @DomName('SVGGraphicsElement')
 @Experimental() // untriaged
 @Native("SVGGraphicsElement")
 class GraphicsElement extends SvgElement implements Tests {
   // To suppress missing implicit constructor warnings.
-  factory GraphicsElement._() { throw new UnsupportedError("Not supported"); }
+  factory GraphicsElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2442,24 +2595,24 @@
   @DomName('SVGGraphicsElement.getBBox')
   @DocsEditable()
   @Experimental() // untriaged
-  Rect getBBox() native;
+  Rect getBBox() native ;
 
   @JSName('getCTM')
   @DomName('SVGGraphicsElement.getCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getCtm() native;
+  Matrix getCtm() native ;
 
   @JSName('getScreenCTM')
   @DomName('SVGGraphicsElement.getScreenCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getScreenCtm() native;
+  Matrix getScreenCtm() native ;
 
   @DomName('SVGGraphicsElement.getTransformToElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getTransformToElement(SvgElement element) native;
+  Matrix getTransformToElement(SvgElement element) native ;
 
   // From SVGTests
 
@@ -2481,24 +2634,26 @@
   @DomName('SVGGraphicsElement.hasExtension')
   @DocsEditable()
   @Experimental() // untriaged
-  bool hasExtension(String extension) native;
+  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.
 
-
 @DocsEditable()
 @DomName('SVGImageElement')
 @Unstable()
 @Native("SVGImageElement")
 class ImageElement extends GraphicsElement implements UriReference {
   // To suppress missing implicit constructor warnings.
-  factory ImageElement._() { throw new UnsupportedError("Not supported"); }
+  factory ImageElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGImageElement.SVGImageElement')
   @DocsEditable()
-  factory ImageElement() => _SvgElementFactoryProvider.createSvgElement_tag("image");
+  factory ImageElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("image");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2536,14 +2691,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.
 
-
 @DocsEditable()
 @DomName('SVGLength')
 @Unstable()
 @Native("SVGLength")
 class Length extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Length._() { throw new UnsupportedError("Not supported"); }
+  factory Length._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGLength.SVG_LENGTHTYPE_CM')
   @DocsEditable()
@@ -2607,24 +2763,27 @@
 
   @DomName('SVGLength.convertToSpecifiedUnits')
   @DocsEditable()
-  void convertToSpecifiedUnits(int unitType) native;
+  void convertToSpecifiedUnits(int unitType) native ;
 
   @DomName('SVGLength.newValueSpecifiedUnits')
   @DocsEditable()
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) 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.
 
-
 @DocsEditable()
 @DomName('SVGLengthList')
 @Unstable()
 @Native("SVGLengthList")
-class LengthList extends Interceptor with ListMixin<Length>, ImmutableListMixin<Length> implements List<Length> {
+class LengthList extends Interceptor
+    with ListMixin<Length>, ImmutableListMixin<Length>
+    implements List<Length> {
   // To suppress missing implicit constructor warnings.
-  factory LengthList._() { throw new UnsupportedError("Not supported"); }
+  factory LengthList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGLengthList.length')
   @DocsEditable()
@@ -2635,19 +2794,18 @@
   @DocsEditable()
   final int numberOfItems;
 
-  Length operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  Length operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return this.getItem(index);
   }
-  void operator[]=(int index, Length value) {
+
+  void operator []=(int index, Length value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<Length> mixins.
   // Length is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -2682,52 +2840,54 @@
   @DomName('SVGLengthList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Length newItem) native;
+  void __setter__(int index, Length newItem) native ;
 
   @DomName('SVGLengthList.appendItem')
   @DocsEditable()
-  Length appendItem(Length newItem) native;
+  Length appendItem(Length newItem) native ;
 
   @DomName('SVGLengthList.clear')
   @DocsEditable()
-  void clear() native;
+  void clear() native ;
 
   @DomName('SVGLengthList.getItem')
   @DocsEditable()
-  Length getItem(int index) native;
+  Length getItem(int index) native ;
 
   @DomName('SVGLengthList.initialize')
   @DocsEditable()
-  Length initialize(Length newItem) native;
+  Length initialize(Length newItem) native ;
 
   @DomName('SVGLengthList.insertItemBefore')
   @DocsEditable()
-  Length insertItemBefore(Length newItem, int index) native;
+  Length insertItemBefore(Length newItem, int index) native ;
 
   @DomName('SVGLengthList.removeItem')
   @DocsEditable()
-  Length removeItem(int index) native;
+  Length removeItem(int index) native ;
 
   @DomName('SVGLengthList.replaceItem')
   @DocsEditable()
-  Length replaceItem(Length newItem, int index) native;
+  Length replaceItem(Length 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.
 
-
 @DocsEditable()
 @DomName('SVGLineElement')
 @Unstable()
 @Native("SVGLineElement")
 class LineElement extends GeometryElement {
   // To suppress missing implicit constructor warnings.
-  factory LineElement._() { throw new UnsupportedError("Not supported"); }
+  factory LineElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGLineElement.SVGLineElement')
   @DocsEditable()
-  factory LineElement() => _SvgElementFactoryProvider.createSvgElement_tag("line");
+  factory LineElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("line");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2755,18 +2915,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.
 
-
 @DocsEditable()
 @DomName('SVGLinearGradientElement')
 @Unstable()
 @Native("SVGLinearGradientElement")
 class LinearGradientElement extends _GradientElement {
   // To suppress missing implicit constructor warnings.
-  factory LinearGradientElement._() { throw new UnsupportedError("Not supported"); }
+  factory LinearGradientElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGLinearGradientElement.SVGLinearGradientElement')
   @DocsEditable()
-  factory LinearGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("linearGradient");
+  factory LinearGradientElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("linearGradient");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2794,18 +2956,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.
 
-
 @DocsEditable()
 @DomName('SVGMarkerElement')
 @Unstable()
 @Native("SVGMarkerElement")
 class MarkerElement extends SvgElement implements FitToViewBox {
   // To suppress missing implicit constructor warnings.
-  factory MarkerElement._() { throw new UnsupportedError("Not supported"); }
+  factory MarkerElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGMarkerElement.SVGMarkerElement')
   @DocsEditable()
-  factory MarkerElement() => _SvgElementFactoryProvider.createSvgElement_tag("marker");
+  factory MarkerElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("marker");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2867,11 +3031,11 @@
 
   @DomName('SVGMarkerElement.setOrientToAngle')
   @DocsEditable()
-  void setOrientToAngle(Angle angle) native;
+  void setOrientToAngle(Angle angle) native ;
 
   @DomName('SVGMarkerElement.setOrientToAuto')
   @DocsEditable()
-  void setOrientToAuto() native;
+  void setOrientToAuto() native ;
 
   // From SVGFitToViewBox
 
@@ -2887,18 +3051,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.
 
-
 @DocsEditable()
 @DomName('SVGMaskElement')
 @Unstable()
 @Native("SVGMaskElement")
 class MaskElement extends SvgElement implements Tests {
   // To suppress missing implicit constructor warnings.
-  factory MaskElement._() { throw new UnsupportedError("Not supported"); }
+  factory MaskElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGMaskElement.SVGMaskElement')
   @DocsEditable()
-  factory MaskElement() => _SvgElementFactoryProvider.createSvgElement_tag("mask");
+  factory MaskElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("mask");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2946,20 +3112,21 @@
 
   @DomName('SVGMaskElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) native;
+  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.
 
-
 @DocsEditable()
 @DomName('SVGMatrix')
 @Unstable()
 @Native("SVGMatrix")
 class Matrix extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Matrix._() { throw new UnsupportedError("Not supported"); }
+  factory Matrix._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGMatrix.a')
   @DocsEditable()
@@ -2987,60 +3154,61 @@
 
   @DomName('SVGMatrix.flipX')
   @DocsEditable()
-  Matrix flipX() native;
+  Matrix flipX() native ;
 
   @DomName('SVGMatrix.flipY')
   @DocsEditable()
-  Matrix flipY() native;
+  Matrix flipY() native ;
 
   @DomName('SVGMatrix.inverse')
   @DocsEditable()
-  Matrix inverse() native;
+  Matrix inverse() native ;
 
   @DomName('SVGMatrix.multiply')
   @DocsEditable()
-  Matrix multiply(Matrix secondMatrix) native;
+  Matrix multiply(Matrix secondMatrix) native ;
 
   @DomName('SVGMatrix.rotate')
   @DocsEditable()
-  Matrix rotate(num angle) native;
+  Matrix rotate(num angle) native ;
 
   @DomName('SVGMatrix.rotateFromVector')
   @DocsEditable()
-  Matrix rotateFromVector(num x, num y) native;
+  Matrix rotateFromVector(num x, num y) native ;
 
   @DomName('SVGMatrix.scale')
   @DocsEditable()
-  Matrix scale(num scaleFactor) native;
+  Matrix scale(num scaleFactor) native ;
 
   @DomName('SVGMatrix.scaleNonUniform')
   @DocsEditable()
-  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) native;
+  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) native ;
 
   @DomName('SVGMatrix.skewX')
   @DocsEditable()
-  Matrix skewX(num angle) native;
+  Matrix skewX(num angle) native ;
 
   @DomName('SVGMatrix.skewY')
   @DocsEditable()
-  Matrix skewY(num angle) native;
+  Matrix skewY(num angle) native ;
 
   @DomName('SVGMatrix.translate')
   @DocsEditable()
-  Matrix translate(num x, num y) native;
+  Matrix 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.
 
-
 @DocsEditable()
 @DomName('SVGMetadataElement')
 @Unstable()
 @Native("SVGMetadataElement")
 class MetadataElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
-  factory MetadataElement._() { throw new UnsupportedError("Not supported"); }
+  factory MetadataElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -3052,14 +3220,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.
 
-
 @DocsEditable()
 @DomName('SVGNumber')
 @Unstable()
 @Native("SVGNumber")
 class Number extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Number._() { throw new UnsupportedError("Not supported"); }
+  factory Number._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGNumber.value')
   @DocsEditable()
@@ -3069,14 +3238,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.
 
-
 @DocsEditable()
 @DomName('SVGNumberList')
 @Unstable()
 @Native("SVGNumberList")
-class NumberList extends Interceptor with ListMixin<Number>, ImmutableListMixin<Number> implements List<Number> {
+class NumberList extends Interceptor
+    with ListMixin<Number>, ImmutableListMixin<Number>
+    implements List<Number> {
   // To suppress missing implicit constructor warnings.
-  factory NumberList._() { throw new UnsupportedError("Not supported"); }
+  factory NumberList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGNumberList.length')
   @DocsEditable()
@@ -3087,19 +3259,18 @@
   @DocsEditable()
   final int numberOfItems;
 
-  Number operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  Number operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return this.getItem(index);
   }
-  void operator[]=(int index, Number value) {
+
+  void operator []=(int index, Number value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<Number> mixins.
   // Number is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -3134,52 +3305,54 @@
   @DomName('SVGNumberList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Number newItem) native;
+  void __setter__(int index, Number newItem) native ;
 
   @DomName('SVGNumberList.appendItem')
   @DocsEditable()
-  Number appendItem(Number newItem) native;
+  Number appendItem(Number newItem) native ;
 
   @DomName('SVGNumberList.clear')
   @DocsEditable()
-  void clear() native;
+  void clear() native ;
 
   @DomName('SVGNumberList.getItem')
   @DocsEditable()
-  Number getItem(int index) native;
+  Number getItem(int index) native ;
 
   @DomName('SVGNumberList.initialize')
   @DocsEditable()
-  Number initialize(Number newItem) native;
+  Number initialize(Number newItem) native ;
 
   @DomName('SVGNumberList.insertItemBefore')
   @DocsEditable()
-  Number insertItemBefore(Number newItem, int index) native;
+  Number insertItemBefore(Number newItem, int index) native ;
 
   @DomName('SVGNumberList.removeItem')
   @DocsEditable()
-  Number removeItem(int index) native;
+  Number removeItem(int index) native ;
 
   @DomName('SVGNumberList.replaceItem')
   @DocsEditable()
-  Number replaceItem(Number newItem, int index) native;
+  Number replaceItem(Number 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.
 
-
 @DocsEditable()
 @DomName('SVGPathElement')
 @Unstable()
 @Native("SVGPathElement")
 class PathElement extends GeometryElement {
   // To suppress missing implicit constructor warnings.
-  factory PathElement._() { throw new UnsupportedError("Not supported"); }
+  factory PathElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathElement.SVGPathElement')
   @DocsEditable()
-  factory PathElement() => _SvgElementFactoryProvider.createSvgElement_tag("path");
+  factory PathElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("path");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -3210,122 +3383,133 @@
   @JSName('createSVGPathSegArcAbs')
   @DomName('SVGPathElement.createSVGPathSegArcAbs')
   @DocsEditable()
-  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
+  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle,
+      bool largeArcFlag, bool sweepFlag) native ;
 
   @JSName('createSVGPathSegArcRel')
   @DomName('SVGPathElement.createSVGPathSegArcRel')
   @DocsEditable()
-  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native;
+  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle,
+      bool largeArcFlag, bool sweepFlag) native ;
 
   @JSName('createSVGPathSegClosePath')
   @DomName('SVGPathElement.createSVGPathSegClosePath')
   @DocsEditable()
-  PathSegClosePath createSvgPathSegClosePath() native;
+  PathSegClosePath createSvgPathSegClosePath() native ;
 
   @JSName('createSVGPathSegCurvetoCubicAbs')
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicAbs')
   @DocsEditable()
-  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native;
+  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(
+      num x, num y, num x1, num y1, num x2, num y2) native ;
 
   @JSName('createSVGPathSegCurvetoCubicRel')
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicRel')
   @DocsEditable()
-  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) native;
+  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(
+      num x, num y, num x1, num y1, num x2, num y2) native ;
 
   @JSName('createSVGPathSegCurvetoCubicSmoothAbs')
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) native;
+  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(
+      num x, num y, num x2, num y2) native ;
 
   @JSName('createSVGPathSegCurvetoCubicSmoothRel')
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native;
+  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(
+      num x, num y, num x2, num y2) native ;
 
   @JSName('createSVGPathSegCurvetoQuadraticAbs')
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native;
+  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(
+      num x, num y, num x1, num y1) native ;
 
   @JSName('createSVGPathSegCurvetoQuadraticRel')
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native;
+  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(
+      num x, num y, num x1, num y1) native ;
 
   @JSName('createSVGPathSegCurvetoQuadraticSmoothAbs')
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) native;
+  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(
+      num x, num y) native ;
 
   @JSName('createSVGPathSegCurvetoQuadraticSmoothRel')
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) native;
+  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(
+      num x, num y) native ;
 
   @JSName('createSVGPathSegLinetoAbs')
   @DomName('SVGPathElement.createSVGPathSegLinetoAbs')
   @DocsEditable()
-  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) native;
+  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) native ;
 
   @JSName('createSVGPathSegLinetoHorizontalAbs')
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalAbs')
   @DocsEditable()
-  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) native;
+  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) native ;
 
   @JSName('createSVGPathSegLinetoHorizontalRel')
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalRel')
   @DocsEditable()
-  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) native;
+  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) native ;
 
   @JSName('createSVGPathSegLinetoRel')
   @DomName('SVGPathElement.createSVGPathSegLinetoRel')
   @DocsEditable()
-  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) native;
+  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) native ;
 
   @JSName('createSVGPathSegLinetoVerticalAbs')
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalAbs')
   @DocsEditable()
-  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) native;
+  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) native ;
 
   @JSName('createSVGPathSegLinetoVerticalRel')
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalRel')
   @DocsEditable()
-  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) native;
+  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) native ;
 
   @JSName('createSVGPathSegMovetoAbs')
   @DomName('SVGPathElement.createSVGPathSegMovetoAbs')
   @DocsEditable()
-  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) native;
+  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) native ;
 
   @JSName('createSVGPathSegMovetoRel')
   @DomName('SVGPathElement.createSVGPathSegMovetoRel')
   @DocsEditable()
-  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) native;
+  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) native ;
 
   @DomName('SVGPathElement.getPathSegAtLength')
   @DocsEditable()
-  int getPathSegAtLength(num distance) native;
+  int getPathSegAtLength(num distance) native ;
 
   @DomName('SVGPathElement.getPointAtLength')
   @DocsEditable()
-  Point getPointAtLength(num distance) native;
+  Point getPointAtLength(num distance) native ;
 
   @DomName('SVGPathElement.getTotalLength')
   @DocsEditable()
-  double getTotalLength() native;
+  double getTotalLength() 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.
 
-
 @DocsEditable()
 @DomName('SVGPathSeg')
 @Unstable()
 @Native("SVGPathSeg")
 class PathSeg extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PathSeg._() { throw new UnsupportedError("Not supported"); }
+  factory PathSeg._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSeg.PATHSEG_ARC_ABS')
   @DocsEditable()
@@ -3419,14 +3603,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegArcAbs')
 @Unstable()
 @Native("SVGPathSegArcAbs")
 class PathSegArcAbs extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegArcAbs._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegArcAbs._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegArcAbs.angle')
   @DocsEditable()
@@ -3460,14 +3645,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegArcRel')
 @Unstable()
 @Native("SVGPathSegArcRel")
 class PathSegArcRel extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegArcRel._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegArcRel._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegArcRel.angle')
   @DocsEditable()
@@ -3501,27 +3687,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('SVGPathSegClosePath')
 @Unstable()
 @Native("SVGPathSegClosePath")
 class PathSegClosePath extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegClosePath._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegClosePath._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegCurvetoCubicAbs')
 @Unstable()
 @Native("SVGPathSegCurvetoCubicAbs")
 class PathSegCurvetoCubicAbs extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegCurvetoCubicAbs._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegCurvetoCubicAbs._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegCurvetoCubicAbs.x')
   @DocsEditable()
@@ -3551,14 +3739,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegCurvetoCubicRel')
 @Unstable()
 @Native("SVGPathSegCurvetoCubicRel")
 class PathSegCurvetoCubicRel extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegCurvetoCubicRel._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegCurvetoCubicRel._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegCurvetoCubicRel.x')
   @DocsEditable()
@@ -3588,14 +3777,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegCurvetoCubicSmoothAbs')
 @Unstable()
 @Native("SVGPathSegCurvetoCubicSmoothAbs")
 class PathSegCurvetoCubicSmoothAbs extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegCurvetoCubicSmoothAbs._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegCurvetoCubicSmoothAbs._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   @DocsEditable()
@@ -3617,14 +3807,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegCurvetoCubicSmoothRel')
 @Unstable()
 @Native("SVGPathSegCurvetoCubicSmoothRel")
 class PathSegCurvetoCubicSmoothRel extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegCurvetoCubicSmoothRel._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegCurvetoCubicSmoothRel._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   @DocsEditable()
@@ -3646,14 +3837,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegCurvetoQuadraticAbs')
 @Unstable()
 @Native("SVGPathSegCurvetoQuadraticAbs")
 class PathSegCurvetoQuadraticAbs extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegCurvetoQuadraticAbs._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegCurvetoQuadraticAbs._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   @DocsEditable()
@@ -3675,14 +3867,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegCurvetoQuadraticRel')
 @Unstable()
 @Native("SVGPathSegCurvetoQuadraticRel")
 class PathSegCurvetoQuadraticRel extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegCurvetoQuadraticRel._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegCurvetoQuadraticRel._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
   @DocsEditable()
@@ -3704,14 +3897,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegCurvetoQuadraticSmoothAbs')
 @Unstable()
 @Native("SVGPathSegCurvetoQuadraticSmoothAbs")
 class PathSegCurvetoQuadraticSmoothAbs extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegCurvetoQuadraticSmoothAbs._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegCurvetoQuadraticSmoothAbs._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   @DocsEditable()
@@ -3725,14 +3919,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegCurvetoQuadraticSmoothRel')
 @Unstable()
 @Native("SVGPathSegCurvetoQuadraticSmoothRel")
 class PathSegCurvetoQuadraticSmoothRel extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegCurvetoQuadraticSmoothRel._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegCurvetoQuadraticSmoothRel._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   @DocsEditable()
@@ -3746,14 +3941,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegLinetoAbs')
 @Unstable()
 @Native("SVGPathSegLinetoAbs")
 class PathSegLinetoAbs extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegLinetoAbs._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegLinetoAbs._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegLinetoAbs.x')
   @DocsEditable()
@@ -3767,14 +3963,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegLinetoHorizontalAbs')
 @Unstable()
 @Native("SVGPathSegLinetoHorizontalAbs")
 class PathSegLinetoHorizontalAbs extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegLinetoHorizontalAbs._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegLinetoHorizontalAbs._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
   @DocsEditable()
@@ -3784,14 +3981,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegLinetoHorizontalRel')
 @Unstable()
 @Native("SVGPathSegLinetoHorizontalRel")
 class PathSegLinetoHorizontalRel extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegLinetoHorizontalRel._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegLinetoHorizontalRel._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegLinetoHorizontalRel.x')
   @DocsEditable()
@@ -3801,14 +3999,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegLinetoRel')
 @Unstable()
 @Native("SVGPathSegLinetoRel")
 class PathSegLinetoRel extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegLinetoRel._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegLinetoRel._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegLinetoRel.x')
   @DocsEditable()
@@ -3822,14 +4021,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegLinetoVerticalAbs')
 @Unstable()
 @Native("SVGPathSegLinetoVerticalAbs")
 class PathSegLinetoVerticalAbs extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegLinetoVerticalAbs._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegLinetoVerticalAbs._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegLinetoVerticalAbs.y')
   @DocsEditable()
@@ -3839,14 +4039,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegLinetoVerticalRel')
 @Unstable()
 @Native("SVGPathSegLinetoVerticalRel")
 class PathSegLinetoVerticalRel extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegLinetoVerticalRel._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegLinetoVerticalRel._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegLinetoVerticalRel.y')
   @DocsEditable()
@@ -3856,14 +4057,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegList')
 @Unstable()
 @Native("SVGPathSegList")
-class PathSegList extends Interceptor with ListMixin<PathSeg>, ImmutableListMixin<PathSeg> implements List<PathSeg> {
+class PathSegList extends Interceptor
+    with ListMixin<PathSeg>, ImmutableListMixin<PathSeg>
+    implements List<PathSeg> {
   // To suppress missing implicit constructor warnings.
-  factory PathSegList._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegList.length')
   @DocsEditable()
@@ -3874,19 +4078,18 @@
   @DocsEditable()
   final int numberOfItems;
 
-  PathSeg operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  PathSeg operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return this.getItem(index);
   }
-  void operator[]=(int index, PathSeg value) {
+
+  void operator []=(int index, PathSeg value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<PathSeg> mixins.
   // PathSeg is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -3921,48 +4124,49 @@
   @DomName('SVGPathSegList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, PathSeg newItem) native;
+  void __setter__(int index, PathSeg newItem) native ;
 
   @DomName('SVGPathSegList.appendItem')
   @DocsEditable()
-  PathSeg appendItem(PathSeg newItem) native;
+  PathSeg appendItem(PathSeg newItem) native ;
 
   @DomName('SVGPathSegList.clear')
   @DocsEditable()
-  void clear() native;
+  void clear() native ;
 
   @DomName('SVGPathSegList.getItem')
   @DocsEditable()
-  PathSeg getItem(int index) native;
+  PathSeg getItem(int index) native ;
 
   @DomName('SVGPathSegList.initialize')
   @DocsEditable()
-  PathSeg initialize(PathSeg newItem) native;
+  PathSeg initialize(PathSeg newItem) native ;
 
   @DomName('SVGPathSegList.insertItemBefore')
   @DocsEditable()
-  PathSeg insertItemBefore(PathSeg newItem, int index) native;
+  PathSeg insertItemBefore(PathSeg newItem, int index) native ;
 
   @DomName('SVGPathSegList.removeItem')
   @DocsEditable()
-  PathSeg removeItem(int index) native;
+  PathSeg removeItem(int index) native ;
 
   @DomName('SVGPathSegList.replaceItem')
   @DocsEditable()
-  PathSeg replaceItem(PathSeg newItem, int index) native;
+  PathSeg replaceItem(PathSeg 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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegMovetoAbs')
 @Unstable()
 @Native("SVGPathSegMovetoAbs")
 class PathSegMovetoAbs extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegMovetoAbs._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegMovetoAbs._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegMovetoAbs.x')
   @DocsEditable()
@@ -3976,14 +4180,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.
 
-
 @DocsEditable()
 @DomName('SVGPathSegMovetoRel')
 @Unstable()
 @Native("SVGPathSegMovetoRel")
 class PathSegMovetoRel extends PathSeg {
   // To suppress missing implicit constructor warnings.
-  factory PathSegMovetoRel._() { throw new UnsupportedError("Not supported"); }
+  factory PathSegMovetoRel._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPathSegMovetoRel.x')
   @DocsEditable()
@@ -3997,18 +4202,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.
 
-
 @DocsEditable()
 @DomName('SVGPatternElement')
 @Unstable()
 @Native("SVGPatternElement")
-class PatternElement extends SvgElement implements FitToViewBox, UriReference, Tests {
+class PatternElement extends SvgElement
+    implements FitToViewBox, UriReference, Tests {
   // To suppress missing implicit constructor warnings.
-  factory PatternElement._() { throw new UnsupportedError("Not supported"); }
+  factory PatternElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPatternElement.SVGPatternElement')
   @DocsEditable()
-  factory PatternElement() => _SvgElementFactoryProvider.createSvgElement_tag("pattern");
+  factory PatternElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("pattern");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -4070,7 +4278,7 @@
 
   @DomName('SVGPatternElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) native;
+  bool hasExtension(String extension) native ;
 
   // From SVGURIReference
 
@@ -4082,14 +4290,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.
 
-
 @DocsEditable()
 @DomName('SVGPoint')
 @Unstable()
 @Native("SVGPoint")
 class Point extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Point._() { throw new UnsupportedError("Not supported"); }
+  factory Point._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPoint.x')
   @DocsEditable()
@@ -4101,20 +4310,21 @@
 
   @DomName('SVGPoint.matrixTransform')
   @DocsEditable()
-  Point matrixTransform(Matrix matrix) native;
+  Point matrixTransform(Matrix 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.
 
-
 @DocsEditable()
 @DomName('SVGPointList')
 @Unstable()
 @Native("SVGPointList")
 class PointList extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PointList._() { throw new UnsupportedError("Not supported"); }
+  factory PointList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPointList.length')
   @DocsEditable()
@@ -4128,52 +4338,54 @@
   @DomName('SVGPointList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Point newItem) native;
+  void __setter__(int index, Point newItem) native ;
 
   @DomName('SVGPointList.appendItem')
   @DocsEditable()
-  Point appendItem(Point newItem) native;
+  Point appendItem(Point newItem) native ;
 
   @DomName('SVGPointList.clear')
   @DocsEditable()
-  void clear() native;
+  void clear() native ;
 
   @DomName('SVGPointList.getItem')
   @DocsEditable()
-  Point getItem(int index) native;
+  Point getItem(int index) native ;
 
   @DomName('SVGPointList.initialize')
   @DocsEditable()
-  Point initialize(Point newItem) native;
+  Point initialize(Point newItem) native ;
 
   @DomName('SVGPointList.insertItemBefore')
   @DocsEditable()
-  Point insertItemBefore(Point newItem, int index) native;
+  Point insertItemBefore(Point newItem, int index) native ;
 
   @DomName('SVGPointList.removeItem')
   @DocsEditable()
-  Point removeItem(int index) native;
+  Point removeItem(int index) native ;
 
   @DomName('SVGPointList.replaceItem')
   @DocsEditable()
-  Point replaceItem(Point newItem, int index) native;
+  Point replaceItem(Point 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.
 
-
 @DocsEditable()
 @DomName('SVGPolygonElement')
 @Unstable()
 @Native("SVGPolygonElement")
 class PolygonElement extends GeometryElement {
   // To suppress missing implicit constructor warnings.
-  factory PolygonElement._() { throw new UnsupportedError("Not supported"); }
+  factory PolygonElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPolygonElement.SVGPolygonElement')
   @DocsEditable()
-  factory PolygonElement() => _SvgElementFactoryProvider.createSvgElement_tag("polygon");
+  factory PolygonElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("polygon");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -4193,18 +4405,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.
 
-
 @DocsEditable()
 @DomName('SVGPolylineElement')
 @Unstable()
 @Native("SVGPolylineElement")
 class PolylineElement extends GeometryElement {
   // To suppress missing implicit constructor warnings.
-  factory PolylineElement._() { throw new UnsupportedError("Not supported"); }
+  factory PolylineElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPolylineElement.SVGPolylineElement')
   @DocsEditable()
-  factory PolylineElement() => _SvgElementFactoryProvider.createSvgElement_tag("polyline");
+  factory PolylineElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("polyline");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -4224,14 +4438,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.
 
-
 @DocsEditable()
 @DomName('SVGPreserveAspectRatio')
 @Unstable()
 @Native("SVGPreserveAspectRatio")
 class PreserveAspectRatio extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PreserveAspectRatio._() { throw new UnsupportedError("Not supported"); }
+  factory PreserveAspectRatio._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET')
   @DocsEditable()
@@ -4301,18 +4516,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.
 
-
 @DocsEditable()
 @DomName('SVGRadialGradientElement')
 @Unstable()
 @Native("SVGRadialGradientElement")
 class RadialGradientElement extends _GradientElement {
   // To suppress missing implicit constructor warnings.
-  factory RadialGradientElement._() { throw new UnsupportedError("Not supported"); }
+  factory RadialGradientElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGRadialGradientElement.SVGRadialGradientElement')
   @DocsEditable()
-  factory RadialGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("radialGradient");
+  factory RadialGradientElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("radialGradient");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -4348,14 +4565,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.
 
-
 @DocsEditable()
 @DomName('SVGRect')
 @Unstable()
 @Native("SVGRect")
 class Rect extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Rect._() { throw new UnsupportedError("Not supported"); }
+  factory Rect._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGRect.height')
   @DocsEditable()
@@ -4377,18 +4595,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.
 
-
 @DocsEditable()
 @DomName('SVGRectElement')
 @Unstable()
 @Native("SVGRectElement")
 class RectElement extends GeometryElement {
   // To suppress missing implicit constructor warnings.
-  factory RectElement._() { throw new UnsupportedError("Not supported"); }
+  factory RectElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGRectElement.SVGRectElement')
   @DocsEditable()
-  factory RectElement() => _SvgElementFactoryProvider.createSvgElement_tag("rect");
+  factory RectElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("rect");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -4424,18 +4644,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.
 
-
 @DocsEditable()
 @DomName('SVGScriptElement')
 @Unstable()
 @Native("SVGScriptElement")
 class ScriptElement extends SvgElement implements UriReference {
   // To suppress missing implicit constructor warnings.
-  factory ScriptElement._() { throw new UnsupportedError("Not supported"); }
+  factory ScriptElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGScriptElement.SVGScriptElement')
   @DocsEditable()
-  factory ScriptElement() => _SvgElementFactoryProvider.createSvgElement_tag("script");
+  factory ScriptElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("script");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -4457,7 +4679,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.
 
-
 @DocsEditable()
 @DomName('SVGSetElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -4467,11 +4688,14 @@
 @Native("SVGSetElement")
 class SetElement extends AnimationElement {
   // To suppress missing implicit constructor warnings.
-  factory SetElement._() { throw new UnsupportedError("Not supported"); }
+  factory SetElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGSetElement.SVGSetElement')
   @DocsEditable()
-  factory SetElement() => _SvgElementFactoryProvider.createSvgElement_tag("set");
+  factory SetElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("set");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -4480,24 +4704,28 @@
   SetElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('set') && (new SvgElement.tag('set') is SetElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('set') &&
+      (new SvgElement.tag('set') is SetElement);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('SVGStopElement')
 @Unstable()
 @Native("SVGStopElement")
 class StopElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
-  factory StopElement._() { throw new UnsupportedError("Not supported"); }
+  factory StopElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGStopElement.SVGStopElement')
   @DocsEditable()
-  factory StopElement() => _SvgElementFactoryProvider.createSvgElement_tag("stop");
+  factory StopElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("stop");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -4514,14 +4742,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.
 
-
 @DocsEditable()
 @DomName('SVGStringList')
 @Unstable()
 @Native("SVGStringList")
-class StringList extends Interceptor with ListMixin<String>, ImmutableListMixin<String> implements List<String> {
+class StringList extends Interceptor
+    with ListMixin<String>, ImmutableListMixin<String>
+    implements List<String> {
   // To suppress missing implicit constructor warnings.
-  factory StringList._() { throw new UnsupportedError("Not supported"); }
+  factory StringList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGStringList.length')
   @DocsEditable()
@@ -4532,19 +4763,18 @@
   @DocsEditable()
   final int numberOfItems;
 
-  String operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  String operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return this.getItem(index);
   }
-  void operator[]=(int index, String value) {
+
+  void operator []=(int index, String value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<String> mixins.
   // String is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -4579,41 +4809,40 @@
   @DomName('SVGStringList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, String newItem) native;
+  void __setter__(int index, String newItem) native ;
 
   @DomName('SVGStringList.appendItem')
   @DocsEditable()
-  String appendItem(String newItem) native;
+  String appendItem(String newItem) native ;
 
   @DomName('SVGStringList.clear')
   @DocsEditable()
-  void clear() native;
+  void clear() native ;
 
   @DomName('SVGStringList.getItem')
   @DocsEditable()
-  String getItem(int index) native;
+  String getItem(int index) native ;
 
   @DomName('SVGStringList.initialize')
   @DocsEditable()
-  String initialize(String newItem) native;
+  String initialize(String newItem) native ;
 
   @DomName('SVGStringList.insertItemBefore')
   @DocsEditable()
-  String insertItemBefore(String item, int index) native;
+  String insertItemBefore(String item, int index) native ;
 
   @DomName('SVGStringList.removeItem')
   @DocsEditable()
-  String removeItem(int index) native;
+  String removeItem(int index) native ;
 
   @DomName('SVGStringList.replaceItem')
   @DocsEditable()
-  String replaceItem(String newItem, int index) native;
+  String replaceItem(String 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.
 
-
 @DocsEditable()
 @DomName('SVGStyleElement')
 // http://www.w3.org/TR/SVG/types.html#InterfaceSVGStylable
@@ -4621,11 +4850,14 @@
 @Native("SVGStyleElement")
 class StyleElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
-  factory StyleElement._() { throw new UnsupportedError("Not supported"); }
+  factory StyleElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGStyleElement.SVGStyleElement')
   @DocsEditable()
-  factory StyleElement() => _SvgElementFactoryProvider.createSvgElement_tag("style");
+  factory StyleElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("style");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -4657,7 +4889,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.
 
-
 class _AttributeClassSet extends CssClassSetImpl {
   final Element _element;
 
@@ -4694,7 +4925,6 @@
       document.createElementNS("http://www.w3.org/2000/svg", tag);
   factory SvgElement.svg(String svg,
       {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
-
     if (validator == null && treeSanitizer == null) {
       validator = new NodeValidatorBuilder.common()..allowSvg();
     }
@@ -4706,8 +4936,8 @@
     } else {
       parentElement = new SvgSvgElement();
     }
-    var fragment = parentElement.createFragment(svg, validator: validator,
-        treeSanitizer: treeSanitizer);
+    var fragment = parentElement.createFragment(svg,
+        validator: validator, treeSanitizer: treeSanitizer);
     return fragment.nodes.where((e) => e is SvgElement).single;
   }
 
@@ -4741,19 +4971,17 @@
 
   DocumentFragment createFragment(String svg,
       {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
-
     if (treeSanitizer == null) {
       if (validator == null) {
-        validator = new NodeValidatorBuilder.common()
-          ..allowSvg();
+        validator = new NodeValidatorBuilder.common()..allowSvg();
       }
       treeSanitizer = new NodeTreeSanitizer(validator);
     }
 
     // We create a fragment which will parse in the HTML parser
     var html = '<svg version="1.1">$svg</svg>';
-    var fragment = document.body.createFragment(html,
-        treeSanitizer: treeSanitizer);
+    var fragment =
+        document.body.createFragment(html, treeSanitizer: treeSanitizer);
 
     var svgFragment = new DocumentFragment();
     // The root is the <svg/> element, need to pull out the contents.
@@ -4772,8 +5000,8 @@
   }
 
   @DomName('Element.insertAdjacentHTML')
-  void insertAdjacentHtml(String where, String text, {NodeValidator validator,
-      NodeTreeSanitizer treeSanitizer}) {
+  void insertAdjacentHtml(String where, String text,
+      {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
     throw new UnsupportedError("Cannot invoke insertAdjacentHtml on SVG.");
   }
 
@@ -4802,267 +5030,321 @@
   }
 
   // To suppress missing implicit constructor warnings.
-  factory SvgElement._() { throw new UnsupportedError("Not supported"); }
+  factory SvgElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGElement.abortEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
+  static const EventStreamProvider<Event> abortEvent =
+      const EventStreamProvider<Event>('abort');
 
   @DomName('SVGElement.blurEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
+  static const EventStreamProvider<Event> blurEvent =
+      const EventStreamProvider<Event>('blur');
 
   @DomName('SVGElement.canplayEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');
+  static const EventStreamProvider<Event> canPlayEvent =
+      const EventStreamProvider<Event>('canplay');
 
   @DomName('SVGElement.canplaythroughEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');
+  static const EventStreamProvider<Event> canPlayThroughEvent =
+      const EventStreamProvider<Event>('canplaythrough');
 
   @DomName('SVGElement.changeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
+  static const EventStreamProvider<Event> changeEvent =
+      const EventStreamProvider<Event>('change');
 
   @DomName('SVGElement.clickEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');
+  static const EventStreamProvider<MouseEvent> clickEvent =
+      const EventStreamProvider<MouseEvent>('click');
 
   @DomName('SVGElement.contextmenuEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');
+  static const EventStreamProvider<MouseEvent> contextMenuEvent =
+      const EventStreamProvider<MouseEvent>('contextmenu');
 
   @DomName('SVGElement.dblclickEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');
+  static const EventStreamProvider<Event> doubleClickEvent =
+      const EventStreamProvider<Event>('dblclick');
 
   @DomName('SVGElement.dragEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');
+  static const EventStreamProvider<MouseEvent> dragEvent =
+      const EventStreamProvider<MouseEvent>('drag');
 
   @DomName('SVGElement.dragendEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');
+  static const EventStreamProvider<MouseEvent> dragEndEvent =
+      const EventStreamProvider<MouseEvent>('dragend');
 
   @DomName('SVGElement.dragenterEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');
+  static const EventStreamProvider<MouseEvent> dragEnterEvent =
+      const EventStreamProvider<MouseEvent>('dragenter');
 
   @DomName('SVGElement.dragleaveEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');
+  static const EventStreamProvider<MouseEvent> dragLeaveEvent =
+      const EventStreamProvider<MouseEvent>('dragleave');
 
   @DomName('SVGElement.dragoverEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');
+  static const EventStreamProvider<MouseEvent> dragOverEvent =
+      const EventStreamProvider<MouseEvent>('dragover');
 
   @DomName('SVGElement.dragstartEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');
+  static const EventStreamProvider<MouseEvent> dragStartEvent =
+      const EventStreamProvider<MouseEvent>('dragstart');
 
   @DomName('SVGElement.dropEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');
+  static const EventStreamProvider<MouseEvent> dropEvent =
+      const EventStreamProvider<MouseEvent>('drop');
 
   @DomName('SVGElement.durationchangeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');
+  static const EventStreamProvider<Event> durationChangeEvent =
+      const EventStreamProvider<Event>('durationchange');
 
   @DomName('SVGElement.emptiedEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');
+  static const EventStreamProvider<Event> emptiedEvent =
+      const EventStreamProvider<Event>('emptied');
 
   @DomName('SVGElement.endedEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+  static const EventStreamProvider<Event> endedEvent =
+      const EventStreamProvider<Event>('ended');
 
   @DomName('SVGElement.errorEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+  static const EventStreamProvider<Event> errorEvent =
+      const EventStreamProvider<Event>('error');
 
   @DomName('SVGElement.focusEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
+  static const EventStreamProvider<Event> focusEvent =
+      const EventStreamProvider<Event>('focus');
 
   @DomName('SVGElement.inputEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');
+  static const EventStreamProvider<Event> inputEvent =
+      const EventStreamProvider<Event>('input');
 
   @DomName('SVGElement.invalidEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> invalidEvent = const EventStreamProvider<Event>('invalid');
+  static const EventStreamProvider<Event> invalidEvent =
+      const EventStreamProvider<Event>('invalid');
 
   @DomName('SVGElement.keydownEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');
+  static const EventStreamProvider<KeyboardEvent> keyDownEvent =
+      const EventStreamProvider<KeyboardEvent>('keydown');
 
   @DomName('SVGElement.keypressEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');
+  static const EventStreamProvider<KeyboardEvent> keyPressEvent =
+      const EventStreamProvider<KeyboardEvent>('keypress');
 
   @DomName('SVGElement.keyupEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');
+  static const EventStreamProvider<KeyboardEvent> keyUpEvent =
+      const EventStreamProvider<KeyboardEvent>('keyup');
 
   @DomName('SVGElement.loadEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
+  static const EventStreamProvider<Event> loadEvent =
+      const EventStreamProvider<Event>('load');
 
   @DomName('SVGElement.loadeddataEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');
+  static const EventStreamProvider<Event> loadedDataEvent =
+      const EventStreamProvider<Event>('loadeddata');
 
   @DomName('SVGElement.loadedmetadataEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');
+  static const EventStreamProvider<Event> loadedMetadataEvent =
+      const EventStreamProvider<Event>('loadedmetadata');
 
   @DomName('SVGElement.mousedownEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
+  static const EventStreamProvider<MouseEvent> mouseDownEvent =
+      const EventStreamProvider<MouseEvent>('mousedown');
 
   @DomName('SVGElement.mouseenterEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
+  static const EventStreamProvider<MouseEvent> mouseEnterEvent =
+      const EventStreamProvider<MouseEvent>('mouseenter');
 
   @DomName('SVGElement.mouseleaveEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
+  static const EventStreamProvider<MouseEvent> mouseLeaveEvent =
+      const EventStreamProvider<MouseEvent>('mouseleave');
 
   @DomName('SVGElement.mousemoveEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
+  static const EventStreamProvider<MouseEvent> mouseMoveEvent =
+      const EventStreamProvider<MouseEvent>('mousemove');
 
   @DomName('SVGElement.mouseoutEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');
+  static const EventStreamProvider<MouseEvent> mouseOutEvent =
+      const EventStreamProvider<MouseEvent>('mouseout');
 
   @DomName('SVGElement.mouseoverEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');
+  static const EventStreamProvider<MouseEvent> mouseOverEvent =
+      const EventStreamProvider<MouseEvent>('mouseover');
 
   @DomName('SVGElement.mouseupEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');
+  static const EventStreamProvider<MouseEvent> mouseUpEvent =
+      const EventStreamProvider<MouseEvent>('mouseup');
 
   @DomName('SVGElement.mousewheelEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');
+  static const EventStreamProvider<WheelEvent> mouseWheelEvent =
+      const EventStreamProvider<WheelEvent>('mousewheel');
 
   @DomName('SVGElement.pauseEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');
+  static const EventStreamProvider<Event> pauseEvent =
+      const EventStreamProvider<Event>('pause');
 
   @DomName('SVGElement.playEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');
+  static const EventStreamProvider<Event> playEvent =
+      const EventStreamProvider<Event>('play');
 
   @DomName('SVGElement.playingEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');
+  static const EventStreamProvider<Event> playingEvent =
+      const EventStreamProvider<Event>('playing');
 
   @DomName('SVGElement.ratechangeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');
+  static const EventStreamProvider<Event> rateChangeEvent =
+      const EventStreamProvider<Event>('ratechange');
 
   @DomName('SVGElement.resetEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');
+  static const EventStreamProvider<Event> resetEvent =
+      const EventStreamProvider<Event>('reset');
 
   @DomName('SVGElement.resizeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
+  static const EventStreamProvider<Event> resizeEvent =
+      const EventStreamProvider<Event>('resize');
 
   @DomName('SVGElement.scrollEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
+  static const EventStreamProvider<Event> scrollEvent =
+      const EventStreamProvider<Event>('scroll');
 
   @DomName('SVGElement.seekedEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');
+  static const EventStreamProvider<Event> seekedEvent =
+      const EventStreamProvider<Event>('seeked');
 
   @DomName('SVGElement.seekingEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');
+  static const EventStreamProvider<Event> seekingEvent =
+      const EventStreamProvider<Event>('seeking');
 
   @DomName('SVGElement.selectEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');
+  static const EventStreamProvider<Event> selectEvent =
+      const EventStreamProvider<Event>('select');
 
   @DomName('SVGElement.stalledEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');
+  static const EventStreamProvider<Event> stalledEvent =
+      const EventStreamProvider<Event>('stalled');
 
   @DomName('SVGElement.submitEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');
+  static const EventStreamProvider<Event> submitEvent =
+      const EventStreamProvider<Event>('submit');
 
   @DomName('SVGElement.suspendEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');
+  static const EventStreamProvider<Event> suspendEvent =
+      const EventStreamProvider<Event>('suspend');
 
   @DomName('SVGElement.timeupdateEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');
+  static const EventStreamProvider<Event> timeUpdateEvent =
+      const EventStreamProvider<Event>('timeupdate');
 
   @DomName('SVGElement.volumechangeEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');
+  static const EventStreamProvider<Event> volumeChangeEvent =
+      const EventStreamProvider<Event>('volumechange');
 
   @DomName('SVGElement.waitingEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
+  static const EventStreamProvider<Event> waitingEvent =
+      const EventStreamProvider<Event>('waiting');
 
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -5092,12 +5374,12 @@
   @DomName('SVGElement.blur')
   @DocsEditable()
   @Experimental() // untriaged
-  void blur() native;
+  void blur() native ;
 
   @DomName('SVGElement.focus')
   @DocsEditable()
   @Experimental() // untriaged
-  void focus() native;
+  void focus() native ;
 
   @DomName('SVGElement.onabort')
   @DocsEditable()
@@ -5117,7 +5399,8 @@
   @DomName('SVGElement.oncanplaythrough')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onCanPlayThrough => canPlayThroughEvent.forElement(this);
+  ElementStream<Event> get onCanPlayThrough =>
+      canPlayThroughEvent.forElement(this);
 
   @DomName('SVGElement.onchange')
   @DocsEditable()
@@ -5132,7 +5415,8 @@
   @DomName('SVGElement.oncontextmenu')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<MouseEvent> get onContextMenu => contextMenuEvent.forElement(this);
+  ElementStream<MouseEvent> get onContextMenu =>
+      contextMenuEvent.forElement(this);
 
   @DomName('SVGElement.ondblclick')
   @DocsEditable()
@@ -5177,7 +5461,8 @@
   @DomName('SVGElement.ondurationchange')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onDurationChange => durationChangeEvent.forElement(this);
+  ElementStream<Event> get onDurationChange =>
+      durationChangeEvent.forElement(this);
 
   @DomName('SVGElement.onemptied')
   @DocsEditable()
@@ -5237,7 +5522,8 @@
   @DomName('SVGElement.onloadedmetadata')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<Event> get onLoadedMetadata => loadedMetadataEvent.forElement(this);
+  ElementStream<Event> get onLoadedMetadata =>
+      loadedMetadataEvent.forElement(this);
 
   @DomName('SVGElement.onmousedown')
   @DocsEditable()
@@ -5247,12 +5533,14 @@
   @DomName('SVGElement.onmouseenter')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<MouseEvent> get onMouseEnter => mouseEnterEvent.forElement(this);
+  ElementStream<MouseEvent> get onMouseEnter =>
+      mouseEnterEvent.forElement(this);
 
   @DomName('SVGElement.onmouseleave')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forElement(this);
+  ElementStream<MouseEvent> get onMouseLeave =>
+      mouseLeaveEvent.forElement(this);
 
   @DomName('SVGElement.onmousemove')
   @DocsEditable()
@@ -5277,7 +5565,8 @@
   @DomName('SVGElement.onmousewheel')
   @DocsEditable()
   @Experimental() // untriaged
-  ElementStream<WheelEvent> get onMouseWheel => mouseWheelEvent.forElement(this);
+  ElementStream<WheelEvent> get onMouseWheel =>
+      mouseWheelEvent.forElement(this);
 
   @DomName('SVGElement.onpause')
   @DocsEditable()
@@ -5358,17 +5647,16 @@
   @DocsEditable()
   @Experimental() // untriaged
   ElementStream<Event> get onWaiting => waitingEvent.forElement(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.
 
-
 @DomName('SVGSVGElement')
 @Unstable()
 @Native("SVGSVGElement")
-class SvgSvgElement extends GraphicsElement implements FitToViewBox, ZoomAndPan {
+class SvgSvgElement extends GraphicsElement
+    implements FitToViewBox, ZoomAndPan {
   factory SvgSvgElement() {
     final el = new SvgElement.tag("svg");
     // The SVG spec requires the version attribute to match the spec version
@@ -5377,7 +5665,9 @@
   }
 
   // To suppress missing implicit constructor warnings.
-  factory SvgSvgElement._() { throw new UnsupportedError("Not supported"); }
+  factory SvgSvgElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5439,107 +5729,108 @@
 
   @DomName('SVGSVGElement.animationsPaused')
   @DocsEditable()
-  bool animationsPaused() native;
+  bool animationsPaused() native ;
 
   @DomName('SVGSVGElement.checkEnclosure')
   @DocsEditable()
-  bool checkEnclosure(SvgElement element, Rect rect) native;
+  bool checkEnclosure(SvgElement element, Rect rect) native ;
 
   @DomName('SVGSVGElement.checkIntersection')
   @DocsEditable()
-  bool checkIntersection(SvgElement element, Rect rect) native;
+  bool checkIntersection(SvgElement element, Rect rect) native ;
 
   @JSName('createSVGAngle')
   @DomName('SVGSVGElement.createSVGAngle')
   @DocsEditable()
-  Angle createSvgAngle() native;
+  Angle createSvgAngle() native ;
 
   @JSName('createSVGLength')
   @DomName('SVGSVGElement.createSVGLength')
   @DocsEditable()
-  Length createSvgLength() native;
+  Length createSvgLength() native ;
 
   @JSName('createSVGMatrix')
   @DomName('SVGSVGElement.createSVGMatrix')
   @DocsEditable()
-  Matrix createSvgMatrix() native;
+  Matrix createSvgMatrix() native ;
 
   @JSName('createSVGNumber')
   @DomName('SVGSVGElement.createSVGNumber')
   @DocsEditable()
-  Number createSvgNumber() native;
+  Number createSvgNumber() native ;
 
   @JSName('createSVGPoint')
   @DomName('SVGSVGElement.createSVGPoint')
   @DocsEditable()
-  Point createSvgPoint() native;
+  Point createSvgPoint() native ;
 
   @JSName('createSVGRect')
   @DomName('SVGSVGElement.createSVGRect')
   @DocsEditable()
-  Rect createSvgRect() native;
+  Rect createSvgRect() native ;
 
   @JSName('createSVGTransform')
   @DomName('SVGSVGElement.createSVGTransform')
   @DocsEditable()
-  Transform createSvgTransform() native;
+  Transform createSvgTransform() native ;
 
   @JSName('createSVGTransformFromMatrix')
   @DomName('SVGSVGElement.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) native;
+  Transform createSvgTransformFromMatrix(Matrix matrix) native ;
 
   @DomName('SVGSVGElement.deselectAll')
   @DocsEditable()
-  void deselectAll() native;
+  void deselectAll() native ;
 
   @DomName('SVGSVGElement.forceRedraw')
   @DocsEditable()
-  void forceRedraw() native;
+  void forceRedraw() native ;
 
   @DomName('SVGSVGElement.getCurrentTime')
   @DocsEditable()
-  double getCurrentTime() native;
+  double getCurrentTime() native ;
 
   @DomName('SVGSVGElement.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) native;
+  Element getElementById(String elementId) native ;
 
   @DomName('SVGSVGElement.getEnclosureList')
   @DocsEditable()
   @Returns('NodeList')
   @Creates('NodeList')
-  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) native;
+  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) native ;
 
   @DomName('SVGSVGElement.getIntersectionList')
   @DocsEditable()
   @Returns('NodeList')
   @Creates('NodeList')
-  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) native;
+  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement)
+      native ;
 
   @DomName('SVGSVGElement.pauseAnimations')
   @DocsEditable()
-  void pauseAnimations() native;
+  void pauseAnimations() native ;
 
   @DomName('SVGSVGElement.setCurrentTime')
   @DocsEditable()
-  void setCurrentTime(num seconds) native;
+  void setCurrentTime(num seconds) native ;
 
   @DomName('SVGSVGElement.suspendRedraw')
   @DocsEditable()
-  int suspendRedraw(int maxWaitMilliseconds) native;
+  int suspendRedraw(int maxWaitMilliseconds) native ;
 
   @DomName('SVGSVGElement.unpauseAnimations')
   @DocsEditable()
-  void unpauseAnimations() native;
+  void unpauseAnimations() native ;
 
   @DomName('SVGSVGElement.unsuspendRedraw')
   @DocsEditable()
-  void unsuspendRedraw(int suspendHandleId) native;
+  void unsuspendRedraw(int suspendHandleId) native ;
 
   @DomName('SVGSVGElement.unsuspendRedrawAll')
   @DocsEditable()
-  void unsuspendRedrawAll() native;
+  void unsuspendRedrawAll() native ;
 
   // From SVGFitToViewBox
 
@@ -5556,24 +5847,25 @@
   @DomName('SVGSVGElement.zoomAndPan')
   @DocsEditable()
   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.
 
-
 @DocsEditable()
 @DomName('SVGSwitchElement')
 @Unstable()
 @Native("SVGSwitchElement")
 class SwitchElement extends GraphicsElement {
   // To suppress missing implicit constructor warnings.
-  factory SwitchElement._() { throw new UnsupportedError("Not supported"); }
+  factory SwitchElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGSwitchElement.SVGSwitchElement')
   @DocsEditable()
-  factory SwitchElement() => _SvgElementFactoryProvider.createSvgElement_tag("switch");
+  factory SwitchElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("switch");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5585,18 +5877,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.
 
-
 @DocsEditable()
 @DomName('SVGSymbolElement')
 @Unstable()
 @Native("SVGSymbolElement")
 class SymbolElement extends SvgElement implements FitToViewBox {
   // To suppress missing implicit constructor warnings.
-  factory SymbolElement._() { throw new UnsupportedError("Not supported"); }
+  factory SymbolElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGSymbolElement.SVGSymbolElement')
   @DocsEditable()
-  factory SymbolElement() => _SvgElementFactoryProvider.createSvgElement_tag("symbol");
+  factory SymbolElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("symbol");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5618,18 +5912,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.
 
-
 @DocsEditable()
 @DomName('SVGTSpanElement')
 @Unstable()
 @Native("SVGTSpanElement")
 class TSpanElement extends TextPositioningElement {
   // To suppress missing implicit constructor warnings.
-  factory TSpanElement._() { throw new UnsupportedError("Not supported"); }
+  factory TSpanElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGTSpanElement.SVGTSpanElement')
   @DocsEditable()
-  factory TSpanElement() => _SvgElementFactoryProvider.createSvgElement_tag("tspan");
+  factory TSpanElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("tspan");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5641,13 +5937,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.
 
-
 @DocsEditable()
 @DomName('SVGTests')
 @Unstable()
 abstract class Tests extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Tests._() { throw new UnsupportedError("Not supported"); }
+  factory Tests._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   final StringList requiredExtensions;
 
@@ -5661,14 +5958,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.
 
-
 @DocsEditable()
 @DomName('SVGTextContentElement')
 @Unstable()
 @Native("SVGTextContentElement")
 class TextContentElement extends GraphicsElement {
   // To suppress missing implicit constructor warnings.
-  factory TextContentElement._() { throw new UnsupportedError("Not supported"); }
+  factory TextContentElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5698,56 +5996,58 @@
 
   @DomName('SVGTextContentElement.getCharNumAtPosition')
   @DocsEditable()
-  int getCharNumAtPosition(Point point) native;
+  int getCharNumAtPosition(Point point) native ;
 
   @DomName('SVGTextContentElement.getComputedTextLength')
   @DocsEditable()
-  double getComputedTextLength() native;
+  double getComputedTextLength() native ;
 
   @DomName('SVGTextContentElement.getEndPositionOfChar')
   @DocsEditable()
-  Point getEndPositionOfChar(int charnum) native;
+  Point getEndPositionOfChar(int charnum) native ;
 
   @DomName('SVGTextContentElement.getExtentOfChar')
   @DocsEditable()
-  Rect getExtentOfChar(int charnum) native;
+  Rect getExtentOfChar(int charnum) native ;
 
   @DomName('SVGTextContentElement.getNumberOfChars')
   @DocsEditable()
-  int getNumberOfChars() native;
+  int getNumberOfChars() native ;
 
   @DomName('SVGTextContentElement.getRotationOfChar')
   @DocsEditable()
-  double getRotationOfChar(int charnum) native;
+  double getRotationOfChar(int charnum) native ;
 
   @DomName('SVGTextContentElement.getStartPositionOfChar')
   @DocsEditable()
-  Point getStartPositionOfChar(int charnum) native;
+  Point getStartPositionOfChar(int charnum) native ;
 
   @DomName('SVGTextContentElement.getSubStringLength')
   @DocsEditable()
-  double getSubStringLength(int charnum, int nchars) native;
+  double getSubStringLength(int charnum, int nchars) native ;
 
   @DomName('SVGTextContentElement.selectSubString')
   @DocsEditable()
-  void selectSubString(int charnum, int nchars) native;
+  void selectSubString(int charnum, int nchars) 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.
 
-
 @DocsEditable()
 @DomName('SVGTextElement')
 @Unstable()
 @Native("SVGTextElement")
 class TextElement extends TextPositioningElement {
   // To suppress missing implicit constructor warnings.
-  factory TextElement._() { throw new UnsupportedError("Not supported"); }
+  factory TextElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGTextElement.SVGTextElement')
   @DocsEditable()
-  factory TextElement() => _SvgElementFactoryProvider.createSvgElement_tag("text");
+  factory TextElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("text");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5759,14 +6059,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.
 
-
 @DocsEditable()
 @DomName('SVGTextPathElement')
 @Unstable()
 @Native("SVGTextPathElement")
 class TextPathElement extends TextContentElement implements UriReference {
   // To suppress missing implicit constructor warnings.
-  factory TextPathElement._() { throw new UnsupportedError("Not supported"); }
+  factory TextPathElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5820,14 +6121,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.
 
-
 @DocsEditable()
 @DomName('SVGTextPositioningElement')
 @Unstable()
 @Native("SVGTextPositioningElement")
 class TextPositioningElement extends TextContentElement {
   // To suppress missing implicit constructor warnings.
-  factory TextPositioningElement._() { throw new UnsupportedError("Not supported"); }
+  factory TextPositioningElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5859,18 +6161,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.
 
-
 @DocsEditable()
 @DomName('SVGTitleElement')
 @Unstable()
 @Native("SVGTitleElement")
 class TitleElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
-  factory TitleElement._() { throw new UnsupportedError("Not supported"); }
+  factory TitleElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGTitleElement.SVGTitleElement')
   @DocsEditable()
-  factory TitleElement() => _SvgElementFactoryProvider.createSvgElement_tag("title");
+  factory TitleElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("title");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5882,14 +6186,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.
 
-
 @DocsEditable()
 @DomName('SVGTransform')
 @Unstable()
 @Native("SVGTransform")
 class Transform extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Transform._() { throw new UnsupportedError("Not supported"); }
+  factory Transform._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGTransform.SVG_TRANSFORM_MATRIX')
   @DocsEditable()
@@ -5933,40 +6238,43 @@
 
   @DomName('SVGTransform.setMatrix')
   @DocsEditable()
-  void setMatrix(Matrix matrix) native;
+  void setMatrix(Matrix matrix) native ;
 
   @DomName('SVGTransform.setRotate')
   @DocsEditable()
-  void setRotate(num angle, num cx, num cy) native;
+  void setRotate(num angle, num cx, num cy) native ;
 
   @DomName('SVGTransform.setScale')
   @DocsEditable()
-  void setScale(num sx, num sy) native;
+  void setScale(num sx, num sy) native ;
 
   @DomName('SVGTransform.setSkewX')
   @DocsEditable()
-  void setSkewX(num angle) native;
+  void setSkewX(num angle) native ;
 
   @DomName('SVGTransform.setSkewY')
   @DocsEditable()
-  void setSkewY(num angle) native;
+  void setSkewY(num angle) native ;
 
   @DomName('SVGTransform.setTranslate')
   @DocsEditable()
-  void setTranslate(num tx, num ty) 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.
 
-
 @DocsEditable()
 @DomName('SVGTransformList')
 @Unstable()
 @Native("SVGTransformList")
-class TransformList extends Interceptor with ListMixin<Transform>, ImmutableListMixin<Transform> implements List<Transform> {
+class TransformList extends Interceptor
+    with ListMixin<Transform>, ImmutableListMixin<Transform>
+    implements List<Transform> {
   // To suppress missing implicit constructor warnings.
-  factory TransformList._() { throw new UnsupportedError("Not supported"); }
+  factory TransformList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGTransformList.length')
   @DocsEditable()
@@ -5977,19 +6285,18 @@
   @DocsEditable()
   final int numberOfItems;
 
-  Transform operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  Transform operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return this.getItem(index);
   }
-  void operator[]=(int index, Transform value) {
+
+  void operator []=(int index, Transform value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<Transform> mixins.
   // Transform is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -6024,57 +6331,58 @@
   @DomName('SVGTransformList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Transform newItem) native;
+  void __setter__(int index, Transform newItem) native ;
 
   @DomName('SVGTransformList.appendItem')
   @DocsEditable()
-  Transform appendItem(Transform newItem) native;
+  Transform appendItem(Transform newItem) native ;
 
   @DomName('SVGTransformList.clear')
   @DocsEditable()
-  void clear() native;
+  void clear() native ;
 
   @DomName('SVGTransformList.consolidate')
   @DocsEditable()
-  Transform consolidate() native;
+  Transform consolidate() native ;
 
   @JSName('createSVGTransformFromMatrix')
   @DomName('SVGTransformList.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) native;
+  Transform createSvgTransformFromMatrix(Matrix matrix) native ;
 
   @DomName('SVGTransformList.getItem')
   @DocsEditable()
-  Transform getItem(int index) native;
+  Transform getItem(int index) native ;
 
   @DomName('SVGTransformList.initialize')
   @DocsEditable()
-  Transform initialize(Transform newItem) native;
+  Transform initialize(Transform newItem) native ;
 
   @DomName('SVGTransformList.insertItemBefore')
   @DocsEditable()
-  Transform insertItemBefore(Transform newItem, int index) native;
+  Transform insertItemBefore(Transform newItem, int index) native ;
 
   @DomName('SVGTransformList.removeItem')
   @DocsEditable()
-  Transform removeItem(int index) native;
+  Transform removeItem(int index) native ;
 
   @DomName('SVGTransformList.replaceItem')
   @DocsEditable()
-  Transform replaceItem(Transform newItem, int index) native;
+  Transform replaceItem(Transform 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.
 
-
 @DocsEditable()
 @DomName('SVGUnitTypes')
 @Unstable()
 @Native("SVGUnitTypes")
 class UnitTypes extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory UnitTypes._() { throw new UnsupportedError("Not supported"); }
+  factory UnitTypes._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX')
   @DocsEditable()
@@ -6092,13 +6400,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.
 
-
 @DocsEditable()
 @DomName('SVGURIReference')
 @Unstable()
 abstract class UriReference extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory UriReference._() { throw new UnsupportedError("Not supported"); }
+  factory UriReference._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   final AnimatedString href;
 }
@@ -6106,18 +6415,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.
 
-
 @DocsEditable()
 @DomName('SVGUseElement')
 @Unstable()
 @Native("SVGUseElement")
 class UseElement extends GraphicsElement implements UriReference {
   // To suppress missing implicit constructor warnings.
-  factory UseElement._() { throw new UnsupportedError("Not supported"); }
+  factory UseElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGUseElement.SVGUseElement')
   @DocsEditable()
-  factory UseElement() => _SvgElementFactoryProvider.createSvgElement_tag("use");
+  factory UseElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("use");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6151,18 +6462,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.
 
-
 @DocsEditable()
 @DomName('SVGViewElement')
 @Unstable()
 @Native("SVGViewElement")
 class ViewElement extends SvgElement implements FitToViewBox, ZoomAndPan {
   // To suppress missing implicit constructor warnings.
-  factory ViewElement._() { throw new UnsupportedError("Not supported"); }
+  factory ViewElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGViewElement.SVGViewElement')
   @DocsEditable()
-  factory ViewElement() => _SvgElementFactoryProvider.createSvgElement_tag("view");
+  factory ViewElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("view");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6194,14 +6507,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.
 
-
 @DocsEditable()
 @DomName('SVGViewSpec')
 @Unstable()
 @Native("SVGViewSpec")
 class ViewSpec extends Interceptor implements FitToViewBox, ZoomAndPan {
   // To suppress missing implicit constructor warnings.
-  factory ViewSpec._() { throw new UnsupportedError("Not supported"); }
+  factory ViewSpec._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGViewSpec.preserveAspectRatioString')
   @DocsEditable()
@@ -6250,13 +6564,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.
 
-
 @DocsEditable()
 @DomName('SVGZoomAndPan')
 @Unstable()
 abstract class ZoomAndPan extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ZoomAndPan._() { throw new UnsupportedError("Not supported"); }
+  factory ZoomAndPan._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE')
   @DocsEditable()
@@ -6276,14 +6591,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.
 
-
 @DocsEditable()
 @DomName('SVGZoomEvent')
 @Unstable()
 @Native("SVGZoomEvent")
 class ZoomEvent extends UIEvent {
   // To suppress missing implicit constructor warnings.
-  factory ZoomEvent._() { throw new UnsupportedError("Not supported"); }
+  factory ZoomEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGZoomEvent.newScale')
   @DocsEditable()
@@ -6309,14 +6625,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.
 
-
 @DocsEditable()
 @DomName('SVGGradientElement')
 @Unstable()
 @Native("SVGGradientElement")
 class _GradientElement extends SvgElement implements UriReference {
   // To suppress missing implicit constructor warnings.
-  factory _GradientElement._() { throw new UnsupportedError("Not supported"); }
+  factory _GradientElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6362,14 +6679,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.
 
-
 @DocsEditable()
 @DomName('SVGComponentTransferFunctionElement')
 @Unstable()
 @Native("SVGComponentTransferFunctionElement")
 abstract class _SVGComponentTransferFunctionElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
-  factory _SVGComponentTransferFunctionElement._() { throw new UnsupportedError("Not supported"); }
+  factory _SVGComponentTransferFunctionElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6381,18 +6699,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.
 
-
 @DocsEditable()
 @DomName('SVGCursorElement')
 @Unstable()
 @Native("SVGCursorElement")
-abstract class _SVGCursorElement extends SvgElement implements UriReference, Tests {
+abstract class _SVGCursorElement extends SvgElement
+    implements UriReference, Tests {
   // To suppress missing implicit constructor warnings.
-  factory _SVGCursorElement._() { throw new UnsupportedError("Not supported"); }
+  factory _SVGCursorElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGCursorElement.SVGCursorElement')
   @DocsEditable()
-  factory _SVGCursorElement() => _SvgElementFactoryProvider.createSvgElement_tag("cursor");
+  factory _SVGCursorElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("cursor");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6401,7 +6722,9 @@
   _SVGCursorElement.created() : super.created();
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => SvgElement.isTagSupported('cursor') && (new SvgElement.tag('cursor') is _SVGCursorElement);
+  static bool get supported =>
+      SvgElement.isTagSupported('cursor') &&
+      (new SvgElement.tag('cursor') is _SVGCursorElement);
 
   // From SVGTests
 
@@ -6413,14 +6736,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.
 
-
 @DocsEditable()
 @DomName('SVGFEDropShadowElement')
 @Experimental() // nonstandard
 @Native("SVGFEDropShadowElement")
-abstract class _SVGFEDropShadowElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+abstract class _SVGFEDropShadowElement extends SvgElement
+    implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
-  factory _SVGFEDropShadowElement._() { throw new UnsupportedError("Not supported"); }
+  factory _SVGFEDropShadowElement._() {
+    throw new UnsupportedError("Not supported");
+  }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6436,17 +6761,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.
 
-
 @DocsEditable()
 @DomName('SVGMPathElement')
 @Native("SVGMPathElement")
 abstract class _SVGMPathElement extends SvgElement implements UriReference {
   // To suppress missing implicit constructor warnings.
-  factory _SVGMPathElement._() { throw new UnsupportedError("Not supported"); }
+  factory _SVGMPathElement._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SVGMPathElement.SVGMPathElement')
   @DocsEditable()
-  factory _SVGMPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("mpath");
+  factory _SVGMPathElement() =>
+      _SvgElementFactoryProvider.createSvgElement_tag("mpath");
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6457,4 +6784,3 @@
   // From SVGURIReference
 
 }
-
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/typed_data/typed_data.dart b/pkg/dev_compiler/tool/input_sdk/lib/typed_data/typed_data.dart
index 54d7b49..e332944 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/typed_data/typed_data.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/typed_data/typed_data.dart
@@ -4,9 +4,9 @@
 
 /// Lists that efficiently handle fixed sized data
 /// (for example, unsigned 8 byte integers) and SIMD numeric types.
-/// 
+///
 /// To use this library in your code:
-/// 
+///
 ///     import 'dart:typed_data';
 library dart.typed_data;
 
@@ -359,7 +359,6 @@
   ByteData asByteData([int offsetInBytes = 0, int length]);
 }
 
-
 /**
  * A typed view of a sequence of bytes.
  */
@@ -386,7 +385,6 @@
   ByteBuffer get buffer;
 }
 
-
 /**
  * Describes endianness to be used when accessing or updating a
  * sequence of bytes.
@@ -397,13 +395,13 @@
   static const Endianness BIG_ENDIAN = const Endianness._(false);
   static const Endianness LITTLE_ENDIAN = const Endianness._(true);
   static final Endianness HOST_ENDIAN =
-    (new ByteData.view(new Uint16List.fromList([1]).buffer)).getInt8(0) == 1 ?
-    LITTLE_ENDIAN : BIG_ENDIAN;
+      (new ByteData.view(new Uint16List.fromList([1]).buffer)).getInt8(0) == 1
+          ? LITTLE_ENDIAN
+          : BIG_ENDIAN;
 
   final bool _littleEndian;
 }
 
-
 /**
  * A fixed-length, random-access sequence of bytes that also provides random
  * and unaligned access to the fixed-width integers and floating point
@@ -447,7 +445,7 @@
    * the length of [buffer].
    */
   factory ByteData.view(ByteBuffer buffer,
-                        [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asByteData(offsetInBytes, length);
   }
 
@@ -522,9 +520,8 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 2` is greater than the length of this object.
    */
-  void setInt16(int byteOffset,
-                int value,
-                [Endianness endian = Endianness.BIG_ENDIAN]);
+  void setInt16(int byteOffset, int value,
+      [Endianness endian = Endianness.BIG_ENDIAN]);
 
   /**
    * Returns the positive integer represented by the two bytes starting
@@ -549,9 +546,8 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 2` is greater than the length of this object.
    */
-  void setUint16(int byteOffset,
-                 int value,
-                 [Endianness endian = Endianness.BIG_ENDIAN]);
+  void setUint16(int byteOffset, int value,
+      [Endianness endian = Endianness.BIG_ENDIAN]);
 
   /**
    * Returns the (possibly negative) integer represented by the four bytes at
@@ -577,9 +573,8 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 4` is greater than the length of this object.
    */
-  void setInt32(int byteOffset,
-                int value,
-                [Endianness endian = Endianness.BIG_ENDIAN]);
+  void setInt32(int byteOffset, int value,
+      [Endianness endian = Endianness.BIG_ENDIAN]);
 
   /**
    * Returns the positive integer represented by the four bytes starting
@@ -604,9 +599,8 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 4` is greater than the length of this object.
    */
-  void setUint32(int byteOffset,
-                 int value,
-                 [Endianness endian = Endianness.BIG_ENDIAN]);
+  void setUint32(int byteOffset, int value,
+      [Endianness endian = Endianness.BIG_ENDIAN]);
 
   /**
    * Returns the (possibly negative) integer represented by the eight bytes at
@@ -632,9 +626,8 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 8` is greater than the length of this object.
    */
-  void setInt64(int byteOffset,
-                int value,
-                [Endianness endian = Endianness.BIG_ENDIAN]);
+  void setInt64(int byteOffset, int value,
+      [Endianness endian = Endianness.BIG_ENDIAN]);
 
   /**
    * Returns the positive integer represented by the eight bytes starting
@@ -659,9 +652,8 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 8` is greater than the length of this object.
    */
-  void setUint64(int byteOffset,
-                 int value,
-                 [Endianness endian = Endianness.BIG_ENDIAN]);
+  void setUint64(int byteOffset, int value,
+      [Endianness endian = Endianness.BIG_ENDIAN]);
 
   /**
    * Returns the floating point number represented by the four bytes at
@@ -672,7 +664,7 @@
    * `byteOffset + 4` is greater than the length of this object.
    */
   double getFloat32(int byteOffset,
-                    [Endianness endian = Endianness.BIG_ENDIAN]);
+      [Endianness endian = Endianness.BIG_ENDIAN]);
 
   /**
    * Sets the four bytes starting at the specified [byteOffset] in this
@@ -691,9 +683,8 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 4` is greater than the length of this object.
    */
-  void setFloat32(int byteOffset,
-                  double value,
-                  [Endianness endian = Endianness.BIG_ENDIAN]);
+  void setFloat32(int byteOffset, double value,
+      [Endianness endian = Endianness.BIG_ENDIAN]);
 
   /**
    * Returns the floating point number represented by the eight bytes at
@@ -704,7 +695,7 @@
    * `byteOffset + 8` is greater than the length of this object.
    */
   double getFloat64(int byteOffset,
-                    [Endianness endian = Endianness.BIG_ENDIAN]);
+      [Endianness endian = Endianness.BIG_ENDIAN]);
 
   /**
    * Sets the eight bytes starting at the specified [byteOffset] in this
@@ -714,12 +705,10 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 8` is greater than the length of this object.
    */
-  void setFloat64(int byteOffset,
-                  double value,
-                  [Endianness endian = Endianness.BIG_ENDIAN]);
+  void setFloat64(int byteOffset, double value,
+      [Endianness endian = Endianness.BIG_ENDIAN]);
 }
 
-
 /**
  * A fixed-length list of 8-bit signed integers.
  *
@@ -761,14 +750,13 @@
    * the length of [buffer].
    */
   factory Int8List.view(ByteBuffer buffer,
-                        [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asInt8List(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 1;
 }
 
-
 /**
  * A fixed-length list of 8-bit unsigned integers.
  *
@@ -810,14 +798,13 @@
    * the length of [buffer].
    */
   factory Uint8List.view(ByteBuffer buffer,
-                         [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asUint8List(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 1;
 }
 
-
 /**
  * A fixed-length list of 8-bit unsigned integers.
  *
@@ -860,14 +847,13 @@
    * the length of [buffer].
    */
   factory Uint8ClampedList.view(ByteBuffer buffer,
-                                [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asUint8ClampedList(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 1;
 }
 
-
 /**
  * A fixed-length list of 16-bit signed integers that is viewable as a
  * [TypedData].
@@ -913,14 +899,13 @@
    * [BYTES_PER_ELEMENT].
    */
   factory Int16List.view(ByteBuffer buffer,
-                         [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asInt16List(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 2;
 }
 
-
 /**
  * A fixed-length list of 16-bit unsigned integers that is viewable as a
  * [TypedData].
@@ -967,14 +952,13 @@
    * [BYTES_PER_ELEMENT].
    */
   factory Uint16List.view(ByteBuffer buffer,
-                          [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asUint16List(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 2;
 }
 
-
 /**
  * A fixed-length list of 32-bit signed integers that is viewable as a
  * [TypedData].
@@ -1020,14 +1004,13 @@
    * [BYTES_PER_ELEMENT].
    */
   factory Int32List.view(ByteBuffer buffer,
-                         [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asInt32List(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 4;
 }
 
-
 /**
  * A fixed-length list of 32-bit unsigned integers that is viewable as a
  * [TypedData].
@@ -1074,14 +1057,13 @@
    * [BYTES_PER_ELEMENT].
    */
   factory Uint32List.view(ByteBuffer buffer,
-                          [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asUint32List(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 4;
 }
 
-
 /**
  * A fixed-length list of 64-bit signed integers that is viewable as a
  * [TypedData].
@@ -1127,14 +1109,13 @@
    * [BYTES_PER_ELEMENT].
    */
   factory Int64List.view(ByteBuffer buffer,
-                         [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asInt64List(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 8;
 }
 
-
 /**
  * A fixed-length list of 64-bit unsigned integers that is viewable as a
  * [TypedData].
@@ -1181,14 +1162,13 @@
    * [BYTES_PER_ELEMENT].
    */
   factory Uint64List.view(ByteBuffer buffer,
-                          [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asUint64List(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 8;
 }
 
-
 /**
  * A fixed-length list of IEEE 754 single-precision binary floating-point
  * numbers that is viewable as a [TypedData].
@@ -1235,14 +1215,13 @@
    * [BYTES_PER_ELEMENT].
    */
   factory Float32List.view(ByteBuffer buffer,
-                           [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asFloat32List(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 4;
 }
 
-
 /**
  * A fixed-length list of IEEE 754 double-precision binary floating-point
  * numbers  that is viewable as a [TypedData].
@@ -1282,14 +1261,13 @@
    * [BYTES_PER_ELEMENT].
    */
   factory Float64List.view(ByteBuffer buffer,
-                           [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asFloat64List(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 8;
 }
 
-
 /**
  * A fixed-length list of Float32x4 numbers that is viewable as a
  * [TypedData].
@@ -1328,14 +1306,13 @@
    * [BYTES_PER_ELEMENT].
    */
   factory Float32x4List.view(ByteBuffer buffer,
-                             [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asFloat32x4List(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 16;
 }
 
-
 /**
  * A fixed-length list of Int32x4 numbers that is viewable as a
  * [TypedData].
@@ -1374,14 +1351,13 @@
    * [BYTES_PER_ELEMENT].
    */
   factory Int32x4List.view(ByteBuffer buffer,
-                             [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asInt32x4List(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 16;
 }
 
-
 /**
  * A fixed-length list of Float64x2 numbers that is viewable as a
  * [TypedData].
@@ -1420,14 +1396,13 @@
    * [BYTES_PER_ELEMENT].
    */
   factory Float64x2List.view(ByteBuffer buffer,
-                             [int offsetInBytes = 0, int length]) {
+      [int offsetInBytes = 0, int length]) {
     return buffer.asFloat64x2List(offsetInBytes, length);
   }
 
   static const int BYTES_PER_ELEMENT = 16;
 }
 
-
 /**
  * Float32x4 immutable value type and operations.
  *
@@ -1439,48 +1414,63 @@
   external factory Float32x4.splat(double v);
   external factory Float32x4.zero();
   external factory Float32x4.fromInt32x4Bits(Int32x4 x);
+
   /// Sets the x and y lanes to their respective values in [v] and sets the z
   /// and w lanes to 0.0.
   external factory Float32x4.fromFloat64x2(Float64x2 v);
 
   /// Addition operator.
-  Float32x4 operator+(Float32x4 other);
+  Float32x4 operator +(Float32x4 other);
+
   /// Negate operator.
-  Float32x4 operator-();
+  Float32x4 operator -();
+
   /// Subtraction operator.
-  Float32x4 operator-(Float32x4 other);
+  Float32x4 operator -(Float32x4 other);
+
   /// Multiplication operator.
-  Float32x4 operator*(Float32x4 other);
+  Float32x4 operator *(Float32x4 other);
+
   /// Division operator.
-  Float32x4 operator/(Float32x4 other);
+  Float32x4 operator /(Float32x4 other);
 
   /// Relational less than.
   Int32x4 lessThan(Float32x4 other);
+
   /// Relational less than or equal.
   Int32x4 lessThanOrEqual(Float32x4 other);
+
   /// Relational greater than.
   Int32x4 greaterThan(Float32x4 other);
+
   /// Relational greater than or equal.
   Int32x4 greaterThanOrEqual(Float32x4 other);
+
   /// Relational equal.
   Int32x4 equal(Float32x4 other);
+
   /// Relational not-equal.
   Int32x4 notEqual(Float32x4 other);
 
   /// Returns a copy of [this] each lane being scaled by [s].
   /// Equivalent to this * new Float32x4.splat(s)
   Float32x4 scale(double s);
+
   /// Returns the lane-wise absolute value of this [Float32x4].
   Float32x4 abs();
+
   /// Lane-wise clamp [this] to be in the range [lowerLimit]-[upperLimit].
   Float32x4 clamp(Float32x4 lowerLimit, Float32x4 upperLimit);
 
   /// Extracted x value.
   double get x;
+
   /// Extracted y value.
   double get y;
+
   /// Extracted z value.
   double get z;
+
   /// Extracted w value.
   double get w;
 
@@ -1759,10 +1749,13 @@
 
   /// Returns a new [Float32x4] copied from [this] with a new x value.
   Float32x4 withX(double x);
+
   /// Returns a new [Float32x4] copied from [this] with a new y value.
   Float32x4 withY(double y);
+
   /// Returns a new [Float32x4] copied from [this] with a new z value.
   Float32x4 withZ(double z);
+
   /// Returns a new [Float32x4] copied from [this] with a new w value.
   Float32x4 withW(double w);
 
@@ -1782,7 +1775,6 @@
   Float32x4 reciprocalSqrt();
 }
 
-
 /**
  * Int32x4 and operations.
  *
@@ -1795,22 +1787,29 @@
   external factory Int32x4.fromFloat32x4Bits(Float32x4 x);
 
   /// The bit-wise or operator.
-  Int32x4 operator|(Int32x4 other);
+  Int32x4 operator |(Int32x4 other);
+
   /// The bit-wise and operator.
-  Int32x4 operator&(Int32x4 other);
+  Int32x4 operator &(Int32x4 other);
+
   /// The bit-wise xor operator.
-  Int32x4 operator^(Int32x4 other);
+  Int32x4 operator ^(Int32x4 other);
+
   /// Addition operator.
-  Int32x4 operator+(Int32x4 other);
+  Int32x4 operator +(Int32x4 other);
+
   /// Subtraction operator.
-  Int32x4 operator-(Int32x4 other);
+  Int32x4 operator -(Int32x4 other);
 
   /// Extract 32-bit mask from x lane.
   int get x;
+
   /// Extract 32-bit mask from y lane.
   int get y;
+
   /// Extract 32-bit mask from z lane.
   int get z;
+
   /// Extract 32-bit mask from w lane.
   int get w;
 
@@ -2089,28 +2088,37 @@
 
   /// Returns a new [Int32x4] copied from [this] with a new x value.
   Int32x4 withX(int x);
+
   /// Returns a new [Int32x4] copied from [this] with a new y value.
   Int32x4 withY(int y);
+
   /// Returns a new [Int32x4] copied from [this] with a new z value.
   Int32x4 withZ(int z);
+
   /// Returns a new [Int32x4] copied from [this] with a new w value.
   Int32x4 withW(int w);
 
   /// Extracted x value. Returns false for 0, true for any other value.
   bool get flagX;
+
   /// Extracted y value. Returns false for 0, true for any other value.
   bool get flagY;
+
   /// Extracted z value. Returns false for 0, true for any other value.
   bool get flagZ;
+
   /// Extracted w value. Returns false for 0, true for any other value.
   bool get flagW;
 
   /// Returns a new [Int32x4] copied from [this] with a new x value.
   Int32x4 withFlagX(bool x);
+
   /// Returns a new [Int32x4] copied from [this] with a new y value.
   Int32x4 withFlagY(bool y);
+
   /// Returns a new [Int32x4] copied from [this] with a new z value.
   Int32x4 withFlagZ(bool z);
+
   /// Returns a new [Int32x4] copied from [this] with a new w value.
   Int32x4 withFlagW(bool w);
 
@@ -2130,32 +2138,38 @@
   external factory Float64x2(double x, double y);
   external factory Float64x2.splat(double v);
   external factory Float64x2.zero();
+
   /// Uses the "x" and "y" lanes from [v].
   external factory Float64x2.fromFloat32x4(Float32x4 v);
 
   /// Addition operator.
-  Float64x2 operator+(Float64x2 other);
+  Float64x2 operator +(Float64x2 other);
+
   /// Negate operator.
-  Float64x2 operator-();
+  Float64x2 operator -();
+
   /// Subtraction operator.
-  Float64x2 operator-(Float64x2 other);
+  Float64x2 operator -(Float64x2 other);
+
   /// Multiplication operator.
-  Float64x2 operator*(Float64x2 other);
+  Float64x2 operator *(Float64x2 other);
+
   /// Division operator.
-  Float64x2 operator/(Float64x2 other);
+  Float64x2 operator /(Float64x2 other);
 
   /// Returns a copy of [this] each lane being scaled by [s].
   /// Equivalent to this * new Float64x2.splat(s)
   Float64x2 scale(double s);
+
   /// Returns the lane-wise absolute value of this [Float64x2].
   Float64x2 abs();
 
   /// Lane-wise clamp [this] to be in the range [lowerLimit]-[upperLimit].
-  Float64x2 clamp(Float64x2 lowerLimit,
-                  Float64x2 upperLimit);
+  Float64x2 clamp(Float64x2 lowerLimit, Float64x2 upperLimit);
 
   /// Extracted x value.
   double get x;
+
   /// Extracted y value.
   double get y;
 
@@ -2166,6 +2180,7 @@
 
   /// Returns a new [Float64x2] copied from [this] with a new x value.
   Float64x2 withX(double x);
+
   /// Returns a new [Float64x2] copied from [this] with a new y value.
   Float64x2 withY(double y);
 
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 6005329..f78c944 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -10,21 +10,18 @@
 import 'dart:html_common';
 import 'dart:_native_typed_data';
 import 'dart:typed_data';
-import 'dart:_js_helper' show Creates, JSName, Native, Returns, convertDartClosureToJS;
+import 'dart:_js_helper'
+    show Creates, JSName, Native, Returns, convertDartClosureToJS;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor;
 // DO NOT EDIT - unless you are editing documentation as per:
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:audio library.
 
-
-
-
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('AnalyserNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AnalyserNode
@@ -32,7 +29,9 @@
 @Native("AnalyserNode,RealtimeAnalyserNode")
 class AnalyserNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory AnalyserNode._() { throw new UnsupportedError("Not supported"); }
+  factory AnalyserNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
@@ -56,26 +55,25 @@
 
   @DomName('AnalyserNode.getByteFrequencyData')
   @DocsEditable()
-  void getByteFrequencyData(Uint8List array) native;
+  void getByteFrequencyData(Uint8List array) native ;
 
   @DomName('AnalyserNode.getByteTimeDomainData')
   @DocsEditable()
-  void getByteTimeDomainData(Uint8List array) native;
+  void getByteTimeDomainData(Uint8List array) native ;
 
   @DomName('AnalyserNode.getFloatFrequencyData')
   @DocsEditable()
-  void getFloatFrequencyData(Float32List array) native;
+  void getFloatFrequencyData(Float32List array) native ;
 
   @DomName('AnalyserNode.getFloatTimeDomainData')
   @DocsEditable()
   @Experimental() // untriaged
-  void getFloatTimeDomainData(Float32List array) native;
+  void getFloatTimeDomainData(Float32List 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.
 
-
 @DocsEditable()
 @DomName('AudioBuffer')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBuffer-section
@@ -83,7 +81,9 @@
 @Native("AudioBuffer")
 class AudioBuffer extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AudioBuffer._() { throw new UnsupportedError("Not supported"); }
+  factory AudioBuffer._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AudioBuffer.duration')
   @DocsEditable()
@@ -103,7 +103,7 @@
 
   @DomName('AudioBuffer.getChannelData')
   @DocsEditable()
-  Float32List getChannelData(int channelIndex) native;
+  Float32List 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
@@ -111,7 +111,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('AudioBufferCallback')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBuffer-section
 @Experimental()
@@ -120,7 +119,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.
 
-
 @DomName('AudioBufferSourceNode')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -128,7 +126,6 @@
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBufferSourceNode-section
 @Native("AudioBufferSourceNode")
 class AudioBufferSourceNode extends AudioSourceNode {
-
   // TODO(efortuna): Remove these methods when Chrome stable also uses start
   // instead of noteOn.
   void start(num when, [num grainOffset, num grainDuration]) {
@@ -158,8 +155,11 @@
       JS('void', '#.noteOff(#)', this, when);
     }
   }
+
   // To suppress missing implicit constructor warnings.
-  factory AudioBufferSourceNode._() { throw new UnsupportedError("Not supported"); }
+  factory AudioBufferSourceNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `ended` events to event
@@ -170,7 +170,8 @@
   @DomName('AudioBufferSourceNode.endedEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+  static const EventStreamProvider<Event> endedEvent =
+      const EventStreamProvider<Event>('ended');
 
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
@@ -197,13 +198,11 @@
   @DocsEditable()
   @Experimental() // untriaged
   Stream<Event> get onEnded => endedEvent.forTarget(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.
 
-
 @DomName('AudioContext')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -212,7 +211,9 @@
 @Native("AudioContext,webkitAudioContext")
 class AudioContext extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory AudioContext._() { throw new UnsupportedError("Not supported"); }
+  factory AudioContext._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `complete` events to event
@@ -222,10 +223,12 @@
    */
   @DomName('AudioContext.completeEvent')
   @DocsEditable()
-  static const EventStreamProvider<Event> completeEvent = const EventStreamProvider<Event>('complete');
+  static const EventStreamProvider<Event> completeEvent =
+      const EventStreamProvider<Event>('complete');
 
   /// Checks if this type is supported on the current platform.
-  static bool get supported => JS('bool', '!!(window.AudioContext || window.webkitAudioContext)');
+  static bool get supported =>
+      JS('bool', '!!(window.AudioContext || window.webkitAudioContext)');
 
   @DomName('AudioContext.currentTime')
   @DocsEditable()
@@ -245,77 +248,82 @@
 
   @DomName('AudioContext.createAnalyser')
   @DocsEditable()
-  AnalyserNode createAnalyser() native;
+  AnalyserNode createAnalyser() native ;
 
   @DomName('AudioContext.createBiquadFilter')
   @DocsEditable()
-  BiquadFilterNode createBiquadFilter() native;
+  BiquadFilterNode createBiquadFilter() native ;
 
   @DomName('AudioContext.createBuffer')
   @DocsEditable()
-  AudioBuffer createBuffer(int numberOfChannels, int numberOfFrames, num sampleRate) native;
+  AudioBuffer createBuffer(
+      int numberOfChannels, int numberOfFrames, num sampleRate) native ;
 
   @DomName('AudioContext.createBufferSource')
   @DocsEditable()
-  AudioBufferSourceNode createBufferSource() native;
+  AudioBufferSourceNode createBufferSource() native ;
 
   @DomName('AudioContext.createChannelMerger')
   @DocsEditable()
-  ChannelMergerNode createChannelMerger([int numberOfInputs]) native;
+  ChannelMergerNode createChannelMerger([int numberOfInputs]) native ;
 
   @DomName('AudioContext.createChannelSplitter')
   @DocsEditable()
-  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) native;
+  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) native ;
 
   @DomName('AudioContext.createConvolver')
   @DocsEditable()
-  ConvolverNode createConvolver() native;
+  ConvolverNode createConvolver() native ;
 
   @DomName('AudioContext.createDelay')
   @DocsEditable()
-  DelayNode createDelay([num maxDelayTime]) native;
+  DelayNode createDelay([num maxDelayTime]) native ;
 
   @DomName('AudioContext.createDynamicsCompressor')
   @DocsEditable()
-  DynamicsCompressorNode createDynamicsCompressor() native;
+  DynamicsCompressorNode createDynamicsCompressor() native ;
 
   @DomName('AudioContext.createMediaElementSource')
   @DocsEditable()
-  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) native;
+  MediaElementAudioSourceNode createMediaElementSource(
+      MediaElement mediaElement) native ;
 
   @DomName('AudioContext.createMediaStreamDestination')
   @DocsEditable()
-  MediaStreamAudioDestinationNode createMediaStreamDestination() native;
+  MediaStreamAudioDestinationNode createMediaStreamDestination() native ;
 
   @DomName('AudioContext.createMediaStreamSource')
   @DocsEditable()
-  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) native;
+  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream)
+      native ;
 
   @DomName('AudioContext.createOscillator')
   @DocsEditable()
-  OscillatorNode createOscillator() native;
+  OscillatorNode createOscillator() native ;
 
   @DomName('AudioContext.createPanner')
   @DocsEditable()
-  PannerNode createPanner() native;
+  PannerNode createPanner() native ;
 
   @DomName('AudioContext.createPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
-  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) native;
+  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) native ;
 
   @DomName('AudioContext.createWaveShaper')
   @DocsEditable()
-  WaveShaperNode createWaveShaper() native;
+  WaveShaperNode createWaveShaper() native ;
 
   @JSName('decodeAudioData')
   @DomName('AudioContext.decodeAudioData')
   @DocsEditable()
-  void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native;
+  void _decodeAudioData(
+      ByteBuffer audioData, AudioBufferCallback successCallback,
+      [AudioBufferCallback errorCallback]) native ;
 
   @DomName('AudioContext.startRendering')
   @DocsEditable()
-  void startRendering() native;
+  void startRendering() native ;
 
   /// Stream of `complete` events handled by this [AudioContext].
   @DomName('AudioContext.oncomplete')
@@ -335,8 +343,12 @@
 
   ScriptProcessorNode createScriptProcessor(int bufferSize,
       [int numberOfInputChannels, int numberOfOutputChannels]) {
-    var function = JS('=Object', '#.createScriptProcessor || '
-        '#.createJavaScriptNode', this, this);
+    var function = JS(
+        '=Object',
+        '#.createScriptProcessor || '
+        '#.createJavaScriptNode',
+        this,
+        this);
     if (numberOfOutputChannels != null) {
       return JS('ScriptProcessorNode', '#.call(#, #, #, #)', function, this,
           bufferSize, numberOfInputChannels, numberOfOutputChannels);
@@ -344,22 +356,23 @@
       return JS('ScriptProcessorNode', '#.call(#, #, #)', function, this,
           bufferSize, numberOfInputChannels);
     } else {
-      return JS('ScriptProcessorNode', '#.call(#, #)', function, this,
-          bufferSize);
+      return JS(
+          'ScriptProcessorNode', '#.call(#, #)', function, this, bufferSize);
     }
   }
+
   @DomName('AudioContext.decodeAudioData')
   Future<AudioBuffer> decodeAudioData(ByteBuffer audioData) {
     var completer = new Completer<AudioBuffer>();
-    _decodeAudioData(audioData,
-        (value) { completer.complete(value); },
-        (error) {
-          if (error == null) {
-            completer.completeError('');
-          } else {
-            completer.completeError(error);
-          }
-        });
+    _decodeAudioData(audioData, (value) {
+      completer.complete(value);
+    }, (error) {
+      if (error == null) {
+        completer.completeError('');
+      } else {
+        completer.completeError(error);
+      }
+    });
     return completer.future;
   }
 }
@@ -367,7 +380,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.
 
-
 @DocsEditable()
 @DomName('AudioDestinationNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioDestinationNode-section
@@ -375,7 +387,9 @@
 @Native("AudioDestinationNode")
 class AudioDestinationNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory AudioDestinationNode._() { throw new UnsupportedError("Not supported"); }
+  factory AudioDestinationNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AudioDestinationNode.maxChannelCount')
   @DocsEditable()
@@ -385,7 +399,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.
 
-
 @DocsEditable()
 @DomName('AudioListener')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioListener-section
@@ -393,7 +406,9 @@
 @Native("AudioListener")
 class AudioListener extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AudioListener._() { throw new UnsupportedError("Not supported"); }
+  factory AudioListener._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AudioListener.dopplerFactor')
   @DocsEditable()
@@ -405,28 +420,29 @@
 
   @DomName('AudioListener.setOrientation')
   @DocsEditable()
-  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native;
+  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native ;
 
   @DomName('AudioListener.setPosition')
   @DocsEditable()
-  void setPosition(num x, num y, num z) native;
+  void setPosition(num x, num y, num z) native ;
 
   @DomName('AudioListener.setVelocity')
   @DocsEditable()
-  void setVelocity(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.
 
-
 @DomName('AudioNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioNode-section
 @Experimental()
 @Native("AudioNode")
 class AudioNode extends EventTarget {
   // To suppress missing implicit constructor warnings.
-  factory AudioNode._() { throw new UnsupportedError("Not supported"); }
+  factory AudioNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AudioNode.channelCount')
   @DocsEditable()
@@ -455,11 +471,11 @@
   @JSName('connect')
   @DomName('AudioNode.connect')
   @DocsEditable()
-  void _connect(destination, int output, [int input]) native;
+  void _connect(destination, int output, [int input]) native ;
 
   @DomName('AudioNode.disconnect')
   @DocsEditable()
-  void disconnect(int output) native;
+  void disconnect(int output) native ;
 
   @DomName('AudioNode.connect')
   void connectNode(AudioNode destination, [int output = 0, int input = 0]) =>
@@ -473,7 +489,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.
 
-
 @DocsEditable()
 @DomName('AudioParam')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioParam
@@ -481,7 +496,9 @@
 @Native("AudioParam")
 class AudioParam extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AudioParam._() { throw new UnsupportedError("Not supported"); }
+  factory AudioParam._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AudioParam.defaultValue')
   @DocsEditable()
@@ -493,33 +510,32 @@
 
   @DomName('AudioParam.cancelScheduledValues')
   @DocsEditable()
-  void cancelScheduledValues(num startTime) native;
+  void cancelScheduledValues(num startTime) native ;
 
   @DomName('AudioParam.exponentialRampToValueAtTime')
   @DocsEditable()
-  void exponentialRampToValueAtTime(num value, num time) native;
+  void exponentialRampToValueAtTime(num value, num time) native ;
 
   @DomName('AudioParam.linearRampToValueAtTime')
   @DocsEditable()
-  void linearRampToValueAtTime(num value, num time) native;
+  void linearRampToValueAtTime(num value, num time) native ;
 
   @DomName('AudioParam.setTargetAtTime')
   @DocsEditable()
-  void setTargetAtTime(num target, num time, num timeConstant) native;
+  void setTargetAtTime(num target, num time, num timeConstant) native ;
 
   @DomName('AudioParam.setValueAtTime')
   @DocsEditable()
-  void setValueAtTime(num value, num time) native;
+  void setValueAtTime(num value, num time) native ;
 
   @DomName('AudioParam.setValueCurveAtTime')
   @DocsEditable()
-  void setValueCurveAtTime(Float32List values, num time, num duration) native;
+  void setValueCurveAtTime(Float32List 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.
 
-
 @DocsEditable()
 @DomName('AudioProcessingEvent')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioProcessingEvent-section
@@ -527,7 +543,9 @@
 @Native("AudioProcessingEvent")
 class AudioProcessingEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory AudioProcessingEvent._() { throw new UnsupportedError("Not supported"); }
+  factory AudioProcessingEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('AudioProcessingEvent.inputBuffer')
   @DocsEditable()
@@ -546,7 +564,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.
 
-
 @DocsEditable()
 @DomName('AudioSourceNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html
@@ -554,13 +571,14 @@
 @Native("AudioSourceNode")
 class AudioSourceNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory AudioSourceNode._() { throw new UnsupportedError("Not supported"); }
+  factory AudioSourceNode._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('BiquadFilterNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#BiquadFilterNode-section
@@ -568,7 +586,9 @@
 @Native("BiquadFilterNode")
 class BiquadFilterNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory BiquadFilterNode._() { throw new UnsupportedError("Not supported"); }
+  factory BiquadFilterNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('BiquadFilterNode.Q')
   @DocsEditable()
@@ -592,13 +612,13 @@
 
   @DomName('BiquadFilterNode.getFrequencyResponse')
   @DocsEditable()
-  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse, Float32List phaseResponse) native;
+  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse,
+      Float32List 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.
 
-
 @DocsEditable()
 @DomName('ChannelMergerNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ChannelMergerNode-section
@@ -606,13 +626,14 @@
 @Native("ChannelMergerNode,AudioChannelMerger")
 class ChannelMergerNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory ChannelMergerNode._() { throw new UnsupportedError("Not supported"); }
+  factory ChannelMergerNode._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('ChannelSplitterNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ChannelSplitterNode-section
@@ -620,13 +641,14 @@
 @Native("ChannelSplitterNode,AudioChannelSplitter")
 class ChannelSplitterNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory ChannelSplitterNode._() { throw new UnsupportedError("Not supported"); }
+  factory ChannelSplitterNode._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('ConvolverNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ConvolverNode
@@ -634,7 +656,9 @@
 @Native("ConvolverNode")
 class ConvolverNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory ConvolverNode._() { throw new UnsupportedError("Not supported"); }
+  factory ConvolverNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
@@ -648,7 +672,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.
 
-
 @DocsEditable()
 @DomName('DelayNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#DelayNode
@@ -656,7 +679,9 @@
 @Native("DelayNode")
 class DelayNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory DelayNode._() { throw new UnsupportedError("Not supported"); }
+  factory DelayNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DelayNode.delayTime')
   @DocsEditable()
@@ -666,7 +691,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.
 
-
 @DocsEditable()
 @DomName('DynamicsCompressorNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#DynamicsCompressorNode
@@ -674,7 +698,9 @@
 @Native("DynamicsCompressorNode")
 class DynamicsCompressorNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory DynamicsCompressorNode._() { throw new UnsupportedError("Not supported"); }
+  factory DynamicsCompressorNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('DynamicsCompressorNode.attack')
   @DocsEditable()
@@ -704,7 +730,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.
 
-
 @DocsEditable()
 @DomName('GainNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#GainNode
@@ -712,7 +737,9 @@
 @Native("GainNode,AudioGainNode")
 class GainNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory GainNode._() { throw new UnsupportedError("Not supported"); }
+  factory GainNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('GainNode.gain')
   @DocsEditable()
@@ -722,7 +749,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.
 
-
 @DocsEditable()
 @DomName('MediaElementAudioSourceNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaElementAudioSourceNode
@@ -730,7 +756,9 @@
 @Native("MediaElementAudioSourceNode")
 class MediaElementAudioSourceNode extends AudioSourceNode {
   // To suppress missing implicit constructor warnings.
-  factory MediaElementAudioSourceNode._() { throw new UnsupportedError("Not supported"); }
+  factory MediaElementAudioSourceNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaElementAudioSourceNode.mediaElement')
   @DocsEditable()
@@ -741,7 +769,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.
 
-
 @DocsEditable()
 @DomName('MediaStreamAudioDestinationNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaStreamAudioDestinationNode
@@ -749,7 +776,9 @@
 @Native("MediaStreamAudioDestinationNode")
 class MediaStreamAudioDestinationNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory MediaStreamAudioDestinationNode._() { throw new UnsupportedError("Not supported"); }
+  factory MediaStreamAudioDestinationNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaStreamAudioDestinationNode.stream')
   @DocsEditable()
@@ -759,7 +788,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.
 
-
 @DocsEditable()
 @DomName('MediaStreamAudioSourceNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaStreamAudioSourceNode
@@ -767,7 +795,9 @@
 @Native("MediaStreamAudioSourceNode")
 class MediaStreamAudioSourceNode extends AudioSourceNode {
   // To suppress missing implicit constructor warnings.
-  factory MediaStreamAudioSourceNode._() { throw new UnsupportedError("Not supported"); }
+  factory MediaStreamAudioSourceNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('MediaStreamAudioSourceNode.mediaStream')
   @DocsEditable()
@@ -777,7 +807,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.
 
-
 @DocsEditable()
 @DomName('OfflineAudioCompletionEvent')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#OfflineAudioCompletionEvent-section
@@ -785,7 +814,9 @@
 @Native("OfflineAudioCompletionEvent")
 class OfflineAudioCompletionEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory OfflineAudioCompletionEvent._() { throw new UnsupportedError("Not supported"); }
+  factory OfflineAudioCompletionEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('OfflineAudioCompletionEvent.renderedBuffer')
   @DocsEditable()
@@ -795,7 +826,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.
 
-
 @DocsEditable()
 @DomName('OfflineAudioContext')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#OfflineAudioContext-section
@@ -803,20 +833,26 @@
 @Native("OfflineAudioContext")
 class OfflineAudioContext extends AudioContext {
   // To suppress missing implicit constructor warnings.
-  factory OfflineAudioContext._() { throw new UnsupportedError("Not supported"); }
+  factory OfflineAudioContext._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('OfflineAudioContext.OfflineAudioContext')
   @DocsEditable()
-  factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) {
-    return OfflineAudioContext._create_1(numberOfChannels, numberOfFrames, sampleRate);
+  factory OfflineAudioContext(
+      int numberOfChannels, int numberOfFrames, num sampleRate) {
+    return OfflineAudioContext._create_1(
+        numberOfChannels, numberOfFrames, sampleRate);
   }
-  static OfflineAudioContext _create_1(numberOfChannels, numberOfFrames, sampleRate) => JS('OfflineAudioContext', 'new OfflineAudioContext(#,#,#)', numberOfChannels, numberOfFrames, sampleRate);
+  static OfflineAudioContext _create_1(
+          numberOfChannels, numberOfFrames, sampleRate) =>
+      JS('OfflineAudioContext', 'new OfflineAudioContext(#,#,#)',
+          numberOfChannels, numberOfFrames, sampleRate);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('OscillatorNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-OscillatorNode
@@ -824,7 +860,9 @@
 @Native("OscillatorNode,Oscillator")
 class OscillatorNode extends AudioSourceNode {
   // To suppress missing implicit constructor warnings.
-  factory OscillatorNode._() { throw new UnsupportedError("Not supported"); }
+  factory OscillatorNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `ended` events to event
@@ -835,7 +873,8 @@
   @DomName('OscillatorNode.endedEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+  static const EventStreamProvider<Event> endedEvent =
+      const EventStreamProvider<Event>('ended');
 
   @DomName('OscillatorNode.detune')
   @DocsEditable()
@@ -851,24 +890,24 @@
 
   @DomName('OscillatorNode.noteOff')
   @DocsEditable()
-  void noteOff(num when) native;
+  void noteOff(num when) native ;
 
   @DomName('OscillatorNode.noteOn')
   @DocsEditable()
-  void noteOn(num when) native;
+  void noteOn(num when) native ;
 
   @DomName('OscillatorNode.setPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
-  void setPeriodicWave(PeriodicWave periodicWave) native;
+  void setPeriodicWave(PeriodicWave periodicWave) native ;
 
   @DomName('OscillatorNode.start')
   @DocsEditable()
-  void start([num when]) native;
+  void start([num when]) native ;
 
   @DomName('OscillatorNode.stop')
   @DocsEditable()
-  void stop([num when]) native;
+  void stop([num when]) native ;
 
   /// Stream of `ended` events handled by this [OscillatorNode].
   @DomName('OscillatorNode.onended')
@@ -880,7 +919,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.
 
-
 @DocsEditable()
 @DomName('PannerNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#PannerNode
@@ -888,7 +926,9 @@
 @Native("PannerNode,AudioPannerNode,webkitAudioPannerNode")
 class PannerNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory PannerNode._() { throw new UnsupportedError("Not supported"); }
+  factory PannerNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
@@ -924,34 +964,34 @@
 
   @DomName('PannerNode.setOrientation')
   @DocsEditable()
-  void setOrientation(num x, num y, num z) native;
+  void setOrientation(num x, num y, num z) native ;
 
   @DomName('PannerNode.setPosition')
   @DocsEditable()
-  void setPosition(num x, num y, num z) native;
+  void setPosition(num x, num y, num z) native ;
 
   @DomName('PannerNode.setVelocity')
   @DocsEditable()
-  void setVelocity(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.
 
-
 @DocsEditable()
 @DomName('PeriodicWave')
 @Experimental() // untriaged
 @Native("PeriodicWave")
 class PeriodicWave extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory PeriodicWave._() { throw new UnsupportedError("Not supported"); }
+  factory PeriodicWave._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('ScriptProcessorNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ScriptProcessorNode
@@ -959,7 +999,9 @@
 @Native("ScriptProcessorNode,JavaScriptAudioNode")
 class ScriptProcessorNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory ScriptProcessorNode._() { throw new UnsupportedError("Not supported"); }
+  factory ScriptProcessorNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /**
    * Static factory designed to expose `audioprocess` events to event
@@ -970,7 +1012,8 @@
   @DomName('ScriptProcessorNode.audioprocessEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  static const EventStreamProvider<AudioProcessingEvent> audioProcessEvent = const EventStreamProvider<AudioProcessingEvent>('audioprocess');
+  static const EventStreamProvider<AudioProcessingEvent> audioProcessEvent =
+      const EventStreamProvider<AudioProcessingEvent>('audioprocess');
 
   @DomName('ScriptProcessorNode.bufferSize')
   @DocsEditable()
@@ -979,7 +1022,7 @@
   @DomName('ScriptProcessorNode.setEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void setEventListener(EventListener eventListener) native;
+  void setEventListener(EventListener eventListener) native ;
 
   /// Stream of `audioprocess` events handled by this [ScriptProcessorNode].
 /**
@@ -992,13 +1035,13 @@
   @DomName('ScriptProcessorNode.onaudioprocess')
   @DocsEditable()
   @Experimental() // untriaged
-  Stream<AudioProcessingEvent> get onAudioProcess => audioProcessEvent.forTarget(this);
+  Stream<AudioProcessingEvent> get onAudioProcess =>
+      audioProcessEvent.forTarget(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.
 
-
 @DocsEditable()
 @DomName('WaveShaperNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-WaveShaperNode
@@ -1006,7 +1049,9 @@
 @Native("WaveShaperNode")
 class WaveShaperNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
-  factory WaveShaperNode._() { throw new UnsupportedError("Not supported"); }
+  factory WaveShaperNode._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index 2ce52d4..28cefc1 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -9,22 +9,18 @@
 import 'dart:html_common';
 import 'dart:_native_typed_data';
 import 'dart:typed_data';
-import 'dart:_js_helper' show Creates, JSName, Native, Returns, convertDartClosureToJS;
+import 'dart:_js_helper'
+    show Creates, JSName, Native, Returns, convertDartClosureToJS;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor, JSExtendableArray;
 // DO NOT EDIT - unless you are editing documentation as per:
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:web_gl library.
 
-
-
-
-
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 const int ACTIVE_ATTRIBUTES = RenderingContext.ACTIVE_ATTRIBUTES;
 const int ACTIVE_TEXTURE = RenderingContext.ACTIVE_TEXTURE;
 const int ACTIVE_UNIFORMS = RenderingContext.ACTIVE_UNIFORMS;
@@ -62,7 +58,8 @@
 const int COLOR_CLEAR_VALUE = RenderingContext.COLOR_CLEAR_VALUE;
 const int COLOR_WRITEMASK = RenderingContext.COLOR_WRITEMASK;
 const int COMPILE_STATUS = RenderingContext.COMPILE_STATUS;
-const int COMPRESSED_TEXTURE_FORMATS = RenderingContext.COMPRESSED_TEXTURE_FORMATS;
+const int COMPRESSED_TEXTURE_FORMATS =
+    RenderingContext.COMPRESSED_TEXTURE_FORMATS;
 const int CONSTANT_ALPHA = RenderingContext.CONSTANT_ALPHA;
 const int CONSTANT_COLOR = RenderingContext.CONSTANT_COLOR;
 const int CONTEXT_LOST_WEBGL = RenderingContext.CONTEXT_LOST_WEBGL;
@@ -92,7 +89,8 @@
 const int DST_COLOR = RenderingContext.DST_COLOR;
 const int DYNAMIC_DRAW = RenderingContext.DYNAMIC_DRAW;
 const int ELEMENT_ARRAY_BUFFER = RenderingContext.ELEMENT_ARRAY_BUFFER;
-const int ELEMENT_ARRAY_BUFFER_BINDING = RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING;
+const int ELEMENT_ARRAY_BUFFER_BINDING =
+    RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING;
 const int EQUAL = RenderingContext.EQUAL;
 const int FASTEST = RenderingContext.FASTEST;
 const int FLOAT = RenderingContext.FLOAT;
@@ -104,15 +102,22 @@
 const int FLOAT_VEC4 = RenderingContext.FLOAT_VEC4;
 const int FRAGMENT_SHADER = RenderingContext.FRAGMENT_SHADER;
 const int FRAMEBUFFER = RenderingContext.FRAMEBUFFER;
-const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;
-const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;
-const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;
-const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;
+const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME =
+    RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;
+const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE =
+    RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;
+const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE =
+    RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;
+const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL =
+    RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;
 const int FRAMEBUFFER_BINDING = RenderingContext.FRAMEBUFFER_BINDING;
 const int FRAMEBUFFER_COMPLETE = RenderingContext.FRAMEBUFFER_COMPLETE;
-const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
-const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
-const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
+const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT =
+    RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS =
+    RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
+const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT =
+    RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
 const int FRAMEBUFFER_UNSUPPORTED = RenderingContext.FRAMEBUFFER_UNSUPPORTED;
 const int FRONT = RenderingContext.FRONT;
 const int FRONT_AND_BACK = RenderingContext.FRONT_AND_BACK;
@@ -134,7 +139,8 @@
 const int INT_VEC3 = RenderingContext.INT_VEC3;
 const int INT_VEC4 = RenderingContext.INT_VEC4;
 const int INVALID_ENUM = RenderingContext.INVALID_ENUM;
-const int INVALID_FRAMEBUFFER_OPERATION = RenderingContext.INVALID_FRAMEBUFFER_OPERATION;
+const int INVALID_FRAMEBUFFER_OPERATION =
+    RenderingContext.INVALID_FRAMEBUFFER_OPERATION;
 const int INVALID_OPERATION = RenderingContext.INVALID_OPERATION;
 const int INVALID_VALUE = RenderingContext.INVALID_VALUE;
 const int INVERT = RenderingContext.INVERT;
@@ -153,16 +159,21 @@
 const int LOW_INT = RenderingContext.LOW_INT;
 const int LUMINANCE = RenderingContext.LUMINANCE;
 const int LUMINANCE_ALPHA = RenderingContext.LUMINANCE_ALPHA;
-const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS;
-const int MAX_CUBE_MAP_TEXTURE_SIZE = RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE;
-const int MAX_FRAGMENT_UNIFORM_VECTORS = RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS;
+const int MAX_COMBINED_TEXTURE_IMAGE_UNITS =
+    RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS;
+const int MAX_CUBE_MAP_TEXTURE_SIZE =
+    RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE;
+const int MAX_FRAGMENT_UNIFORM_VECTORS =
+    RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS;
 const int MAX_RENDERBUFFER_SIZE = RenderingContext.MAX_RENDERBUFFER_SIZE;
 const int MAX_TEXTURE_IMAGE_UNITS = RenderingContext.MAX_TEXTURE_IMAGE_UNITS;
 const int MAX_TEXTURE_SIZE = RenderingContext.MAX_TEXTURE_SIZE;
 const int MAX_VARYING_VECTORS = RenderingContext.MAX_VARYING_VECTORS;
 const int MAX_VERTEX_ATTRIBS = RenderingContext.MAX_VERTEX_ATTRIBS;
-const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS;
-const int MAX_VERTEX_UNIFORM_VECTORS = RenderingContext.MAX_VERTEX_UNIFORM_VECTORS;
+const int MAX_VERTEX_TEXTURE_IMAGE_UNITS =
+    RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS;
+const int MAX_VERTEX_UNIFORM_VECTORS =
+    RenderingContext.MAX_VERTEX_UNIFORM_VECTORS;
 const int MAX_VIEWPORT_DIMS = RenderingContext.MAX_VIEWPORT_DIMS;
 const int MEDIUM_FLOAT = RenderingContext.MEDIUM_FLOAT;
 const int MEDIUM_INT = RenderingContext.MEDIUM_INT;
@@ -196,9 +207,11 @@
 const int RENDERBUFFER_DEPTH_SIZE = RenderingContext.RENDERBUFFER_DEPTH_SIZE;
 const int RENDERBUFFER_GREEN_SIZE = RenderingContext.RENDERBUFFER_GREEN_SIZE;
 const int RENDERBUFFER_HEIGHT = RenderingContext.RENDERBUFFER_HEIGHT;
-const int RENDERBUFFER_INTERNAL_FORMAT = RenderingContext.RENDERBUFFER_INTERNAL_FORMAT;
+const int RENDERBUFFER_INTERNAL_FORMAT =
+    RenderingContext.RENDERBUFFER_INTERNAL_FORMAT;
 const int RENDERBUFFER_RED_SIZE = RenderingContext.RENDERBUFFER_RED_SIZE;
-const int RENDERBUFFER_STENCIL_SIZE = RenderingContext.RENDERBUFFER_STENCIL_SIZE;
+const int RENDERBUFFER_STENCIL_SIZE =
+    RenderingContext.RENDERBUFFER_STENCIL_SIZE;
 const int RENDERBUFFER_WIDTH = RenderingContext.RENDERBUFFER_WIDTH;
 const int RENDERER = RenderingContext.RENDERER;
 const int REPEAT = RenderingContext.REPEAT;
@@ -228,8 +241,10 @@
 const int STENCIL_ATTACHMENT = RenderingContext.STENCIL_ATTACHMENT;
 const int STENCIL_BACK_FAIL = RenderingContext.STENCIL_BACK_FAIL;
 const int STENCIL_BACK_FUNC = RenderingContext.STENCIL_BACK_FUNC;
-const int STENCIL_BACK_PASS_DEPTH_FAIL = RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL;
-const int STENCIL_BACK_PASS_DEPTH_PASS = RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS;
+const int STENCIL_BACK_PASS_DEPTH_FAIL =
+    RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL;
+const int STENCIL_BACK_PASS_DEPTH_PASS =
+    RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS;
 const int STENCIL_BACK_REF = RenderingContext.STENCIL_BACK_REF;
 const int STENCIL_BACK_VALUE_MASK = RenderingContext.STENCIL_BACK_VALUE_MASK;
 const int STENCIL_BACK_WRITEMASK = RenderingContext.STENCIL_BACK_WRITEMASK;
@@ -285,12 +300,18 @@
 const int TEXTURE_BINDING_2D = RenderingContext.TEXTURE_BINDING_2D;
 const int TEXTURE_BINDING_CUBE_MAP = RenderingContext.TEXTURE_BINDING_CUBE_MAP;
 const int TEXTURE_CUBE_MAP = RenderingContext.TEXTURE_CUBE_MAP;
-const int TEXTURE_CUBE_MAP_NEGATIVE_X = RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X;
-const int TEXTURE_CUBE_MAP_NEGATIVE_Y = RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y;
-const int TEXTURE_CUBE_MAP_NEGATIVE_Z = RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z;
-const int TEXTURE_CUBE_MAP_POSITIVE_X = RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X;
-const int TEXTURE_CUBE_MAP_POSITIVE_Y = RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y;
-const int TEXTURE_CUBE_MAP_POSITIVE_Z = RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z;
+const int TEXTURE_CUBE_MAP_NEGATIVE_X =
+    RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X;
+const int TEXTURE_CUBE_MAP_NEGATIVE_Y =
+    RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y;
+const int TEXTURE_CUBE_MAP_NEGATIVE_Z =
+    RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z;
+const int TEXTURE_CUBE_MAP_POSITIVE_X =
+    RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X;
+const int TEXTURE_CUBE_MAP_POSITIVE_Y =
+    RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y;
+const int TEXTURE_CUBE_MAP_POSITIVE_Z =
+    RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z;
 const int TEXTURE_MAG_FILTER = RenderingContext.TEXTURE_MAG_FILTER;
 const int TEXTURE_MIN_FILTER = RenderingContext.TEXTURE_MIN_FILTER;
 const int TEXTURE_WRAP_S = RenderingContext.TEXTURE_WRAP_S;
@@ -299,9 +320,11 @@
 const int TRIANGLE_FAN = RenderingContext.TRIANGLE_FAN;
 const int TRIANGLE_STRIP = RenderingContext.TRIANGLE_STRIP;
 const int UNPACK_ALIGNMENT = RenderingContext.UNPACK_ALIGNMENT;
-const int UNPACK_COLORSPACE_CONVERSION_WEBGL = RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL;
+const int UNPACK_COLORSPACE_CONVERSION_WEBGL =
+    RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL;
 const int UNPACK_FLIP_Y_WEBGL = RenderingContext.UNPACK_FLIP_Y_WEBGL;
-const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL;
+const int UNPACK_PREMULTIPLY_ALPHA_WEBGL =
+    RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL;
 const int UNSIGNED_BYTE = RenderingContext.UNSIGNED_BYTE;
 const int UNSIGNED_INT = RenderingContext.UNSIGNED_INT;
 const int UNSIGNED_SHORT = RenderingContext.UNSIGNED_SHORT;
@@ -311,12 +334,17 @@
 const int VALIDATE_STATUS = RenderingContext.VALIDATE_STATUS;
 const int VENDOR = RenderingContext.VENDOR;
 const int VERSION = RenderingContext.VERSION;
-const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;
-const int VERTEX_ATTRIB_ARRAY_ENABLED = RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED;
-const int VERTEX_ATTRIB_ARRAY_NORMALIZED = RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED;
-const int VERTEX_ATTRIB_ARRAY_POINTER = RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER;
+const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING =
+    RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;
+const int VERTEX_ATTRIB_ARRAY_ENABLED =
+    RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED;
+const int VERTEX_ATTRIB_ARRAY_NORMALIZED =
+    RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED;
+const int VERTEX_ATTRIB_ARRAY_POINTER =
+    RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER;
 const int VERTEX_ATTRIB_ARRAY_SIZE = RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE;
-const int VERTEX_ATTRIB_ARRAY_STRIDE = RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE;
+const int VERTEX_ATTRIB_ARRAY_STRIDE =
+    RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE;
 const int VERTEX_ATTRIB_ARRAY_TYPE = RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE;
 const int VERTEX_SHADER = RenderingContext.VERTEX_SHADER;
 const int VIEWPORT = RenderingContext.VIEWPORT;
@@ -325,14 +353,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.
 
-
 @DocsEditable()
 @DomName('WebGLActiveInfo')
 @Unstable()
 @Native("WebGLActiveInfo")
 class ActiveInfo extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ActiveInfo._() { throw new UnsupportedError("Not supported"); }
+  factory ActiveInfo._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebGLActiveInfo.name')
   @DocsEditable()
@@ -350,14 +379,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.
 
-
 @DocsEditable()
 @DomName('ANGLEInstancedArrays')
 @Experimental() // untriaged
 @Native("ANGLEInstancedArrays")
 class AngleInstancedArrays extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory AngleInstancedArrays._() { throw new UnsupportedError("Not supported"); }
+  factory AngleInstancedArrays._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('ANGLEInstancedArrays.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE')
   @DocsEditable()
@@ -368,38 +398,40 @@
   @DomName('ANGLEInstancedArrays.drawArraysInstancedANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawArraysInstancedAngle(int mode, int first, int count, int primcount) native;
+  void drawArraysInstancedAngle(int mode, int first, int count, int primcount)
+      native ;
 
   @JSName('drawElementsInstancedANGLE')
   @DomName('ANGLEInstancedArrays.drawElementsInstancedANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawElementsInstancedAngle(int mode, int count, int type, int offset, int primcount) native;
+  void drawElementsInstancedAngle(
+      int mode, int count, int type, int offset, int primcount) native ;
 
   @JSName('vertexAttribDivisorANGLE')
   @DomName('ANGLEInstancedArrays.vertexAttribDivisorANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttribDivisorAngle(int index, int divisor) native;
+  void vertexAttribDivisorAngle(int index, int divisor) 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.
 
-
 @DocsEditable()
 @DomName('WebGLBuffer')
 @Unstable()
 @Native("WebGLBuffer")
 class Buffer extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Buffer._() { throw new UnsupportedError("Not supported"); }
+  factory Buffer._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('WebGLCompressedTextureATC')
 // http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_atc/
@@ -407,13 +439,16 @@
 @Native("WebGLCompressedTextureATC")
 class CompressedTextureAtc extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory CompressedTextureAtc._() { throw new UnsupportedError("Not supported"); }
+  factory CompressedTextureAtc._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebGLCompressedTextureATC.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL')
   @DocsEditable()
   static const int COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 0x8C93;
 
-  @DomName('WebGLCompressedTextureATC.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL')
+  @DomName(
+      'WebGLCompressedTextureATC.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL')
   @DocsEditable()
   static const int COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 0x87EE;
 
@@ -425,14 +460,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.
 
-
 @DocsEditable()
 @DomName('WebGLCompressedTextureETC1')
 @Experimental() // untriaged
 @Native("WebGLCompressedTextureETC1")
 class CompressedTextureETC1 extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory CompressedTextureETC1._() { throw new UnsupportedError("Not supported"); }
+  factory CompressedTextureETC1._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebGLCompressedTextureETC1.COMPRESSED_RGB_ETC1_WEBGL')
   @DocsEditable()
@@ -443,7 +479,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.
 
-
 @DocsEditable()
 @DomName('WebGLCompressedTexturePVRTC')
 // http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_pvrtc/
@@ -451,7 +486,9 @@
 @Native("WebGLCompressedTexturePVRTC")
 class CompressedTexturePvrtc extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory CompressedTexturePvrtc._() { throw new UnsupportedError("Not supported"); }
+  factory CompressedTexturePvrtc._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebGLCompressedTexturePVRTC.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG')
   @DocsEditable()
@@ -473,7 +510,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.
 
-
 @DocsEditable()
 @DomName('WebGLCompressedTextureS3TC')
 // http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/
@@ -481,7 +517,9 @@
 @Native("WebGLCompressedTextureS3TC")
 class CompressedTextureS3TC extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory CompressedTextureS3TC._() { throw new UnsupportedError("Not supported"); }
+  factory CompressedTextureS3TC._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebGLCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT')
   @DocsEditable()
@@ -503,7 +541,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.
 
-
 @DocsEditable()
 /**
  * The properties of a WebGL rendering context.
@@ -532,7 +569,9 @@
 @Native("WebGLContextAttributes")
 class ContextAttributes extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ContextAttributes._() { throw new UnsupportedError("Not supported"); }
+  factory ContextAttributes._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebGLContextAttributes.alpha')
   @DocsEditable()
@@ -567,14 +606,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.
 
-
 @DocsEditable()
 @DomName('WebGLContextEvent')
 @Unstable()
 @Native("WebGLContextEvent")
 class ContextEvent extends Event {
   // To suppress missing implicit constructor warnings.
-  factory ContextEvent._() { throw new UnsupportedError("Not supported"); }
+  factory ContextEvent._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebGLContextEvent.statusMessage')
   @DocsEditable()
@@ -584,7 +624,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.
 
-
 @DocsEditable()
 @DomName('WebGLDebugRendererInfo')
 // http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_renderer_info/
@@ -592,7 +631,9 @@
 @Native("WebGLDebugRendererInfo")
 class DebugRendererInfo extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DebugRendererInfo._() { throw new UnsupportedError("Not supported"); }
+  factory DebugRendererInfo._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebGLDebugRendererInfo.UNMASKED_RENDERER_WEBGL')
   @DocsEditable()
@@ -606,7 +647,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.
 
-
 @DocsEditable()
 @DomName('WebGLDebugShaders')
 // http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_shaders/
@@ -614,17 +654,18 @@
 @Native("WebGLDebugShaders")
 class DebugShaders extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DebugShaders._() { throw new UnsupportedError("Not supported"); }
+  factory DebugShaders._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebGLDebugShaders.getTranslatedShaderSource')
   @DocsEditable()
-  String getTranslatedShaderSource(Shader shader) native;
+  String getTranslatedShaderSource(Shader 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.
 
-
 @DocsEditable()
 @DomName('WebGLDepthTexture')
 // http://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/
@@ -632,7 +673,9 @@
 @Native("WebGLDepthTexture")
 class DepthTexture extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DepthTexture._() { throw new UnsupportedError("Not supported"); }
+  factory DepthTexture._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebGLDepthTexture.UNSIGNED_INT_24_8_WEBGL')
   @DocsEditable()
@@ -642,7 +685,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.
 
-
 @DocsEditable()
 @DomName('WebGLDrawBuffers')
 // http://www.khronos.org/registry/webgl/specs/latest/
@@ -650,7 +692,9 @@
 @Native("WebGLDrawBuffers")
 class DrawBuffers extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory DrawBuffers._() { throw new UnsupportedError("Not supported"); }
+  factory DrawBuffers._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT0_WEBGL')
   @DocsEditable()
@@ -791,20 +835,21 @@
   @JSName('drawBuffersWEBGL')
   @DomName('WebGLDrawBuffers.drawBuffersWEBGL')
   @DocsEditable()
-  void drawBuffersWebgl(List<int> buffers) native;
+  void drawBuffersWebgl(List<int> buffers) 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.
 
-
 @DocsEditable()
 @DomName('EXTBlendMinMax')
 @Experimental() // untriaged
 @Native("EXTBlendMinMax")
 class ExtBlendMinMax extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ExtBlendMinMax._() { throw new UnsupportedError("Not supported"); }
+  factory ExtBlendMinMax._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('EXTBlendMinMax.MAX_EXT')
   @DocsEditable()
@@ -820,7 +865,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.
 
-
 @DocsEditable()
 @DomName('EXTFragDepth')
 // http://www.khronos.org/registry/webgl/extensions/EXT_frag_depth/
@@ -828,26 +872,28 @@
 @Native("EXTFragDepth")
 class ExtFragDepth extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ExtFragDepth._() { throw new UnsupportedError("Not supported"); }
+  factory ExtFragDepth._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('EXTShaderTextureLOD')
 @Experimental() // untriaged
 @Native("EXTShaderTextureLOD")
 class ExtShaderTextureLod extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ExtShaderTextureLod._() { throw new UnsupportedError("Not supported"); }
+  factory ExtShaderTextureLod._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('EXTTextureFilterAnisotropic')
 // http://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotropic/
@@ -855,7 +901,9 @@
 @Native("EXTTextureFilterAnisotropic")
 class ExtTextureFilterAnisotropic extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ExtTextureFilterAnisotropic._() { throw new UnsupportedError("Not supported"); }
+  factory ExtTextureFilterAnisotropic._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('EXTTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT')
   @DocsEditable()
@@ -869,20 +917,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.
 
-
 @DocsEditable()
 @DomName('WebGLFramebuffer')
 @Unstable()
 @Native("WebGLFramebuffer")
 class Framebuffer extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Framebuffer._() { throw new UnsupportedError("Not supported"); }
+  factory Framebuffer._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('WebGLLoseContext')
 // http://www.khronos.org/registry/webgl/extensions/WEBGL_lose_context/
@@ -890,21 +938,22 @@
 @Native("WebGLLoseContext,WebGLExtensionLoseContext")
 class LoseContext extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory LoseContext._() { throw new UnsupportedError("Not supported"); }
+  factory LoseContext._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebGLLoseContext.loseContext')
   @DocsEditable()
-  void loseContext() native;
+  void loseContext() native ;
 
   @DomName('WebGLLoseContext.restoreContext')
   @DocsEditable()
-  void restoreContext() 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.
 
-
 @DocsEditable()
 @DomName('OESElementIndexUint')
 // http://www.khronos.org/registry/webgl/extensions/OES_element_index_uint/
@@ -912,13 +961,14 @@
 @Native("OESElementIndexUint")
 class OesElementIndexUint extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory OesElementIndexUint._() { throw new UnsupportedError("Not supported"); }
+  factory OesElementIndexUint._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('OESStandardDerivatives')
 // http://www.khronos.org/registry/webgl/extensions/OES_standard_derivatives/
@@ -926,7 +976,9 @@
 @Native("OESStandardDerivatives")
 class OesStandardDerivatives extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory OesStandardDerivatives._() { throw new UnsupportedError("Not supported"); }
+  factory OesStandardDerivatives._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('OESStandardDerivatives.FRAGMENT_SHADER_DERIVATIVE_HINT_OES')
   @DocsEditable()
@@ -936,7 +988,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.
 
-
 @DocsEditable()
 @DomName('OESTextureFloat')
 // http://www.khronos.org/registry/webgl/extensions/OES_texture_float/
@@ -944,13 +995,14 @@
 @Native("OESTextureFloat")
 class OesTextureFloat extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory OesTextureFloat._() { throw new UnsupportedError("Not supported"); }
+  factory OesTextureFloat._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('OESTextureFloatLinear')
 // http://www.khronos.org/registry/webgl/extensions/OES_texture_float_linear/
@@ -958,13 +1010,14 @@
 @Native("OESTextureFloatLinear")
 class OesTextureFloatLinear extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory OesTextureFloatLinear._() { throw new UnsupportedError("Not supported"); }
+  factory OesTextureFloatLinear._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('OESTextureHalfFloat')
 // http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float/
@@ -972,7 +1025,9 @@
 @Native("OESTextureHalfFloat")
 class OesTextureHalfFloat extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory OesTextureHalfFloat._() { throw new UnsupportedError("Not supported"); }
+  factory OesTextureHalfFloat._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('OESTextureHalfFloat.HALF_FLOAT_OES')
   @DocsEditable()
@@ -982,7 +1037,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.
 
-
 @DocsEditable()
 @DomName('OESTextureHalfFloatLinear')
 // http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float_linear/
@@ -990,13 +1044,14 @@
 @Native("OESTextureHalfFloatLinear")
 class OesTextureHalfFloatLinear extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory OesTextureHalfFloatLinear._() { throw new UnsupportedError("Not supported"); }
+  factory OesTextureHalfFloatLinear._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('OESVertexArrayObject')
 // http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
@@ -1004,7 +1059,9 @@
 @Native("OESVertexArrayObject")
 class OesVertexArrayObject extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory OesVertexArrayObject._() { throw new UnsupportedError("Not supported"); }
+  factory OesVertexArrayObject._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('OESVertexArrayObject.VERTEX_ARRAY_BINDING_OES')
   @DocsEditable()
@@ -1013,54 +1070,55 @@
   @JSName('bindVertexArrayOES')
   @DomName('OESVertexArrayObject.bindVertexArrayOES')
   @DocsEditable()
-  void bindVertexArray(VertexArrayObject arrayObject) native;
+  void bindVertexArray(VertexArrayObject arrayObject) native ;
 
   @JSName('createVertexArrayOES')
   @DomName('OESVertexArrayObject.createVertexArrayOES')
   @DocsEditable()
-  VertexArrayObject createVertexArray() native;
+  VertexArrayObject createVertexArray() native ;
 
   @JSName('deleteVertexArrayOES')
   @DomName('OESVertexArrayObject.deleteVertexArrayOES')
   @DocsEditable()
-  void deleteVertexArray(VertexArrayObject arrayObject) native;
+  void deleteVertexArray(VertexArrayObject arrayObject) native ;
 
   @JSName('isVertexArrayOES')
   @DomName('OESVertexArrayObject.isVertexArrayOES')
   @DocsEditable()
-  bool isVertexArray(VertexArrayObject arrayObject) native;
+  bool isVertexArray(VertexArrayObject 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.
 
-
 @DocsEditable()
 @DomName('WebGLProgram')
 @Unstable()
 @Native("WebGLProgram")
 class Program extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Program._() { throw new UnsupportedError("Not supported"); }
+  factory Program._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('WebGLRenderbuffer')
 @Unstable()
 @Native("WebGLRenderbuffer")
 class Renderbuffer extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Renderbuffer._() { throw new UnsupportedError("Not supported"); }
+  factory Renderbuffer._() {
+    throw new UnsupportedError("Not supported");
+  }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for 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('WebGLRenderingContext')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -1069,7 +1127,9 @@
 @Native("WebGLRenderingContext")
 class RenderingContext extends Interceptor implements CanvasRenderingContext {
   // To suppress missing implicit constructor warnings.
-  factory RenderingContext._() { throw new UnsupportedError("Not supported"); }
+  factory RenderingContext._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.WebGLRenderingContext)');
@@ -2281,51 +2341,52 @@
 
   @DomName('WebGLRenderingContext.activeTexture')
   @DocsEditable()
-  void activeTexture(int texture) native;
+  void activeTexture(int texture) native ;
 
   @DomName('WebGLRenderingContext.attachShader')
   @DocsEditable()
-  void attachShader(Program program, Shader shader) native;
+  void attachShader(Program program, Shader shader) native ;
 
   @DomName('WebGLRenderingContext.bindAttribLocation')
   @DocsEditable()
-  void bindAttribLocation(Program program, int index, String name) native;
+  void bindAttribLocation(Program program, int index, String name) native ;
 
   @DomName('WebGLRenderingContext.bindBuffer')
   @DocsEditable()
-  void bindBuffer(int target, Buffer buffer) native;
+  void bindBuffer(int target, Buffer buffer) native ;
 
   @DomName('WebGLRenderingContext.bindFramebuffer')
   @DocsEditable()
-  void bindFramebuffer(int target, Framebuffer framebuffer) native;
+  void bindFramebuffer(int target, Framebuffer framebuffer) native ;
 
   @DomName('WebGLRenderingContext.bindRenderbuffer')
   @DocsEditable()
-  void bindRenderbuffer(int target, Renderbuffer renderbuffer) native;
+  void bindRenderbuffer(int target, Renderbuffer renderbuffer) native ;
 
   @DomName('WebGLRenderingContext.bindTexture')
   @DocsEditable()
-  void bindTexture(int target, Texture texture) native;
+  void bindTexture(int target, Texture texture) native ;
 
   @DomName('WebGLRenderingContext.blendColor')
   @DocsEditable()
-  void blendColor(num red, num green, num blue, num alpha) native;
+  void blendColor(num red, num green, num blue, num alpha) native ;
 
   @DomName('WebGLRenderingContext.blendEquation')
   @DocsEditable()
-  void blendEquation(int mode) native;
+  void blendEquation(int mode) native ;
 
   @DomName('WebGLRenderingContext.blendEquationSeparate')
   @DocsEditable()
-  void blendEquationSeparate(int modeRGB, int modeAlpha) native;
+  void blendEquationSeparate(int modeRGB, int modeAlpha) native ;
 
   @DomName('WebGLRenderingContext.blendFunc')
   @DocsEditable()
-  void blendFunc(int sfactor, int dfactor) native;
+  void blendFunc(int sfactor, int dfactor) native ;
 
   @DomName('WebGLRenderingContext.blendFuncSeparate')
   @DocsEditable()
-  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native;
+  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha)
+      native ;
 
   @JSName('bufferData')
   /**
@@ -2337,7 +2398,7 @@
    */
   @DomName('WebGLRenderingContext.bufferData')
   @DocsEditable()
-  void bufferByteData(int target, ByteBuffer data, int usage) native;
+  void bufferByteData(int target, ByteBuffer data, int usage) native ;
 
   /**
    * Buffers the specified data.
@@ -2348,7 +2409,7 @@
    */
   @DomName('WebGLRenderingContext.bufferData')
   @DocsEditable()
-  void bufferData(int target, data_OR_size, int usage) native;
+  void bufferData(int target, data_OR_size, int usage) native ;
 
   @JSName('bufferData')
   /**
@@ -2360,7 +2421,7 @@
    */
   @DomName('WebGLRenderingContext.bufferData')
   @DocsEditable()
-  void bufferDataTyped(int target, TypedData data, int usage) native;
+  void bufferDataTyped(int target, TypedData data, int usage) native ;
 
   @JSName('bufferSubData')
   /**
@@ -2372,7 +2433,7 @@
    */
   @DomName('WebGLRenderingContext.bufferSubData')
   @DocsEditable()
-  void bufferSubByteData(int target, int offset, ByteBuffer data) native;
+  void bufferSubByteData(int target, int offset, ByteBuffer data) native ;
 
   /**
    * Buffers the specified subset of data.
@@ -2383,7 +2444,7 @@
    */
   @DomName('WebGLRenderingContext.bufferSubData')
   @DocsEditable()
-  void bufferSubData(int target, int offset, data) native;
+  void bufferSubData(int target, int offset, data) native ;
 
   @JSName('bufferSubData')
   /**
@@ -2395,189 +2456,195 @@
    */
   @DomName('WebGLRenderingContext.bufferSubData')
   @DocsEditable()
-  void bufferSubDataTyped(int target, int offset, TypedData data) native;
+  void bufferSubDataTyped(int target, int offset, TypedData data) native ;
 
   @DomName('WebGLRenderingContext.checkFramebufferStatus')
   @DocsEditable()
-  int checkFramebufferStatus(int target) native;
+  int checkFramebufferStatus(int target) native ;
 
   @DomName('WebGLRenderingContext.clear')
   @DocsEditable()
-  void clear(int mask) native;
+  void clear(int mask) native ;
 
   @DomName('WebGLRenderingContext.clearColor')
   @DocsEditable()
-  void clearColor(num red, num green, num blue, num alpha) native;
+  void clearColor(num red, num green, num blue, num alpha) native ;
 
   @DomName('WebGLRenderingContext.clearDepth')
   @DocsEditable()
-  void clearDepth(num depth) native;
+  void clearDepth(num depth) native ;
 
   @DomName('WebGLRenderingContext.clearStencil')
   @DocsEditable()
-  void clearStencil(int s) native;
+  void clearStencil(int s) native ;
 
   @DomName('WebGLRenderingContext.colorMask')
   @DocsEditable()
-  void colorMask(bool red, bool green, bool blue, bool alpha) native;
+  void colorMask(bool red, bool green, bool blue, bool alpha) native ;
 
   @DomName('WebGLRenderingContext.compileShader')
   @DocsEditable()
-  void compileShader(Shader shader) native;
+  void compileShader(Shader shader) native ;
 
   @DomName('WebGLRenderingContext.compressedTexImage2D')
   @DocsEditable()
-  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) native;
+  void compressedTexImage2D(int target, int level, int internalformat,
+      int width, int height, int border, TypedData data) native ;
 
   @DomName('WebGLRenderingContext.compressedTexSubImage2D')
   @DocsEditable()
-  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) native;
+  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset,
+      int width, int height, int format, TypedData data) native ;
 
   @DomName('WebGLRenderingContext.copyTexImage2D')
   @DocsEditable()
-  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) native;
+  void copyTexImage2D(int target, int level, int internalformat, int x, int y,
+      int width, int height, int border) native ;
 
   @DomName('WebGLRenderingContext.copyTexSubImage2D')
   @DocsEditable()
-  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) native;
+  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x,
+      int y, int width, int height) native ;
 
   @DomName('WebGLRenderingContext.createBuffer')
   @DocsEditable()
-  Buffer createBuffer() native;
+  Buffer createBuffer() native ;
 
   @DomName('WebGLRenderingContext.createFramebuffer')
   @DocsEditable()
-  Framebuffer createFramebuffer() native;
+  Framebuffer createFramebuffer() native ;
 
   @DomName('WebGLRenderingContext.createProgram')
   @DocsEditable()
-  Program createProgram() native;
+  Program createProgram() native ;
 
   @DomName('WebGLRenderingContext.createRenderbuffer')
   @DocsEditable()
-  Renderbuffer createRenderbuffer() native;
+  Renderbuffer createRenderbuffer() native ;
 
   @DomName('WebGLRenderingContext.createShader')
   @DocsEditable()
-  Shader createShader(int type) native;
+  Shader createShader(int type) native ;
 
   @DomName('WebGLRenderingContext.createTexture')
   @DocsEditable()
-  Texture createTexture() native;
+  Texture createTexture() native ;
 
   @DomName('WebGLRenderingContext.cullFace')
   @DocsEditable()
-  void cullFace(int mode) native;
+  void cullFace(int mode) native ;
 
   @DomName('WebGLRenderingContext.deleteBuffer')
   @DocsEditable()
-  void deleteBuffer(Buffer buffer) native;
+  void deleteBuffer(Buffer buffer) native ;
 
   @DomName('WebGLRenderingContext.deleteFramebuffer')
   @DocsEditable()
-  void deleteFramebuffer(Framebuffer framebuffer) native;
+  void deleteFramebuffer(Framebuffer framebuffer) native ;
 
   @DomName('WebGLRenderingContext.deleteProgram')
   @DocsEditable()
-  void deleteProgram(Program program) native;
+  void deleteProgram(Program program) native ;
 
   @DomName('WebGLRenderingContext.deleteRenderbuffer')
   @DocsEditable()
-  void deleteRenderbuffer(Renderbuffer renderbuffer) native;
+  void deleteRenderbuffer(Renderbuffer renderbuffer) native ;
 
   @DomName('WebGLRenderingContext.deleteShader')
   @DocsEditable()
-  void deleteShader(Shader shader) native;
+  void deleteShader(Shader shader) native ;
 
   @DomName('WebGLRenderingContext.deleteTexture')
   @DocsEditable()
-  void deleteTexture(Texture texture) native;
+  void deleteTexture(Texture texture) native ;
 
   @DomName('WebGLRenderingContext.depthFunc')
   @DocsEditable()
-  void depthFunc(int func) native;
+  void depthFunc(int func) native ;
 
   @DomName('WebGLRenderingContext.depthMask')
   @DocsEditable()
-  void depthMask(bool flag) native;
+  void depthMask(bool flag) native ;
 
   @DomName('WebGLRenderingContext.depthRange')
   @DocsEditable()
-  void depthRange(num zNear, num zFar) native;
+  void depthRange(num zNear, num zFar) native ;
 
   @DomName('WebGLRenderingContext.detachShader')
   @DocsEditable()
-  void detachShader(Program program, Shader shader) native;
+  void detachShader(Program program, Shader shader) native ;
 
   @DomName('WebGLRenderingContext.disable')
   @DocsEditable()
-  void disable(int cap) native;
+  void disable(int cap) native ;
 
   @DomName('WebGLRenderingContext.disableVertexAttribArray')
   @DocsEditable()
-  void disableVertexAttribArray(int index) native;
+  void disableVertexAttribArray(int index) native ;
 
   @DomName('WebGLRenderingContext.drawArrays')
   @DocsEditable()
-  void drawArrays(int mode, int first, int count) native;
+  void drawArrays(int mode, int first, int count) native ;
 
   @DomName('WebGLRenderingContext.drawElements')
   @DocsEditable()
-  void drawElements(int mode, int count, int type, int offset) native;
+  void drawElements(int mode, int count, int type, int offset) native ;
 
   @DomName('WebGLRenderingContext.enable')
   @DocsEditable()
-  void enable(int cap) native;
+  void enable(int cap) native ;
 
   @DomName('WebGLRenderingContext.enableVertexAttribArray')
   @DocsEditable()
-  void enableVertexAttribArray(int index) native;
+  void enableVertexAttribArray(int index) native ;
 
   @DomName('WebGLRenderingContext.finish')
   @DocsEditable()
-  void finish() native;
+  void finish() native ;
 
   @DomName('WebGLRenderingContext.flush')
   @DocsEditable()
-  void flush() native;
+  void flush() native ;
 
   @DomName('WebGLRenderingContext.framebufferRenderbuffer')
   @DocsEditable()
-  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) native;
+  void framebufferRenderbuffer(int target, int attachment,
+      int renderbuffertarget, Renderbuffer renderbuffer) native ;
 
   @DomName('WebGLRenderingContext.framebufferTexture2D')
   @DocsEditable()
-  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) native;
+  void framebufferTexture2D(int target, int attachment, int textarget,
+      Texture texture, int level) native ;
 
   @DomName('WebGLRenderingContext.frontFace')
   @DocsEditable()
-  void frontFace(int mode) native;
+  void frontFace(int mode) native ;
 
   @DomName('WebGLRenderingContext.generateMipmap')
   @DocsEditable()
-  void generateMipmap(int target) native;
+  void generateMipmap(int target) native ;
 
   @DomName('WebGLRenderingContext.getActiveAttrib')
   @DocsEditable()
-  ActiveInfo getActiveAttrib(Program program, int index) native;
+  ActiveInfo getActiveAttrib(Program program, int index) native ;
 
   @DomName('WebGLRenderingContext.getActiveUniform')
   @DocsEditable()
-  ActiveInfo getActiveUniform(Program program, int index) native;
+  ActiveInfo getActiveUniform(Program program, int index) native ;
 
   @DomName('WebGLRenderingContext.getAttachedShaders')
   @DocsEditable()
-  List<Shader> getAttachedShaders(Program program) native;
+  List<Shader> getAttachedShaders(Program program) native ;
 
   @DomName('WebGLRenderingContext.getAttribLocation')
   @DocsEditable()
-  int getAttribLocation(Program program, String name) native;
+  int getAttribLocation(Program program, String name) native ;
 
   @DomName('WebGLRenderingContext.getBufferParameter')
   @DocsEditable()
   @Creates('int|Null')
   @Returns('int|Null')
-  Object getBufferParameter(int target, int pname) native;
+  Object getBufferParameter(int target, int pname) native ;
 
   @DomName('WebGLRenderingContext.getContextAttributes')
   @DocsEditable()
@@ -2585,191 +2652,200 @@
   ContextAttributes getContextAttributes() {
     return convertNativeToDart_ContextAttributes(_getContextAttributes_1());
   }
+
   @JSName('getContextAttributes')
   @DomName('WebGLRenderingContext.getContextAttributes')
   @DocsEditable()
   @Creates('ContextAttributes|=Object')
-  _getContextAttributes_1() native;
+  _getContextAttributes_1() native ;
 
   @DomName('WebGLRenderingContext.getError')
   @DocsEditable()
-  int getError() native;
+  int getError() native ;
 
   @DomName('WebGLRenderingContext.getExtension')
   @DocsEditable()
-  Object getExtension(String name) native;
+  Object getExtension(String name) native ;
 
   @DomName('WebGLRenderingContext.getFramebufferAttachmentParameter')
   @DocsEditable()
   @Creates('int|Renderbuffer|Texture|Null')
   @Returns('int|Renderbuffer|Texture|Null')
-  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native;
+  Object getFramebufferAttachmentParameter(
+      int target, int attachment, int pname) native ;
 
   @DomName('WebGLRenderingContext.getParameter')
   @DocsEditable()
-  @Creates('Null|num|String|bool|JSExtendableArray|NativeFloat32List|NativeInt32List|NativeUint32List|Framebuffer|Renderbuffer|Texture')
-  @Returns('Null|num|String|bool|JSExtendableArray|NativeFloat32List|NativeInt32List|NativeUint32List|Framebuffer|Renderbuffer|Texture')
-  Object getParameter(int pname) native;
+  @Creates(
+      'Null|num|String|bool|JSExtendableArray|NativeFloat32List|NativeInt32List|NativeUint32List|Framebuffer|Renderbuffer|Texture')
+  @Returns(
+      'Null|num|String|bool|JSExtendableArray|NativeFloat32List|NativeInt32List|NativeUint32List|Framebuffer|Renderbuffer|Texture')
+  Object getParameter(int pname) native ;
 
   @DomName('WebGLRenderingContext.getProgramInfoLog')
   @DocsEditable()
-  String getProgramInfoLog(Program program) native;
+  String getProgramInfoLog(Program program) native ;
 
   @DomName('WebGLRenderingContext.getProgramParameter')
   @DocsEditable()
   @Creates('int|bool|Null')
   @Returns('int|bool|Null')
-  Object getProgramParameter(Program program, int pname) native;
+  Object getProgramParameter(Program program, int pname) native ;
 
   @DomName('WebGLRenderingContext.getRenderbufferParameter')
   @DocsEditable()
   @Creates('int|Null')
   @Returns('int|Null')
-  Object getRenderbufferParameter(int target, int pname) native;
+  Object getRenderbufferParameter(int target, int pname) native ;
 
   @DomName('WebGLRenderingContext.getShaderInfoLog')
   @DocsEditable()
-  String getShaderInfoLog(Shader shader) native;
+  String getShaderInfoLog(Shader shader) native ;
 
   @DomName('WebGLRenderingContext.getShaderParameter')
   @DocsEditable()
   @Creates('int|bool|Null')
   @Returns('int|bool|Null')
-  Object getShaderParameter(Shader shader, int pname) native;
+  Object getShaderParameter(Shader shader, int pname) native ;
 
   @DomName('WebGLRenderingContext.getShaderPrecisionFormat')
   @DocsEditable()
-  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) native;
+  ShaderPrecisionFormat getShaderPrecisionFormat(
+      int shadertype, int precisiontype) native ;
 
   @DomName('WebGLRenderingContext.getShaderSource')
   @DocsEditable()
-  String getShaderSource(Shader shader) native;
+  String getShaderSource(Shader shader) native ;
 
   @DomName('WebGLRenderingContext.getSupportedExtensions')
   @DocsEditable()
-  List<String> getSupportedExtensions() native;
+  List<String> getSupportedExtensions() native ;
 
   @DomName('WebGLRenderingContext.getTexParameter')
   @DocsEditable()
   @Creates('int|Null')
   @Returns('int|Null')
-  Object getTexParameter(int target, int pname) native;
+  Object getTexParameter(int target, int pname) native ;
 
   @DomName('WebGLRenderingContext.getUniform')
   @DocsEditable()
-  @Creates('Null|num|String|bool|JSExtendableArray|NativeFloat32List|NativeInt32List|NativeUint32List')
-  @Returns('Null|num|String|bool|JSExtendableArray|NativeFloat32List|NativeInt32List|NativeUint32List')
-  Object getUniform(Program program, UniformLocation location) native;
+  @Creates(
+      'Null|num|String|bool|JSExtendableArray|NativeFloat32List|NativeInt32List|NativeUint32List')
+  @Returns(
+      'Null|num|String|bool|JSExtendableArray|NativeFloat32List|NativeInt32List|NativeUint32List')
+  Object getUniform(Program program, UniformLocation location) native ;
 
   @DomName('WebGLRenderingContext.getUniformLocation')
   @DocsEditable()
-  UniformLocation getUniformLocation(Program program, String name) native;
+  UniformLocation getUniformLocation(Program program, String name) native ;
 
   @DomName('WebGLRenderingContext.getVertexAttrib')
   @DocsEditable()
   @Creates('Null|num|bool|NativeFloat32List|Buffer')
   @Returns('Null|num|bool|NativeFloat32List|Buffer')
-  Object getVertexAttrib(int index, int pname) native;
+  Object getVertexAttrib(int index, int pname) native ;
 
   @DomName('WebGLRenderingContext.getVertexAttribOffset')
   @DocsEditable()
-  int getVertexAttribOffset(int index, int pname) native;
+  int getVertexAttribOffset(int index, int pname) native ;
 
   @DomName('WebGLRenderingContext.hint')
   @DocsEditable()
-  void hint(int target, int mode) native;
+  void hint(int target, int mode) native ;
 
   @DomName('WebGLRenderingContext.isBuffer')
   @DocsEditable()
-  bool isBuffer(Buffer buffer) native;
+  bool isBuffer(Buffer buffer) native ;
 
   @DomName('WebGLRenderingContext.isContextLost')
   @DocsEditable()
-  bool isContextLost() native;
+  bool isContextLost() native ;
 
   @DomName('WebGLRenderingContext.isEnabled')
   @DocsEditable()
-  bool isEnabled(int cap) native;
+  bool isEnabled(int cap) native ;
 
   @DomName('WebGLRenderingContext.isFramebuffer')
   @DocsEditable()
-  bool isFramebuffer(Framebuffer framebuffer) native;
+  bool isFramebuffer(Framebuffer framebuffer) native ;
 
   @DomName('WebGLRenderingContext.isProgram')
   @DocsEditable()
-  bool isProgram(Program program) native;
+  bool isProgram(Program program) native ;
 
   @DomName('WebGLRenderingContext.isRenderbuffer')
   @DocsEditable()
-  bool isRenderbuffer(Renderbuffer renderbuffer) native;
+  bool isRenderbuffer(Renderbuffer renderbuffer) native ;
 
   @DomName('WebGLRenderingContext.isShader')
   @DocsEditable()
-  bool isShader(Shader shader) native;
+  bool isShader(Shader shader) native ;
 
   @DomName('WebGLRenderingContext.isTexture')
   @DocsEditable()
-  bool isTexture(Texture texture) native;
+  bool isTexture(Texture texture) native ;
 
   @DomName('WebGLRenderingContext.lineWidth')
   @DocsEditable()
-  void lineWidth(num width) native;
+  void lineWidth(num width) native ;
 
   @DomName('WebGLRenderingContext.linkProgram')
   @DocsEditable()
-  void linkProgram(Program program) native;
+  void linkProgram(Program program) native ;
 
   @DomName('WebGLRenderingContext.pixelStorei')
   @DocsEditable()
-  void pixelStorei(int pname, int param) native;
+  void pixelStorei(int pname, int param) native ;
 
   @DomName('WebGLRenderingContext.polygonOffset')
   @DocsEditable()
-  void polygonOffset(num factor, num units) native;
+  void polygonOffset(num factor, num units) native ;
 
   @DomName('WebGLRenderingContext.readPixels')
   @DocsEditable()
-  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) native;
+  void readPixels(int x, int y, int width, int height, int format, int type,
+      TypedData pixels) native ;
 
   @DomName('WebGLRenderingContext.renderbufferStorage')
   @DocsEditable()
-  void renderbufferStorage(int target, int internalformat, int width, int height) native;
+  void renderbufferStorage(
+      int target, int internalformat, int width, int height) native ;
 
   @DomName('WebGLRenderingContext.sampleCoverage')
   @DocsEditable()
-  void sampleCoverage(num value, bool invert) native;
+  void sampleCoverage(num value, bool invert) native ;
 
   @DomName('WebGLRenderingContext.scissor')
   @DocsEditable()
-  void scissor(int x, int y, int width, int height) native;
+  void scissor(int x, int y, int width, int height) native ;
 
   @DomName('WebGLRenderingContext.shaderSource')
   @DocsEditable()
-  void shaderSource(Shader shader, String string) native;
+  void shaderSource(Shader shader, String string) native ;
 
   @DomName('WebGLRenderingContext.stencilFunc')
   @DocsEditable()
-  void stencilFunc(int func, int ref, int mask) native;
+  void stencilFunc(int func, int ref, int mask) native ;
 
   @DomName('WebGLRenderingContext.stencilFuncSeparate')
   @DocsEditable()
-  void stencilFuncSeparate(int face, int func, int ref, int mask) native;
+  void stencilFuncSeparate(int face, int func, int ref, int mask) native ;
 
   @DomName('WebGLRenderingContext.stencilMask')
   @DocsEditable()
-  void stencilMask(int mask) native;
+  void stencilMask(int mask) native ;
 
   @DomName('WebGLRenderingContext.stencilMaskSeparate')
   @DocsEditable()
-  void stencilMaskSeparate(int face, int mask) native;
+  void stencilMaskSeparate(int face, int mask) native ;
 
   @DomName('WebGLRenderingContext.stencilOp')
   @DocsEditable()
-  void stencilOp(int fail, int zfail, int zpass) native;
+  void stencilOp(int fail, int zfail, int zpass) native ;
 
   @DomName('WebGLRenderingContext.stencilOpSeparate')
   @DocsEditable()
-  void stencilOpSeparate(int face, int fail, int zfail, int zpass) native;
+  void stencilOpSeparate(int face, int fail, int zfail, int zpass) native ;
 
   /**
    * Updates the currently bound texture to [data].
@@ -2781,90 +2857,69 @@
    */
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable()
-  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, TypedData pixels]) {
-    if (pixels != null && type != null && format != null && (border_OR_canvas_OR_image_OR_pixels_OR_video is int)) {
-      _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
+  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,
+      TypedData pixels]) {
+    if (pixels != null &&
+        type != null &&
+        format != null &&
+        (border_OR_canvas_OR_image_OR_pixels_OR_video is int)) {
+      _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 == null && type == null && pixels == null) {
-      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);
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData ||
+            border_OR_canvas_OR_image_OR_pixels_OR_video == null) &&
+        format == null &&
+        type == null &&
+        pixels == null) {
+      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) && format == null && type == null && pixels == null) {
-      _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement) &&
+        format == null &&
+        type == null &&
+        pixels == null) {
+      _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) && format == null && type == null && pixels == null) {
-      _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement) &&
+        format == null &&
+        type == null &&
+        pixels == null) {
+      _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) && format == null && type == null && pixels == null) {
-      _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+    if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement) &&
+        format == null &&
+        type == null &&
+        pixels == null) {
+      _texImage2D_5(target, level, internalformat, format_OR_width,
+          height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
-  void _texImage2D_1(target, level, internalformat, width, height, int border, format, type, TypedData pixels) native;
-  @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
-  void _texImage2D_2(target, level, internalformat, format, type, pixels) native;
-  @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
-  void _texImage2D_3(target, level, internalformat, format, type, ImageElement image) native;
-  @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
-  void _texImage2D_4(target, level, internalformat, format, type, CanvasElement canvas) native;
-  @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
-  void _texImage2D_5(target, level, internalformat, format, type, VideoElement video) native;
 
   @JSName('texImage2D')
   /**
@@ -2877,7 +2932,60 @@
    */
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable()
-  void texImage2DCanvas(int target, int level, int internalformat, int format, int type, CanvasElement canvas) native;
+  void _texImage2D_1(target, level, internalformat, width, height, int border,
+      format, type, TypedData pixels) native ;
+  @JSName('texImage2D')
+  /**
+   * Updates the currently bound texture to [data].
+   *
+   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
+   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
+   * (or for more specificity, the more specialized [texImage2DImageData],
+   * [texImage2DCanvas], [texImage2DVideo]).
+   */
+  @DomName('WebGLRenderingContext.texImage2D')
+  @DocsEditable()
+  void _texImage2D_2(target, level, internalformat, format, type, pixels)
+      native ;
+  @JSName('texImage2D')
+  /**
+   * Updates the currently bound texture to [data].
+   *
+   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
+   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
+   * (or for more specificity, the more specialized [texImage2DImageData],
+   * [texImage2DCanvas], [texImage2DVideo]).
+   */
+  @DomName('WebGLRenderingContext.texImage2D')
+  @DocsEditable()
+  void _texImage2D_3(
+      target, level, internalformat, format, type, ImageElement image) native ;
+  @JSName('texImage2D')
+  /**
+   * Updates the currently bound texture to [data].
+   *
+   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
+   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
+   * (or for more specificity, the more specialized [texImage2DImageData],
+   * [texImage2DCanvas], [texImage2DVideo]).
+   */
+  @DomName('WebGLRenderingContext.texImage2D')
+  @DocsEditable()
+  void _texImage2D_4(target, level, internalformat, format, type,
+      CanvasElement canvas) native ;
+  @JSName('texImage2D')
+  /**
+   * Updates the currently bound texture to [data].
+   *
+   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
+   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
+   * (or for more specificity, the more specialized [texImage2DImageData],
+   * [texImage2DCanvas], [texImage2DVideo]).
+   */
+  @DomName('WebGLRenderingContext.texImage2D')
+  @DocsEditable()
+  void _texImage2D_5(
+      target, level, internalformat, format, type, VideoElement video) native ;
 
   @JSName('texImage2D')
   /**
@@ -2890,7 +2998,22 @@
    */
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable()
-  void texImage2DImage(int target, int level, int internalformat, int format, int type, ImageElement image) native;
+  void texImage2DCanvas(int target, int level, int internalformat, int format,
+      int type, CanvasElement canvas) native ;
+
+  @JSName('texImage2D')
+  /**
+   * Updates the currently bound texture to [data].
+   *
+   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
+   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
+   * (or for more specificity, the more specialized [texImage2DImageData],
+   * [texImage2DCanvas], [texImage2DVideo]).
+   */
+  @DomName('WebGLRenderingContext.texImage2D')
+  @DocsEditable()
+  void texImage2DImage(int target, int level, int internalformat, int format,
+      int type, ImageElement image) native ;
 
   /**
    * Updates the currently bound texture to [data].
@@ -2902,23 +3025,13 @@
    */
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable()
-  void texImage2DImageData(int target, int level, int internalformat, int format, int type, ImageData pixels) {
+  void texImage2DImageData(int target, int level, int internalformat,
+      int format, int type, ImageData pixels) {
     var pixels_1 = convertDartToNative_ImageData(pixels);
-    _texImage2DImageData_1(target, level, internalformat, format, type, pixels_1);
+    _texImage2DImageData_1(
+        target, level, internalformat, format, type, pixels_1);
     return;
   }
-  @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texImage2D')
-  @DocsEditable()
-  void _texImage2DImageData_1(target, level, internalformat, format, type, pixels) native;
 
   @JSName('texImage2D')
   /**
@@ -2931,15 +3044,30 @@
    */
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable()
-  void texImage2DVideo(int target, int level, int internalformat, int format, int type, VideoElement video) native;
+  void _texImage2DImageData_1(
+      target, level, internalformat, format, type, pixels) native ;
+
+  @JSName('texImage2D')
+  /**
+   * Updates the currently bound texture to [data].
+   *
+   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
+   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
+   * (or for more specificity, the more specialized [texImage2DImageData],
+   * [texImage2DCanvas], [texImage2DVideo]).
+   */
+  @DomName('WebGLRenderingContext.texImage2D')
+  @DocsEditable()
+  void texImage2DVideo(int target, int level, int internalformat, int format,
+      int type, VideoElement video) native ;
 
   @DomName('WebGLRenderingContext.texParameterf')
   @DocsEditable()
-  void texParameterf(int target, int pname, num param) native;
+  void texParameterf(int target, int pname, num param) native ;
 
   @DomName('WebGLRenderingContext.texParameteri')
   @DocsEditable()
-  void texParameteri(int target, int pname, int param) native;
+  void texParameteri(int target, int pname, int param) native ;
 
   /**
    * Updates a sub-rectangle of the currently bound texture to [data].
@@ -2951,90 +3079,64 @@
    */
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable()
-  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, TypedData pixels]) {
-    if (pixels != null && type != null && (canvas_OR_format_OR_image_OR_pixels_OR_video is int)) {
-      _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
+  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,
+      TypedData pixels]) {
+    if (pixels != null &&
+        type != null &&
+        (canvas_OR_format_OR_image_OR_pixels_OR_video is int)) {
+      _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 == null && pixels == null) {
-      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);
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData ||
+            canvas_OR_format_OR_image_OR_pixels_OR_video == null) &&
+        type == null &&
+        pixels == null) {
+      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) && type == null && pixels == null) {
-      _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement) &&
+        type == null &&
+        pixels == null) {
+      _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) && type == null && pixels == null) {
-      _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement) &&
+        type == null &&
+        pixels == null) {
+      _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) && type == null && pixels == null) {
-      _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+    if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement) &&
+        type == null &&
+        pixels == null) {
+      _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width,
+          height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
-  @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
-  void _texSubImage2D_1(target, level, xoffset, yoffset, width, height, int format, type, TypedData pixels) native;
-  @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
-  void _texSubImage2D_2(target, level, xoffset, yoffset, format, type, pixels) native;
-  @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
-  void _texSubImage2D_3(target, level, xoffset, yoffset, format, type, ImageElement image) native;
-  @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
-  void _texSubImage2D_4(target, level, xoffset, yoffset, format, type, CanvasElement canvas) native;
-  @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
-  void _texSubImage2D_5(target, level, xoffset, yoffset, format, type, VideoElement video) native;
 
   @JSName('texSubImage2D')
   /**
@@ -3047,7 +3149,60 @@
    */
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable()
-  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas) native;
+  void _texSubImage2D_1(target, level, xoffset, yoffset, width, height,
+      int format, type, TypedData pixels) native ;
+  @JSName('texSubImage2D')
+  /**
+   * Updates a sub-rectangle of the currently bound texture to [data].
+   *
+   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
+   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
+   * (or for more specificity, the more specialized [texSubImage2DImageData],
+   * [texSubImage2DCanvas], [texSubImage2DVideo]).
+   */
+  @DomName('WebGLRenderingContext.texSubImage2D')
+  @DocsEditable()
+  void _texSubImage2D_2(target, level, xoffset, yoffset, format, type, pixels)
+      native ;
+  @JSName('texSubImage2D')
+  /**
+   * Updates a sub-rectangle of the currently bound texture to [data].
+   *
+   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
+   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
+   * (or for more specificity, the more specialized [texSubImage2DImageData],
+   * [texSubImage2DCanvas], [texSubImage2DVideo]).
+   */
+  @DomName('WebGLRenderingContext.texSubImage2D')
+  @DocsEditable()
+  void _texSubImage2D_3(target, level, xoffset, yoffset, format, type,
+      ImageElement image) native ;
+  @JSName('texSubImage2D')
+  /**
+   * Updates a sub-rectangle of the currently bound texture to [data].
+   *
+   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
+   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
+   * (or for more specificity, the more specialized [texSubImage2DImageData],
+   * [texSubImage2DCanvas], [texSubImage2DVideo]).
+   */
+  @DomName('WebGLRenderingContext.texSubImage2D')
+  @DocsEditable()
+  void _texSubImage2D_4(target, level, xoffset, yoffset, format, type,
+      CanvasElement canvas) native ;
+  @JSName('texSubImage2D')
+  /**
+   * Updates a sub-rectangle of the currently bound texture to [data].
+   *
+   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
+   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
+   * (or for more specificity, the more specialized [texSubImage2DImageData],
+   * [texSubImage2DCanvas], [texSubImage2DVideo]).
+   */
+  @DomName('WebGLRenderingContext.texSubImage2D')
+  @DocsEditable()
+  void _texSubImage2D_5(target, level, xoffset, yoffset, format, type,
+      VideoElement video) native ;
 
   @JSName('texSubImage2D')
   /**
@@ -3060,7 +3215,22 @@
    */
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable()
-  void texSubImage2DImage(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image) native;
+  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset,
+      int format, int type, CanvasElement canvas) native ;
+
+  @JSName('texSubImage2D')
+  /**
+   * Updates a sub-rectangle of the currently bound texture to [data].
+   *
+   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
+   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
+   * (or for more specificity, the more specialized [texSubImage2DImageData],
+   * [texSubImage2DCanvas], [texSubImage2DVideo]).
+   */
+  @DomName('WebGLRenderingContext.texSubImage2D')
+  @DocsEditable()
+  void texSubImage2DImage(int target, int level, int xoffset, int yoffset,
+      int format, int type, ImageElement image) native ;
 
   /**
    * Updates a sub-rectangle of the currently bound texture to [data].
@@ -3072,23 +3242,13 @@
    */
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable()
-  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels) {
+  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset,
+      int format, int type, ImageData pixels) {
     var pixels_1 = convertDartToNative_ImageData(pixels);
-    _texSubImage2DImageData_1(target, level, xoffset, yoffset, format, type, pixels_1);
+    _texSubImage2DImageData_1(
+        target, level, xoffset, yoffset, format, type, pixels_1);
     return;
   }
-  @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
-  @DomName('WebGLRenderingContext.texSubImage2D')
-  @DocsEditable()
-  void _texSubImage2DImageData_1(target, level, xoffset, yoffset, format, type, pixels) native;
 
   @JSName('texSubImage2D')
   /**
@@ -3101,132 +3261,150 @@
    */
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable()
-  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video) native;
+  void _texSubImage2DImageData_1(
+      target, level, xoffset, yoffset, format, type, pixels) native ;
+
+  @JSName('texSubImage2D')
+  /**
+   * Updates a sub-rectangle of the currently bound texture to [data].
+   *
+   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
+   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
+   * (or for more specificity, the more specialized [texSubImage2DImageData],
+   * [texSubImage2DCanvas], [texSubImage2DVideo]).
+   */
+  @DomName('WebGLRenderingContext.texSubImage2D')
+  @DocsEditable()
+  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset,
+      int format, int type, VideoElement video) native ;
 
   @DomName('WebGLRenderingContext.uniform1f')
   @DocsEditable()
-  void uniform1f(UniformLocation location, num x) native;
+  void uniform1f(UniformLocation location, num x) native ;
 
   @DomName('WebGLRenderingContext.uniform1fv')
   @DocsEditable()
-  void uniform1fv(UniformLocation location, Float32List v) native;
+  void uniform1fv(UniformLocation location, Float32List v) native ;
 
   @DomName('WebGLRenderingContext.uniform1i')
   @DocsEditable()
-  void uniform1i(UniformLocation location, int x) native;
+  void uniform1i(UniformLocation location, int x) native ;
 
   @DomName('WebGLRenderingContext.uniform1iv')
   @DocsEditable()
-  void uniform1iv(UniformLocation location, Int32List v) native;
+  void uniform1iv(UniformLocation location, Int32List v) native ;
 
   @DomName('WebGLRenderingContext.uniform2f')
   @DocsEditable()
-  void uniform2f(UniformLocation location, num x, num y) native;
+  void uniform2f(UniformLocation location, num x, num y) native ;
 
   @DomName('WebGLRenderingContext.uniform2fv')
   @DocsEditable()
-  void uniform2fv(UniformLocation location, Float32List v) native;
+  void uniform2fv(UniformLocation location, Float32List v) native ;
 
   @DomName('WebGLRenderingContext.uniform2i')
   @DocsEditable()
-  void uniform2i(UniformLocation location, int x, int y) native;
+  void uniform2i(UniformLocation location, int x, int y) native ;
 
   @DomName('WebGLRenderingContext.uniform2iv')
   @DocsEditable()
-  void uniform2iv(UniformLocation location, Int32List v) native;
+  void uniform2iv(UniformLocation location, Int32List v) native ;
 
   @DomName('WebGLRenderingContext.uniform3f')
   @DocsEditable()
-  void uniform3f(UniformLocation location, num x, num y, num z) native;
+  void uniform3f(UniformLocation location, num x, num y, num z) native ;
 
   @DomName('WebGLRenderingContext.uniform3fv')
   @DocsEditable()
-  void uniform3fv(UniformLocation location, Float32List v) native;
+  void uniform3fv(UniformLocation location, Float32List v) native ;
 
   @DomName('WebGLRenderingContext.uniform3i')
   @DocsEditable()
-  void uniform3i(UniformLocation location, int x, int y, int z) native;
+  void uniform3i(UniformLocation location, int x, int y, int z) native ;
 
   @DomName('WebGLRenderingContext.uniform3iv')
   @DocsEditable()
-  void uniform3iv(UniformLocation location, Int32List v) native;
+  void uniform3iv(UniformLocation location, Int32List v) native ;
 
   @DomName('WebGLRenderingContext.uniform4f')
   @DocsEditable()
-  void uniform4f(UniformLocation location, num x, num y, num z, num w) native;
+  void uniform4f(UniformLocation location, num x, num y, num z, num w) native ;
 
   @DomName('WebGLRenderingContext.uniform4fv')
   @DocsEditable()
-  void uniform4fv(UniformLocation location, Float32List v) native;
+  void uniform4fv(UniformLocation location, Float32List v) native ;
 
   @DomName('WebGLRenderingContext.uniform4i')
   @DocsEditable()
-  void uniform4i(UniformLocation location, int x, int y, int z, int w) native;
+  void uniform4i(UniformLocation location, int x, int y, int z, int w) native ;
 
   @DomName('WebGLRenderingContext.uniform4iv')
   @DocsEditable()
-  void uniform4iv(UniformLocation location, Int32List v) native;
+  void uniform4iv(UniformLocation location, Int32List v) native ;
 
   @DomName('WebGLRenderingContext.uniformMatrix2fv')
   @DocsEditable()
-  void uniformMatrix2fv(UniformLocation location, bool transpose, Float32List array) native;
+  void uniformMatrix2fv(
+      UniformLocation location, bool transpose, Float32List array) native ;
 
   @DomName('WebGLRenderingContext.uniformMatrix3fv')
   @DocsEditable()
-  void uniformMatrix3fv(UniformLocation location, bool transpose, Float32List array) native;
+  void uniformMatrix3fv(
+      UniformLocation location, bool transpose, Float32List array) native ;
 
   @DomName('WebGLRenderingContext.uniformMatrix4fv')
   @DocsEditable()
-  void uniformMatrix4fv(UniformLocation location, bool transpose, Float32List array) native;
+  void uniformMatrix4fv(
+      UniformLocation location, bool transpose, Float32List array) native ;
 
   @DomName('WebGLRenderingContext.useProgram')
   @DocsEditable()
-  void useProgram(Program program) native;
+  void useProgram(Program program) native ;
 
   @DomName('WebGLRenderingContext.validateProgram')
   @DocsEditable()
-  void validateProgram(Program program) native;
+  void validateProgram(Program program) native ;
 
   @DomName('WebGLRenderingContext.vertexAttrib1f')
   @DocsEditable()
-  void vertexAttrib1f(int indx, num x) native;
+  void vertexAttrib1f(int indx, num x) native ;
 
   @DomName('WebGLRenderingContext.vertexAttrib1fv')
   @DocsEditable()
-  void vertexAttrib1fv(int indx, Float32List values) native;
+  void vertexAttrib1fv(int indx, Float32List values) native ;
 
   @DomName('WebGLRenderingContext.vertexAttrib2f')
   @DocsEditable()
-  void vertexAttrib2f(int indx, num x, num y) native;
+  void vertexAttrib2f(int indx, num x, num y) native ;
 
   @DomName('WebGLRenderingContext.vertexAttrib2fv')
   @DocsEditable()
-  void vertexAttrib2fv(int indx, Float32List values) native;
+  void vertexAttrib2fv(int indx, Float32List values) native ;
 
   @DomName('WebGLRenderingContext.vertexAttrib3f')
   @DocsEditable()
-  void vertexAttrib3f(int indx, num x, num y, num z) native;
+  void vertexAttrib3f(int indx, num x, num y, num z) native ;
 
   @DomName('WebGLRenderingContext.vertexAttrib3fv')
   @DocsEditable()
-  void vertexAttrib3fv(int indx, Float32List values) native;
+  void vertexAttrib3fv(int indx, Float32List values) native ;
 
   @DomName('WebGLRenderingContext.vertexAttrib4f')
   @DocsEditable()
-  void vertexAttrib4f(int indx, num x, num y, num z, num w) native;
+  void vertexAttrib4f(int indx, num x, num y, num z, num w) native ;
 
   @DomName('WebGLRenderingContext.vertexAttrib4fv')
   @DocsEditable()
-  void vertexAttrib4fv(int indx, Float32List values) native;
+  void vertexAttrib4fv(int indx, Float32List values) native ;
 
   @DomName('WebGLRenderingContext.vertexAttribPointer')
   @DocsEditable()
-  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) native;
+  void vertexAttribPointer(int indx, int size, int type, bool normalized,
+      int stride, int offset) native ;
 
   @DomName('WebGLRenderingContext.viewport')
   @DocsEditable()
-  void viewport(int x, int y, int width, int height) native;
-
+  void viewport(int x, int y, int width, int height) native ;
 
   /**
    * Sets the currently bound texture to [data].
@@ -3238,16 +3416,23 @@
    *
    */
   @JSName('texImage2D')
-  void texImage2DUntyped(int targetTexture, int levelOfDetail, 
-      int internalFormat, int format, int type, data) native;
+  void texImage2DUntyped(int targetTexture, int levelOfDetail,
+      int internalFormat, int format, int type, data) native ;
 
   /**
    * Sets the currently bound texture to [data].
    */
   @JSName('texImage2D')
-  void texImage2DTyped(int targetTexture, int levelOfDetail,
-      int internalFormat, int width, int height, int border, int format,
-      int type, TypedData data) native;
+  void texImage2DTyped(
+      int targetTexture,
+      int levelOfDetail,
+      int internalFormat,
+      int width,
+      int height,
+      int border,
+      int format,
+      int type,
+      TypedData data) native ;
 
   /**
    * Updates a sub-rectangle of the currently bound texture to [data].
@@ -3259,40 +3444,50 @@
    *
    */
   @JSName('texSubImage2D')
-  void texSubImage2DUntyped(int targetTexture, int levelOfDetail,
-      int xOffset, int yOffset, int format, int type, data) native;
+  void texSubImage2DUntyped(int targetTexture, int levelOfDetail, int xOffset,
+      int yOffset, int format, int type, data) native ;
 
   /**
    * Updates a sub-rectangle of the currently bound texture to [data].
    */
   @JSName('texSubImage2D')
-  void texSubImage2DTyped(int targetTexture, int levelOfDetail,
-      int xOffset, int yOffset, int width, int height, int border, int format,
-      int type, TypedData data) native;
+  void texSubImage2DTyped(
+      int targetTexture,
+      int levelOfDetail,
+      int xOffset,
+      int yOffset,
+      int width,
+      int height,
+      int border,
+      int format,
+      int type,
+      TypedData 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.
 
-
 @DocsEditable()
 @DomName('WebGLShader')
 @Native("WebGLShader")
 class Shader extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Shader._() { throw new UnsupportedError("Not supported"); }
+  factory Shader._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('WebGLShaderPrecisionFormat')
 @Native("WebGLShaderPrecisionFormat")
 class ShaderPrecisionFormat extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory ShaderPrecisionFormat._() { throw new UnsupportedError("Not supported"); }
+  factory ShaderPrecisionFormat._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('WebGLShaderPrecisionFormat.precision')
   @DocsEditable()
@@ -3310,31 +3505,32 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('WebGLTexture')
 @Native("WebGLTexture")
 class Texture extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory Texture._() { throw new UnsupportedError("Not supported"); }
+  factory Texture._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('WebGLUniformLocation')
 @Native("WebGLUniformLocation")
 class UniformLocation extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory UniformLocation._() { throw new UnsupportedError("Not supported"); }
+  factory UniformLocation._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('WebGLVertexArrayObjectOES')
 // http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
@@ -3342,17 +3538,20 @@
 @Native("WebGLVertexArrayObjectOES")
 class VertexArrayObject extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory VertexArrayObject._() { throw new UnsupportedError("Not supported"); }
+  factory VertexArrayObject._() {
+    throw new UnsupportedError("Not 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.
 
-
 @DocsEditable()
 @DomName('WebGLRenderingContextBase')
 @Experimental() // untriaged
 abstract class _WebGLRenderingContextBase extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory _WebGLRenderingContextBase._() { throw new UnsupportedError("Not supported"); }
+  factory _WebGLRenderingContextBase._() {
+    throw new UnsupportedError("Not supported");
+  }
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/web_sql/dart2js/web_sql_dart2js.dart b/pkg/dev_compiler/tool/input_sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
index 433459d..911c3c9 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
@@ -22,38 +22,34 @@
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:audio library.
 
-
-
-
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('SQLStatementCallback')
 // http://www.w3.org/TR/webdatabase/#sqlstatementcallback
 @Experimental() // deprecated
-typedef void SqlStatementCallback(SqlTransaction transaction, SqlResultSet resultSet);
+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.
 
-
 @DomName('SQLStatementErrorCallback')
 // http://www.w3.org/TR/webdatabase/#sqlstatementerrorcallback
 @Experimental() // deprecated
-typedef void SqlStatementErrorCallback(SqlTransaction transaction, SqlError error);
+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('SQLTransactionCallback')
 // http://www.w3.org/TR/webdatabase/#sqltransactioncallback
 @Experimental() // deprecated
@@ -64,7 +60,6 @@
 
 // WARNING: Do not edit - generated code.
 
-
 @DomName('SQLTransactionErrorCallback')
 // http://www.w3.org/TR/webdatabase/#sqltransactionerrorcallback
 @Experimental() // deprecated
@@ -73,7 +68,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.
 
-
 @DocsEditable()
 @DomName('Database')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -84,7 +78,9 @@
 @Native("Database")
 class SqlDatabase extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory SqlDatabase._() { throw new UnsupportedError("Not supported"); }
+  factory SqlDatabase._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.openDatabase)');
@@ -109,21 +105,27 @@
    */
   @DomName('Database.changeVersion')
   @DocsEditable()
-  void changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
+  void changeVersion(String oldVersion, String newVersion,
+      [SqlTransactionCallback callback,
+      SqlTransactionErrorCallback errorCallback,
+      VoidCallback successCallback]) native ;
 
   @DomName('Database.readTransaction')
   @DocsEditable()
-  void readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native;
+  void readTransaction(SqlTransactionCallback callback,
+      [SqlTransactionErrorCallback errorCallback,
+      VoidCallback successCallback]) native ;
 
   @DomName('Database.transaction')
   @DocsEditable()
-  void transaction(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.
 
-
 @DocsEditable()
 @DomName('SQLError')
 // http://www.w3.org/TR/webdatabase/#sqlerror
@@ -131,7 +133,9 @@
 @Native("SQLError")
 class SqlError extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory SqlError._() { throw new UnsupportedError("Not supported"); }
+  factory SqlError._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SQLError.CONSTRAINT_ERR')
   @DocsEditable()
@@ -177,7 +181,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.
 
-
 @DocsEditable()
 @DomName('SQLResultSet')
 // http://www.w3.org/TR/webdatabase/#sqlresultset
@@ -185,7 +188,9 @@
 @Native("SQLResultSet")
 class SqlResultSet extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory SqlResultSet._() { throw new UnsupportedError("Not supported"); }
+  factory SqlResultSet._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SQLResultSet.insertId')
   @DocsEditable()
@@ -203,33 +208,35 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 @DocsEditable()
 @DomName('SQLResultSetRowList')
 // http://www.w3.org/TR/webdatabase/#sqlresultsetrowlist
 @Experimental() // deprecated
 @Native("SQLResultSetRowList")
-class SqlResultSetRowList extends Interceptor with ListMixin<Map>, ImmutableListMixin<Map> implements List<Map> {
+class SqlResultSetRowList extends Interceptor
+    with ListMixin<Map>, ImmutableListMixin<Map>
+    implements List<Map> {
   // To suppress missing implicit constructor warnings.
-  factory SqlResultSetRowList._() { throw new UnsupportedError("Not supported"); }
+  factory SqlResultSetRowList._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SQLResultSetRowList.length')
   @DocsEditable()
   int get length => JS("int", "#.length", this);
 
-  Map operator[](int index) {
-    if (JS("bool", "# >>> 0 !== # || # >= #", index,
-        index, index, length))
+  Map operator [](int index) {
+    if (JS("bool", "# >>> 0 !== # || # >= #", index, index, index, length))
       throw new RangeError.index(index, this);
     return this.item(index);
   }
-  void operator[]=(int index, Map value) {
+
+  void operator []=(int index, Map value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
   // -- start List<Map> mixins.
   // Map is the element type.
 
-
   set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
@@ -267,17 +274,17 @@
   Map item(int index) {
     return convertNativeToDart_Dictionary(_item_1(index));
   }
+
   @JSName('item')
   @DomName('SQLResultSetRowList.item')
   @DocsEditable()
   @Creates('=Object')
-  _item_1(index) native;
+  _item_1(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.
 
-
 @DocsEditable()
 @DomName('SQLTransaction')
 @SupportedBrowser(SupportedBrowser.CHROME)
@@ -288,9 +295,13 @@
 @Native("SQLTransaction")
 class SqlTransaction extends Interceptor {
   // To suppress missing implicit constructor warnings.
-  factory SqlTransaction._() { throw new UnsupportedError("Not supported"); }
+  factory SqlTransaction._() {
+    throw new UnsupportedError("Not supported");
+  }
 
   @DomName('SQLTransaction.executeSql')
   @DocsEditable()
-  void executeSql(String sqlStatement, List<Object> arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) native;
+  void executeSql(String sqlStatement, List<Object> arguments,
+      [SqlStatementCallback callback,
+      SqlStatementErrorCallback errorCallback]) native ;
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/libraries.dart b/pkg/dev_compiler/tool/input_sdk/libraries.dart
index d14bf10..fe28fc5 100644
--- a/pkg/dev_compiler/tool/input_sdk/libraries.dart
+++ b/pkg/dev_compiler/tool/input_sdk/libraries.dart
@@ -18,17 +18,22 @@
 enum Category {
   /// Indicates that a library can be used in a browser context.
   client,
+
   /// Indicates that a library can be used in a command line context.
   server,
+
   /// Indicates that a library can be used from embedded devices.
   embedded
 }
 
 Category parseCategory(String name) {
   switch (name) {
-    case "Client": return Category.client;
-    case "Server": return Category.server;
-    case "Embedded": return Category.embedded;
+    case "Client":
+      return Category.client;
+    case "Server":
+      return Category.server;
+    case "Embedded":
+      return Category.embedded;
   }
   return null;
 }
@@ -36,195 +41,131 @@
 /// Mapping of "dart:" library name (e.g. "core") to information about that
 /// library.
 const Map<String, LibraryInfo> libraries = const {
-  "async": const LibraryInfo(
-      "async/async.dart",
+  "async": const LibraryInfo("async/async.dart",
       categories: "Client,Server",
       maturity: Maturity.STABLE,
       dart2jsPatchPath: "_internal/js_runtime/lib/async_patch.dart"),
-
-  "collection": const LibraryInfo(
-      "collection/collection.dart",
+  "collection": const LibraryInfo("collection/collection.dart",
       categories: "Client,Server,Embedded",
       maturity: Maturity.STABLE,
       dart2jsPatchPath: "_internal/js_runtime/lib/collection_patch.dart"),
-
-  "convert": const LibraryInfo(
-      "convert/convert.dart",
+  "convert": const LibraryInfo("convert/convert.dart",
       categories: "Client,Server",
       maturity: Maturity.STABLE,
       dart2jsPatchPath: "_internal/js_runtime/lib/convert_patch.dart"),
-
-  "core": const LibraryInfo(
-      "core/core.dart",
+  "core": const LibraryInfo("core/core.dart",
       categories: "Client,Server,Embedded",
       maturity: Maturity.STABLE,
       dart2jsPatchPath: "_internal/js_runtime/lib/core_patch.dart"),
-
-  "developer": const LibraryInfo(
-      "developer/developer.dart",
+  "developer": const LibraryInfo("developer/developer.dart",
       categories: "Client,Server,Embedded",
       maturity: Maturity.UNSTABLE,
       dart2jsPatchPath: "_internal/js_runtime/lib/developer_patch.dart"),
-
-  "html": const LibraryInfo(
-      "html/dartium/html_dartium.dart",
+  "html": const LibraryInfo("html/dartium/html_dartium.dart",
       categories: "Client",
       maturity: Maturity.WEB_STABLE,
       dart2jsPath: "html/dart2js/html_dart2js.dart"),
-
-  "html_common": const LibraryInfo(
-      "html/html_common/html_common.dart",
+  "html_common": const LibraryInfo("html/html_common/html_common.dart",
       categories: "Client",
       maturity: Maturity.WEB_STABLE,
       dart2jsPath: "html/html_common/html_common_dart2js.dart",
       documented: false,
       implementation: true),
-
-  "indexed_db": const LibraryInfo(
-      "indexed_db/dartium/indexed_db_dartium.dart",
+  "indexed_db": const LibraryInfo("indexed_db/dartium/indexed_db_dartium.dart",
       categories: "Client",
       maturity: Maturity.WEB_STABLE,
       dart2jsPath: "indexed_db/dart2js/indexed_db_dart2js.dart"),
-
-  "io": const LibraryInfo(
-      "io/io.dart",
+  "io": const LibraryInfo("io/io.dart",
       categories: "Server",
       dart2jsPatchPath: "_internal/js_runtime/lib/io_patch.dart"),
-
-  "isolate": const LibraryInfo(
-      "isolate/isolate.dart",
+  "isolate": const LibraryInfo("isolate/isolate.dart",
       categories: "Client,Server",
       maturity: Maturity.STABLE,
       dart2jsPatchPath: "_internal/js_runtime/lib/isolate_patch.dart"),
-
-  "js": const LibraryInfo(
-      "js/dartium/js_dartium.dart",
+  "js": const LibraryInfo("js/dartium/js_dartium.dart",
       categories: "Client",
       maturity: Maturity.STABLE,
       dart2jsPath: "js/dart2js/js_dart2js.dart"),
-
-  "js_util": const LibraryInfo(
-      "js_util/dartium/js_util_dartium.dart",
+  "js_util": const LibraryInfo("js_util/dartium/js_util_dartium.dart",
       categories: "Client",
       maturity: Maturity.STABLE,
       dart2jsPath: "js_util/dart2js/js_util_dart2js.dart"),
-
-  "math": const LibraryInfo(
-      "math/math.dart",
+  "math": const LibraryInfo("math/math.dart",
       categories: "Client,Server,Embedded",
       maturity: Maturity.STABLE,
       dart2jsPatchPath: "_internal/js_runtime/lib/math_patch.dart"),
-
-  "mirrors": const LibraryInfo(
-      "mirrors/mirrors.dart",
+  "mirrors": const LibraryInfo("mirrors/mirrors.dart",
       categories: "Client,Server",
       maturity: Maturity.UNSTABLE,
       dart2jsPatchPath: "_internal/js_runtime/lib/mirrors_patch.dart"),
-
-  "nativewrappers": const LibraryInfo(
-      "html/dartium/nativewrappers.dart",
+  "nativewrappers": const LibraryInfo("html/dartium/nativewrappers.dart",
       categories: "Client",
       implementation: true,
       documented: false,
       dart2jsPath: "html/dart2js/nativewrappers.dart"),
-
-  "typed_data": const LibraryInfo(
-      "typed_data/typed_data.dart",
+  "typed_data": const LibraryInfo("typed_data/typed_data.dart",
       categories: "Client,Server,Embedded",
       maturity: Maturity.STABLE,
       dart2jsPatchPath: "_internal/js_runtime/lib/typed_data_patch.dart"),
-
   "_native_typed_data": const LibraryInfo(
       "_internal/js_runtime/lib/native_typed_data.dart",
       categories: "",
       implementation: true,
       documented: false,
       platforms: DART2JS_PLATFORM),
-
-  "svg": const LibraryInfo(
-      "svg/dartium/svg_dartium.dart",
+  "svg": const LibraryInfo("svg/dartium/svg_dartium.dart",
       categories: "Client",
       maturity: Maturity.WEB_STABLE,
       dart2jsPath: "svg/dart2js/svg_dart2js.dart"),
-
-  "web_audio": const LibraryInfo(
-      "web_audio/dartium/web_audio_dartium.dart",
+  "web_audio": const LibraryInfo("web_audio/dartium/web_audio_dartium.dart",
       categories: "Client",
       maturity: Maturity.WEB_STABLE,
       dart2jsPath: "web_audio/dart2js/web_audio_dart2js.dart"),
-
-  "web_gl": const LibraryInfo(
-      "web_gl/dartium/web_gl_dartium.dart",
+  "web_gl": const LibraryInfo("web_gl/dartium/web_gl_dartium.dart",
       categories: "Client",
       maturity: Maturity.WEB_STABLE,
       dart2jsPath: "web_gl/dart2js/web_gl_dart2js.dart"),
-
-  "web_sql": const LibraryInfo(
-      "web_sql/dartium/web_sql_dartium.dart",
+  "web_sql": const LibraryInfo("web_sql/dartium/web_sql_dartium.dart",
       categories: "Client",
       maturity: Maturity.WEB_STABLE,
       dart2jsPath: "web_sql/dart2js/web_sql_dart2js.dart"),
-
-  "_internal": const LibraryInfo(
-      "internal/internal.dart",
+  "_internal": const LibraryInfo("internal/internal.dart",
       categories: "",
       documented: false,
       dart2jsPatchPath: "_internal/js_runtime/lib/internal_patch.dart"),
-
-  "_js_helper": const LibraryInfo(
-      "_internal/js_runtime/lib/js_helper.dart",
-      categories: "",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
+  "_js_helper": const LibraryInfo("_internal/js_runtime/lib/js_helper.dart",
+      categories: "", documented: false, platforms: DART2JS_PLATFORM),
   "_interceptors": const LibraryInfo(
       "_internal/js_runtime/lib/interceptors.dart",
       categories: "",
       documented: false,
       platforms: DART2JS_PLATFORM),
-
   "_foreign_helper": const LibraryInfo(
       "_internal/js_runtime/lib/foreign_helper.dart",
       categories: "",
       documented: false,
       platforms: DART2JS_PLATFORM),
-
   "_isolate_helper": const LibraryInfo(
       "_internal/js_runtime/lib/isolate_helper.dart",
       categories: "",
       documented: false,
       platforms: DART2JS_PLATFORM),
-
-  "_js_mirrors": const LibraryInfo(
-      "_internal/js_runtime/lib/js_mirrors.dart",
-      categories: "",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
+  "_js_mirrors": const LibraryInfo("_internal/js_runtime/lib/js_mirrors.dart",
+      categories: "", documented: false, platforms: DART2JS_PLATFORM),
   "_js_primitives": const LibraryInfo(
       "_internal/js_runtime/lib/js_primitives.dart",
       categories: "",
       documented: false,
       platforms: DART2JS_PLATFORM),
-
   "_js_embedded_names": const LibraryInfo(
       "_internal/js_runtime/lib/shared/embedded_names.dart",
       categories: "",
       documented: false,
       platforms: DART2JS_PLATFORM),
-
-  "_metadata": const LibraryInfo(
-      "html/html_common/metadata.dart",
-      categories: "",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
-  "_debugger": const LibraryInfo(
-      "_internal/js_runtime/lib/debugger.dart",
-      category: "",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
+  "_metadata": const LibraryInfo("html/html_common/metadata.dart",
+      categories: "", documented: false, platforms: DART2JS_PLATFORM),
+  "_debugger": const LibraryInfo("_internal/js_runtime/lib/debugger.dart",
+      category: "", documented: false, platforms: DART2JS_PLATFORM),
   "_runtime": const LibraryInfo(
       "_internal/js_runtime/lib/ddc_runtime/runtime.dart",
       category: "",
@@ -286,14 +227,14 @@
    */
   final Maturity maturity;
 
-  const LibraryInfo(this.path, {
-                    String categories: "",
-                    this.dart2jsPath,
-                    this.dart2jsPatchPath,
-                    this.implementation: false,
-                    this.documented: true,
-                    this.maturity: Maturity.UNSPECIFIED,
-                    this.platforms: DART2JS_PLATFORM | VM_PLATFORM})
+  const LibraryInfo(this.path,
+      {String categories: "",
+      this.dart2jsPath,
+      this.dart2jsPatchPath,
+      this.implementation: false,
+      this.documented: true,
+      this.maturity: Maturity.UNSPECIFIED,
+      this.platforms: DART2JS_PLATFORM | VM_PLATFORM})
       : _categories = categories;
 
   bool get isDart2jsLibrary => (platforms & DART2JS_PLATFORM) != 0;
@@ -336,20 +277,28 @@
   static const Maturity DEPRECATED = const Maturity(0, "Deprecated",
       "This library will be remove before next major release.");
 
-  static const Maturity EXPERIMENTAL = const Maturity(1, "Experimental",
+  static const Maturity EXPERIMENTAL = const Maturity(
+      1,
+      "Experimental",
       "This library is experimental and will likely change or be removed\n"
       "in future versions.");
 
-  static const Maturity UNSTABLE = const Maturity(2, "Unstable",
+  static const Maturity UNSTABLE = const Maturity(
+      2,
+      "Unstable",
       "This library is in still changing and have not yet endured\n"
       "sufficient real-world testing.\n"
       "Backwards-compatibility is NOT guaranteed.");
 
-  static const Maturity WEB_STABLE = const Maturity(3, "Web Stable",
+  static const Maturity WEB_STABLE = const Maturity(
+      3,
+      "Web Stable",
       "This library is tracking the DOM evolution as defined by WC3.\n"
       "Backwards-compatibility is NOT guaranteed.");
 
-  static const Maturity STABLE = const Maturity(4, "Stable",
+  static const Maturity STABLE = const Maturity(
+      4,
+      "Stable",
       "The library is stable. API backwards-compatibility is guaranteed.\n"
       "However implementation details might change.");
 
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
index cd898d0..9e4670b 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
@@ -4,16 +4,15 @@
 
 // Patch file for the dart:async library.
 
-import 'dart:_js_helper' show
-    patch,
-    Primitives;
-import 'dart:_isolate_helper' show
-    IsolateNatives,
-    TimerImpl,
-    global,
-    leaveJsAsync,
-    enterJsAsync,
-    isWorker;
+import 'dart:_js_helper' show patch, Primitives;
+import 'dart:_isolate_helper'
+    show
+        IsolateNatives,
+        TimerImpl,
+        global,
+        leaveJsAsync,
+        enterJsAsync,
+        isWorker;
 
 import 'dart:_foreign_helper' show JS;
 
@@ -49,11 +48,13 @@
         var f = storedCallback;
         storedCallback = null;
         f();
-      };
+      }
 
-      var observer = JS('', 'new #.MutationObserver(#)', global, internalCallback);
-      JS('', '#.observe(#, { childList: true })',
-          observer, div);
+      ;
+
+      var observer =
+          JS('', 'new #.MutationObserver(#)', global, internalCallback);
+      JS('', '#.observe(#, { childList: true })', observer, div);
 
       return (void callback()) {
         assert(storedCallback == null);
@@ -62,8 +63,8 @@
         // Because of a broken shadow-dom polyfill we have to change the
         // children instead a cheap property.
         // See https://github.com/Polymer/ShadowDOM/issues/468
-        JS('', '#.firstChild ? #.removeChild(#): #.appendChild(#)',
-            div, div, span, div, span);
+        JS('', '#.firstChild ? #.removeChild(#): #.appendChild(#)', div, div,
+            span, div, span);
       };
     } else if (JS('', '#.setImmediate', global) != null) {
       return _scheduleImmediateWithSetImmediate;
@@ -76,7 +77,9 @@
     internalCallback() {
       leaveJsAsync();
       callback();
-    };
+    }
+
+    ;
     enterJsAsync();
     JS('void', '#.scheduleImmediate(#)', global, internalCallback);
   }
@@ -85,7 +88,9 @@
     internalCallback() {
       leaveJsAsync();
       callback();
-    };
+    }
+
+    ;
     enterJsAsync();
     JS('void', '#.setImmediate(#)', global, internalCallback);
   }
@@ -100,7 +105,7 @@
   @patch
   Future<Null> load() {
     throw 'DeferredLibrary not supported. '
-          'please use the `import "lib.dart" deferred as lib` syntax.';
+        'please use the `import "lib.dart" deferred as lib` syntax.';
   }
 }
 
@@ -114,8 +119,8 @@
   }
 
   @patch
-  static Timer _createPeriodicTimer(Duration duration,
-                             void callback(Timer timer)) {
+  static Timer _createPeriodicTimer(
+      Duration duration, void callback(Timer timer)) {
     int milliseconds = duration.inMilliseconds;
     if (milliseconds < 0) milliseconds = 0;
     return new TimerImpl.periodic(milliseconds, callback);
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
index 5e2a79c..429f40e 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
@@ -4,19 +4,28 @@
 
 // Patch file for dart:collection classes.
 import 'dart:_foreign_helper' show JS;
-import 'dart:_js_helper' show
-    fillLiteralMap, InternalMap, NoInline, NoSideEffects, NoThrows, patch,
-    JsLinkedHashMap, LinkedHashMapCell, LinkedHashMapKeyIterable,
-    LinkedHashMapKeyIterator;
+import 'dart:_js_helper'
+    show
+        fillLiteralMap,
+        InternalMap,
+        NoInline,
+        NoSideEffects,
+        NoThrows,
+        patch,
+        JsLinkedHashMap,
+        LinkedHashMapCell,
+        LinkedHashMapKeyIterable,
+        LinkedHashMapKeyIterator;
 
 const _USE_ES6_MAPS = true;
 
 @patch
 class HashMap<K, V> {
   @patch
-  factory HashMap({ bool equals(K key1, K key2),
-                    int hashCode(K key),
-                    bool isValidKey(Object potentialKey) }) {
+  factory HashMap(
+      {bool equals(K key1, K key2),
+      int hashCode(K key),
+      bool isValidKey(Object potentialKey)}) {
     if (isValidKey == null) {
       if (hashCode == null) {
         if (equals == null) {
@@ -70,7 +79,6 @@
 
   _HashMap();
 
-
   int get length => _length;
   bool get isEmpty => _length == 0;
   bool get isNotEmpty => !isEmpty;
@@ -112,7 +120,7 @@
     });
   }
 
-  V operator[](Object key) {
+  V operator [](Object key) {
     if (_isStringKey(key)) {
       var strings = _strings;
       return (strings == null) ? null : _getTableEntry(strings, key);
@@ -132,7 +140,7 @@
     return (index < 0) ? null : JS('var', '#[#]', bucket, index + 1);
   }
 
-  void operator[]=(K key, V value) {
+  void operator []=(K key, V value) {
     if (_isStringKey(key)) {
       var strings = _strings;
       if (strings == null) _strings = strings = _newHashTable();
@@ -389,16 +397,16 @@
   final _Equality<K> _equals;
   final _Hasher<K> _hashCode;
   final _Predicate<Object> _validKey;
-  _CustomHashMap(this._equals, this._hashCode,
-                 bool validKey(Object potentialKey))
+  _CustomHashMap(
+      this._equals, this._hashCode, bool validKey(Object potentialKey))
       : _validKey = (validKey != null) ? validKey : ((v) => v is K);
 
-  V operator[](Object key) {
+  V operator [](Object key) {
     if (!_validKey(key)) return null;
     return super._get(key);
   }
 
-  void operator[]=(K key, V value) {
+  void operator []=(K key, V value) {
     super._set(key, value);
   }
 
@@ -489,9 +497,10 @@
 @patch
 class LinkedHashMap<K, V> {
   @patch
-  factory LinkedHashMap({ bool equals(K key1, K key2),
-                          int hashCode(K key),
-                          bool isValidKey(Object potentialKey) }) {
+  factory LinkedHashMap(
+      {bool equals(K key1, K key2),
+      int hashCode(K key),
+      bool isValidKey(Object potentialKey)}) {
     if (isValidKey == null) {
       if (hashCode == null) {
         if (equals == null) {
@@ -553,8 +562,8 @@
   }
 }
 
-class _Es6LinkedIdentityHashMap<K, V>
-    extends _LinkedIdentityHashMap<K, V> implements InternalMap<K, V> {
+class _Es6LinkedIdentityHashMap<K, V> extends _LinkedIdentityHashMap<K, V>
+    implements InternalMap<K, V> {
   final _map;
   int _modifications = 0;
 
@@ -566,8 +575,7 @@
 
   Iterable<K> get keys => new _Es6MapIterable<K>(this, true);
 
-  Iterable<V> get values =>
-      new _Es6MapIterable<V>(this, false);
+  Iterable<V> get values => new _Es6MapIterable<V>(this, false);
 
   bool containsKey(Object key) {
     return JS('bool', '#.has(#)', _map, key);
@@ -583,11 +591,11 @@
     });
   }
 
-  V operator[](Object key) {
+  V operator [](Object key) {
     return JS('var', '#.get(#)', _map, key);
   }
 
-  void operator[]=(K key, V value) {
+  void operator []=(K key, V value) {
     JS('var', '#.set(#, #)', _map, key, value);
     _modified();
   }
@@ -717,16 +725,16 @@
   final _Equality<K> _equals;
   final _Hasher<K> _hashCode;
   final _Predicate<Object> _validKey;
-  _LinkedCustomHashMap(this._equals, this._hashCode,
-                       bool validKey(Object potentialKey))
+  _LinkedCustomHashMap(
+      this._equals, this._hashCode, bool validKey(Object potentialKey))
       : _validKey = (validKey != null) ? validKey : ((v) => v is K);
 
-  V operator[](Object key) {
+  V operator [](Object key) {
     if (!_validKey(key)) return null;
     return super.internalGet(key);
   }
 
-  void operator[]=(K key, V value) {
+  void operator []=(K key, V value) {
     super.internalSet(key, value);
   }
 
@@ -761,9 +769,10 @@
 @patch
 class HashSet<E> {
   @patch
-  factory HashSet({ bool equals(E e1, E e2),
-                    int hashCode(E e),
-                    bool isValidKey(Object potentialKey) }) {
+  factory HashSet(
+      {bool equals(E e1, E e2),
+      int hashCode(E e),
+      bool isValidKey(Object potentialKey)}) {
     if (isValidKey == null) {
       if (hashCode == null) {
         if (equals == null) {
@@ -1093,8 +1102,8 @@
   _Equality<E> _equality;
   _Hasher<E> _hasher;
   _Predicate<Object> _validKey;
-  _CustomHashSet(this._equality, this._hasher,
-                 bool validKey(Object potentialKey))
+  _CustomHashSet(
+      this._equality, this._hasher, bool validKey(Object potentialKey))
       : _validKey = (validKey != null) ? validKey : ((x) => x is E);
 
   Set<E> _newSet() => new _CustomHashSet<E>(_equality, _hasher, _validKey);
@@ -1167,9 +1176,10 @@
 @patch
 class LinkedHashSet<E> {
   @patch
-  factory LinkedHashSet({ bool equals(E e1, E e2),
-                          int hashCode(E e),
-                          bool isValidKey(Object potentialKey) }) {
+  factory LinkedHashSet(
+      {bool equals(E e1, E e2),
+      int hashCode(E e),
+      bool isValidKey(Object potentialKey)}) {
     if (isValidKey == null) {
       if (hashCode == null) {
         if (equals == null) {
@@ -1355,7 +1365,8 @@
     if (index < 0) return false;
     // Use splice to remove the [cell] element at the index and
     // unlink it.
-    _LinkedHashSetCell/*<E>*/ cell = JS('var', '#.splice(#, 1)[0]', bucket, index);
+    _LinkedHashSetCell/*<E>*/ cell =
+        JS('var', '#.splice(#, 1)[0]', bucket, index);
     _unlinkCell(cell);
     return true;
   }
@@ -1536,8 +1547,8 @@
   _Equality<E> _equality;
   _Hasher<E> _hasher;
   _Predicate<Object> _validKey;
-  _LinkedCustomHashSet(this._equality, this._hasher,
-                       bool validKey(Object potentialKey))
+  _LinkedCustomHashSet(
+      this._equality, this._hasher, bool validKey(Object potentialKey))
       : _validKey = (validKey != null) ? validKey : ((x) => x is E);
 
   Set<E> _newSet() =>
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/convert_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/convert_patch.dart
index 54575b5..41130a9 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/convert_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/convert_patch.dart
@@ -33,8 +33,7 @@
   var parsed;
   try {
     parsed = JS('=Object|JSExtendableArray|Null|bool|num|String',
-                'JSON.parse(#)',
-                source);
+        'JSON.parse(#)', source);
   } catch (e) {
     throw new FormatException(JS('String', 'String(#)', e));
   }
@@ -88,7 +87,7 @@
     }
 
     // Update the JSON map structure so future access is cheaper.
-    map._original = processed;  // Don't keep two objects around.
+    map._original = processed; // Don't keep two objects around.
     return map;
   }
 
@@ -140,10 +139,10 @@
 
   _JsonMap(this._original);
 
-  operator[](key) {
+  operator [](key) {
     if (_isUpgraded) {
       return _upgradedMap[key];
-    } else if (key is !String) {
+    } else if (key is! String) {
       return null;
     } else {
       var result = _getProperty(_processed, key);
@@ -152,9 +151,7 @@
     }
   }
 
-  int get length => _isUpgraded
-      ? _upgradedMap.length
-      : _computeKeys().length;
+  int get length => _isUpgraded ? _upgradedMap.length : _computeKeys().length;
 
   bool get isEmpty => length == 0;
   bool get isNotEmpty => length > 0;
@@ -169,7 +166,7 @@
     return new MappedIterable(_computeKeys(), (each) => this[each]);
   }
 
-  operator[]=(key, value) {
+  operator []=(key, value) {
     if (_isUpgraded) {
       _upgradedMap[key] = value;
     } else if (containsKey(key)) {
@@ -177,7 +174,7 @@
       _setProperty(processed, key, value);
       var original = _original;
       if (!identical(original, processed)) {
-        _setProperty(original, key, null);  // Reclaim memory.
+        _setProperty(original, key, null); // Reclaim memory.
       }
     } else {
       _upgrade()[key] = value;
@@ -202,7 +199,7 @@
 
   bool containsKey(key) {
     if (_isUpgraded) return _upgradedMap.containsKey(key);
-    if (key is !String) return false;
+    if (key is! String) return false;
     return _hasProperty(_original, key);
   }
 
@@ -260,7 +257,6 @@
 
   String toString() => Maps.mapToString(this);
 
-
   // ------------------------------------------
   // Private helper methods.
   // ------------------------------------------
@@ -319,23 +315,20 @@
     return _setProperty(_processed, key, result);
   }
 
-
   // ------------------------------------------
   // Private JavaScript helper methods.
   // ------------------------------------------
 
-  static bool _hasProperty(object, String key)
-      => JS('bool', 'Object.prototype.hasOwnProperty.call(#,#)', object, key);
-  static _getProperty(object, String key)
-      => JS('', '#[#]', object, key);
-  static _setProperty(object, String key, value)
-      => JS('', '#[#]=#', object, key, value);
-  static List _getPropertyNames(object)
-      => JS('JSExtendableArray', 'Object.keys(#)', object);
-  static bool _isUnprocessed(object)
-      => JS('bool', 'typeof(#)=="undefined"', object);
-  static _newJavaScriptObject()
-      => JS('=Object', 'Object.create(null)');
+  static bool _hasProperty(object, String key) =>
+      JS('bool', 'Object.prototype.hasOwnProperty.call(#,#)', object, key);
+  static _getProperty(object, String key) => JS('', '#[#]', object, key);
+  static _setProperty(object, String key, value) =>
+      JS('', '#[#]=#', object, key, value);
+  static List _getPropertyNames(object) =>
+      JS('JSExtendableArray', 'Object.keys(#)', object);
+  static bool _isUnprocessed(object) =>
+      JS('bool', 'typeof(#)=="undefined"', object);
+  static _newJavaScriptObject() => JS('=Object', 'Object.create(null)');
 }
 
 class _JsonMapKeyIterable extends ListIterable {
@@ -346,16 +339,18 @@
   int get length => _parent.length;
 
   String elementAt(int index) {
-    return _parent._isUpgraded ? _parent.keys.elementAt(index)
-                               : _parent._computeKeys()[index];
+    return _parent._isUpgraded
+        ? _parent.keys.elementAt(index)
+        : _parent._computeKeys()[index];
   }
 
   /// Although [ListIterable] defines its own iterator, we return the iterator
   /// of the underlying list [_keys] in order to propagate
   /// [ConcurrentModificationError]s.
   Iterator get iterator {
-    return _parent._isUpgraded ? _parent.keys.iterator
-                               : _parent._computeKeys().iterator;
+    return _parent._isUpgraded
+        ? _parent.keys.iterator
+        : _parent._computeKeys().iterator;
   }
 
   /// Delegate to [parent.containsKey] to ensure the performance expected
@@ -363,7 +358,8 @@
   bool contains(Object key) => _parent.containsKey(key);
 }
 
-@patch class JsonDecoder {
+@patch
+class JsonDecoder {
   @patch
   StringConversionSink startChunkedConversion(Sink<Object> sink) {
     return new _JsonDecoderSink(_reviver, sink);
@@ -381,8 +377,7 @@
   final _Reviver _reviver;
   final Sink<Object> _sink;
 
-  _JsonDecoderSink(this._reviver, this._sink)
-      : super(new StringBuffer());
+  _JsonDecoderSink(this._reviver, this._sink) : super(new StringBuffer());
 
   void close() {
     super.close();
@@ -395,17 +390,18 @@
   }
 }
 
-@patch class Utf8Decoder {
+@patch
+class Utf8Decoder {
   @patch
-  Converter<List<int>, dynamic/*=T*/> fuse/*<T>*/(
-      Converter<String, dynamic/*=T*/> next) {
+  Converter<List<int>, dynamic/*=T*/ > fuse/*<T>*/(
+      Converter<String, dynamic/*=T*/ > next) {
     return super.fuse/*<T>*/(next);
   }
 
   // Currently not intercepting UTF8 decoding.
   @patch
-  static String _convertIntercepted(bool allowMalformed, List<int> codeUnits,
-                                    int start, int end) {
-    return null;  // This call was not intercepted.
+  static String _convertIntercepted(
+      bool allowMalformed, List<int> codeUnits, int start, int end) {
+    return null; // This call was not intercepted.
   }
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
index 71a568b..73bd6e5 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
@@ -5,16 +5,18 @@
 // Patch file for dart:core classes.
 import "dart:_internal" as _symbol_dev;
 import 'dart:_interceptors';
-import 'dart:_js_helper' show patch,
-                              checkInt,
-                              getRuntimeType,
-                              jsonEncodeNative,
-                              JsLinkedHashMap,
-                              JSSyntaxRegExp,
-                              Primitives,
-                              stringJoinUnchecked,
-                              objectHashCode,
-                              getTraceFromException;
+import 'dart:_js_helper'
+    show
+        patch,
+        checkInt,
+        getRuntimeType,
+        jsonEncodeNative,
+        JsLinkedHashMap,
+        JSSyntaxRegExp,
+        Primitives,
+        stringJoinUnchecked,
+        objectHashCode,
+        getTraceFromException;
 
 import 'dart:_foreign_helper' show JS;
 
@@ -29,7 +31,7 @@
 @patch
 class Object {
   @patch
-  bool operator==(other) => identical(this, other);
+  bool operator ==(other) => identical(this, other);
 
   @patch
   int get hashCode => Primitives.objectHashCode(this);
@@ -39,11 +41,8 @@
 
   @patch
   dynamic noSuchMethod(Invocation invocation) {
-    throw new NoSuchMethodError(
-        this,
-        invocation.memberName,
-        invocation.positionalArguments,
-        invocation.namedArguments);
+    throw new NoSuchMethodError(this, invocation.memberName,
+        invocation.positionalArguments, invocation.namedArguments);
   }
 
   @patch
@@ -61,9 +60,8 @@
 @patch
 class Function {
   @patch
-  static apply(Function f,
-               List positionalArguments,
-               [Map<Symbol, dynamic> namedArguments]) {
+  static apply(Function f, List positionalArguments,
+      [Map<Symbol, dynamic> namedArguments]) {
     positionalArguments ??= [];
     // dcall expects the namedArguments as a JS map in the last slot.
     if (namedArguments != null && namedArguments.isNotEmpty) {
@@ -73,7 +71,8 @@
       });
       positionalArguments = new List.from(positionalArguments)..add(map);
     }
-    return JS('', 'dart.dcall.apply(null, [#].concat(#))', f, positionalArguments);
+    return JS(
+        '', 'dart.dcall.apply(null, [#].concat(#))', f, positionalArguments);
   }
 
   static Map<String, dynamic> _toMangledNames(
@@ -94,13 +93,13 @@
   Expando([String name]) : this.name = name;
 
   @patch
-  T operator[](Object object) {
+  T operator [](Object object) {
     var values = Primitives.getProperty(object, _EXPANDO_PROPERTY_NAME);
     return (values == null) ? null : Primitives.getProperty(values, _getKey());
   }
 
   @patch
-  void operator[]=(Object object, T value) {
+  void operator []=(Object object, T value) {
     var values = Primitives.getProperty(object, _EXPANDO_PROPERTY_NAME);
     if (values == null) {
       values = new Object();
@@ -126,9 +125,7 @@
 @patch
 class int {
   @patch
-  static int parse(String source,
-                         { int radix,
-                           int onError(String source) }) {
+  static int parse(String source, {int radix, int onError(String source)}) {
     return Primitives.parseInt(source, radix, onError);
   }
 
@@ -142,8 +139,7 @@
 @patch
 class double {
   @patch
-  static double parse(String source,
-                            [double onError(String source)]) {
+  static double parse(String source, [double onError(String source)]) {
     return Primitives.parseDouble(source, onError);
   }
 }
@@ -184,33 +180,31 @@
 class DateTime {
   @patch
   DateTime.fromMillisecondsSinceEpoch(int millisecondsSinceEpoch,
-                                      {bool isUtc: false})
+      {bool isUtc: false})
       : this._withValue(millisecondsSinceEpoch, isUtc: isUtc);
 
   @patch
   DateTime.fromMicrosecondsSinceEpoch(int microsecondsSinceEpoch,
-                                      {bool isUtc: false})
+      {bool isUtc: false})
       : this._withValue(
-          _microsecondInRoundedMilliseconds(microsecondsSinceEpoch),
-          isUtc: isUtc);
+            _microsecondInRoundedMilliseconds(microsecondsSinceEpoch),
+            isUtc: isUtc);
 
   @patch
-  DateTime._internal(int year,
-                     int month,
-                     int day,
-                     int hour,
-                     int minute,
-                     int second,
-                     int millisecond,
-                     int microsecond,
-                     bool isUtc)
-        // checkBool is manually inlined here because dart2js doesn't inline it
-        // and [isUtc] is usually a constant.
+  DateTime._internal(int year, int month, int day, int hour, int minute,
+      int second, int millisecond, int microsecond, bool isUtc)
+      // checkBool is manually inlined here because dart2js doesn't inline it
+      // and [isUtc] is usually a constant.
       : this.isUtc = isUtc is bool
             ? isUtc
             : throw new ArgumentError.value(isUtc, 'isUtc'),
         _value = checkInt(Primitives.valueFromDecomposedDate(
-            year, month, day, hour, minute, second,
+            year,
+            month,
+            day,
+            hour,
+            minute,
+            second,
             millisecond + _microsecondInRoundedMilliseconds(microsecond),
             isUtc));
 
@@ -227,11 +221,15 @@
   }
 
   @patch
-  static int _brokenDownDateToValue(
-      int year, int month, int day, int hour, int minute, int second,
-      int millisecond, int microsecond, bool isUtc) {
+  static int _brokenDownDateToValue(int year, int month, int day, int hour,
+      int minute, int second, int millisecond, int microsecond, bool isUtc) {
     return Primitives.valueFromDecomposedDate(
-        year, month, day, hour, minute, second,
+        year,
+        month,
+        day,
+        hour,
+        minute,
+        second,
         millisecond + _microsecondInRoundedMilliseconds(microsecond),
         isUtc);
   }
@@ -250,14 +248,14 @@
 
   @patch
   DateTime add(Duration duration) {
-    return new DateTime._withValue(
-        _value + duration.inMilliseconds, isUtc: isUtc);
+    return new DateTime._withValue(_value + duration.inMilliseconds,
+        isUtc: isUtc);
   }
 
   @patch
   DateTime subtract(Duration duration) {
-    return new DateTime._withValue(
-        _value - duration.inMilliseconds, isUtc: isUtc);
+    return new DateTime._withValue(_value - duration.inMilliseconds,
+        isUtc: isUtc);
   }
 
   @patch
@@ -299,7 +297,6 @@
   int get weekday => Primitives.getWeekday(this);
 }
 
-
 // Patch for Stopwatch implementation.
 @patch
 class Stopwatch {
@@ -324,8 +321,9 @@
     } else {
       // Explicit type test is necessary to guard against JavaScript conversions
       // in unchecked mode.
-      if ((length is !int) || (length < 0)) {
-        throw new ArgumentError("Length must be a non-negative integer: $length");
+      if ((length is! int) || (length < 0)) {
+        throw new ArgumentError(
+            "Length must be a non-negative integer: $length");
       }
       list = JSArray.markFixedList(JS('', 'new Array(#)', length));
     }
@@ -344,7 +342,7 @@
   }
 
   @patch
-  factory List.from(Iterable elements, { bool growable: true }) {
+  factory List.from(Iterable elements, {bool growable: true}) {
     List<E> list = new List<E>();
     for (var e in elements) {
       list.add(e);
@@ -375,7 +373,7 @@
 class String {
   @patch
   factory String.fromCharCodes(Iterable<int> charCodes,
-                               [int start = 0, int end]) {
+      [int start = 0, int end]) {
     if (charCodes is JSArray) {
       return _stringFromJSArray(charCodes, start, end);
     }
@@ -397,7 +395,9 @@
   }
 
   static String _stringFromJSArray(
-      /*=JSArray<int>*/ list, int start, int endOrNull) {
+      /*=JSArray<int>*/ list,
+      int start,
+      int endOrNull) {
     int len = list.length;
     int end = RangeError.checkValidRange(start, endOrNull, len);
     if (start > 0 || end < len) {
@@ -413,8 +413,8 @@
     return Primitives.stringFromNativeUint8List(charCodes, start, end);
   }
 
-  static String _stringFromIterable(Iterable<int> charCodes,
-                                    int start, int end) {
+  static String _stringFromIterable(
+      Iterable<int> charCodes, int start, int end) {
     if (start < 0) throw new RangeError.range(start, 0, charCodes.length);
     if (end != null && end < start) {
       throw new RangeError.range(end, start, charCodes.length);
@@ -449,18 +449,16 @@
   }
 
   @patch
-  int get hashCode => super.hashCode;  
+  int get hashCode => super.hashCode;
 }
 
 @patch
 class RegExp {
   @patch
   factory RegExp(String source,
-                       {bool multiLine: false,
-                        bool caseSensitive: true})
-    => new JSSyntaxRegExp(source,
-                          multiLine: multiLine,
-                          caseSensitive: caseSensitive);
+          {bool multiLine: false, bool caseSensitive: true}) =>
+      new JSSyntaxRegExp(source,
+          multiLine: multiLine, caseSensitive: caseSensitive);
 }
 
 // Patch for 'identical' function.
@@ -536,11 +534,9 @@
 @patch
 class NoSuchMethodError {
   @patch
-  NoSuchMethodError(Object receiver,
-                    Symbol memberName,
-                    List positionalArguments,
-                    Map<Symbol, dynamic> namedArguments,
-                    [List existingArgumentNames = null])
+  NoSuchMethodError(Object receiver, Symbol memberName,
+      List positionalArguments, Map<Symbol, dynamic> namedArguments,
+      [List existingArgumentNames = null])
       : _receiver = receiver,
         _memberName = memberName,
         _arguments = positionalArguments,
@@ -619,10 +615,8 @@
    * that appear in [canonicalTable], and returns the escaped string.
    */
   @patch
-  static String _uriEncode(List<int> canonicalTable,
-                           String text,
-                           Encoding encoding,
-                           bool spaceToPlus) {
+  static String _uriEncode(List<int> canonicalTable, String text,
+      Encoding encoding, bool spaceToPlus) {
     if (identical(encoding, UTF8) && _needsNoEncoding.hasMatch(text)) {
       return text;
     }
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
index 4cefe98..07fbcb8 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
@@ -23,13 +23,13 @@
 
 @patch
 void log(String message,
-         {DateTime time,
-          int sequenceNumber,
-          int level: 0,
-          String name: '',
-          Zone zone,
-          Object error,
-          StackTrace stackTrace}) {
+    {DateTime time,
+    int sequenceNumber,
+    int level: 0,
+    String name: '',
+    Zone zone,
+    Object error,
+    StackTrace stackTrace}) {
   // TODO.
 }
 
@@ -50,7 +50,6 @@
   // TODO.
 }
 
-
 @patch
 bool _isDartStreamEnabled() {
   return false;
@@ -61,6 +60,7 @@
   // TODO.
   return _clockValue++;
 }
+
 int _clockValue = 0;
 
 @patch
@@ -68,21 +68,15 @@
   return -1;
 }
 
-
 @patch
-void _reportCompleteEvent(int start,
-                          int startCpu,
-                          String category,
-                          String name,
-                          String argumentsAsJson) {
+void _reportCompleteEvent(int start, int startCpu, String category, String name,
+    String argumentsAsJson) {
   // TODO.
 }
 
 @patch
-void _reportInstantEvent(int start,
-                         String category,
-                         String name,
-                         String argumentsAsJson) {
+void _reportInstantEvent(
+    int start, String category, String name, String argumentsAsJson) {
   // TODO.
 }
 
@@ -97,13 +91,9 @@
 }
 
 @patch
-void _reportTaskEvent(int start,
-                      int taskId,
-                      String phase,
-                      String category,
-                      String name,
-                      String argumentsAsJson) {
- // TODO.
+void _reportTaskEvent(int start, int taskId, String phase, String category,
+    String name, String argumentsAsJson) {
+  // TODO.
 }
 
 @patch
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart
index d878d54..30f35ac 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart
@@ -10,8 +10,7 @@
 @patch
 class Symbol implements core.Symbol {
   @patch
-  const Symbol(String name)
-      : this._name = name;
+  const Symbol(String name) : this._name = name;
 
   @patch
   int get hashCode {
@@ -22,7 +21,7 @@
     JS('', '#._hashCode = #', this, hash);
     return hash;
   }
-  
+
   @patch
   toString() => 'Symbol("$_name")';
 }
@@ -36,16 +35,15 @@
 
   const PrivateSymbol(this._name, this._nativeSymbol);
 
-  static String getName(core.Symbol symbol) =>
-      (symbol as PrivateSymbol)._name;
+  static String getName(core.Symbol symbol) => (symbol as PrivateSymbol)._name;
 
   static Object getNativeSymbol(core.Symbol symbol) {
     if (symbol is PrivateSymbol) return symbol._nativeSymbol;
     return null;
   }
 
-  bool operator ==(other) => other is PrivateSymbol &&
-      identical(_nativeSymbol, other._nativeSymbol);
+  bool operator ==(other) =>
+      other is PrivateSymbol && identical(_nativeSymbol, other._nativeSymbol);
 
   // TODO(jmesserly): is this equivalent to _nativeSymbol toString?
   toString() => 'Symbol("$_name")';
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart
index 35d314f..1a532de 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart
@@ -10,38 +10,45 @@
   static _current() {
     throw new UnsupportedError("Directory._current");
   }
+
   @patch
   static _setCurrent(path) {
     throw new UnsupportedError("Directory_SetCurrent");
   }
+
   @patch
   static _createTemp(String path) {
     throw new UnsupportedError("Directory._createTemp");
   }
+
   @patch
   static String _systemTemp() {
     throw new UnsupportedError("Directory._systemTemp");
   }
+
   @patch
   static _exists(String path) {
     throw new UnsupportedError("Directory._exists");
   }
+
   @patch
   static _create(String path) {
     throw new UnsupportedError("Directory._create");
   }
+
   @patch
   static _deleteNative(String path, bool recursive) {
     throw new UnsupportedError("Directory._deleteNative");
   }
+
   @patch
   static _rename(String path, String newPath) {
     throw new UnsupportedError("Directory._rename");
   }
+
   @patch
-  static void _fillWithDirectoryListing(
-      List<FileSystemEntity> list, String path, bool recursive,
-      bool followLinks) {
+  static void _fillWithDirectoryListing(List<FileSystemEntity> list,
+      String path, bool recursive, bool followLinks) {
     throw new UnsupportedError("Directory._fillWithDirectoryListing");
   }
 }
@@ -57,9 +64,7 @@
 @patch
 class _EventHandler {
   @patch
-  static void _sendData(Object sender,
-                        SendPort sendPort,
-                        int data) {
+  static void _sendData(Object sender, SendPort sendPort, int data) {
     throw new UnsupportedError("EventHandler._sendData");
   }
 }
@@ -78,10 +83,12 @@
   static _getType(String path, bool followLinks) {
     throw new UnsupportedError("FileSystemEntity._getType");
   }
+
   @patch
   static _identical(String path1, String path2) {
     throw new UnsupportedError("FileSystemEntity._identical");
   }
+
   @patch
   static _resolveSymbolicLinks(String path) {
     throw new UnsupportedError("FileSystemEntity._resolveSymbolicLinks");
@@ -94,62 +101,77 @@
   static _exists(String path) {
     throw new UnsupportedError("File._exists");
   }
+
   @patch
   static _create(String path) {
     throw new UnsupportedError("File._create");
   }
+
   @patch
   static _createLink(String path, String target) {
     throw new UnsupportedError("File._createLink");
   }
+
   @patch
   static _linkTarget(String path) {
     throw new UnsupportedError("File._linkTarget");
   }
+
   @patch
   static _deleteNative(String path) {
     throw new UnsupportedError("File._deleteNative");
   }
+
   @patch
   static _deleteLinkNative(String path) {
     throw new UnsupportedError("File._deleteLinkNative");
   }
+
   @patch
   static _rename(String oldPath, String newPath) {
     throw new UnsupportedError("File._rename");
   }
+
   @patch
   static _renameLink(String oldPath, String newPath) {
     throw new UnsupportedError("File._renameLink");
   }
+
   @patch
   static _copy(String oldPath, String newPath) {
     throw new UnsupportedError("File._copy");
   }
+
   @patch
   static _lengthFromPath(String path) {
     throw new UnsupportedError("File._lengthFromPath");
   }
+
   @patch
   static _lastModified(String path) {
     throw new UnsupportedError("File._lastModified");
   }
+
   @patch
   static _lastAccessed(String path) {
     throw new UnsupportedError("File._lastAccessed");
   }
+
   @patch
   static _setLastModified(String path, int millis) {
     throw new UnsupportedError("File._setLastModified");
   }
+
   @patch
   static _setLastAccessed(String path, int millis) {
     throw new UnsupportedError("File._setLastAccessed");
   }
+
   @patch
   static _open(String path, int mode) {
     throw new UnsupportedError("File._open");
   }
+
   @patch
   static int _openStdio(int fd) {
     throw new UnsupportedError("File._openStdio");
@@ -178,46 +200,57 @@
   static int _numberOfProcessors() {
     throw new UnsupportedError("Platform._numberOfProcessors");
   }
+
   @patch
   static String _pathSeparator() {
     throw new UnsupportedError("Platform._pathSeparator");
   }
+
   @patch
   static String _operatingSystem() {
     throw new UnsupportedError("Platform._operatingSystem");
   }
+
   @patch
   static _localHostname() {
     throw new UnsupportedError("Platform._localHostname");
   }
+
   @patch
   static _executable() {
     throw new UnsupportedError("Platform._executable");
   }
+
   @patch
   static _resolvedExecutable() {
     throw new UnsupportedError("Platform._resolvedExecutable");
   }
+
   @patch
   static List<String> _executableArguments() {
     throw new UnsupportedError("Platform._executableArguments");
   }
+
   @patch
   static String _packageRoot() {
     throw new UnsupportedError("Platform._packageRoot");
   }
+
   @patch
   static String _packageConfig() {
     throw new UnsupportedError("Platform._packageConfig");
   }
+
   @patch
   static _environment() {
     throw new UnsupportedError("Platform._environment");
   }
+
   @patch
   static String _version() {
     throw new UnsupportedError("Platform._version");
   }
+
   @patch
   static _ansiSupported() {
     throw new UnsupportedError("Platform._ansiSupported");
@@ -230,22 +263,27 @@
   static void _exit(int status) {
     throw new UnsupportedError("ProcessUtils._exit");
   }
+
   @patch
   static void _setExitCode(int status) {
     throw new UnsupportedError("ProcessUtils._setExitCode");
   }
+
   @patch
   static int _getExitCode() {
     throw new UnsupportedError("ProcessUtils._getExitCode");
   }
+
   @patch
   static void _sleep(int millis) {
     throw new UnsupportedError("ProcessUtils._sleep");
   }
+
   @patch
   static int _pid(Process process) {
     throw new UnsupportedError("ProcessUtils._pid");
   }
+
   @patch
   static Stream<ProcessSignal> _watchSignal(ProcessSignal signal) {
     throw new UnsupportedError("ProcessUtils._watchSignal");
@@ -255,46 +293,39 @@
 @patch
 class Process {
   @patch
-  static Future<Process> start(
-      String executable,
-      List<String> arguments,
+  static Future<Process> start(String executable, List<String> arguments,
       {String workingDirectory,
-       Map<String, String> environment,
-       bool includeParentEnvironment: true,
-       bool runInShell: false,
-       ProcessStartMode mode: ProcessStartMode.NORMAL}) {
+      Map<String, String> environment,
+      bool includeParentEnvironment: true,
+      bool runInShell: false,
+      ProcessStartMode mode: ProcessStartMode.NORMAL}) {
     throw new UnsupportedError("Process.start");
   }
 
   @patch
-  static Future<ProcessResult> run(
-      String executable,
-      List<String> arguments,
+  static Future<ProcessResult> run(String executable, List<String> arguments,
       {String workingDirectory,
-       Map<String, String> environment,
-       bool includeParentEnvironment: true,
-       bool runInShell: false,
-       Encoding stdoutEncoding: SYSTEM_ENCODING,
-       Encoding stderrEncoding: SYSTEM_ENCODING}) {
+      Map<String, String> environment,
+      bool includeParentEnvironment: true,
+      bool runInShell: false,
+      Encoding stdoutEncoding: SYSTEM_ENCODING,
+      Encoding stderrEncoding: SYSTEM_ENCODING}) {
     throw new UnsupportedError("Process.run");
   }
 
   @patch
-  static ProcessResult runSync(
-      String executable,
-      List<String> arguments,
+  static ProcessResult runSync(String executable, List<String> arguments,
       {String workingDirectory,
-       Map<String, String> environment,
-       bool includeParentEnvironment: true,
-       bool runInShell: false,
-       Encoding stdoutEncoding: SYSTEM_ENCODING,
-       Encoding stderrEncoding: SYSTEM_ENCODING}) {
+      Map<String, String> environment,
+      bool includeParentEnvironment: true,
+      bool runInShell: false,
+      Encoding stdoutEncoding: SYSTEM_ENCODING,
+      Encoding stderrEncoding: SYSTEM_ENCODING}) {
     throw new UnsupportedError("Process.runSync");
   }
 
   @patch
-  static bool killPid(
-      int pid, [ProcessSignal signal = ProcessSignal.SIGTERM]) {
+  static bool killPid(int pid, [ProcessSignal signal = ProcessSignal.SIGTERM]) {
     throw new UnsupportedError("Process.killPid");
   }
 }
@@ -305,27 +336,32 @@
   static InternetAddress get LOOPBACK_IP_V4 {
     throw new UnsupportedError("InternetAddress.LOOPBACK_IP_V4");
   }
+
   @patch
   static InternetAddress get LOOPBACK_IP_V6 {
     throw new UnsupportedError("InternetAddress.LOOPBACK_IP_V6");
   }
+
   @patch
   static InternetAddress get ANY_IP_V4 {
     throw new UnsupportedError("InternetAddress.ANY_IP_V4");
   }
+
   @patch
   static InternetAddress get ANY_IP_V6 {
     throw new UnsupportedError("InternetAddress.ANY_IP_V6");
   }
+
   @patch
   factory InternetAddress(String address) {
     throw new UnsupportedError("InternetAddress");
   }
   @patch
-  static Future<List<InternetAddress>> lookup(
-      String host, {InternetAddressType type: InternetAddressType.ANY}) {
+  static Future<List<InternetAddress>> lookup(String host,
+      {InternetAddressType type: InternetAddressType.ANY}) {
     throw new UnsupportedError("InternetAddress.lookup");
   }
+
   @patch
   static InternetAddress _cloneWithNewHost(
       InternetAddress address, String host) {
@@ -339,9 +375,10 @@
   static bool get listSupported {
     throw new UnsupportedError("NetworkInterface.listSupported");
   }
+
   @patch
-  static Future<List<NetworkInterface>> list({
-      bool includeLoopback: false,
+  static Future<List<NetworkInterface>> list(
+      {bool includeLoopback: false,
       bool includeLinkLocal: false,
       InternetAddressType type: InternetAddressType.ANY}) {
     throw new UnsupportedError("NetworkInterface.list");
@@ -351,11 +388,8 @@
 @patch
 class RawServerSocket {
   @patch
-  static Future<RawServerSocket> bind(address,
-                                      int port,
-                                      {int backlog: 0,
-                                       bool v6Only: false,
-                                       bool shared: false}) {
+  static Future<RawServerSocket> bind(address, int port,
+      {int backlog: 0, bool v6Only: false, bool shared: false}) {
     throw new UnsupportedError("RawServerSocket.bind");
   }
 }
@@ -363,11 +397,8 @@
 @patch
 class ServerSocket {
   @patch
-  static Future<ServerSocket> bind(address,
-                                   int port,
-                                   {int backlog: 0,
-                                    bool v6Only: false,
-                                    bool shared: false}) {
+  static Future<ServerSocket> bind(address, int port,
+      {int backlog: 0, bool v6Only: false, bool shared: false}) {
     throw new UnsupportedError("ServerSocket.bind");
   }
 }
@@ -425,8 +456,8 @@
 @patch
 class RawDatagramSocket {
   @patch
-  static Future<RawDatagramSocket> bind(
-      host, int port, {bool reuseAddress: true}) {
+  static Future<RawDatagramSocket> bind(host, int port,
+      {bool reuseAddress: true}) {
     throw new UnsupportedError("RawDatagramSocket.bind");
   }
 }
@@ -445,14 +476,17 @@
   static Stdin _getStdioInputStream() {
     throw new UnsupportedError("StdIOUtils._getStdioInputStream");
   }
+
   @patch
   static _getStdioOutputStream(int fd) {
     throw new UnsupportedError("StdIOUtils._getStdioOutputStream");
   }
+
   @patch
   static int _socketType(Socket socket) {
     throw new UnsupportedError("StdIOUtils._socketType");
   }
+
   @patch
   static _getStdioHandleType(int fd) {
     throw new UnsupportedError("StdIOUtils._getStdioHandleType");
@@ -478,15 +512,14 @@
 @patch
 class _Filter {
   @patch
-  static _Filter _newZLibDeflateFilter(bool gzip, int level,
-                                       int windowBits, int memLevel,
-                                       int strategy,
-                                       List<int> dictionary, bool raw) {
+  static _Filter _newZLibDeflateFilter(bool gzip, int level, int windowBits,
+      int memLevel, int strategy, List<int> dictionary, bool raw) {
     throw new UnsupportedError("_newZLibDeflateFilter");
   }
+
   @patch
-  static _Filter _newZLibInflateFilter(int windowBits,
-                                       List<int> dictionary, bool raw) {
+  static _Filter _newZLibInflateFilter(
+      int windowBits, List<int> dictionary, bool raw) {
     throw new UnsupportedError("_newZLibInflateFilter");
   }
 }
@@ -497,18 +530,22 @@
   int readByteSync() {
     throw new UnsupportedError("Stdin.readByteSync");
   }
+
   @patch
   bool get echoMode {
     throw new UnsupportedError("Stdin.echoMode");
   }
+
   @patch
   void set echoMode(bool enabled) {
     throw new UnsupportedError("Stdin.echoMode");
   }
+
   @patch
   bool get lineMode {
     throw new UnsupportedError("Stdin.lineMode");
   }
+
   @patch
   void set lineMode(bool enabled) {
     throw new UnsupportedError("Stdin.lineMode");
@@ -521,10 +558,12 @@
   bool _hasTerminal(int fd) {
     throw new UnsupportedError("Stdout.hasTerminal");
   }
+
   @patch
   int _terminalColumns(int fd) {
     throw new UnsupportedError("Stdout.terminalColumns");
   }
+
   @patch
   int _terminalLines(int fd) {
     throw new UnsupportedError("Stdout.terminalLines");
@@ -538,6 +577,7 @@
       String path, int events, bool recursive) {
     throw new UnsupportedError("_FileSystemWatcher.watch");
   }
+
   @patch
   static bool get isSupported {
     throw new UnsupportedError("_FileSystemWatcher.isSupported");
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
index 637943b..8bd8d1a 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
@@ -5,10 +5,8 @@
 // Patch file for the dart:isolate library.
 
 import 'dart:_js_helper' show patch;
-import 'dart:_isolate_helper' show CapabilityImpl,
-                                   IsolateNatives,
-                                   ReceivePortImpl,
-                                   RawReceivePortImpl;
+import 'dart:_isolate_helper'
+    show CapabilityImpl, IsolateNatives, ReceivePortImpl, RawReceivePortImpl;
 
 typedef _UnaryFunction(arg);
 
@@ -41,11 +39,12 @@
 
   @patch
   static Future<Isolate> spawn(void entryPoint(message), var message,
-                               {bool paused: false, bool errorsAreFatal,
-                                SendPort onExit, SendPort onError}) {
-    bool forcePause = (errorsAreFatal != null) ||
-                      (onExit != null) ||
-                      (onError != null);
+      {bool paused: false,
+      bool errorsAreFatal,
+      SendPort onExit,
+      SendPort onError}) {
+    bool forcePause =
+        (errorsAreFatal != null) || (onExit != null) || (onError != null);
     try {
       // Check for the type of `entryPoint` on the spawning isolate to make
       // error-handling easier.
@@ -55,53 +54,50 @@
       // TODO: Consider passing the errorsAreFatal/onExit/onError values
       //       as arguments to the internal spawnUri instead of setting
       //       them after the isolate has been created.
-      return IsolateNatives.spawnFunction(entryPoint, message,
-                                          paused || forcePause)
+      return IsolateNatives
+          .spawnFunction(entryPoint, message, paused || forcePause)
           .then((msg) {
-            var isolate = new Isolate(msg[1],
-                                      pauseCapability: msg[2],
-                                      terminateCapability: msg[3]);
-            if (forcePause) {
-              if (errorsAreFatal != null) {
-                isolate.setErrorsFatal(errorsAreFatal);
-              }
-              if (onExit != null) {
-                isolate.addOnExitListener(onExit);
-              }
-              if (onError != null) {
-                isolate.addErrorListener(onError);
-              }
-              if (!paused) {
-                isolate.resume(isolate.pauseCapability);
-              }
-            }
-            return isolate;
-          });
+        var isolate = new Isolate(msg[1],
+            pauseCapability: msg[2], terminateCapability: msg[3]);
+        if (forcePause) {
+          if (errorsAreFatal != null) {
+            isolate.setErrorsFatal(errorsAreFatal);
+          }
+          if (onExit != null) {
+            isolate.addOnExitListener(onExit);
+          }
+          if (onError != null) {
+            isolate.addErrorListener(onError);
+          }
+          if (!paused) {
+            isolate.resume(isolate.pauseCapability);
+          }
+        }
+        return isolate;
+      });
     } catch (e, st) {
       return new Future<Isolate>.error(e, st);
     }
   }
 
   @patch
-  static Future<Isolate> spawnUri(
-      Uri uri, List<String> args, var message,
+  static Future<Isolate> spawnUri(Uri uri, List<String> args, var message,
       {bool paused: false,
-       SendPort onExit,
-       SendPort onError,
-       bool errorsAreFatal,
-       bool checked,
-       Map<String, String> environment,
-       Uri packageRoot,
-       Uri packageConfig,
-       bool automaticPackageResolution: false}) {
+      SendPort onExit,
+      SendPort onError,
+      bool errorsAreFatal,
+      bool checked,
+      Map<String, String> environment,
+      Uri packageRoot,
+      Uri packageConfig,
+      bool automaticPackageResolution: false}) {
     if (environment != null) throw new UnimplementedError("environment");
     if (packageRoot != null) throw new UnimplementedError("packageRoot");
     if (packageConfig != null) throw new UnimplementedError("packageConfig");
     // TODO(lrn): Figure out how to handle the automaticPackageResolution
     // parameter.
-    bool forcePause = (errorsAreFatal != null) ||
-                      (onExit != null) ||
-                      (onError != null);
+    bool forcePause =
+        (errorsAreFatal != null) || (onExit != null) || (onError != null);
     try {
       if (args is List<String>) {
         for (int i = 0; i < args.length; i++) {
@@ -116,27 +112,27 @@
       // TODO: Consider passing the errorsAreFatal/onExit/onError values
       //       as arguments to the internal spawnUri instead of setting
       //       them after the isolate has been created.
-      return IsolateNatives.spawnUri(uri, args, message, paused || forcePause)
+      return IsolateNatives
+          .spawnUri(uri, args, message, paused || forcePause)
           .then((msg) {
-            var isolate = new Isolate(msg[1],
-                                      pauseCapability: msg[2],
-                                      terminateCapability: msg[3]);
-            if (forcePause) {
-              if (errorsAreFatal != null) {
-                isolate.setErrorsFatal(errorsAreFatal);
-              }
-              if (onExit != null) {
-                isolate.addOnExitListener(onExit);
-              }
-              if (onError != null) {
-                isolate.addErrorListener(onError);
-              }
-              if (!paused) {
-                isolate.resume(isolate.pauseCapability);
-              }
-            }
-            return isolate;
-          });
+        var isolate = new Isolate(msg[1],
+            pauseCapability: msg[2], terminateCapability: msg[3]);
+        if (forcePause) {
+          if (errorsAreFatal != null) {
+            isolate.setErrorsFatal(errorsAreFatal);
+          }
+          if (onExit != null) {
+            isolate.addOnExitListener(onExit);
+          }
+          if (onError != null) {
+            isolate.addErrorListener(onError);
+          }
+          if (!paused) {
+            isolate.resume(isolate.pauseCapability);
+          }
+        }
+        return isolate;
+      });
     } catch (e, st) {
       return new Future<Isolate>.error(e, st);
     }
@@ -145,17 +141,17 @@
   @patch
   void _pause(Capability resumeCapability) {
     var message = new List(3)
-        ..[0] = "pause"
-        ..[1] = pauseCapability
-        ..[2] = resumeCapability;
+      ..[0] = "pause"
+      ..[1] = pauseCapability
+      ..[2] = resumeCapability;
     controlPort.send(message);
   }
 
   @patch
   void resume(Capability resumeCapability) {
     var message = new List(2)
-        ..[0] = "resume"
-        ..[1] = resumeCapability;
+      ..[0] = "resume"
+      ..[1] = resumeCapability;
     controlPort.send(message);
   }
 
@@ -164,26 +160,26 @@
     // TODO(lrn): Can we have an internal method that checks if the receiving
     // isolate of a SendPort is still alive?
     var message = new List(3)
-        ..[0] = "add-ondone"
-        ..[1] = responsePort
-        ..[2] = response;
+      ..[0] = "add-ondone"
+      ..[1] = responsePort
+      ..[2] = response;
     controlPort.send(message);
   }
 
   @patch
   void removeOnExitListener(SendPort responsePort) {
     var message = new List(2)
-        ..[0] = "remove-ondone"
-        ..[1] = responsePort;
+      ..[0] = "remove-ondone"
+      ..[1] = responsePort;
     controlPort.send(message);
   }
 
   @patch
   void setErrorsFatal(bool errorsAreFatal) {
     var message = new List(3)
-        ..[0] = "set-errors-fatal"
-        ..[1] = terminateCapability
-        ..[2] = errorsAreFatal;
+      ..[0] = "set-errors-fatal"
+      ..[1] = terminateCapability
+      ..[2] = errorsAreFatal;
     controlPort.send(message);
   }
 
@@ -193,29 +189,28 @@
   }
 
   @patch
-  void ping(SendPort responsePort, {Object response,
-                                    int priority: IMMEDIATE}) {
+  void ping(SendPort responsePort, {Object response, int priority: IMMEDIATE}) {
     var message = new List(4)
-        ..[0] = "ping"
-        ..[1] = responsePort
-        ..[2] = priority
-        ..[3] = response;
+      ..[0] = "ping"
+      ..[1] = responsePort
+      ..[2] = priority
+      ..[3] = response;
     controlPort.send(message);
   }
 
   @patch
   void addErrorListener(SendPort port) {
     var message = new List(2)
-        ..[0] = "getErrors"
-        ..[1] = port;
+      ..[0] = "getErrors"
+      ..[1] = port;
     controlPort.send(message);
   }
 
   @patch
   void removeErrorListener(SendPort port) {
     var message = new List(2)
-        ..[0] = "stopErrors"
-        ..[1] = port;
+      ..[0] = "stopErrors"
+      ..[1] = port;
     controlPort.send(message);
   }
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/math_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/math_patch.dart
index 73a6723..d727e22 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/math_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/math_patch.dart
@@ -8,52 +8,43 @@
 import 'dart:typed_data' show ByteData;
 
 @patch
-num/*=T*/ min/*<T extends num>*/(num/*=T*/ a, num/*=T*/ b)
-  => JS('num', r'Math.min(#, #)', checkNum(a), checkNum(b)) as num/*=T*/;
+num/*=T*/ min/*<T extends num>*/(num/*=T*/ a, num/*=T*/ b) =>
+    JS('num', r'Math.min(#, #)', checkNum(a), checkNum(b)) as num/*=T*/;
 
 @patch
-num/*=T*/ max/*<T extends num>*/(num/*=T*/ a, num/*=T*/ b)
-  => JS('num', r'Math.max(#, #)', checkNum(a), checkNum(b)) as num/*=T*/;
+num/*=T*/ max/*<T extends num>*/(num/*=T*/ a, num/*=T*/ b) =>
+    JS('num', r'Math.max(#, #)', checkNum(a), checkNum(b)) as num/*=T*/;
 
 @patch
-double sqrt(num x)
-  => JS('num', r'Math.sqrt(#)', checkNum(x));
+double sqrt(num x) => JS('num', r'Math.sqrt(#)', checkNum(x));
 
 @patch
-double sin(num x)
-  => JS('num', r'Math.sin(#)', checkNum(x));
+double sin(num x) => JS('num', r'Math.sin(#)', checkNum(x));
 
 @patch
-double cos(num x)
-  => JS('num', r'Math.cos(#)', checkNum(x));
+double cos(num x) => JS('num', r'Math.cos(#)', checkNum(x));
 
 @patch
-double tan(num x)
-  => JS('num', r'Math.tan(#)', checkNum(x));
+double tan(num x) => JS('num', r'Math.tan(#)', checkNum(x));
 
 @patch
-double acos(num x)
-  => JS('num', r'Math.acos(#)', checkNum(x));
+double acos(num x) => JS('num', r'Math.acos(#)', checkNum(x));
 
 @patch
-double asin(num x)
-  => JS('num', r'Math.asin(#)', checkNum(x));
+double asin(num x) => JS('num', r'Math.asin(#)', checkNum(x));
 
 @patch
-double atan(num x)
-  => JS('num', r'Math.atan(#)', checkNum(x));
+double atan(num x) => JS('num', r'Math.atan(#)', checkNum(x));
 
 @patch
-double atan2(num a, num b)
-  => JS('num', r'Math.atan2(#, #)', checkNum(a), checkNum(b));
+double atan2(num a, num b) =>
+    JS('num', r'Math.atan2(#, #)', checkNum(a), checkNum(b));
 
 @patch
-double exp(num x)
-  => JS('num', r'Math.exp(#)', checkNum(x));
+double exp(num x) => JS('num', r'Math.exp(#)', checkNum(x));
 
 @patch
-double log(num x)
-  => JS('num', r'Math.log(#)', checkNum(x));
+double log(num x) => JS('num', r'Math.log(#)', checkNum(x));
 
 @patch
 num pow(num x, num exponent) {
@@ -99,7 +90,6 @@
   bool nextBool() => JS("bool", "Math.random() < 0.5");
 }
 
-
 class _Random implements Random {
   // Constants used by the algorithm or masking.
   static const double _POW2_53_D = 1.0 * (0x20000000000000);
@@ -202,9 +192,9 @@
   //   _hi = state >> 32;
   void _nextState() {
     // Simulate (0xFFFFDA61 * lo + hi) without overflowing 53 bits.
-    int tmpHi = 0xFFFF0000 * _lo;  // At most 48 bits of significant result.
-    int tmpHiLo = tmpHi & _MASK32;             // Get the lower 32 bits.
-    int tmpHiHi = tmpHi - tmpHiLo;            // And just the upper 32 bits.
+    int tmpHi = 0xFFFF0000 * _lo; // At most 48 bits of significant result.
+    int tmpHiLo = tmpHi & _MASK32; // Get the lower 32 bits.
+    int tmpHiHi = tmpHi - tmpHiLo; // And just the upper 32 bits.
     int tmpLo = 0xDA61 * _lo;
     int tmpLoLo = tmpLo & _MASK32;
     int tmpLoHi = tmpLo - tmpLoLo;
@@ -251,7 +241,6 @@
   }
 }
 
-
 class _JSSecureRandom implements Random {
   // Reused buffer with room enough for a double.
   final _buffer = new ByteData(8);
@@ -271,7 +260,7 @@
   /// Fill _buffer from [start] to `start + length` with random bytes.
   void _getRandomBytes(int start, int length) {
     JS("void", "crypto.getRandomValues(#)",
-       _buffer.buffer.asUint8List(start, length));
+        _buffer.buffer.asUint8List(start, length));
   }
 
   bool nextBool() {
@@ -294,7 +283,7 @@
     // The getFloat64 method is big-endian as default.
     double result = _buffer.getFloat64(0) - 1.0;
     if (highByte & 0x10 != 0) {
-      result += 1.1102230246251565e-16;  // pow(2,-53).
+      result += 1.1102230246251565e-16; // pow(2,-53).
     }
     return result;
   }
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/mirrors_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/mirrors_patch.dart
index eb6319c..b2c765f 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/mirrors_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/mirrors_patch.dart
@@ -11,8 +11,8 @@
 class MirrorSystem {
   @patch
   LibraryMirror findLibrary(Symbol libraryName) {
-    return libraries.values.singleWhere(
-        (library) => library.simpleName == libraryName);
+    return libraries.values
+        .singleWhere((library) => library.simpleName == libraryName);
   }
 
   @patch
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/typed_data_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/typed_data_patch.dart
index a7f13ab..615c9da 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/typed_data_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/typed_data_patch.dart
@@ -2,151 +2,189 @@
 // for 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:_js_helper' show patch;
 import 'dart:_native_typed_data';
 
-@patch class ByteData {
-  @patch factory ByteData(int length) = NativeByteData;
+@patch
+class ByteData {
+  @patch
+  factory ByteData(int length) = NativeByteData;
 }
 
+@patch
+class Float32List {
+  @patch
+  factory Float32List(int length) = NativeFloat32List;
 
-@patch class Float32List {
-  @patch factory Float32List(int length) = NativeFloat32List;
-
-  @patch factory Float32List.fromList(List<double> elements) =
+  @patch
+  factory Float32List.fromList(List<double> elements) =
       NativeFloat32List.fromList;
 }
 
+@patch
+class Float64List {
+  @patch
+  factory Float64List(int length) = NativeFloat64List;
 
-@patch class Float64List {
-  @patch factory Float64List(int length) = NativeFloat64List;
-
-  @patch factory Float64List.fromList(List<double> elements) =
+  @patch
+  factory Float64List.fromList(List<double> elements) =
       NativeFloat64List.fromList;
 }
 
+@patch
+class Int16List {
+  @patch
+  factory Int16List(int length) = NativeInt16List;
 
-@patch class Int16List {
-  @patch factory Int16List(int length) = NativeInt16List;
-
-  @patch factory Int16List.fromList(List<int> elements) =
-      NativeInt16List.fromList;
+  @patch
+  factory Int16List.fromList(List<int> elements) = NativeInt16List.fromList;
 }
 
-@patch class Int32List {
-  @patch factory Int32List(int length) = NativeInt32List;
+@patch
+class Int32List {
+  @patch
+  factory Int32List(int length) = NativeInt32List;
 
-  @patch factory Int32List.fromList(List<int> elements) =
-      NativeInt32List.fromList;
+  @patch
+  factory Int32List.fromList(List<int> elements) = NativeInt32List.fromList;
 }
 
+@patch
+class Int8List {
+  @patch
+  factory Int8List(int length) = NativeInt8List;
 
-@patch class Int8List {
-  @patch factory Int8List(int length) = NativeInt8List;
-
-  @patch factory Int8List.fromList(List<int> elements) =
-      NativeInt8List.fromList;
+  @patch
+  factory Int8List.fromList(List<int> elements) = NativeInt8List.fromList;
 }
 
+@patch
+class Uint32List {
+  @patch
+  factory Uint32List(int length) = NativeUint32List;
 
-@patch class Uint32List {
-  @patch factory Uint32List(int length) = NativeUint32List;
-
-  @patch factory Uint32List.fromList(List<int> elements) =
-      NativeUint32List.fromList;
+  @patch
+  factory Uint32List.fromList(List<int> elements) = NativeUint32List.fromList;
 }
 
+@patch
+class Uint16List {
+  @patch
+  factory Uint16List(int length) = NativeUint16List;
 
-@patch class Uint16List {
-  @patch factory Uint16List(int length) = NativeUint16List;
-
-  @patch factory Uint16List.fromList(List<int> elements) =
-      NativeUint16List.fromList;
+  @patch
+  factory Uint16List.fromList(List<int> elements) = NativeUint16List.fromList;
 }
 
+@patch
+class Uint8ClampedList {
+  @patch
+  factory Uint8ClampedList(int length) = NativeUint8ClampedList;
 
-@patch class Uint8ClampedList {
-  @patch factory Uint8ClampedList(int length) = NativeUint8ClampedList;
-
-  @patch factory Uint8ClampedList.fromList(List<int> elements) =
+  @patch
+  factory Uint8ClampedList.fromList(List<int> elements) =
       NativeUint8ClampedList.fromList;
 }
 
+@patch
+class Uint8List {
+  @patch
+  factory Uint8List(int length) = NativeUint8List;
 
-@patch class Uint8List {
-  @patch factory Uint8List(int length) = NativeUint8List;
-
-  @patch factory Uint8List.fromList(List<int> elements) =
-      NativeUint8List.fromList;
+  @patch
+  factory Uint8List.fromList(List<int> elements) = NativeUint8List.fromList;
 }
 
-
-@patch class Int64List {
-  @patch factory Int64List(int length) {
+@patch
+class Int64List {
+  @patch
+  factory Int64List(int length) {
     throw new UnsupportedError("Int64List not supported by dart2js.");
   }
 
-  @patch factory Int64List.fromList(List<int> elements) {
+  @patch
+  factory Int64List.fromList(List<int> elements) {
     throw new UnsupportedError("Int64List not supported by dart2js.");
   }
 }
 
-
-@patch class Uint64List {
-  @patch factory Uint64List(int length) {
+@patch
+class Uint64List {
+  @patch
+  factory Uint64List(int length) {
     throw new UnsupportedError("Uint64List not supported by dart2js.");
   }
 
-  @patch factory Uint64List.fromList(List<int> elements) {
+  @patch
+  factory Uint64List.fromList(List<int> elements) {
     throw new UnsupportedError("Uint64List not supported by dart2js.");
   }
 }
 
-@patch class Int32x4List {
-  @patch factory Int32x4List(int length) = NativeInt32x4List;
+@patch
+class Int32x4List {
+  @patch
+  factory Int32x4List(int length) = NativeInt32x4List;
 
-  @patch factory Int32x4List.fromList(List<Int32x4> elements) =
+  @patch
+  factory Int32x4List.fromList(List<Int32x4> elements) =
       NativeInt32x4List.fromList;
 }
 
-@patch class Float32x4List {
-  @patch factory Float32x4List(int length) = NativeFloat32x4List;
+@patch
+class Float32x4List {
+  @patch
+  factory Float32x4List(int length) = NativeFloat32x4List;
 
-  @patch factory Float32x4List.fromList(List<Float32x4> elements) =
+  @patch
+  factory Float32x4List.fromList(List<Float32x4> elements) =
       NativeFloat32x4List.fromList;
 }
 
-@patch class Float64x2List {
-  @patch factory Float64x2List(int length) = NativeFloat64x2List;
+@patch
+class Float64x2List {
+  @patch
+  factory Float64x2List(int length) = NativeFloat64x2List;
 
-  @patch factory Float64x2List.fromList(List<Float64x2> elements) =
+  @patch
+  factory Float64x2List.fromList(List<Float64x2> elements) =
       NativeFloat64x2List.fromList;
 }
 
-@patch class Float32x4 {
-  @patch factory Float32x4(double x, double y, double z, double w) =
-      NativeFloat32x4;
-  @patch factory Float32x4.splat(double v) = NativeFloat32x4.splat;
-  @patch factory Float32x4.zero() = NativeFloat32x4.zero;
-  @patch factory Float32x4.fromInt32x4Bits(Int32x4 x) =
+@patch
+class Float32x4 {
+  @patch
+  factory Float32x4(double x, double y, double z, double w) = NativeFloat32x4;
+  @patch
+  factory Float32x4.splat(double v) = NativeFloat32x4.splat;
+  @patch
+  factory Float32x4.zero() = NativeFloat32x4.zero;
+  @patch
+  factory Float32x4.fromInt32x4Bits(Int32x4 x) =
       NativeFloat32x4.fromInt32x4Bits;
-  @patch factory Float32x4.fromFloat64x2(Float64x2 v) =
-      NativeFloat32x4.fromFloat64x2;
+  @patch
+  factory Float32x4.fromFloat64x2(Float64x2 v) = NativeFloat32x4.fromFloat64x2;
 }
 
-@patch class Int32x4 {
-  @patch factory Int32x4(int x, int y, int z, int w) = NativeInt32x4;
-  @patch factory Int32x4.bool(bool x, bool y, bool z, bool w) =
-      NativeInt32x4.bool;
-  @patch factory Int32x4.fromFloat32x4Bits(Float32x4 x) =
+@patch
+class Int32x4 {
+  @patch
+  factory Int32x4(int x, int y, int z, int w) = NativeInt32x4;
+  @patch
+  factory Int32x4.bool(bool x, bool y, bool z, bool w) = NativeInt32x4.bool;
+  @patch
+  factory Int32x4.fromFloat32x4Bits(Float32x4 x) =
       NativeInt32x4.fromFloat32x4Bits;
 }
 
-@patch class Float64x2 {
-  @patch factory Float64x2(double x, double y) = NativeFloat64x2;
-  @patch factory Float64x2.splat(double v) = NativeFloat64x2.splat;
-  @patch factory Float64x2.zero() = NativeFloat64x2.zero;
-  @patch factory Float64x2.fromFloat32x4(Float32x4 v) =
-      NativeFloat64x2.fromFloat32x4;
+@patch
+class Float64x2 {
+  @patch
+  factory Float64x2(double x, double y) = NativeFloat64x2;
+  @patch
+  factory Float64x2.splat(double v) = NativeFloat64x2.splat;
+  @patch
+  factory Float64x2.zero() = NativeFloat64x2.zero;
+  @patch
+  factory Float64x2.fromFloat32x4(Float32x4 v) = NativeFloat64x2.fromFloat32x4;
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
index b432d3e..ca60086 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
@@ -15,40 +15,52 @@
   _ignoreWhitelistedErrors = flag;
 }
 
-throwCastError(object, actual, type) => JS('', '''(() => {
+throwCastError(object, actual, type) => JS(
+    '',
+    '''(() => {
   var found = $typeName($actual);
   var expected = $typeName($type);
   if ($_trapRuntimeErrors) debugger;
   $throw_(new $CastErrorImplementation($object, found, expected));
 })()''');
 
-throwTypeError(object, actual, type) => JS('', '''(() => {
+throwTypeError(object, actual, type) => JS(
+    '',
+    '''(() => {
   var found = $typeName($actual);
   var expected = $typeName($type);
   if ($_trapRuntimeErrors) debugger;
   $throw_(new $TypeErrorImplementation($object, found, expected));
 })()''');
 
-throwStrongModeCastError(object, actual, type) => JS('', '''(() => {
+throwStrongModeCastError(object, actual, type) => JS(
+    '',
+    '''(() => {
   var found = $typeName($actual);
   var expected = $typeName($type);
   if ($_trapRuntimeErrors) debugger;
   $throw_(new $StrongModeCastError($object, found, expected));
 })()''');
 
-throwStrongModeTypeError(object, actual, type) => JS('', '''(() => {
+throwStrongModeTypeError(object, actual, type) => JS(
+    '',
+    '''(() => {
   var found = $typeName($actual);
   var expected = $typeName($type);
   if ($_trapRuntimeErrors) debugger;
   $throw_(new $StrongModeTypeError($object, found, expected));
 })()''');
 
-throwUnimplementedError(message) => JS('', '''(() => {
+throwUnimplementedError(message) => JS(
+    '',
+    '''(() => {
   if ($_trapRuntimeErrors) debugger;
   $throw_(new $UnimplementedError($message));
 })()''');
 
-throwAssertionError([message]) => JS('', '''(() => {
+throwAssertionError([message]) => JS(
+    '',
+    '''(() => {
   if ($_trapRuntimeErrors) debugger;
   let error = $message != null
         ? new $AssertionErrorWithMessage($message())
@@ -56,7 +68,9 @@
   $throw_(error);
 })()''');
 
-throwNullValueError() => JS('', '''(() => {
+throwNullValueError() => JS(
+    '',
+    '''(() => {
   // TODO(vsm): Per spec, we should throw an NSM here.  Technically, we ought
   // to thread through method info, but that uglifies the code and can't
   // actually be queried ... it only affects how the error is printed.
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
index 090ec26..b90e2cc 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart
@@ -14,13 +14,17 @@
 final _jsIterator = JS('', 'Symbol("_jsIterator")');
 final _current = JS('', 'Symbol("_current")');
 
-syncStar(gen, E, @rest args) => JS('', '''(() => {
+syncStar(gen, E, @rest args) => JS(
+    '',
+    '''(() => {
   const SyncIterable_E = ${getGenericClass(SyncIterable)}($E);
   return new SyncIterable_E($gen, $args);
 })()''');
 
 @JSExportName('async')
-async_(gen, T, @rest args) => JS('', '''(() => {
+async_(gen, T, @rest args) => JS(
+    '',
+    '''(() => {
   let iter;
   function onValue(res) {
     if (res === void 0) res = null;
@@ -77,7 +81,9 @@
 //    }
 //
 // TODO(ochafik): Port back to Dart (which it used to be in the past).
-final _AsyncStarStreamController = JS('', '''
+final _AsyncStarStreamController = JS(
+    '',
+    '''
   class _AsyncStarStreamController {
     constructor(generator, T, args) {
       this.isAdding = false;
@@ -219,6 +225,8 @@
 
 /// Returns a Stream of T implemented by an async* function. */
 ///
-asyncStar(gen, T, @rest args) => JS('', '''(() => {
+asyncStar(gen, T, @rest args) => JS(
+    '',
+    '''(() => {
   return new $_AsyncStarStreamController($gen, $T, $args).controller.stream;
 })()''');
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
index eb3b1e0..b0ca189 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
@@ -35,7 +35,9 @@
 // Note, native extensions are registered onto types in dart.global.
 // This polyfill needs to run before the corresponding dart:html code is run.
 @JSExportName('global')
-final global_ = JS('', '''
+final global_ = JS(
+    '',
+    '''
   function () {
     if (typeof NodeList !== "undefined") {
       // TODO(vsm): Do we still need these?
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
index 154410e..76b6a25 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
@@ -49,7 +49,9 @@
 /// After initial get or set, it will replace itself with a value property.
 // TODO(jmesserly): reusing descriptor objects has been shown to improve
 // performance in other projects (e.g. webcomponents.js ShadowDOM polyfill).
-defineLazyProperty(to, name, desc) => JS('', '''(() => {
+defineLazyProperty(to, name, desc) => JS(
+    '',
+    '''(() => {
   let init = $desc.get;
     let value = null;
 
@@ -75,7 +77,9 @@
     return $defineProperty($to, $name, $desc);
 })()''');
 
-void defineLazy(to, from) => JS('', '''(() => {
+void defineLazy(to, from) => JS(
+    '',
+    '''(() => {
   for (let name of $getOwnNamesAndSymbols($from)) {
     $defineLazyProperty($to, name, $getOwnPropertyDescriptor($from, name));
   }
@@ -85,7 +89,9 @@
   return defineLazyProperty(obj, name, JS('', '{get: #}', getter));
 }
 
-copyTheseProperties(to, from, names) => JS('', '''(() => {
+copyTheseProperties(to, from, names) => JS(
+    '',
+    '''(() => {
   for (let i = 0; i < $names.length; ++i) {
     $copyProperty($to, $from, $names[i]);
   }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/foreign_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/foreign_helper.dart
index b738e81..c8dcc6b 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/foreign_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/foreign_helper.dart
@@ -107,8 +107,18 @@
 // Add additional optional arguments if needed. The method is treated internally
 // as a variable argument method.
 JS(String typeDescription, String codeTemplate,
-    [arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11])
-{}
+    [arg0,
+    arg1,
+    arg2,
+    arg3,
+    arg4,
+    arg5,
+    arg6,
+    arg7,
+    arg8,
+    arg9,
+    arg10,
+    arg11]) {}
 
 /// Annotates the compiled Js name for fields and methods.
 /// Similar behaviour to `JS` from `package:js/js.dart` (but usable from runtime
@@ -257,7 +267,9 @@
  * TODO(sra): Replace this hack with something to mark the volatile or
  * externally initialized elements.
  */
-void JS_EFFECT(Function code) { code(null); }
+void JS_EFFECT(Function code) {
+  code(null);
+}
 
 /**
  * Use this class for creating constants that hold JavaScript code.
@@ -294,7 +306,6 @@
 const _Rest rest = const _Rest();
 
 dynamic spread(args) {
-  throw new StateError(
-      'The spread function cannot be called, '
+  throw new StateError('The spread function cannot be called, '
       'it should be compiled away.');
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart b/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
index 4c84cc9..124ee63 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
@@ -46,7 +46,7 @@
  */
 abstract class JSIndexable<E> {
   int get length;
-  E operator[](int index);
+  E operator [](int index);
 }
 
 /**
@@ -55,9 +55,7 @@
  *
  * This is the type that should be exported by a JavaScript interop library.
  */
-abstract class JSObject {
-}
-
+abstract class JSObject {}
 
 /**
  * Interceptor base class for JavaScript objects not recognized as some more
@@ -72,7 +70,6 @@
   Type get runtimeType => JSObject;
 }
 
-
 /**
  * Interceptor for plain JavaScript objects created as JavaScript object
  * literals or `new Object()`.
@@ -81,7 +78,6 @@
   const PlainJavaScriptObject();
 }
 
-
 /**
  * Interceptor for unclassified JavaScript objects, typically objects with a
  * non-trivial prototype chain.
@@ -99,7 +95,7 @@
 // Warning: calls to these methods need to be removed before custom elements
 // and cross-frame dom objects behave correctly in ddc.
 // See https://github.com/dart-lang/sdk/issues/28326
-findInterceptorConstructorForType(Type type) { }
-findConstructorForNativeSubclassType(Type type, String name) { }
+findInterceptorConstructorForType(Type type) {}
+findConstructorForNativeSubclassType(Type type, String name) {}
 getNativeInterceptor(object) {}
 setDispatchProperty(object, value) {}
diff --git a/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
index a6310d5..971840f 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
@@ -4,41 +4,41 @@
 
 library dart._isolate_helper;
 
-import 'dart:_js_embedded_names' show
-    CLASS_ID_EXTRACTOR,
-    CLASS_FIELDS_EXTRACTOR,
-    CURRENT_SCRIPT,
-    GLOBAL_FUNCTIONS,
-    INITIALIZE_EMPTY_INSTANCE,
-    INSTANCE_FROM_CLASS_ID;
+import 'dart:_js_embedded_names'
+    show
+        CLASS_ID_EXTRACTOR,
+        CLASS_FIELDS_EXTRACTOR,
+        CURRENT_SCRIPT,
+        GLOBAL_FUNCTIONS,
+        INITIALIZE_EMPTY_INSTANCE,
+        INSTANCE_FROM_CLASS_ID;
 
 import 'dart:async';
 import 'dart:collection' show Queue, HashMap;
 import 'dart:isolate';
 import 'dart:_native_typed_data' show NativeByteBuffer, NativeTypedData;
 
-import 'dart:_js_helper' show
-    InternalMap,
-    Null,
-    Primitives,
-    random64;
+import 'dart:_js_helper' show InternalMap, Null, Primitives, random64;
 
-import 'dart:_foreign_helper' show JS,
-                                   JS_CREATE_ISOLATE,
-                                   JS_CURRENT_ISOLATE_CONTEXT,
-                                   JS_CURRENT_ISOLATE,
-                                   JS_EMBEDDED_GLOBAL,
-                                   JS_SET_CURRENT_ISOLATE,
-                                   IsolateContext;
+import 'dart:_foreign_helper'
+    show
+        JS,
+        JS_CREATE_ISOLATE,
+        JS_CURRENT_ISOLATE_CONTEXT,
+        JS_CURRENT_ISOLATE,
+        JS_EMBEDDED_GLOBAL,
+        JS_SET_CURRENT_ISOLATE,
+        IsolateContext;
 
-import 'dart:_interceptors' show Interceptor,
-                                 JSArray,
-                                 JSExtendableArray,
-                                 JSFixedArray,
-                                 JSIndexable,
-                                 JSMutableArray,
-                                 JSObject;
-
+import 'dart:_interceptors'
+    show
+        Interceptor,
+        JSArray,
+        JSExtendableArray,
+        JSFixedArray,
+        JSIndexable,
+        JSMutableArray,
+        JSObject;
 
 part 'isolate_serialization.dart';
 
@@ -110,9 +110,13 @@
   // by having a "default" isolate (the first one created).
   _globalState.currentContext = rootContext;
   if (entry is _MainFunctionArgs) {
-    rootContext.eval(() { entry(args); });
+    rootContext.eval(() {
+      entry(args);
+    });
   } else if (entry is _MainFunctionArgsMessage) {
-    rootContext.eval(() { entry(args, null); });
+    rootContext.eval(() {
+      entry(args, null);
+    });
   } else {
     rootContext.eval(entry);
   }
@@ -166,7 +170,6 @@
 /** State associated with the current manager. See [globalState]. */
 // TODO(sigmund): split in multiple classes: global, thread, main-worker states?
 class _Manager {
-
   /** Next available isolate id within this [_Manager]. */
   int nextIsolateId = 0;
 
@@ -214,7 +217,7 @@
   _MainManagerStub mainManager;
 
   /// Registry of active Web Workers.  Only used in the main [_Manager].
-  Map<int, dynamic /* Worker */> managers;
+  Map<int, dynamic /* Worker */ > managers;
 
   /** The entry point given by [startRootIsolate]. */
   final Function entry;
@@ -224,7 +227,8 @@
     topEventLoop = new _EventLoop();
     isolates = new Map<int, _IsolateContext>();
     managers = new Map<int, dynamic>();
-    if (isWorker) {  // "if we are not the main manager ourself" is the intent.
+    if (isWorker) {
+      // "if we are not the main manager ourself" is the intent.
       mainManager = new _MainManagerStub();
       _nativeInitWorkerMessageHandler();
     }
@@ -235,20 +239,23 @@
     bool isWorkerDefined = globalWorker != null;
 
     isWorker = !isWindowDefined && globalPostMessageDefined;
-    supportsWorkers = isWorker
-       || (isWorkerDefined && IsolateNatives.thisScript != null);
+    supportsWorkers =
+        isWorker || (isWorkerDefined && IsolateNatives.thisScript != null);
     fromCommandLine = !isWindowDefined && !isWorker;
   }
 
   void _nativeInitWorkerMessageHandler() {
-    var function = JS('',
+    var function = JS(
+        '',
         "(function (f, a) { return function (e) { f(a, e); }})(#, #)",
         IsolateNatives._processWorkerMessage,
         mainManager);
     JS("void", r"#.onmessage = #", global, function);
     // We ensure dartPrint is defined so that the implementation of the Dart
     // print method knows what to call.
-    JS('', '''#.dartPrint = #.dartPrint || (function(serialize) {
+    JS(
+        '',
+        '''#.dartPrint = #.dartPrint || (function(serialize) {
   return function (object) {
     var _self = #;
     if (_self.console && _self.console.log) {
@@ -257,7 +264,11 @@
       _self.postMessage(serialize(object));
     }
   }
-})(#)''', global, global, global, _serializePrintMessage);
+})(#)''',
+        global,
+        global,
+        global,
+        _serializePrintMessage);
   }
 
   static _serializePrintMessage(object) {
@@ -269,9 +280,7 @@
    * there are no active async JavaScript tasks still running.
    */
   void maybeCloseWorker() {
-    if (isWorker
-        && isolates.isEmpty
-        && topEventLoop._activeJsAsyncCount == 0) {
+    if (isWorker && isolates.isEmpty && topEventLoop._activeJsAsyncCount == 0) {
       mainManager.postMessage(_serializeMessage({'command': 'close'}));
     }
   }
@@ -295,7 +304,7 @@
   final RawReceivePortImpl controlPort = new RawReceivePortImpl._controlPort();
 
   final Capability pauseCapability = new Capability();
-  final Capability terminateCapability = new Capability();  // License to kill.
+  final Capability terminateCapability = new Capability(); // License to kill.
 
   /// Boolean flag set when the initial method of the isolate has been executed.
   ///
@@ -345,7 +354,7 @@
     if (!isPaused) return;
     pauseTokens.remove(resume);
     if (pauseTokens.isEmpty) {
-      while(delayedEvents.isNotEmpty) {
+      while (delayedEvents.isNotEmpty) {
         _IsolateEvent event = delayedEvents.removeLast();
         _globalState.topEventLoop.prequeue(event);
       }
@@ -376,12 +385,14 @@
 
   void handlePing(SendPort responsePort, int pingType) {
     if (pingType == Isolate.IMMEDIATE ||
-        (pingType == Isolate.BEFORE_NEXT_EVENT &&
-         !_isExecutingEvent)) {
+        (pingType == Isolate.BEFORE_NEXT_EVENT && !_isExecutingEvent)) {
       responsePort.send(null);
       return;
     }
-    void respond() { responsePort.send(null); }
+    void respond() {
+      responsePort.send(null);
+    }
+
     assert(pingType == Isolate.BEFORE_NEXT_EVENT);
     if (_scheduledControlEvents == null) {
       _scheduledControlEvents = new Queue();
@@ -392,8 +403,7 @@
   void handleKill(Capability authentification, int priority) {
     if (this.terminateCapability != authentification) return;
     if (priority == Isolate.IMMEDIATE ||
-        (priority == Isolate.BEFORE_NEXT_EVENT &&
-         !_isExecutingEvent)) {
+        (priority == Isolate.BEFORE_NEXT_EVENT && !_isExecutingEvent)) {
       kill();
       return;
     }
@@ -431,8 +441,8 @@
       return;
     }
     List message = new List(2)
-        ..[0] = error.toString()
-        ..[1] = (stackTrace == null) ? null : stackTrace.toString();
+      ..[0] = error.toString()
+      ..[1] = (stackTrace == null) ? null : stackTrace.toString();
     for (SendPort port in errorPorts) port.send(message);
   }
 
@@ -524,7 +534,7 @@
   }
 
   /** Registers a port on this isolate. */
-  void register(int portId, RawReceivePortImpl port)  {
+  void register(int portId, RawReceivePortImpl port) {
     _addRegistration(portId, port);
     _updateGlobalState();
   }
@@ -534,7 +544,7 @@
    *
    * The port does not keep the isolate active.
    */
-  void registerWeak(int portId, RawReceivePortImpl port)  {
+  void registerWeak(int portId, RawReceivePortImpl port) {
     weakPorts.add(portId);
     _addRegistration(portId, port);
   }
@@ -607,10 +617,10 @@
   }
 
   void checkOpenReceivePortsFromCommandLine() {
-    if (_globalState.rootContext != null
-        && _globalState.isolates.containsKey(_globalState.rootContext.id)
-        && _globalState.fromCommandLine
-        && _globalState.rootContext.ports.isEmpty) {
+    if (_globalState.rootContext != null &&
+        _globalState.isolates.containsKey(_globalState.rootContext.id) &&
+        _globalState.fromCommandLine &&
+        _globalState.rootContext.ports.isEmpty) {
       // We want to reach here only on the main [_Manager] and only
       // on the command-line.  In the browser the isolate might
       // still be alive due to DOM callbacks, but the presumption is
@@ -645,6 +655,7 @@
         if (!runIteration()) return;
         Timer.run(next);
       }
+
       next();
     } else {
       // Run synchronously until no more iterations are available.
@@ -662,8 +673,8 @@
       try {
         _runHelper();
       } catch (e, trace) {
-        _globalState.mainManager.postMessage(_serializeMessage(
-            {'command': 'error', 'msg': '$e\n$trace' }));
+        _globalState.mainManager.postMessage(
+            _serializeMessage({'command': 'error', 'msg': '$e\n$trace'}));
       }
     }
   }
@@ -693,8 +704,7 @@
 //
 // See: http://www.w3.org/TR/workers/#the-global-scope
 // and: http://www.w3.org/TR/Window/#dfn-self-attribute
-final global =
-  JS("", "typeof global == 'undefined' ? self : global");
+final global = JS("", "typeof global == 'undefined' ? self : global");
 
 /** A stub for interacting with the main manager. */
 class _MainManagerStub {
@@ -713,6 +723,7 @@
 get globalWorker {
   return JS('', "#.Worker", global);
 }
+
 bool get globalPostMessageDefined {
   return JS('bool', "!!#.postMessage", global);
 }
@@ -724,7 +735,6 @@
 /// Note: IsolateNatives depends on _globalState which is only set up correctly
 /// when 'dart:isolate' has been imported.
 class IsolateNatives {
-
   // We set [enableSpawnWorker] to true (not null) when calling isolate
   // primitives that require support for spawning workers. The field starts out
   // by being null, and dart2js' type inference will track if it can have a
@@ -773,10 +783,11 @@
       // According to Internet Explorer documentation, the stack
       // property is not set until the exception is thrown. The stack
       // property was not provided until IE10.
-      stack = JS('String|Null',
-                 '(function() {'
-                 'try { throw new Error() } catch(e) { return e.stack }'
-                 '})()');
+      stack = JS(
+          'String|Null',
+          '(function() {'
+          'try { throw new Error() } catch(e) { return e.stack }'
+          '})()');
       if (stack == null) throw new UnsupportedError('No stack trace');
     }
     var pattern, matches;
@@ -785,9 +796,8 @@
     // traces that look like this:
     // Error
     //     at methodName (URI:LINE:COLUMN)
-    pattern = JS('',
-                 r'new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m")');
-
+    pattern =
+        JS('', r'new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m")');
 
     matches = JS('JSExtendableArray|Null', '#.match(#)', stack, pattern);
     if (matches != null) return JS('String', '#[1]', matches);
@@ -829,8 +839,8 @@
         var replyTo = _deserializeMessage(msg['replyTo']);
         var context = new _IsolateContext();
         _globalState.topEventLoop.enqueue(context, () {
-          _startIsolate(entryPoint, args, message,
-                        isSpawnUri, startPaused, replyTo);
+          _startIsolate(
+              entryPoint, args, message, isSpawnUri, startPaused, replyTo);
         }, 'worker-start');
         // Make sure we always have a current context in this worker.
         // TODO(7907): This is currently needed because we're using
@@ -862,8 +872,8 @@
         break;
       case 'print':
         if (_globalState.isWorker) {
-          _globalState.mainManager.postMessage(
-              _serializeMessage({'command': 'print', 'msg': msg}));
+          _globalState.mainManager
+              .postMessage(_serializeMessage({'command': 'print', 'msg': msg}));
         } else {
           print(msg['msg']);
         }
@@ -875,9 +885,8 @@
 
   static handleSpawnWorkerRequest(msg) {
     var replyPort = msg['replyPort'];
-    spawn(msg['functionName'], msg['uri'],
-          msg['args'], msg['msg'],
-          false, msg['isSpawnUri'], msg['startPaused']).then((msg) {
+    spawn(msg['functionName'], msg['uri'], msg['args'], msg['msg'], false,
+        msg['isSpawnUri'], msg['startPaused']).then((msg) {
       replyPort.send(msg);
     }, onError: (String errorMessage) {
       replyPort.send([_SPAWN_FAILED_SIGNAL, errorMessage]);
@@ -887,8 +896,8 @@
   /** Log a message, forwarding to the main [_Manager] if appropriate. */
   static _log(msg) {
     if (_globalState.isWorker) {
-      _globalState.mainManager.postMessage(
-          _serializeMessage({'command': 'log', 'msg': msg }));
+      _globalState.mainManager
+          .postMessage(_serializeMessage({'command': 'log', 'msg': msg}));
     } else {
       try {
         _consoleLog(msg);
@@ -921,35 +930,32 @@
     return JS("", "new #()", ctor);
   }
 
-  static Future<List> spawnFunction(void topLevelFunction(message),
-                                    var message,
-                                    bool startPaused) {
+  static Future<List> spawnFunction(
+      void topLevelFunction(message), var message, bool startPaused) {
     IsolateNatives.enableSpawnWorker = true;
     final name = _getJSFunctionName(topLevelFunction);
     if (name == null) {
-      throw new UnsupportedError(
-          "only top-level functions can be spawned.");
+      throw new UnsupportedError("only top-level functions can be spawned.");
     }
     bool isLight = false;
     bool isSpawnUri = false;
     return spawn(name, null, null, message, isLight, isSpawnUri, startPaused);
   }
 
-  static Future<List> spawnUri(Uri uri, List<String> args, var message,
-                               bool startPaused) {
+  static Future<List> spawnUri(
+      Uri uri, List<String> args, var message, bool startPaused) {
     IsolateNatives.enableSpawnWorker = true;
     bool isLight = false;
     bool isSpawnUri = true;
-    return spawn(null, uri.toString(), args, message,
-                 isLight, isSpawnUri, startPaused);
+    return spawn(
+        null, uri.toString(), args, message, isLight, isSpawnUri, startPaused);
   }
 
   // TODO(sigmund): clean up above, after we make the new API the default:
 
   /// If [uri] is `null` it is replaced with the current script.
-  static Future<List> spawn(String functionName, String uri,
-                            List<String> args, message,
-                            bool isLight, bool isSpawnUri, bool startPaused) {
+  static Future<List> spawn(String functionName, String uri, List<String> args,
+      message, bool isLight, bool isSpawnUri, bool startPaused) {
     // Assume that the compiled version of the Dart file lives just next to the
     // dart file.
     // TODO(floitsch): support precompiled version of dart2js output.
@@ -969,20 +975,20 @@
     SendPort signalReply = port.sendPort;
 
     if (_globalState.useWorkers && !isLight) {
-      _startWorker(
-          functionName, uri, args, message, isSpawnUri, startPaused,
+      _startWorker(functionName, uri, args, message, isSpawnUri, startPaused,
           signalReply, (String message) => completer.completeError(message));
     } else {
-      _startNonWorker(
-          functionName, uri, args, message, isSpawnUri, startPaused,
+      _startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused,
           signalReply);
     }
     return completer.future;
   }
 
   static void _startWorker(
-      String functionName, String uri,
-      List<String> args, message,
+      String functionName,
+      String uri,
+      List<String> args,
+      message,
       bool isSpawnUri,
       bool startPaused,
       SendPort replyPort,
@@ -993,23 +999,26 @@
     if (args != null) args = new List<String>.from(args);
     if (_globalState.isWorker) {
       _globalState.mainManager.postMessage(_serializeMessage({
-          'command': 'spawn-worker',
-          'functionName': functionName,
-          'args': args,
-          'msg': message,
-          'uri': uri,
-          'isSpawnUri': isSpawnUri,
-          'startPaused': startPaused,
-          'replyPort': replyPort}));
+        'command': 'spawn-worker',
+        'functionName': functionName,
+        'args': args,
+        'msg': message,
+        'uri': uri,
+        'isSpawnUri': isSpawnUri,
+        'startPaused': startPaused,
+        'replyPort': replyPort
+      }));
     } else {
-      _spawnWorker(functionName, uri, args, message,
-                   isSpawnUri, startPaused, replyPort, onError);
+      _spawnWorker(functionName, uri, args, message, isSpawnUri, startPaused,
+          replyPort, onError);
     }
   }
 
   static void _startNonWorker(
-      String functionName, String uri,
-      List<String> args, var message,
+      String functionName,
+      String uri,
+      List<String> args,
+      var message,
       bool isSpawnUri,
       bool startPaused,
       SendPort replyPort) {
@@ -1034,22 +1043,21 @@
   static Isolate get currentIsolate {
     _IsolateContext context = JS_CURRENT_ISOLATE_CONTEXT();
     return new Isolate(context.controlPort.sendPort,
-                       pauseCapability: context.pauseCapability,
-                       terminateCapability: context.terminateCapability);
+        pauseCapability: context.pauseCapability,
+        terminateCapability: context.terminateCapability);
   }
 
-  static void _startIsolate(Function topLevel,
-                            List<String> args, message,
-                            bool isSpawnUri,
-                            bool startPaused,
-                            SendPort replyTo) {
+  static void _startIsolate(Function topLevel, List<String> args, message,
+      bool isSpawnUri, bool startPaused, SendPort replyTo) {
     _IsolateContext context = JS_CURRENT_ISOLATE_CONTEXT();
     Primitives.initializeStatics(context.id);
     // The isolate's port does not keep the isolate open.
-    replyTo.send([_SPAWNED_SIGNAL,
-                  context.controlPort.sendPort,
-                  context.pauseCapability,
-                  context.terminateCapability]);
+    replyTo.send([
+      _SPAWNED_SIGNAL,
+      context.controlPort.sendPort,
+      context.pauseCapability,
+      context.terminateCapability
+    ]);
 
     void runStartFunction() {
       context.initialized = true;
@@ -1066,8 +1074,8 @@
 
     if (startPaused) {
       context.addPause(context.pauseCapability, context.pauseCapability);
-      _globalState.topEventLoop.enqueue(context, runStartFunction,
-                                        'start isolate');
+      _globalState.topEventLoop
+          .enqueue(context, runStartFunction, 'start isolate');
     } else {
       runStartFunction();
     }
@@ -1077,12 +1085,15 @@
    * Spawns an isolate in a worker. [factoryName] is the Javascript constructor
    * name for the isolate entry point class.
    */
-  static void _spawnWorker(functionName, String uri,
-                           List<String> args, message,
-                           bool isSpawnUri,
-                           bool startPaused,
-                           SendPort replyPort,
-                           void onError(String message)) {
+  static void _spawnWorker(
+      functionName,
+      String uri,
+      List<String> args,
+      message,
+      bool isSpawnUri,
+      bool startPaused,
+      SendPort replyPort,
+      void onError(String message)) {
     if (uri == null) uri = thisScript;
     final worker = JS('var', 'new Worker(#)', uri);
     // Trampolines are used when wanting to call a Dart closure from
@@ -1097,7 +1108,9 @@
     return f(e, u, c)
   }
 })(#, #, #)''',
-        workerOnError, uri, onError);
+        workerOnError,
+        uri,
+        onError);
     JS('void', '#.onerror = #', worker, onerrorTrampoline);
 
     var processWorkerMessageTrampoline = JS(
@@ -1118,19 +1131,24 @@
     // We also store the id on the worker itself so that we can unregister it.
     workerIds[worker] = workerId;
     _globalState.managers[workerId] = worker;
-    JS('void', '#.postMessage(#)', worker, _serializeMessage({
-        'command': 'start',
-        'id': workerId,
-        // Note: we serialize replyPort twice because the child worker needs to
-        // first deserialize the worker id, before it can correctly deserialize
-        // the port (port deserialization is sensitive to what is the current
-        // workerId).
-        'replyTo': _serializeMessage(replyPort),
-        'args': args,
-        'msg': _serializeMessage(message),
-        'isSpawnUri': isSpawnUri,
-        'startPaused': startPaused,
-        'functionName': functionName }));
+    JS(
+        'void',
+        '#.postMessage(#)',
+        worker,
+        _serializeMessage({
+          'command': 'start',
+          'id': workerId,
+          // Note: we serialize replyPort twice because the child worker needs to
+          // first deserialize the worker id, before it can correctly deserialize
+          // the port (port deserialization is sensitive to what is the current
+          // workerId).
+          'replyTo': _serializeMessage(replyPort),
+          'args': args,
+          'msg': _serializeMessage(message),
+          'isSpawnUri': isSpawnUri,
+          'startPaused': startPaused,
+          'functionName': functionName
+        }));
   }
 
   static bool workerOnError(
@@ -1165,9 +1183,9 @@
   const _BaseSendPort(this._isolateId);
 
   void _checkReplyTo(SendPort replyTo) {
-    if (replyTo != null
-        && replyTo is! _NativeJsSendPort
-        && replyTo is! _WorkerSendPort) {
+    if (replyTo != null &&
+        replyTo is! _NativeJsSendPort &&
+        replyTo is! _WorkerSendPort) {
       throw new Exception("SendPort.send: Illegal replyTo port type");
     }
   }
@@ -1202,8 +1220,8 @@
     }, 'receive $message');
   }
 
-  bool operator ==(var other) => (other is _NativeJsSendPort) &&
-      (_receivePort == other._receivePort);
+  bool operator ==(var other) =>
+      (other is _NativeJsSendPort) && (_receivePort == other._receivePort);
 
   int get hashCode => _receivePort._id;
 }
@@ -1218,10 +1236,8 @@
       : super(isolateId);
 
   void send(var message) {
-    final workerMessage = _serializeMessage({
-        'command': 'message',
-        'port': this,
-        'msg': message});
+    final workerMessage =
+        _serializeMessage({'command': 'message', 'port': this, 'msg': message});
 
     if (_globalState.isWorker) {
       // Communication from one worker to another go through the
@@ -1267,7 +1283,9 @@
   // Creates the control port of an isolate.
   // This is created before the isolate context object itself,
   // so it cannot access the static _nextFreeId field.
-  RawReceivePortImpl._controlPort() : _handler = null, _id = 0;
+  RawReceivePortImpl._controlPort()
+      : _handler = null,
+        _id = 0;
 
   void set handler(Function newHandler) {
     _handler = newHandler;
@@ -1312,11 +1330,9 @@
   }
 
   StreamSubscription listen(void onData(var event),
-                            {Function onError,
-                             void onDone(),
-                             bool cancelOnError}) {
-    return _controller.stream.listen(onData, onError: onError, onDone: onDone,
-                                     cancelOnError: cancelOnError);
+      {Function onError, void onDone(), bool cancelOnError}) {
+    return _controller.stream.listen(onData,
+        onError: onError, onDone: onDone, cancelOnError: cancelOnError);
   }
 
   void close() {
@@ -1332,10 +1348,8 @@
   bool _inEventLoop = false;
   int _handle;
 
-  TimerImpl(int milliseconds, void callback())
-      : _once = true {
+  TimerImpl(int milliseconds, void callback()) : _once = true {
     if (milliseconds == 0 && (!hasTimer() || _globalState.isWorker)) {
-
       void internalCallback() {
         _handle = null;
         callback();
@@ -1351,11 +1365,10 @@
       // TODO(7907): In case of web workers, we need to use the event
       // loop instead of setTimeout, to make sure the futures get executed in
       // order.
-      _globalState.topEventLoop.enqueue(
-          _globalState.currentContext, internalCallback, 'timer');
+      _globalState.topEventLoop
+          .enqueue(_globalState.currentContext, internalCallback, 'timer');
       _inEventLoop = true;
     } else if (hasTimer()) {
-
       void internalCallback() {
         _handle = null;
         leaveJsAsync();
@@ -1376,8 +1389,9 @@
       : _once = false {
     if (hasTimer()) {
       enterJsAsync();
-      _handle = JS('int', '#.setInterval(#, #)',
-          global, () { callback(this); }, milliseconds);
+      _handle = JS('int', '#.setInterval(#, #)', global, () {
+        callback(this);
+      }, milliseconds);
     } else {
       throw new UnsupportedError("Periodic timer.");
     }
@@ -1408,7 +1422,6 @@
   return JS('', '#.setTimeout', global) != null;
 }
 
-
 /**
  * Implementation class for [Capability].
  *
@@ -1427,7 +1440,7 @@
     // http://www.concentric.net/~Ttwang/tech/inthash.htm
     // (via https://gist.github.com/badboy/6267743)
     int hash = _id;
-    hash = (hash >> 0) ^ (hash ~/ 0x100000000);  // To 32 bit from ~64.
+    hash = (hash >> 0) ^ (hash ~/ 0x100000000); // To 32 bit from ~64.
     hash = (~hash + (hash << 15)) & 0xFFFFFFFF;
     hash ^= hash >> 12;
     hash = (hash * 5) & 0xFFFFFFFF;
@@ -1437,7 +1450,7 @@
     return hash;
   }
 
-  bool operator==(Object other) {
+  bool operator ==(Object other) {
     if (identical(other, this)) return true;
     if (other is CapabilityImpl) {
       return identical(_id, other._id);
diff --git a/pkg/dev_compiler/tool/input_sdk/private/isolate_serialization.dart b/pkg/dev_compiler/tool/input_sdk/private/isolate_serialization.dart
index 28c03f8..be2a25f 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/isolate_serialization.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/isolate_serialization.dart
@@ -116,9 +116,11 @@
 
   serializeMap(InternalMap x) {
     Function serializeTearOff = serialize;
-    return ['map',
-            x.keys.map(serializeTearOff).toList(),
-            x.values.map(serializeTearOff).toList()];
+    return [
+      'map',
+      x.keys.map(serializeTearOff).toList(),
+      x.values.map(serializeTearOff).toList()
+    ];
   }
 
   serializeJSObject(JSObject x) {
@@ -191,20 +193,34 @@
     if (x is! JSArray) throw new ArgumentError("Bad serialized message: $x");
 
     switch (x.first) {
-      case "ref": return deserializeRef(x);
-      case "buffer": return deserializeByteBuffer(x);
-      case "typed": return deserializeTypedData(x);
-      case "fixed": return deserializeFixed(x);
-      case "extendable": return deserializeExtendable(x);
-      case "mutable": return deserializeMutable(x);
-      case "const": return deserializeConst(x);
-      case "map": return deserializeMap(x);
-      case "sendport": return deserializeSendPort(x);
-      case "raw sendport": return deserializeRawSendPort(x);
-      case "js-object": return deserializeJSObject(x);
-      case "function": return deserializeClosure(x);
-      case "dart": return deserializeDartObject(x);
-      default: throw "couldn't deserialize: $x";
+      case "ref":
+        return deserializeRef(x);
+      case "buffer":
+        return deserializeByteBuffer(x);
+      case "typed":
+        return deserializeTypedData(x);
+      case "fixed":
+        return deserializeFixed(x);
+      case "extendable":
+        return deserializeExtendable(x);
+      case "mutable":
+        return deserializeMutable(x);
+      case "const":
+        return deserializeConst(x);
+      case "map":
+        return deserializeMap(x);
+      case "sendport":
+        return deserializeSendPort(x);
+      case "raw sendport":
+        return deserializeRawSendPort(x);
+      case "js-object":
+        return deserializeJSObject(x);
+      case "function":
+        return deserializeClosure(x);
+      case "dart":
+        return deserializeDartObject(x);
+      default:
+        throw "couldn't deserialize: $x";
     }
   }
 
@@ -355,7 +371,7 @@
     var emptyInstance = JS('', '#(#)', instanceFromClassId, classId);
     deserializedObjects.add(emptyInstance);
     deserializeArrayInPlace(fields);
-    return JS('', '#(#, #, #)',
-              initializeObject, classId, emptyInstance, fields);
+    return JS(
+        '', '#(#, #, #)', initializeObject, classId, emptyInstance, fields);
   }
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_array.dart b/pkg/dev_compiler/tool/input_sdk/private/js_array.dart
index c33ca35..f9546e2 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_array.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_array.dart
@@ -12,7 +12,6 @@
  */
 @JsPeerInterface(name: 'Array')
 class JSArray<E> implements List<E>, JSIndexable<E> {
-
   const JSArray();
 
   /**
@@ -74,7 +73,7 @@
 
   E removeAt(int index) {
     checkGrowable('removeAt');
-    if (index is !int) throw argumentErrorValue(index);
+    if (index is! int) throw argumentErrorValue(index);
     if (index < 0 || index >= length) {
       throw new RangeError.value(index);
     }
@@ -83,7 +82,7 @@
 
   void insert(int index, E value) {
     checkGrowable('insert');
-    if (index is !int) throw argumentErrorValue(index);
+    if (index is! int) throw argumentErrorValue(index);
     if (index < 0 || index > length) {
       throw new RangeError.value(index);
     }
@@ -173,7 +172,7 @@
   }
 
   Iterable/*<T>*/ expand/*<T>*/(Iterable/*<T>*/ f(E element)) {
-    return new ExpandIterable<E, dynamic/*=T*/>(this, f);
+    return new ExpandIterable<E, dynamic/*=T*/ >(this, f);
   }
 
   void addAll(Iterable<E> collection) {
@@ -243,7 +242,8 @@
     return value;
   }
 
-  /*=T*/ fold/*<T>*/(/*=T*/ initialValue, /*=T*/ combine(/*=T*/ previousValue, E element)) {
+  /*=T*/ fold/*<T>*/(
+      /*=T*/ initialValue, /*=T*/ combine(/*=T*/ previousValue, E element)) {
     var/*=T*/ value = initialValue;
     int length = this.length;
     for (int i = 0; i < length; i++) {
@@ -269,7 +269,7 @@
     throw IterableElementError.noElement();
   }
 
-  E lastWhere(bool test(E element), { E orElse() }) {
+  E lastWhere(bool test(E element), {E orElse()}) {
     int length = this.length;
     for (int i = length - 1; i >= 0; i--) {
       // TODO(22407): Improve bounds check elimination to allow this JS code to
@@ -313,24 +313,22 @@
 
   List<E> sublist(int start, [int end]) {
     checkNull(start); // TODO(ahe): This is not specified but co19 tests it.
-    if (start is !int) throw argumentErrorValue(start);
+    if (start is! int) throw argumentErrorValue(start);
     if (start < 0 || start > length) {
       throw new RangeError.range(start, 0, length, "start");
     }
     if (end == null) {
       end = length;
     } else {
-      if (end is !int) throw argumentErrorValue(end);
+      if (end is! int) throw argumentErrorValue(end);
       if (end < start || end > length) {
         throw new RangeError.range(end, start, length, "end");
       }
     }
     if (start == end) return <E>[];
-    return new JSArray<E>.typed(
-        JS('', r'#.slice(#, #)', this, start, end));
+    return new JSArray<E>.typed(JS('', r'#.slice(#, #)', this, start, end));
   }
 
-
   Iterable<E> getRange(int start, int end) {
     RangeError.checkValidRange(start, end, this.length);
     return new SubListIterable<E>(this, start, end);
@@ -428,7 +426,7 @@
     } else {
       int delta = insertLength - removeLength;
       int newLength = this.length + delta;
-      int insertEnd = start + insertLength;  // aka. end + delta.
+      int insertEnd = start + insertLength; // aka. end + delta.
       this.length = newLength;
       this.setRange(insertEnd, newLength, this, end);
       this.setRange(start, insertEnd, replacement);
@@ -530,7 +528,7 @@
 
   String toString() => ListBase.listToString(this);
 
-  List<E> toList({ bool growable: true }) {
+  List<E> toList({bool growable: true}) {
     var list = JS('', '#.slice()', this);
     if (!growable) markFixedList(list);
     return new JSArray<E>.typed(list);
@@ -546,7 +544,7 @@
 
   void set length(int newLength) {
     checkGrowable('set length');
-    if (newLength is !int) {
+    if (newLength is! int) {
       throw new ArgumentError.value(newLength, 'newLength');
     }
     // TODO(sra): Remove this test and let JavaScript throw an error.
@@ -559,14 +557,14 @@
   }
 
   E operator [](int index) {
-    if (index is !int) throw diagnoseIndexError(this, index);
+    if (index is! int) throw diagnoseIndexError(this, index);
     if (index >= length || index < 0) throw diagnoseIndexError(this, index);
     return JS('var', '#[#]', this, index);
   }
 
   void operator []=(int index, E value) {
     checkMutable('indexed set');
-    if (index is !int) throw diagnoseIndexError(this, index);
+    if (index is! int) throw diagnoseIndexError(this, index);
     if (index >= length || index < 0) throw diagnoseIndexError(this, index);
     JS('void', r'#[#] = #', this, index, value);
   }
@@ -588,10 +586,12 @@
  * many assuptions in the JS backend.
  */
 class JSMutableArray<E> extends JSArray<E> {}
-class JSFixedArray<E> extends JSMutableArray<E> {}
-class JSExtendableArray<E> extends JSMutableArray<E> {}
-class JSUnmodifiableArray<E> extends JSArray<E> {} // Already is JSIndexable.
 
+class JSFixedArray<E> extends JSMutableArray<E> {}
+
+class JSExtendableArray<E> extends JSMutableArray<E> {}
+
+class JSUnmodifiableArray<E> extends JSArray<E> {} // Already is JSIndexable.
 
 /// An [Iterator] that iterates a JSArray.
 ///
@@ -602,7 +602,9 @@
   E _current;
 
   ArrayIterator(JSArray<E> iterable)
-      : _iterable = iterable, _length = iterable.length, _index = 0;
+      : _iterable = iterable,
+        _length = iterable.length,
+        _index = 0;
 
   E get current => _current;
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
index 28cd859..b8c96a5 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
@@ -8,15 +8,11 @@
 
 import 'dart:_debugger' show stackTraceMapper;
 
-import 'dart:_foreign_helper' show
-    JS,
-    JS_STRING_CONCAT;
+import 'dart:_foreign_helper' show JS, JS_STRING_CONCAT;
 
 import 'dart:_interceptors';
-import 'dart:_internal' show
-    EfficientLengthIterable,
-    MappedIterable,
-    IterableElementError;
+import 'dart:_internal'
+    show EfficientLengthIterable, MappedIterable, IterableElementError;
 
 import 'dart:_native_typed_data';
 
@@ -75,12 +71,12 @@
     return handleError(source);
   }
 
-  static int parseInt(String source,
-                      int radix,
-                      int handleError(String source)) {
+  static int parseInt(
+      String source, int radix, int handleError(String source)) {
     checkString(source);
     var re = JS('', r'/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i');
-    var/*=JSArray<String>*/ match = JS('JSExtendableArray|Null', '#.exec(#)', re, source);
+    var/*=JSArray<String>*/ match =
+        JS('JSExtendableArray|Null', '#.exec(#)', re, source);
     int digitsIndex = 1;
     int hexIndex = 2;
     int decimalIndex = 3;
@@ -150,8 +146,8 @@
   }
 
   @NoInline()
-  static double _parseDoubleError(String source,
-                                  double handleError(String source)) {
+  static double _parseDoubleError(
+      String source, double handleError(String source)) {
     if (handleError == null) {
       throw new FormatException('Invalid double', source);
     }
@@ -166,10 +162,11 @@
     // - [+/-]Infinity
     // - a Dart double literal
     // We do allow leading or trailing whitespace.
-    if (!JS('bool',
-            r'/^\s*[+-]?(?:Infinity|NaN|'
-                r'(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(#)',
-            source)) {
+    if (!JS(
+        'bool',
+        r'/^\s*[+-]?(?:Infinity|NaN|'
+        r'(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(#)',
+        source)) {
       return _parseDoubleError(source, handleError);
     }
     var result = JS('num', r'parseFloat(#)', source);
@@ -221,14 +218,15 @@
   static Function timerTicks;
 
   static bool get isD8 {
-    return JS('bool',
-              'typeof version == "function"'
-              ' && typeof os == "object" && "system" in os');
+    return JS(
+        'bool',
+        'typeof version == "function"'
+        ' && typeof os == "object" && "system" in os');
   }
 
   static bool get isJsshell {
-    return JS('bool',
-              'typeof version == "function" && typeof system == "function"');
+    return JS(
+        'bool', 'typeof version == "function" && typeof system == "function"');
   }
 
   static String currentUri() {
@@ -251,9 +249,13 @@
     String result = '';
     for (int i = 0; i < end; i += kMaxApply) {
       int chunkEnd = (i + kMaxApply < end) ? i + kMaxApply : end;
-      result = JS('String',
+      result = JS(
+          'String',
           r'# + String.fromCharCode.apply(null, #.slice(#, #))',
-          result, array, i, chunkEnd);
+          result,
+          array,
+          i,
+          chunkEnd);
     }
     return result;
   }
@@ -261,7 +263,7 @@
   static String stringFromCodePoints(/*=JSArray<int>*/ codePoints) {
     List<int> a = <int>[];
     for (var i in codePoints) {
-      if (i is !int) throw argumentErrorValue(i);
+      if (i is! int) throw argumentErrorValue(i);
       if (i <= 0xffff) {
         a.add(i);
       } else if (i <= 0x10ffff) {
@@ -276,7 +278,7 @@
 
   static String stringFromCharCodes(/*=JSArray<int>*/ charCodes) {
     for (var i in charCodes) {
-      if (i is !int) throw argumentErrorValue(i);
+      if (i is! int) throw argumentErrorValue(i);
       if (i < 0) throw argumentErrorValue(i);
       if (i > 0xffff) return stringFromCodePoints(charCodes);
     }
@@ -293,14 +295,17 @@
     String result = '';
     for (int i = start; i < end; i += kMaxApply) {
       int chunkEnd = (i + kMaxApply < end) ? i + kMaxApply : end;
-      result = JS('String',
+      result = JS(
+          'String',
           r'# + String.fromCharCode.apply(null, #.subarray(#, #))',
-          result, charCodes, i, chunkEnd);
+          result,
+          charCodes,
+          i,
+          chunkEnd);
     }
     return result;
   }
 
-
   static String stringFromCharCode(int charCode) {
     if (0 <= charCode) {
       if (charCode <= 0xffff) {
@@ -310,7 +315,7 @@
         var bits = charCode - 0x10000;
         var low = 0xDC00 | (bits & 0x3ff);
         var high = 0xD800 | (bits >> 10);
-        return  JS('String', 'String.fromCharCode(#, #)', high, low);
+        return JS('String', 'String.fromCharCode(#, #)', high, low);
       }
     }
     throw new RangeError.range(charCode, 0, 0x10ffff);
@@ -334,19 +339,20 @@
 
     // Internet Explorer 10+ emits the zone name without parenthesis:
     // Example: Thu Oct 31 14:07:44 PDT 2013
-    match = JS('JSArray|Null',
-                // Thu followed by a space.
-                r'/^[A-Z,a-z]{3}\s'
-                // Oct 31 followed by space.
-                r'[A-Z,a-z]{3}\s\d+\s'
-                // Time followed by a space.
-                r'\d{2}:\d{2}:\d{2}\s'
-                // The time zone name followed by a space.
-                r'([A-Z]{3,5})\s'
-                // The year.
-                r'\d{4}$/'
-                '.exec(#.toString())',
-                d);
+    match = JS(
+        'JSArray|Null',
+        // Thu followed by a space.
+        r'/^[A-Z,a-z]{3}\s'
+        // Oct 31 followed by space.
+        r'[A-Z,a-z]{3}\s\d+\s'
+        // Time followed by a space.
+        r'\d{2}:\d{2}:\d{2}\s'
+        // The time zone name followed by a space.
+        r'([A-Z]{3,5})\s'
+        // The year.
+        r'\d{4}$/'
+        '.exec(#.toString())',
+        d);
     if (match != null) return match[1];
 
     // IE 9 and Opera don't provide the zone name. We fall back to emitting the
@@ -364,7 +370,7 @@
   }
 
   static num valueFromDecomposedDate(int years, int month, int day, int hours,
-        int minutes, int seconds, int milliseconds, bool isUtc) {
+      int minutes, int seconds, int milliseconds, bool isUtc) {
     final int MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
     checkInt(years);
     checkInt(month);
@@ -377,11 +383,11 @@
     var jsMonth = month - 1;
     num value;
     if (isUtc) {
-      value = JS('num', r'Date.UTC(#, #, #, #, #, #, #)',
-                 years, jsMonth, day, hours, minutes, seconds, milliseconds);
+      value = JS('num', r'Date.UTC(#, #, #, #, #, #, #)', years, jsMonth, day,
+          hours, minutes, seconds, milliseconds);
     } else {
-      value = JS('num', r'new Date(#, #, #, #, #, #, #).valueOf()',
-                 years, jsMonth, day, hours, minutes, seconds, milliseconds);
+      value = JS('num', r'new Date(#, #, #, #, #, #, #).valueOf()', years,
+          jsMonth, day, hours, minutes, seconds, milliseconds);
     }
     if (value.isNaN ||
         value < -MAX_MILLISECONDS_SINCE_EPOCH ||
@@ -406,7 +412,7 @@
   static lazyAsJsDate(DateTime receiver) {
     if (JS('bool', r'#.date === (void 0)', receiver)) {
       JS('void', r'#.date = new Date(#)', receiver,
-         receiver.millisecondsSinceEpoch);
+          receiver.millisecondsSinceEpoch);
     }
     return JS('var', r'#.date', receiver);
   }
@@ -417,56 +423,56 @@
 
   static getYear(DateTime receiver) {
     return (receiver.isUtc)
-      ? JS('int', r'(#.getUTCFullYear() + 0)', lazyAsJsDate(receiver))
-      : JS('int', r'(#.getFullYear() + 0)', lazyAsJsDate(receiver));
+        ? JS('int', r'(#.getUTCFullYear() + 0)', lazyAsJsDate(receiver))
+        : JS('int', r'(#.getFullYear() + 0)', lazyAsJsDate(receiver));
   }
 
   static getMonth(DateTime receiver) {
     return (receiver.isUtc)
-      ? JS('int', r'#.getUTCMonth() + 1', lazyAsJsDate(receiver))
-      : JS('int', r'#.getMonth() + 1', lazyAsJsDate(receiver));
+        ? JS('int', r'#.getUTCMonth() + 1', lazyAsJsDate(receiver))
+        : JS('int', r'#.getMonth() + 1', lazyAsJsDate(receiver));
   }
 
   static getDay(DateTime receiver) {
     return (receiver.isUtc)
-      ? JS('int', r'(#.getUTCDate() + 0)', lazyAsJsDate(receiver))
-      : JS('int', r'(#.getDate() + 0)', lazyAsJsDate(receiver));
+        ? JS('int', r'(#.getUTCDate() + 0)', lazyAsJsDate(receiver))
+        : JS('int', r'(#.getDate() + 0)', lazyAsJsDate(receiver));
   }
 
   static getHours(DateTime receiver) {
     return (receiver.isUtc)
-      ? JS('int', r'(#.getUTCHours() + 0)', lazyAsJsDate(receiver))
-      : JS('int', r'(#.getHours() + 0)', lazyAsJsDate(receiver));
+        ? JS('int', r'(#.getUTCHours() + 0)', lazyAsJsDate(receiver))
+        : JS('int', r'(#.getHours() + 0)', lazyAsJsDate(receiver));
   }
 
   static getMinutes(DateTime receiver) {
     return (receiver.isUtc)
-      ? JS('int', r'(#.getUTCMinutes() + 0)', lazyAsJsDate(receiver))
-      : JS('int', r'(#.getMinutes() + 0)', lazyAsJsDate(receiver));
+        ? JS('int', r'(#.getUTCMinutes() + 0)', lazyAsJsDate(receiver))
+        : JS('int', r'(#.getMinutes() + 0)', lazyAsJsDate(receiver));
   }
 
   static getSeconds(DateTime receiver) {
     return (receiver.isUtc)
-      ? JS('int', r'(#.getUTCSeconds() + 0)', lazyAsJsDate(receiver))
-      : JS('int', r'(#.getSeconds() + 0)', lazyAsJsDate(receiver));
+        ? JS('int', r'(#.getUTCSeconds() + 0)', lazyAsJsDate(receiver))
+        : JS('int', r'(#.getSeconds() + 0)', lazyAsJsDate(receiver));
   }
 
   static getMilliseconds(DateTime receiver) {
     return (receiver.isUtc)
-      ? JS('int', r'(#.getUTCMilliseconds() + 0)', lazyAsJsDate(receiver))
-      : JS('int', r'(#.getMilliseconds() + 0)', lazyAsJsDate(receiver));
+        ? JS('int', r'(#.getUTCMilliseconds() + 0)', lazyAsJsDate(receiver))
+        : JS('int', r'(#.getMilliseconds() + 0)', lazyAsJsDate(receiver));
   }
 
   static getWeekday(DateTime receiver) {
     int weekday = (receiver.isUtc)
-      ? JS('int', r'#.getUTCDay() + 0', lazyAsJsDate(receiver))
-      : JS('int', r'#.getDay() + 0', lazyAsJsDate(receiver));
+        ? JS('int', r'#.getUTCDay() + 0', lazyAsJsDate(receiver))
+        : JS('int', r'#.getDay() + 0', lazyAsJsDate(receiver));
     // Adjust by one because JS weeks start on Sunday.
     return (weekday + 6) % 7 + 1;
   }
 
   static valueFromDateString(str) {
-    if (str is !String) throw argumentErrorValue(str);
+    if (str is! String) throw argumentErrorValue(str);
     var value = JS('num', r'Date.parse(#)', str);
     if (value.isNaN) throw argumentErrorValue(str);
     return value;
@@ -490,13 +496,14 @@
     return getTraceFromException(JS('', r'#.$thrownJsError', error));
   }
 }
+
 /**
  * Diagnoses an indexing error. Returns the ArgumentError or RangeError that
  * describes the problem.
  */
 @NoInline()
 Error diagnoseIndexError(indexable, index) {
-  if (index is !int) return new ArgumentError.value(index, 'index');
+  if (index is! int) return new ArgumentError.value(index, 'index');
   int length = indexable.length;
   // The following returns the same error that would be thrown by calling
   // [RangeError.checkValidIndex] with no optional parameters provided.
@@ -531,9 +538,8 @@
   return new ArgumentError.value(end, "end");
 }
 
-stringLastIndexOfUnchecked(receiver, element, start)
-  => JS('int', r'#.lastIndexOf(#, #)', receiver, element, start);
-
+stringLastIndexOfUnchecked(receiver, element, start) =>
+    JS('int', r'#.lastIndexOf(#, #)', receiver, element, start);
 
 /// 'factory' for constructing ArgumentError.value to keep the call sites small.
 @NoInline()
@@ -547,22 +553,22 @@
 }
 
 checkNum(value) {
-  if (value is !num) throw argumentErrorValue(value);
+  if (value is! num) throw argumentErrorValue(value);
   return value;
 }
 
 checkInt(value) {
-  if (value is !int) throw argumentErrorValue(value);
+  if (value is! int) throw argumentErrorValue(value);
   return value;
 }
 
 checkBool(value) {
-  if (value is !bool) throw argumentErrorValue(value);
+  if (value is! bool) throw argumentErrorValue(value);
   return value;
 }
 
 checkString(value) {
-  if (value is !String) throw argumentErrorValue(value);
+  if (value is! String) throw argumentErrorValue(value);
   return value;
 }
 
@@ -574,7 +580,6 @@
   throw new AbstractClassInstantiationError(className);
 }
 
-
 @NoInline()
 throwConcurrentModificationError(collection) {
   throw new ConcurrentModificationError(collection);
@@ -776,8 +781,7 @@
  * objects that support integer indexing. This interface is not
  * visible to anyone, and is only injected into special libraries.
  */
-abstract class JavaScriptIndexingBehavior {
-}
+abstract class JavaScriptIndexingBehavior {}
 
 // TODO(lrn): These exceptions should be implemented in core.
 // When they are, remove the 'Implementation' here.
@@ -792,7 +796,7 @@
   // TODO(sra): Include [value] in message.
   TypeErrorImplementation(Object value, Object actualType, Object expectedType)
       : message = "Type '${actualType}' is not a subtype "
-                  "of type '${expectedType}'";
+            "of type '${expectedType}'";
 
   TypeErrorImplementation.fromMessage(String this.message);
 
@@ -810,7 +814,7 @@
   // TODO(sra): Include [value] in message.
   CastErrorImplementation(Object value, Object actualType, Object expectedType)
       : message = "CastError: Casting value of type '$actualType' to"
-                  " incompatible type '$expectedType'";
+            " incompatible type '$expectedType'";
 
   String toString() => message;
 }
@@ -822,7 +826,7 @@
   // TODO(sra): Include [value] in message.
   StrongModeTypeError(Object value, Object actualType, Object expectedType)
       : message = "Type '${actualType}' is not a subtype "
-                  "of type '${expectedType}' in strong mode";
+            "of type '${expectedType}' in strong mode";
   String toString() => message;
 }
 
@@ -833,7 +837,7 @@
   // TODO(sra): Include [value] in message.
   StrongModeCastError(Object value, Object actualType, Object expectedType)
       : message = "CastError: Casting value of type '$actualType' to"
-                  " type '$expectedType' which is incompatible in strong mode";
+            " type '$expectedType' which is incompatible in strong mode";
   String toString() => message;
 }
 
@@ -885,7 +889,6 @@
   return JS("String", "JSON.stringify(#)", string);
 }
 
-
 // TODO(jmesserly): this adapter is to work around
 // https://github.com/dart-lang/sdk/issues/28320
 class SyncIterator<E> implements Iterator<E> {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_number.dart b/pkg/dev_compiler/tool/input_sdk/private/js_number.dart
index 574a457..9fef26c 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_number.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_number.dart
@@ -40,8 +40,7 @@
   bool get isNaN => JS('bool', r'isNaN(#)', this);
 
   bool get isInfinite {
-    return JS('bool', r'# == (1/0)', this)
-        || JS('bool', r'# == (-1/0)', this);
+    return JS('bool', r'# == (1/0)', this) || JS('bool', r'# == (-1/0)', this);
   }
 
   bool get isFinite => JS('bool', r'isFinite(#)', this);
@@ -63,7 +62,7 @@
       return JS('int', '# | 0', this);
     }
     if (JS('bool', r'isFinite(#)', this)) {
-      return JS('int', r'# + 0', truncateToDouble());  // Converts -0.0 to +0.0.
+      return JS('int', r'# + 0', truncateToDouble()); // Converts -0.0 to +0.0.
     }
     // This is either NaN, Infinity or -Infinity.
     throw new UnsupportedError(JS("String", '"" + #', this));
@@ -149,8 +148,7 @@
     if (precision < 1 || precision > 21) {
       throw new RangeError.range(precision, 1, 21, "precision");
     }
-    String result = JS('String', r'#.toPrecision(#)',
-                       this, precision);
+    String result = JS('String', r'#.toPrecision(#)', this, precision);
     if (this == 0 && isNegative) return "-$result";
     return result;
   }
@@ -172,8 +170,7 @@
     // Result is probably IE's untraditional format for large numbers,
     // e.g., "8.0000000000008(e+15)" for 0x8000000000000800.toString(16).
     var match = JS('List|Null',
-                   r'/^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(#)',
-                   result);
+        r'/^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(#)', result);
     if (match == null) {
       // Then we don't know how to handle it at all.
       throw new UnsupportedError("Unexpected toString result: $result");
@@ -201,30 +198,30 @@
   JSNumber operator -() => JS('num', r'-#', this);
 
   JSNumber operator +(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     return JS('num', '# + #', this, other);
   }
 
   JSNumber operator -(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     return JS('num', '# - #', this, other);
   }
 
   double operator /(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     return JS('num', '# / #', this, other);
   }
 
   JSNumber operator *(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     return JS('num', '# * #', this, other);
   }
 
   JSNumber operator %(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     // Euclidean Modulo.
     num result = JS('num', r'# % #', this, other);
-    if (result == 0) return (0 as JSNumber);  // Make sure we don't return -0.0.
+    if (result == 0) return (0 as JSNumber); // Make sure we don't return -0.0.
     if (result > 0) return result;
     if (JS('num', '#', other) < 0) {
       return result - JS('num', '#', other);
@@ -244,7 +241,7 @@
   }
 
   int _tdivSlow(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     return (JS('num', r'# / #', this, other)).toInt();
   }
 
@@ -254,7 +251,7 @@
   // the grain at which we do the type checks.
 
   int operator <<(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     if (JS('num', '#', other) < 0) throw argumentErrorValue(other);
     return _shlPositive(other);
   }
@@ -268,7 +265,7 @@
   }
 
   int operator >>(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     if (JS('num', '#', other) < 0) throw argumentErrorValue(other);
     return _shrOtherPositive(other);
   }
@@ -296,37 +293,37 @@
   }
 
   int operator &(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     return JS('int', r'(# & #) >>> 0', this, other);
   }
 
   int operator |(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     return JS('int', r'(# | #) >>> 0', this, other);
   }
 
   int operator ^(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     return JS('int', r'(# ^ #) >>> 0', this, other);
   }
 
   bool operator <(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     return JS('bool', '# < #', this, other);
   }
 
   bool operator >(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     return JS('bool', '# > #', this, other);
   }
 
   bool operator <=(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     return JS('bool', '# <= #', this, other);
   }
 
   bool operator >=(num other) {
-    if (other is !num) throw argumentErrorValue(other);
+    if (other is! num) throw argumentErrorValue(other);
     return JS('bool', '# >= #', this, other);
   }
 
@@ -403,10 +400,7 @@
     final bool ac = x.isEven;
     int u = x;
     int v = y;
-    int a = 1,
-        b = 0,
-        c = 0,
-        d = 1;
+    int a = 1, b = 0, c = 0, d = 1;
     do {
       while (u.isEven) {
         u ~/= 2;
@@ -444,7 +438,7 @@
         d -= b;
       }
     } while (u != 0);
-    if (!inv) return s*v;
+    if (!inv) return s * v;
     if (v != 1) throw new Exception("Not coprime");
     if (d < 0) {
       d += x;
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_primitives.dart b/pkg/dev_compiler/tool/input_sdk/private/js_primitives.dart
index 389471d..40c451c 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_primitives.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_primitives.dart
@@ -6,8 +6,7 @@
 /// access to JavaScript features.
 library dart2js._js_primitives;
 
-import 'dart:_foreign_helper' show
-    JS;
+import 'dart:_foreign_helper' show JS;
 
 /**
  * This is the low-level method that is used to implement [print].  It is
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_string.dart b/pkg/dev_compiler/tool/input_sdk/private/js_string.dart
index 3e8a7ca..d6b7550 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_string.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_string.dart
@@ -15,7 +15,7 @@
   const JSString();
 
   int codeUnitAt(int index) {
-    if (index is !int) throw diagnoseIndexError(this, index);
+    if (index is! int) throw diagnoseIndexError(this, index);
     if (index < 0) throw diagnoseIndexError(this, index);
     if (index >= length) throw diagnoseIndexError(this, index);
     return JS('int', r'#.charCodeAt(#)', this, index);
@@ -45,7 +45,7 @@
   }
 
   String operator +(String other) {
-    if (other is !String) throw new ArgumentError.value(other);
+    if (other is! String) throw new ArgumentError.value(other);
     return JS('String', r'# + #', this, other);
   }
 
@@ -66,8 +66,7 @@
   }
 
   String splitMapJoin(Pattern from,
-                      {String onMatch(Match match),
-                       String onNonMatch(String nonMatch)}) {
+      {String onMatch(Match match), String onNonMatch(String nonMatch)}) {
     return stringReplaceAllFuncUnchecked(this, from, onMatch, onNonMatch);
   }
 
@@ -79,7 +78,7 @@
   }
 
   String replaceFirstMapped(Pattern from, String replace(Match match),
-                            [int startIndex = 0]) {
+      [int startIndex = 0]) {
     checkNull(replace);
     checkInt(startIndex);
     RangeError.checkValueInInterval(startIndex, 0, this.length, "startIndex");
@@ -153,7 +152,7 @@
     checkInt(startIndex);
     if (endIndex == null) endIndex = length;
     checkInt(endIndex);
-    if (startIndex < 0 ) throw new RangeError.value(startIndex);
+    if (startIndex < 0) throw new RangeError.value(startIndex);
     if (startIndex > endIndex) throw new RangeError.value(startIndex);
     if (endIndex > length) throw new RangeError.value(endIndex);
     return JS('String', r'#.substring(#, #)', this, startIndex, endIndex);
@@ -344,8 +343,8 @@
     return JS('String', r'#.substring(#, #)', result, 0, endIndex);
   }
 
-  String operator*(int times) {
-    if (0 >= times) return '';  // Unnecessary but hoists argument type check.
+  String operator *(int times) {
+    if (0 >= times) return ''; // Unnecessary but hoists argument type check.
     if (times == 1 || this.length == 0) return this;
     if (times != JS('int', '# >>> 0', times)) {
       // times >= 2^32. We can't create a string that big.
@@ -433,9 +432,8 @@
   bool get isNotEmpty => !isEmpty;
 
   int compareTo(String other) {
-    if (other is !String) throw argumentErrorValue(other);
-    return this == other ? 0
-        : JS('bool', r'# < #', this, other) ? -1 : 1;
+    if (other is! String) throw argumentErrorValue(other);
+    return this == other ? 0 : JS('bool', r'# < #', this, other) ? -1 : 1;
   }
 
   // Note: if you change this, also change the function [S].
@@ -456,7 +454,7 @@
       hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
       hash = JS('int', '# ^ (# >> 6)', hash, hash);
     }
-    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) <<  3));
+    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
     hash = JS('int', '# ^ (# >> 11)', hash, hash);
     return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
   }
@@ -466,7 +464,7 @@
   int get length => JS('int', r'#.length', this);
 
   String operator [](int index) {
-    if (index is !int) throw diagnoseIndexError(this, index);
+    if (index is! int) throw diagnoseIndexError(this, index);
     if (index >= length || index < 0) throw diagnoseIndexError(this, index);
     return JS('String', '#[#]', this, index);
   }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/native_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/native_helper.dart
index 335805b..5481fed 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/native_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/native_helper.dart
@@ -4,14 +4,14 @@
 
 part of dart._js_helper;
 
-
 /**
  * Sets a JavaScript property on an object.
  */
 void defineProperty(var obj, String property, var value) {
-  JS('void',
+  JS(
+      'void',
       'Object.defineProperty(#, #, '
-          '{value: #, enumerable: false, writable: true, configurable: true})',
+      '{value: #, enumerable: false, writable: true, configurable: true})',
       obj,
       property,
       value);
@@ -19,13 +19,13 @@
 
 // Obsolete in dart dev compiler. Added only so that the same version of
 // dart:html can be used in dart2js an dev compiler.
-/*=F*/ convertDartClosureToJS /*<F>*/ (/*=F*/ closure, int arity) {
-	return closure;
+/*=F*/ convertDartClosureToJS/*<F>*/(/*=F*/ closure, int arity) {
+  return closure;
 }
 
 // Warning: calls to these methods need to be removed before custom elements
 // and cross-frame dom objects behave correctly in ddc
 // https://github.com/dart-lang/sdk/issues/28326
-setNativeSubclassDispatchRecord(proto, interceptor) { }
+setNativeSubclassDispatchRecord(proto, interceptor) {}
 findDispatchTagForInterceptorClass(interceptorClassConstructor) {}
 makeLeafDispatchRecord(interceptor) {}
diff --git a/pkg/dev_compiler/tool/input_sdk/private/native_typed_data.dart b/pkg/dev_compiler/tool/input_sdk/private/native_typed_data.dart
index d823c36..9d88831 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/native_typed_data.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/native_typed_data.dart
@@ -12,8 +12,15 @@
 import 'dart:_internal';
 import 'dart:_interceptors' show JSIndexable;
 import 'dart:_js_helper'
-show Creates, JavaScriptIndexingBehavior, JSName, Native, Null, Returns,
-    diagnoseIndexError, diagnoseRangeError;
+    show
+        Creates,
+        JavaScriptIndexingBehavior,
+        JSName,
+        Native,
+        Null,
+        Returns,
+        diagnoseIndexError,
+        diagnoseRangeError;
 import 'dart:_foreign_helper' show JS;
 import 'dart:math' as Math;
 
@@ -41,6 +48,7 @@
   Uint16List asUint16List([int offsetInBytes = 0, int length]) {
     return new NativeUint16List.view(this, offsetInBytes, length);
   }
+
   Int16List asInt16List([int offsetInBytes = 0, int length]) {
     return new NativeInt16List.view(this, offsetInBytes, length);
   }
@@ -92,17 +100,14 @@
   }
 }
 
-
-
 /**
  * A fixed-length list of Float32x4 numbers that is viewable as a
  * [TypedData]. For long lists, this implementation will be considerably more
  * space- and time-efficient than the default [List] implementation.
  */
-class NativeFloat32x4List
-    extends Object with ListMixin<Float32x4>, FixedLengthListMixin<Float32x4>
+class NativeFloat32x4List extends Object
+    with ListMixin<Float32x4>, FixedLengthListMixin<Float32x4>
     implements Float32x4List {
-
   final NativeFloat32List _storage;
 
   /**
@@ -150,7 +155,7 @@
 
   int get length => _storage.length ~/ 4;
 
-  Float32x4 operator[](int index) {
+  Float32x4 operator [](int index) {
     _checkValidIndex(index, this, this.length);
     double _x = _storage[(index * 4) + 0];
     double _y = _storage[(index * 4) + 1];
@@ -159,7 +164,7 @@
     return new NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
-  void operator[]=(int index, Float32x4 value) {
+  void operator []=(int index, Float32x4 value) {
     _checkValidIndex(index, this, this.length);
     _storage[(index * 4) + 0] = value.x;
     _storage[(index * 4) + 1] = value.y;
@@ -174,16 +179,14 @@
   }
 }
 
-
 /**
  * A fixed-length list of Int32x4 numbers that is viewable as a
  * [TypedData]. For long lists, this implementation will be considerably more
  * space- and time-efficient than the default [List] implementation.
  */
-class NativeInt32x4List
-    extends Object with ListMixin<Int32x4>, FixedLengthListMixin<Int32x4>
+class NativeInt32x4List extends Object
+    with ListMixin<Int32x4>, FixedLengthListMixin<Int32x4>
     implements Int32x4List {
-
   final Int32List _storage;
 
   /**
@@ -230,7 +233,7 @@
 
   int get length => _storage.length ~/ 4;
 
-  Int32x4 operator[](int index) {
+  Int32x4 operator [](int index) {
     _checkValidIndex(index, this, this.length);
     int _x = _storage[(index * 4) + 0];
     int _y = _storage[(index * 4) + 1];
@@ -239,7 +242,7 @@
     return new NativeInt32x4._truncated(_x, _y, _z, _w);
   }
 
-  void operator[]=(int index, Int32x4 value) {
+  void operator []=(int index, Int32x4 value) {
     _checkValidIndex(index, this, this.length);
     _storage[(index * 4) + 0] = value.x;
     _storage[(index * 4) + 1] = value.y;
@@ -254,16 +257,14 @@
   }
 }
 
-
 /**
  * A fixed-length list of Float64x2 numbers that is viewable as a
  * [TypedData]. For long lists, this implementation will be considerably more
  * space- and time-efficient than the default [List] implementation.
  */
-class NativeFloat64x2List
-    extends Object with ListMixin<Float64x2>, FixedLengthListMixin<Float64x2>
+class NativeFloat64x2List extends Object
+    with ListMixin<Float64x2>, FixedLengthListMixin<Float64x2>
     implements Float64x2List {
-
   final NativeFloat64List _storage;
 
   /**
@@ -309,14 +310,14 @@
 
   int get length => _storage.length ~/ 2;
 
-  Float64x2 operator[](int index) {
+  Float64x2 operator [](int index) {
     _checkValidIndex(index, this, this.length);
     double _x = _storage[(index * 2) + 0];
     double _y = _storage[(index * 2) + 1];
     return new Float64x2(_x, _y);
   }
 
-  void operator[]=(int index, Float64x2 value) {
+  void operator []=(int index, Float64x2 value) {
     _checkValidIndex(index, this, this.length);
     _storage[(index * 2) + 0] = value.x;
     _storage[(index * 2) + 1] = value.y;
@@ -359,7 +360,7 @@
   external int get elementSizeInBytes;
 
   void _invalidPosition(int position, int length, String name) {
-    if (position is !int) {
+    if (position is! int) {
       throw new ArgumentError.value(position, name, 'Invalid list position');
     } else {
       throw new RangeError.range(position, 0, length, name);
@@ -368,13 +369,13 @@
 
   void _checkPosition(int position, int length, String name) {
     if (JS('bool', '(# >>> 0) !== #', position, position) ||
-        JS('int', '#', position) > length) {  // 'int' guaranteed by above test.
+        JS('int', '#', position) > length) {
+      // 'int' guaranteed by above test.
       _invalidPosition(position, length, name);
     }
   }
 }
 
-
 // Validates the unnamed constructor length argument.  Checking is necessary
 // because passing unvalidated values to the native constructors can cause
 // conversions or create views.
@@ -410,7 +411,6 @@
   return result;
 }
 
-
 @Native("DataView")
 class NativeByteData extends NativeTypedData implements ByteData {
   /**
@@ -431,8 +431,8 @@
    * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
    * the length of [buffer].
    */
-  factory NativeByteData.view(ByteBuffer buffer,
-                              int offsetInBytes, int length) {
+  factory NativeByteData.view(
+      ByteBuffer buffer, int offsetInBytes, int length) {
     _checkViewArguments(buffer, offsetInBytes, length);
     return length == null
         ? _create2(buffer, offsetInBytes)
@@ -451,12 +451,13 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 4` is greater than the length of this object.
    */
-  double getFloat32(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) =>
+  double getFloat32(int byteOffset,
+          [Endianness endian = Endianness.BIG_ENDIAN]) =>
       _getFloat32(byteOffset, Endianness.LITTLE_ENDIAN == endian);
 
   @JSName('getFloat32')
   @Returns('double')
-  double _getFloat32(int byteOffset, [bool littleEndian]) native;
+  double _getFloat32(int byteOffset, [bool littleEndian]) native ;
 
   /**
    * Returns the floating point number represented by the eight bytes at
@@ -466,12 +467,13 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 8` is greater than the length of this object.
    */
-  double getFloat64(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) =>
+  double getFloat64(int byteOffset,
+          [Endianness endian = Endianness.BIG_ENDIAN]) =>
       _getFloat64(byteOffset, Endianness.LITTLE_ENDIAN == endian);
 
   @JSName('getFloat64')
   @Returns('double')
-  double _getFloat64(int byteOffset, [bool littleEndian]) native;
+  double _getFloat64(int byteOffset, [bool littleEndian]) native ;
 
   /**
    * Returns the (possibly negative) integer represented by the two bytes at
@@ -483,12 +485,12 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 2` is greater than the length of this object.
    */
-  int getInt16(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) =>
+  int getInt16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) =>
       _getInt16(byteOffset, Endianness.LITTLE_ENDIAN == endian);
 
   @JSName('getInt16')
   @Returns('int')
-  int _getInt16(int byteOffset, [bool littleEndian]) native;
+  int _getInt16(int byteOffset, [bool littleEndian]) native ;
 
   /**
    * Returns the (possibly negative) integer represented by the four bytes at
@@ -500,12 +502,12 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 4` is greater than the length of this object.
    */
-  int getInt32(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) =>
+  int getInt32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) =>
       _getInt32(byteOffset, Endianness.LITTLE_ENDIAN == endian);
 
   @JSName('getInt32')
   @Returns('int')
-  int _getInt32(int byteOffset, [bool littleEndian]) native;
+  int _getInt32(int byteOffset, [bool littleEndian]) native ;
 
   /**
    * Returns the (possibly negative) integer represented by the eight bytes at
@@ -517,7 +519,7 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 8` is greater than the length of this object.
    */
-  int getInt64(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) {
+  int getInt64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
     throw new UnsupportedError('Int64 accessor not supported by dart2js.');
   }
 
@@ -529,7 +531,7 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * greater than or equal to the length of this object.
    */
-  int getInt8(int byteOffset) native;
+  int getInt8(int byteOffset) native ;
 
   /**
    * Returns the positive integer represented by the two bytes starting
@@ -540,12 +542,12 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 2` is greater than the length of this object.
    */
-  int getUint16(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) =>
+  int getUint16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) =>
       _getUint16(byteOffset, Endianness.LITTLE_ENDIAN == endian);
 
   @JSName('getUint16')
   @Returns('int')
-  int _getUint16(int byteOffset, [bool littleEndian]) native;
+  int _getUint16(int byteOffset, [bool littleEndian]) native ;
 
   /**
    * Returns the positive integer represented by the four bytes starting
@@ -556,12 +558,12 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 4` is greater than the length of this object.
    */
-  int getUint32(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) =>
+  int getUint32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) =>
       _getUint32(byteOffset, Endianness.LITTLE_ENDIAN == endian);
 
   @JSName('getUint32')
   @Returns('int')
-  int _getUint32(int byteOffset, [bool littleEndian]) native;
+  int _getUint32(int byteOffset, [bool littleEndian]) native ;
 
   /**
    * Returns the positive integer represented by the eight bytes starting
@@ -572,7 +574,7 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * `byteOffset + 8` is greater than the length of this object.
    */
-  int getUint64(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) {
+  int getUint64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
     throw new UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
 
@@ -584,7 +586,7 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * greater than or equal to the length of this object.
    */
-  int getUint8(int byteOffset) native;
+  int getUint8(int byteOffset) native ;
 
   /**
    * Sets the four bytes starting at the specified [byteOffset] in this
@@ -604,11 +606,11 @@
    * `byteOffset + 4` is greater than the length of this object.
    */
   void setFloat32(int byteOffset, num value,
-                  [Endianness endian=Endianness.BIG_ENDIAN]) =>
+          [Endianness endian = Endianness.BIG_ENDIAN]) =>
       _setFloat32(byteOffset, value, Endianness.LITTLE_ENDIAN == endian);
 
   @JSName('setFloat32')
-  void _setFloat32(int byteOffset, num value, [bool littleEndian]) native;
+  void _setFloat32(int byteOffset, num value, [bool littleEndian]) native ;
 
   /**
    * Sets the eight bytes starting at the specified [byteOffset] in this
@@ -619,11 +621,11 @@
    * `byteOffset + 8` is greater than the length of this object.
    */
   void setFloat64(int byteOffset, num value,
-                  [Endianness endian=Endianness.BIG_ENDIAN]) =>
+          [Endianness endian = Endianness.BIG_ENDIAN]) =>
       _setFloat64(byteOffset, value, Endianness.LITTLE_ENDIAN == endian);
 
   @JSName('setFloat64')
-  void _setFloat64(int byteOffset, num value, [bool littleEndian]) native;
+  void _setFloat64(int byteOffset, num value, [bool littleEndian]) native ;
 
   /**
    * Sets the two bytes starting at the specified [byteOffset] in this
@@ -635,11 +637,11 @@
    * `byteOffset + 2` is greater than the length of this object.
    */
   void setInt16(int byteOffset, int value,
-                [Endianness endian=Endianness.BIG_ENDIAN]) =>
+          [Endianness endian = Endianness.BIG_ENDIAN]) =>
       _setInt16(byteOffset, value, Endianness.LITTLE_ENDIAN == endian);
 
   @JSName('setInt16')
-  void _setInt16(int byteOffset, int value, [bool littleEndian]) native;
+  void _setInt16(int byteOffset, int value, [bool littleEndian]) native ;
 
   /**
    * Sets the four bytes starting at the specified [byteOffset] in this
@@ -651,11 +653,11 @@
    * `byteOffset + 4` is greater than the length of this object.
    */
   void setInt32(int byteOffset, int value,
-                [Endianness endian=Endianness.BIG_ENDIAN]) =>
+          [Endianness endian = Endianness.BIG_ENDIAN]) =>
       _setInt32(byteOffset, value, Endianness.LITTLE_ENDIAN == endian);
 
   @JSName('setInt32')
-  void _setInt32(int byteOffset, int value, [bool littleEndian]) native;
+  void _setInt32(int byteOffset, int value, [bool littleEndian]) native ;
 
   /**
    * Sets the eight bytes starting at the specified [byteOffset] in this
@@ -667,7 +669,7 @@
    * `byteOffset + 8` is greater than the length of this object.
    */
   void setInt64(int byteOffset, int value,
-                [Endianness endian=Endianness.BIG_ENDIAN]) {
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
     throw new UnsupportedError('Int64 accessor not supported by dart2js.');
   }
 
@@ -680,7 +682,7 @@
    * Throws [RangeError] if [byteOffset] is negative, or
    * greater than or equal to the length of this object.
    */
-  void setInt8(int byteOffset, int value) native;
+  void setInt8(int byteOffset, int value) native ;
 
   /**
    * Sets the two bytes starting at the specified [byteOffset] in this object
@@ -692,11 +694,11 @@
    * `byteOffset + 2` is greater than the length of this object.
    */
   void setUint16(int byteOffset, int value,
-                 [Endianness endian=Endianness.BIG_ENDIAN]) =>
+          [Endianness endian = Endianness.BIG_ENDIAN]) =>
       _setUint16(byteOffset, value, Endianness.LITTLE_ENDIAN == endian);
 
   @JSName('setUint16')
-  void _setUint16(int byteOffset, int value, [bool littleEndian]) native;
+  void _setUint16(int byteOffset, int value, [bool littleEndian]) native ;
 
   /**
    * Sets the four bytes starting at the specified [byteOffset] in this object
@@ -708,11 +710,11 @@
    * `byteOffset + 4` is greater than the length of this object.
    */
   void setUint32(int byteOffset, int value,
-                 [Endianness endian=Endianness.BIG_ENDIAN]) =>
+          [Endianness endian = Endianness.BIG_ENDIAN]) =>
       _setUint32(byteOffset, value, Endianness.LITTLE_ENDIAN == endian);
 
   @JSName('setUint32')
-  void _setUint32(int byteOffset, int value, [bool littleEndian]) native;
+  void _setUint32(int byteOffset, int value, [bool littleEndian]) native ;
 
   /**
    * Sets the eight bytes starting at the specified [byteOffset] in this object
@@ -724,7 +726,7 @@
    * `byteOffset + 8` is greater than the length of this object.
    */
   void setUint64(int byteOffset, int value,
-                 [Endianness endian=Endianness.BIG_ENDIAN]) {
+      [Endianness endian = Endianness.BIG_ENDIAN]) {
     throw new UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
 
@@ -737,7 +739,7 @@
    * Throws [RangeError] if [byteOffset] is negative,
    * or greater than or equal to the length of this object.
    */
-  void setUint8(int byteOffset, int value) native;
+  void setUint8(int byteOffset, int value) native ;
 
   static NativeByteData _create1(arg) =>
       JS('NativeByteData', 'new DataView(new ArrayBuffer(#))', arg);
@@ -749,13 +751,12 @@
       JS('NativeByteData', 'new DataView(#, #, #)', arg1, arg2, arg3);
 }
 
-
 abstract class NativeTypedArray extends NativeTypedData
     implements JavaScriptIndexingBehavior {
   int get length;
 
-  void _setRangeFast(int start, int end,
-      NativeTypedArray source, int skipCount) {
+  void _setRangeFast(
+      int start, int end, NativeTypedArray source, int skipCount) {
     int targetLength = this.length;
     _checkPosition(start, targetLength, "start");
     _checkPosition(end, targetLength, "end");
@@ -765,37 +766,34 @@
     if (skipCount < 0) throw new ArgumentError(skipCount);
 
     int sourceLength = source.length;
-    if (sourceLength - skipCount < count)  {
+    if (sourceLength - skipCount < count) {
       throw new StateError('Not enough elements');
     }
 
     if (skipCount != 0 || sourceLength != count) {
       // Create a view of the exact subrange that is copied from the source.
-      source = JS('', '#.subarray(#, #)',
-          source, skipCount, skipCount + count);
+      source = JS('', '#.subarray(#, #)', source, skipCount, skipCount + count);
     }
     JS('void', '#.set(#, #)', this, source, start);
   }
 }
 
-abstract class NativeTypedArrayOfDouble
-    extends NativeTypedArray
-        with ListMixin<double>, FixedLengthListMixin<double> {
-
+abstract class NativeTypedArrayOfDouble extends NativeTypedArray
+    with ListMixin<double>, FixedLengthListMixin<double> {
   int get length => JS('int', '#.length', this);
 
-  double operator[](int index) {
+  double operator [](int index) {
     _checkValidIndex(index, this, this.length);
     return JS('double', '#[#]', this, index);
   }
 
-  void operator[]=(int index, num value) {
+  void operator []=(int index, num value) {
     _checkValidIndex(index, this, this.length);
     JS('void', '#[#] = #', this, index, value);
   }
 
   void setRange(int start, int end, Iterable<double> iterable,
-                [int skipCount = 0]) {
+      [int skipCount = 0]) {
     if (iterable is NativeTypedArrayOfDouble) {
       _setRangeFast(start, end, iterable, skipCount);
       return;
@@ -804,23 +802,21 @@
   }
 }
 
-abstract class NativeTypedArrayOfInt
-    extends NativeTypedArray
-        with ListMixin<int>, FixedLengthListMixin<int>
+abstract class NativeTypedArrayOfInt extends NativeTypedArray
+    with ListMixin<int>, FixedLengthListMixin<int>
     implements List<int> {
-
   int get length => JS('int', '#.length', this);
 
   // operator[]() is not here since different versions have different return
   // types
 
-  void operator[]=(int index, int value) {
+  void operator []=(int index, int value) {
     _checkValidIndex(index, this, this.length);
     JS('void', '#[#] = #', this, index, value);
   }
 
   void setRange(int start, int end, Iterable<int> iterable,
-                [int skipCount = 0]) {
+      [int skipCount = 0]) {
     if (iterable is NativeTypedArrayOfInt) {
       _setRangeFast(start, end, iterable, skipCount);
       return;
@@ -829,19 +825,16 @@
   }
 }
 
-
 @Native("Float32Array")
-class NativeFloat32List
-    extends NativeTypedArrayOfDouble
+class NativeFloat32List extends NativeTypedArrayOfDouble
     implements Float32List {
-
   factory NativeFloat32List(int length) => _create1(_checkLength(length));
 
   factory NativeFloat32List.fromList(List<double> elements) =>
       _create1(_ensureNativeList(elements));
 
-  factory NativeFloat32List.view(ByteBuffer buffer,
-                                 int offsetInBytes, int length) {
+  factory NativeFloat32List.view(
+      ByteBuffer buffer, int offsetInBytes, int length) {
     _checkViewArguments(buffer, offsetInBytes, length);
     return length == null
         ? _create2(buffer, offsetInBytes)
@@ -866,19 +859,16 @@
       JS('NativeFloat32List', 'new Float32Array(#, #, #)', arg1, arg2, arg3);
 }
 
-
 @Native("Float64Array")
-class NativeFloat64List
-    extends NativeTypedArrayOfDouble
+class NativeFloat64List extends NativeTypedArrayOfDouble
     implements Float64List {
-
   factory NativeFloat64List(int length) => _create1(_checkLength(length));
 
   factory NativeFloat64List.fromList(List<double> elements) =>
       _create1(_ensureNativeList(elements));
 
-  factory NativeFloat64List.view(ByteBuffer buffer,
-                                 int offsetInBytes, int length) {
+  factory NativeFloat64List.view(
+      ByteBuffer buffer, int offsetInBytes, int length) {
     _checkViewArguments(buffer, offsetInBytes, length);
     return length == null
         ? _create2(buffer, offsetInBytes)
@@ -903,19 +893,15 @@
       JS('NativeFloat64List', 'new Float64Array(#, #, #)', arg1, arg2, arg3);
 }
 
-
 @Native("Int16Array")
-class NativeInt16List
-    extends NativeTypedArrayOfInt
-    implements Int16List {
-
+class NativeInt16List extends NativeTypedArrayOfInt implements Int16List {
   factory NativeInt16List(int length) => _create1(_checkLength(length));
 
   factory NativeInt16List.fromList(List<int> elements) =>
       _create1(_ensureNativeList(elements));
 
-  factory NativeInt16List.view(NativeByteBuffer buffer,
-                               int offsetInBytes, int length) {
+  factory NativeInt16List.view(
+      NativeByteBuffer buffer, int offsetInBytes, int length) {
     _checkViewArguments(buffer, offsetInBytes, length);
     return length == null
         ? _create2(buffer, offsetInBytes)
@@ -924,7 +910,7 @@
 
   Type get runtimeType => Int16List;
 
-  int operator[](int index) {
+  int operator [](int index) {
     _checkValidIndex(index, this, this.length);
     return JS('int', '#[#]', this, index);
   }
@@ -945,17 +931,15 @@
       JS('NativeInt16List', 'new Int16Array(#, #, #)', arg1, arg2, arg3);
 }
 
-
 @Native("Int32Array")
 class NativeInt32List extends NativeTypedArrayOfInt implements Int32List {
-
   factory NativeInt32List(int length) => _create1(_checkLength(length));
 
   factory NativeInt32List.fromList(List<int> elements) =>
       _create1(_ensureNativeList(elements));
 
-  factory NativeInt32List.view(ByteBuffer buffer,
-                               int offsetInBytes, int length) {
+  factory NativeInt32List.view(
+      ByteBuffer buffer, int offsetInBytes, int length) {
     _checkViewArguments(buffer, offsetInBytes, length);
     return length == null
         ? _create2(buffer, offsetInBytes)
@@ -964,7 +948,7 @@
 
   Type get runtimeType => Int32List;
 
-  int operator[](int index) {
+  int operator [](int index) {
     _checkValidIndex(index, this, this.length);
     return JS('int', '#[#]', this, index);
   }
@@ -985,17 +969,15 @@
       JS('NativeInt32List', 'new Int32Array(#, #, #)', arg1, arg2, arg3);
 }
 
-
 @Native("Int8Array")
 class NativeInt8List extends NativeTypedArrayOfInt implements Int8List {
-
   factory NativeInt8List(int length) => _create1(_checkLength(length));
 
   factory NativeInt8List.fromList(List<int> elements) =>
       _create1(_ensureNativeList(elements));
 
-  factory NativeInt8List.view(ByteBuffer buffer,
-                               int offsetInBytes, int length) {
+  factory NativeInt8List.view(
+      ByteBuffer buffer, int offsetInBytes, int length) {
     _checkViewArguments(buffer, offsetInBytes, length);
     return length == null
         ? _create2(buffer, offsetInBytes)
@@ -1004,7 +986,7 @@
 
   Type get runtimeType => Int8List;
 
-  int operator[](int index) {
+  int operator [](int index) {
     _checkValidIndex(index, this, this.length);
     return JS('int', '#[#]', this, index);
   }
@@ -1025,17 +1007,15 @@
       JS('NativeInt8List', 'new Int8Array(#, #, #)', arg1, arg2, arg3);
 }
 
-
 @Native("Uint16Array")
 class NativeUint16List extends NativeTypedArrayOfInt implements Uint16List {
-
   factory NativeUint16List(int length) => _create1(_checkLength(length));
 
   factory NativeUint16List.fromList(List<int> list) =>
       _create1(_ensureNativeList(list));
 
-  factory NativeUint16List.view(ByteBuffer buffer,
-                                int offsetInBytes, int length) {
+  factory NativeUint16List.view(
+      ByteBuffer buffer, int offsetInBytes, int length) {
     _checkViewArguments(buffer, offsetInBytes, length);
     return length == null
         ? _create2(buffer, offsetInBytes)
@@ -1044,7 +1024,7 @@
 
   Type get runtimeType => Uint16List;
 
-  int operator[](int index) {
+  int operator [](int index) {
     _checkValidIndex(index, this, this.length);
     return JS('int', '#[#]', this, index);
   }
@@ -1065,17 +1045,15 @@
       JS('NativeUint16List', 'new Uint16Array(#, #, #)', arg1, arg2, arg3);
 }
 
-
 @Native("Uint32Array")
 class NativeUint32List extends NativeTypedArrayOfInt implements Uint32List {
-
   factory NativeUint32List(int length) => _create1(_checkLength(length));
 
   factory NativeUint32List.fromList(List<int> elements) =>
       _create1(_ensureNativeList(elements));
 
-  factory NativeUint32List.view(ByteBuffer buffer,
-                                int offsetInBytes, int length) {
+  factory NativeUint32List.view(
+      ByteBuffer buffer, int offsetInBytes, int length) {
     _checkViewArguments(buffer, offsetInBytes, length);
     return length == null
         ? _create2(buffer, offsetInBytes)
@@ -1084,7 +1062,7 @@
 
   Type get runtimeType => Uint32List;
 
-  int operator[](int index) {
+  int operator [](int index) {
     _checkValidIndex(index, this, this.length);
     return JS('int', '#[#]', this, index);
   }
@@ -1105,19 +1083,16 @@
       JS('NativeUint32List', 'new Uint32Array(#, #, #)', arg1, arg2, arg3);
 }
 
-
 @Native("Uint8ClampedArray,CanvasPixelArray")
-class NativeUint8ClampedList
-    extends NativeTypedArrayOfInt
+class NativeUint8ClampedList extends NativeTypedArrayOfInt
     implements Uint8ClampedList {
-
   factory NativeUint8ClampedList(int length) => _create1(_checkLength(length));
 
   factory NativeUint8ClampedList.fromList(List<int> elements) =>
       _create1(_ensureNativeList(elements));
 
-  factory NativeUint8ClampedList.view(ByteBuffer buffer,
-                                      int offsetInBytes, int length) {
+  factory NativeUint8ClampedList.view(
+      ByteBuffer buffer, int offsetInBytes, int length) {
     _checkViewArguments(buffer, offsetInBytes, length);
     return length == null
         ? _create2(buffer, offsetInBytes)
@@ -1128,15 +1103,15 @@
 
   int get length => JS('int', '#.length', this);
 
-  int operator[](int index) {
+  int operator [](int index) {
     _checkValidIndex(index, this, this.length);
     return JS('int', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
-    var source = JS('NativeUint8ClampedList', '#.subarray(#, #)',
-        this, start, end);
+    var source =
+        JS('NativeUint8ClampedList', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
@@ -1146,26 +1121,27 @@
   static NativeUint8ClampedList _create2(arg1, arg2) =>
       JS('NativeUint8ClampedList', 'new Uint8ClampedArray(#, #)', arg1, arg2);
 
-  static NativeUint8ClampedList _create3(arg1, arg2, arg3) =>
-      JS('NativeUint8ClampedList', 'new Uint8ClampedArray(#, #, #)',
-         arg1, arg2, arg3);
+  static NativeUint8ClampedList _create3(arg1, arg2, arg3) => JS(
+      'NativeUint8ClampedList',
+      'new Uint8ClampedArray(#, #, #)',
+      arg1,
+      arg2,
+      arg3);
 }
 
-
 // On some browsers Uint8ClampedArray is a subtype of Uint8Array.  Marking
 // Uint8List as !nonleaf ensures that the native dispatch correctly handles
 // the potential for Uint8ClampedArray to 'accidentally' pick up the
 // dispatch record for Uint8List.
 @Native("Uint8Array,!nonleaf")
 class NativeUint8List extends NativeTypedArrayOfInt implements Uint8List {
-
   factory NativeUint8List(int length) => _create1(_checkLength(length));
 
   factory NativeUint8List.fromList(List<int> elements) =>
       _create1(_ensureNativeList(elements));
 
-  factory NativeUint8List.view(ByteBuffer buffer,
-                               int offsetInBytes, int length) {
+  factory NativeUint8List.view(
+      ByteBuffer buffer, int offsetInBytes, int length) {
     _checkViewArguments(buffer, offsetInBytes, length);
     return length == null
         ? _create2(buffer, offsetInBytes)
@@ -1176,7 +1152,7 @@
 
   int get length => JS('int', '#.length', this);
 
-  int operator[](int index) {
+  int operator [](int index) {
     _checkValidIndex(index, this, this.length);
     return JS('int', '#[#]', this, index);
   }
@@ -1197,7 +1173,6 @@
       JS('NativeUint8List', 'new Uint8Array(#, #, #)', arg1, arg2, arg3);
 }
 
-
 /**
  * Implementation of Dart Float32x4 immutable value type and operations.
  * Float32x4 stores 4 32-bit floating point values in "lanes".
@@ -1218,10 +1193,10 @@
   }
 
   NativeFloat32x4(double x, double y, double z, double w)
-    : this.x = _truncate(x),
-      this.y = _truncate(y),
-      this.z = _truncate(z),
-      this.w = _truncate(w) {
+      : this.x = _truncate(x),
+        this.y = _truncate(y),
+        this.z = _truncate(z),
+        this.w = _truncate(w) {
     // We would prefer to check for `double` but in dart2js we can't see the
     // difference anyway.
     if (x is! num) throw new ArgumentError(x);
@@ -1239,20 +1214,21 @@
     _uint32view[1] = i.y;
     _uint32view[2] = i.z;
     _uint32view[3] = i.w;
-    return new NativeFloat32x4._truncated(_list[0], _list[1], _list[2], _list[3]);
+    return new NativeFloat32x4._truncated(
+        _list[0], _list[1], _list[2], _list[3]);
   }
 
   NativeFloat32x4.fromFloat64x2(Float64x2 v)
-    : this._truncated(_truncate(v.x), _truncate(v.y), 0.0, 0.0);
+      : this._truncated(_truncate(v.x), _truncate(v.y), 0.0, 0.0);
 
   /// Creates a new NativeFloat32x4.
   ///
   /// Does not verify if the given arguments are non-null.
   NativeFloat32x4._doubles(double x, double y, double z, double w)
-    : this.x = _truncate(x),
-      this.y = _truncate(y),
-      this.z = _truncate(z),
-      this.w = _truncate(w);
+      : this.x = _truncate(x),
+        this.y = _truncate(y),
+        this.z = _truncate(z),
+        this.w = _truncate(w);
 
   /// Creates a new NativeFloat32x4.
   ///
@@ -1265,8 +1241,8 @@
     return '[$x, $y, $z, $w]';
   }
 
-   /// Addition operator.
-  Float32x4 operator+(Float32x4 other) {
+  /// Addition operator.
+  Float32x4 operator +(Float32x4 other) {
     double _x = x + other.x;
     double _y = y + other.y;
     double _z = z + other.z;
@@ -1275,12 +1251,12 @@
   }
 
   /// Negate operator.
-  Float32x4 operator-() {
+  Float32x4 operator -() {
     return new NativeFloat32x4._truncated(-x, -y, -z, -w);
   }
 
   /// Subtraction operator.
-  Float32x4 operator-(Float32x4 other) {
+  Float32x4 operator -(Float32x4 other) {
     double _x = x - other.x;
     double _y = y - other.y;
     double _z = z - other.z;
@@ -1289,7 +1265,7 @@
   }
 
   /// Multiplication operator.
-  Float32x4 operator*(Float32x4 other) {
+  Float32x4 operator *(Float32x4 other) {
     double _x = x * other.x;
     double _y = y * other.y;
     double _z = z * other.z;
@@ -1298,7 +1274,7 @@
   }
 
   /// Division operator.
-  Float32x4 operator/(Float32x4 other) {
+  Float32x4 operator /(Float32x4 other) {
     double _x = x / other.x;
     double _y = y / other.y;
     double _z = z / other.z;
@@ -1312,10 +1288,8 @@
     bool _cy = y < other.y;
     bool _cz = z < other.z;
     bool _cw = w < other.w;
-    return new NativeInt32x4._truncated(_cx ? -1 : 0,
-                                        _cy ? -1 : 0,
-                                        _cz ? -1 : 0,
-                                        _cw ? -1 : 0);
+    return new NativeInt32x4._truncated(
+        _cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
   }
 
   /// Relational less than or equal.
@@ -1324,10 +1298,8 @@
     bool _cy = y <= other.y;
     bool _cz = z <= other.z;
     bool _cw = w <= other.w;
-    return new NativeInt32x4._truncated(_cx ? -1 : 0,
-                                        _cy ? -1 : 0,
-                                        _cz ? -1 : 0,
-                                        _cw ? -1 : 0);
+    return new NativeInt32x4._truncated(
+        _cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
   }
 
   /// Relational greater than.
@@ -1336,10 +1308,8 @@
     bool _cy = y > other.y;
     bool _cz = z > other.z;
     bool _cw = w > other.w;
-    return new NativeInt32x4._truncated(_cx ? -1 : 0,
-                                        _cy ? -1 : 0,
-                                        _cz ? -1 : 0,
-                                        _cw ? -1 : 0);
+    return new NativeInt32x4._truncated(
+        _cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
   }
 
   /// Relational greater than or equal.
@@ -1348,10 +1318,8 @@
     bool _cy = y >= other.y;
     bool _cz = z >= other.z;
     bool _cw = w >= other.w;
-    return new NativeInt32x4._truncated(_cx ? -1 : 0,
-                                        _cy ? -1 : 0,
-                                        _cz ? -1 : 0,
-                                        _cw ? -1 : 0);
+    return new NativeInt32x4._truncated(
+        _cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
   }
 
   /// Relational equal.
@@ -1360,10 +1328,8 @@
     bool _cy = y == other.y;
     bool _cz = z == other.z;
     bool _cw = w == other.w;
-    return new NativeInt32x4._truncated(_cx ? -1 : 0,
-                                        _cy ? -1 : 0,
-                                        _cz ? -1 : 0,
-                                        _cw ? -1 : 0);
+    return new NativeInt32x4._truncated(
+        _cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
   }
 
   /// Relational not-equal.
@@ -1372,10 +1338,8 @@
     bool _cy = y != other.y;
     bool _cz = z != other.z;
     bool _cw = w != other.w;
-    return new NativeInt32x4._truncated(_cx ? -1 : 0,
-                                        _cy ? -1 : 0,
-                                        _cz ? -1 : 0,
-                                        _cw ? -1 : 0);
+    return new NativeInt32x4._truncated(
+        _cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
   }
 
   /// Returns a copy of [this] each lane being scaled by [s].
@@ -1544,7 +1508,6 @@
   }
 }
 
-
 /**
  * Interface of Dart Int32x4 and operations.
  * Int32x4 stores 4 32-bit bit-masks in "lanes".
@@ -1564,10 +1527,10 @@
   }
 
   NativeInt32x4(int x, int y, int z, int w)
-    : this.x = _truncate(x),
-      this.y = _truncate(y),
-      this.z = _truncate(z),
-      this.w = _truncate(w) {
+      : this.x = _truncate(x),
+        this.y = _truncate(y),
+        this.z = _truncate(z),
+        this.w = _truncate(w) {
     if (x != this.x && x is! int) throw new ArgumentError(x);
     if (y != this.y && y is! int) throw new ArgumentError(y);
     if (z != this.z && z is! int) throw new ArgumentError(z);
@@ -1575,10 +1538,10 @@
   }
 
   NativeInt32x4.bool(bool x, bool y, bool z, bool w)
-    : this.x = x ? -1 : 0,
-      this.y = y ? -1 : 0,
-      this.z = z ? -1 : 0,
-      this.w = w ? -1 : 0;
+      : this.x = x ? -1 : 0,
+        this.y = y ? -1 : 0,
+        this.z = z ? -1 : 0,
+        this.w = w ? -1 : 0;
 
   /// Returns a bit-wise copy of [f] as a Int32x4.
   factory NativeInt32x4.fromFloat32x4Bits(Float32x4 f) {
@@ -1595,59 +1558,64 @@
 
   String toString() => '[$x, $y, $z, $w]';
 
-
   /// The bit-wise or operator.
-  Int32x4 operator|(Int32x4 other) {
+  Int32x4 operator |(Int32x4 other) {
     // Dart2js uses unsigned results for bit-operations.
     // We use "JS" to fall back to the signed versions.
-    return new NativeInt32x4._truncated(JS("int", "# | #", x, other.x),
-                                        JS("int", "# | #", y, other.y),
-                                        JS("int", "# | #", z, other.z),
-                                        JS("int", "# | #", w, other.w));
+    return new NativeInt32x4._truncated(
+        JS("int", "# | #", x, other.x),
+        JS("int", "# | #", y, other.y),
+        JS("int", "# | #", z, other.z),
+        JS("int", "# | #", w, other.w));
   }
 
   /// The bit-wise and operator.
-  Int32x4 operator&(Int32x4 other) {
+  Int32x4 operator &(Int32x4 other) {
     // Dart2js uses unsigned results for bit-operations.
     // We use "JS" to fall back to the signed versions.
-    return new NativeInt32x4._truncated(JS("int", "# & #", x, other.x),
-                                        JS("int", "# & #", y, other.y),
-                                        JS("int", "# & #", z, other.z),
-                                        JS("int", "# & #", w, other.w));
+    return new NativeInt32x4._truncated(
+        JS("int", "# & #", x, other.x),
+        JS("int", "# & #", y, other.y),
+        JS("int", "# & #", z, other.z),
+        JS("int", "# & #", w, other.w));
   }
 
   /// The bit-wise xor operator.
-  Int32x4 operator^(Int32x4 other) {
+  Int32x4 operator ^(Int32x4 other) {
     // Dart2js uses unsigned results for bit-operations.
     // We use "JS" to fall back to the signed versions.
-    return new NativeInt32x4._truncated(JS("int", "# ^ #", x, other.x),
-                                        JS("int", "# ^ #", y, other.y),
-                                        JS("int", "# ^ #", z, other.z),
-                                        JS("int", "# ^ #", w, other.w));
+    return new NativeInt32x4._truncated(
+        JS("int", "# ^ #", x, other.x),
+        JS("int", "# ^ #", y, other.y),
+        JS("int", "# ^ #", z, other.z),
+        JS("int", "# ^ #", w, other.w));
   }
 
-  Int32x4 operator+(Int32x4 other) {
+  Int32x4 operator +(Int32x4 other) {
     // Avoid going through the typed array by "| 0" the result.
-    return new NativeInt32x4._truncated(JS("int", "(# + #) | 0", x, other.x),
-                                        JS("int", "(# + #) | 0", y, other.y),
-                                        JS("int", "(# + #) | 0", z, other.z),
-                                        JS("int", "(# + #) | 0", w, other.w));
+    return new NativeInt32x4._truncated(
+        JS("int", "(# + #) | 0", x, other.x),
+        JS("int", "(# + #) | 0", y, other.y),
+        JS("int", "(# + #) | 0", z, other.z),
+        JS("int", "(# + #) | 0", w, other.w));
   }
 
-  Int32x4 operator-(Int32x4 other) {
+  Int32x4 operator -(Int32x4 other) {
     // Avoid going through the typed array by "| 0" the result.
-    return new NativeInt32x4._truncated(JS("int", "(# - #) | 0", x, other.x),
-                                        JS("int", "(# - #) | 0", y, other.y),
-                                        JS("int", "(# - #) | 0", z, other.z),
-                                        JS("int", "(# - #) | 0", w, other.w));
+    return new NativeInt32x4._truncated(
+        JS("int", "(# - #) | 0", x, other.x),
+        JS("int", "(# - #) | 0", y, other.y),
+        JS("int", "(# - #) | 0", z, other.z),
+        JS("int", "(# - #) | 0", w, other.w));
   }
 
-  Int32x4 operator-() {
+  Int32x4 operator -() {
     // Avoid going through the typed array by "| 0" the result.
-    return new NativeInt32x4._truncated(JS("int", "(-#) | 0", x),
-                                        JS("int", "(-#) | 0", y),
-                                        JS("int", "(-#) | 0", z),
-                                        JS("int", "(-#) | 0", w));
+    return new NativeInt32x4._truncated(
+        JS("int", "(-#) | 0", x),
+        JS("int", "(-#) | 0", y),
+        JS("int", "(-#) | 0", z),
+        JS("int", "(-#) | 0", w));
   }
 
   /// Extract the top bit from each lane return them in the first 4 bits.
@@ -1724,10 +1692,13 @@
 
   /// Extracted x value. Returns `false` for 0, `true` for any other value.
   bool get flagX => x != 0;
+
   /// Extracted y value. Returns `false` for 0, `true` for any other value.
   bool get flagY => y != 0;
+
   /// Extracted z value. Returns `false` for 0, `true` for any other value.
   bool get flagZ => z != 0;
+
   /// Extracted w value. Returns `false` for 0, `true` for any other value.
   bool get flagW => w != 0;
 
@@ -1816,25 +1787,27 @@
   String toString() => '[$x, $y]';
 
   /// Addition operator.
-  Float64x2 operator+(Float64x2 other) {
+  Float64x2 operator +(Float64x2 other) {
     return new NativeFloat64x2._doubles(x + other.x, y + other.y);
   }
 
   /// Negate operator.
-  Float64x2 operator-() {
+  Float64x2 operator -() {
     return new NativeFloat64x2._doubles(-x, -y);
   }
 
   /// Subtraction operator.
-  Float64x2 operator-(Float64x2 other) {
+  Float64x2 operator -(Float64x2 other) {
     return new NativeFloat64x2._doubles(x - other.x, y - other.y);
   }
+
   /// Multiplication operator.
-  Float64x2 operator*(Float64x2 other) {
+  Float64x2 operator *(Float64x2 other) {
     return new NativeFloat64x2._doubles(x * other.x, y * other.y);
   }
+
   /// Division operator.
-  Float64x2 operator/(Float64x2 other) {
+  Float64x2 operator /(Float64x2 other) {
     return new NativeFloat64x2._doubles(x / other.x, y / other.y);
   }
 
@@ -1849,8 +1822,7 @@
   }
 
   /// Clamps [this] to be in the range [lowerLimit]-[upperLimit].
-  Float64x2 clamp(Float64x2 lowerLimit,
-                  Float64x2 upperLimit) {
+  Float64x2 clamp(Float64x2 lowerLimit, Float64x2 upperLimit) {
     double _lx = lowerLimit.x;
     double _ly = lowerLimit.y;
     double _ux = upperLimit.x;
@@ -1889,20 +1861,19 @@
 
   /// Returns the lane-wise minimum value in [this] or [other].
   Float64x2 min(Float64x2 other) {
-    return new NativeFloat64x2._doubles(x < other.x ? x : other.x,
-                                        y < other.y ? y : other.y);
-
+    return new NativeFloat64x2._doubles(
+        x < other.x ? x : other.x, y < other.y ? y : other.y);
   }
 
   /// Returns the lane-wise maximum value in [this] or [other].
   Float64x2 max(Float64x2 other) {
-    return new NativeFloat64x2._doubles(x > other.x ? x : other.x,
-                                        y > other.y ? y : other.y);
+    return new NativeFloat64x2._doubles(
+        x > other.x ? x : other.x, y > other.y ? y : other.y);
   }
 
   /// Returns the lane-wise square root of [this].
   Float64x2 sqrt() {
-      return new NativeFloat64x2._doubles(Math.sqrt(x), Math.sqrt(y));
+    return new NativeFloat64x2._doubles(Math.sqrt(x), Math.sqrt(y));
   }
 }
 
@@ -1929,11 +1900,10 @@
 /// Returns the actual value of `end`, which is `length` if `end` is `null`, and
 /// the original value of `end` otherwise.
 int _checkValidRange(int start, int end, int length) {
-  if (_isInvalidArrayIndex(start) ||  // Ensures start is non-negative int.
-      ((end == null) ? start > length
-                     : (_isInvalidArrayIndex(end) ||
-                        start > end ||
-                        end > length))) {
+  if (_isInvalidArrayIndex(start) || // Ensures start is non-negative int.
+      ((end == null)
+          ? start > length
+          : (_isInvalidArrayIndex(end) || start > end || end > length))) {
     throw diagnoseRangeError(start, end, length);
   }
   if (end == null) return length;
diff --git a/pkg/dev_compiler/tool/input_sdk/private/regexp_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/regexp_helper.dart
index a8fb4cc..fdfd0d9 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/regexp_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/regexp_helper.dart
@@ -7,7 +7,8 @@
 // Helper method used by internal libraries.
 regExpGetNative(JSSyntaxRegExp regexp) => regexp._nativeRegExp;
 
-List<String> _stringList(List l) => l == null ? l : JS('', 'dart.list(#, #)', l, String);
+List<String> _stringList(List l) =>
+    l == null ? l : JS('', 'dart.list(#, #)', l, String);
 
 /**
  * Returns a native version of the RegExp with the global flag set.
@@ -51,18 +52,15 @@
   String toString() => "RegExp/$pattern/";
 
   JSSyntaxRegExp(String source,
-                 { bool multiLine: false,
-                   bool caseSensitive: true })
+      {bool multiLine: false, bool caseSensitive: true})
       : this.pattern = source,
         this._nativeRegExp =
             makeNative(source, multiLine, caseSensitive, false);
 
   get _nativeGlobalVersion {
     if (_nativeGlobalRegExp != null) return _nativeGlobalRegExp;
-    return _nativeGlobalRegExp = makeNative(pattern,
-                                            _isMultiLine,
-                                            _isCaseSensitive,
-                                            true);
+    return _nativeGlobalRegExp =
+        makeNative(pattern, _isMultiLine, _isCaseSensitive, true);
   }
 
   get _nativeAnchoredVersion {
@@ -72,10 +70,8 @@
     // that it tries, and you can see if the original regexp matched, or it
     // was the added zero-width match that matched, by looking at the last
     // capture. If it is a String, the match participated, otherwise it didn't.
-    return _nativeAnchoredRegExp = makeNative("$pattern|()",
-                                              _isMultiLine,
-                                              _isCaseSensitive,
-                                              true);
+    return _nativeAnchoredRegExp =
+        makeNative("$pattern|()", _isMultiLine, _isCaseSensitive, true);
   }
 
   bool get _isMultiLine => JS("bool", "#.multiline", _nativeRegExp);
@@ -90,27 +86,29 @@
     // We're using the JavaScript's try catch instead of the Dart one
     // to avoid dragging in Dart runtime support just because of using
     // RegExp.
-    var regexp = JS('',
+    var regexp = JS(
+        '',
         '(function() {'
-         'try {'
-          'return new RegExp(#, # + # + #);'
-         '} catch (e) {'
-           'return e;'
-         '}'
-        '})()', source, m, i, g);
+        'try {'
+        'return new RegExp(#, # + # + #);'
+        '} catch (e) {'
+        'return e;'
+        '}'
+        '})()',
+        source,
+        m,
+        i,
+        g);
     if (JS('bool', '# instanceof RegExp', regexp)) return regexp;
     // The returned value is the JavaScript exception. Turn it into a
     // Dart exception.
     String errorMessage = JS('String', r'String(#)', regexp);
-    throw new FormatException(
-        "Illegal RegExp pattern: $source, $errorMessage");
+    throw new FormatException("Illegal RegExp pattern: $source, $errorMessage");
   }
 
   Match firstMatch(String string) {
-    List m = JS('JSExtendableArray|Null',
-                        r'#.exec(#)',
-                        _nativeRegExp,
-                        checkString(string));
+    List m = JS('JSExtendableArray|Null', r'#.exec(#)', _nativeRegExp,
+        checkString(string));
     if (m == null) return null;
     return new _MatchImplementation(this, _stringList(m));
   }
@@ -228,7 +226,7 @@
       }
     }
     _current = null;
-    _string = null;  // Marks iteration as ended.
+    _string = null; // Marks iteration as ended.
     return false;
   }
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/string_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/string_helper.dart
index 0d662f1..704cdb5 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/string_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/string_helper.dart
@@ -21,12 +21,10 @@
 }
 
 class StringMatch implements Match {
-  const StringMatch(int this.start,
-                    String this.input,
-                    String this.pattern);
+  const StringMatch(int this.start, String this.input, String this.pattern);
 
   int get end => start + pattern.length;
-  String operator[](int g) => group(g);
+  String operator [](int g) => group(g);
   int get groupCount => 0;
 
   String group(int group_) {
@@ -49,8 +47,8 @@
   final String pattern;
 }
 
-Iterable<Match> allMatchesInStringUnchecked(String pattern, String string,
-                                            int startIndex) {
+Iterable<Match> allMatchesInStringUnchecked(
+    String pattern, String string, int startIndex) {
   return new _StringAllMatchesIterable(string, pattern, startIndex);
 }
 
@@ -122,8 +120,8 @@
   return JS('String', r'#.replace(#, #)', receiver, replacer, replacement);
 }
 
-String stringReplaceFirstRE(String receiver,
-    JSSyntaxRegExp regexp, String replacement, int startIndex) {
+String stringReplaceFirstRE(String receiver, JSSyntaxRegExp regexp,
+    String replacement, int startIndex) {
   var match = regexp._execGlobal(receiver, startIndex);
   if (match == null) return receiver;
   var start = match.start;
@@ -131,7 +129,6 @@
   return stringReplaceRangeUnchecked(receiver, start, end, replacement);
 }
 
-
 /// Returns a string for a RegExp pattern that matches [string]. This is done by
 /// escaping all RegExp metacharacters.
 String quoteStringForRegExp(string) {
@@ -173,16 +170,13 @@
 String _matchString(Match match) => match[0];
 String _stringIdentity(String string) => string;
 
-String stringReplaceAllFuncUnchecked(
-    String receiver,
-    Pattern pattern,
-    String onMatch(Match match),
-    String onNonMatch(String nonMatch)) {
+String stringReplaceAllFuncUnchecked(String receiver, Pattern pattern,
+    String onMatch(Match match), String onNonMatch(String nonMatch)) {
   if (onMatch == null) onMatch = _matchString;
   if (onNonMatch == null) onNonMatch = _stringIdentity;
   if (pattern is String) {
-    return stringReplaceAllStringFuncUnchecked(receiver, pattern,
-                                               onMatch, onNonMatch);
+    return stringReplaceAllStringFuncUnchecked(
+        receiver, pattern, onMatch, onNonMatch);
   }
   // Placing the Pattern test here is indistingishable from placing it at the
   // top of the method but it saves an extra check on the `pattern is String`
@@ -202,8 +196,7 @@
 }
 
 String stringReplaceAllEmptyFuncUnchecked(String receiver,
-    String onMatch(Match match),
-    String onNonMatch(String nonMatch)) {
+    String onMatch(Match match), String onNonMatch(String nonMatch)) {
   // Pattern is the empty string.
   StringBuffer buffer = new StringBuffer();
   int length = receiver.length;
@@ -231,11 +224,8 @@
   return buffer.toString();
 }
 
-String stringReplaceAllStringFuncUnchecked(
-    String receiver,
-    String pattern,
-    String onMatch(Match match),
-    String onNonMatch(String nonMatch)) {
+String stringReplaceAllStringFuncUnchecked(String receiver, String pattern,
+    String onMatch(Match match), String onNonMatch(String nonMatch)) {
   int patternLength = pattern.length;
   if (patternLength == 0) {
     return stringReplaceAllEmptyFuncUnchecked(receiver, onMatch, onNonMatch);
@@ -256,7 +246,6 @@
   return buffer.toString();
 }
 
-
 String stringReplaceFirstUnchecked(
     String receiver, Pattern pattern, String replacement, int startIndex) {
   if (pattern is String) {
@@ -277,11 +266,8 @@
   return receiver.replaceRange(match.start, match.end, replacement);
 }
 
-String stringReplaceFirstMappedUnchecked(
-    String receiver,
-    Pattern pattern,
-    String replace(Match current),
-    int startIndex) {
+String stringReplaceFirstMappedUnchecked(String receiver, Pattern pattern,
+    String replace(Match current), int startIndex) {
   Iterator<Match> matches = pattern.allMatches(receiver, startIndex).iterator;
   if (!matches.moveNext()) return receiver;
   Match match = matches.current;
@@ -293,8 +279,8 @@
   return JS('String', r'#.join(#)', array, separator);
 }
 
-String stringReplaceRangeUnchecked(String receiver,
-    int start, int end, String replacement) {
+String stringReplaceRangeUnchecked(
+    String receiver, int start, int end, String replacement) {
   var prefix = JS('String', '#.substring(0, #)', receiver, start);
   var suffix = JS('String', '#.substring(#)', receiver, end);
   return "$prefix$replacement$suffix";
diff --git a/pkg/dev_compiler/web/main.dart b/pkg/dev_compiler/web/main.dart
index 22b7e08..1480a65 100755
--- a/pkg/dev_compiler/web/main.dart
+++ b/pkg/dev_compiler/web/main.dart
@@ -23,7 +23,8 @@
   // Avoid race condition when users try to call $setUpDartDevCompilerInBrowser
   // before it is ready by installing the method immediately and making the body
   // of the method async.
-  setUpCompilerInBrowser = allowInterop((String summaryRoot, String sdkUrl,
+  setUpCompilerInBrowser = allowInterop((String summaryRoot,
+      String sdkUrl,
       List<String> summaryUrls,
       Function onCompileReady,
       Function onError) async {
diff --git a/pkg/dev_compiler/web/web_command.dart b/pkg/dev_compiler/web/web_command.dart
index 641c37d..1df3255 100644
--- a/pkg/dev_compiler/web/web_command.dart
+++ b/pkg/dev_compiler/web/web_command.dart
@@ -20,10 +20,7 @@
 import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl;
 import 'package:analyzer/src/summary/idl.dart' show PackageBundle;
 import 'package:analyzer/src/summary/package_bundle_reader.dart'
-    show
-        SummaryDataStore,
-        InSummaryUriResolver,
-        InSummarySource;
+    show SummaryDataStore, InSummaryUriResolver, InSummarySource;
 import 'package:analyzer/src/dart/resolver/scope.dart' show Scope;
 
 import 'package:args/command_runner.dart';
@@ -66,8 +63,8 @@
     return requestSummaries;
   }
 
-  void requestSummaries(String summaryRoot, String sdkUrl, List<String> summaryUrls,
-      Function onCompileReady, Function onError) {
+  void requestSummaries(String summaryRoot, String sdkUrl,
+      List<String> summaryUrls, Function onCompileReady, Function onError) {
     HttpRequest
         .request(sdkUrl,
             responseType: "arraybuffer", mimeType: "application/octet-stream")
@@ -89,8 +86,8 @@
 
         onCompileReady(setUpCompile(sdkBytes, summaryBytes, summaryUrls));
       }).catchError((error) => onError('Summaries failed to load: $error'));
-    }).catchError(
-            (error) => onError('Dart sdk summaries failed to load: $error. url: $sdkUrl'));
+    }).catchError((error) =>
+            onError('Dart sdk summaries failed to load: $error. url: $sdkUrl'));
   }
 
   List<Function> setUpCompile(List<int> sdkBytes, List<List<int>> summaryBytes,
@@ -103,10 +100,10 @@
     var resourceUriResolver = new ResourceUriResolver(resourceProvider);
 
     var options = new AnalyzerOptions.basic(
-            dartSdkPath: '/dart-sdk', dartSdkSummaryPath: dartSdkSummaryPath);
+        dartSdkPath: '/dart-sdk', dartSdkSummaryPath: dartSdkSummaryPath);
 
-    var summaryDataStore =
-        new SummaryDataStore(options.summaryPaths, resourceProvider: resourceProvider, recordDependencyInfo: true);
+    var summaryDataStore = new SummaryDataStore(options.summaryPaths,
+        resourceProvider: resourceProvider, recordDependencyInfo: true);
     for (var i = 0; i < summaryBytes.length; i++) {
       var bytes = summaryBytes[i];
       var url = '/' + summaryUrls[i];
@@ -118,8 +115,7 @@
 
     var fileResolvers = [summaryResolver, resourceUriResolver];
 
-    var compiler = new ModuleCompiler(
-        options,
+    var compiler = new ModuleCompiler(options,
         analysisRoot: '/web-compile-root',
         fileResolvers: fileResolvers,
         resourceProvider: resourceProvider,
diff --git a/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart b/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
index f91ae20..8a76b65 100644
--- a/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
+++ b/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
@@ -392,11 +392,12 @@
 
   void handleNoInitializers() {
     debugEvent("NoInitializers");
+    push(NullValue.ConstructorInitializers);
   }
 
   void endInitializers(int count, Token beginToken, Token endToken) {
     debugEvent("Initializers");
-    popList(count);
+    push(popList(count));
   }
 
   void endVariableInitializer(Token assignmentOperator) {
@@ -414,8 +415,8 @@
     debugEvent("WhileStatement");
     Statement body = pop();
     ParenthesizedExpression condition = pop();
-    pop(); // continue target
-    pop(); // break target
+    exitContinueTarget();
+    exitBreakTarget();
     push(ast.whileStatement(
         toAnalyzerToken(whileKeyword),
         condition.leftParenthesis,
@@ -474,25 +475,43 @@
         toAnalyzerToken(beginToken), statements, toAnalyzerToken(endToken)));
   }
 
-  void endForStatement(
-      int updateExpressionCount, Token beginToken, Token endToken) {
+  void endForStatement(Token forKeyword, Token leftSeparator,
+      int updateExpressionCount, Token endToken) {
     debugEvent("ForStatement");
     Statement body = pop();
     List<Expression> updates = popList(updateExpressionCount);
-    ExpressionStatement condition = pop();
-    VariableDeclarationStatement variables = pop();
+    Statement conditionStatement = pop();
+    Object initializerPart = pop();
+    exitLocalScope();
     exitContinueTarget();
     exitBreakTarget();
-    exitLocalScope();
-    BeginGroupToken leftParenthesis = beginToken.next;
+    BeginGroupToken leftParenthesis = forKeyword.next;
+
+    VariableDeclarationList variableList;
+    Expression initializer;
+    if (initializerPart is VariableDeclarationStatement) {
+      variableList = initializerPart.variables;
+    } else {
+      initializer = initializerPart as Expression;
+    }
+
+    Expression condition;
+    analyzer.Token rightSeparator;
+    if (conditionStatement is ExpressionStatement) {
+      condition = conditionStatement.expression;
+      rightSeparator = conditionStatement.semicolon;
+    } else {
+      rightSeparator = (conditionStatement as EmptyStatement).semicolon;
+    }
+
     push(ast.forStatement(
-        toAnalyzerToken(beginToken),
+        toAnalyzerToken(forKeyword),
         toAnalyzerToken(leftParenthesis),
-        variables?.variables,
-        null, // initialization.
-        variables?.semicolon,
-        condition.expression,
-        condition.semicolon,
+        variableList,
+        initializer,
+        toAnalyzerToken(leftSeparator),
+        condition,
+        rightSeparator,
         updates,
         toAnalyzerToken(leftParenthesis.endGroup),
         body));
@@ -700,9 +719,9 @@
     Statement body = pop();
     Expression iterator = pop();
     Object variableOrDeclaration = pop();
-    pop(); // local scope
-    pop(); // continue target
-    pop(); // break target
+    exitLocalScope();
+    exitContinueTarget();
+    exitBreakTarget();
     if (variableOrDeclaration is SimpleIdentifier) {
       push(ast.forEachStatementWithReference(
           toAnalyzerToken(awaitToken),
@@ -1067,8 +1086,8 @@
     debugEvent("DoWhileStatement");
     ParenthesizedExpression condition = pop();
     Statement body = pop();
-    pop(); // continue target
-    pop(); // break target
+    exitContinueTarget();
+    exitBreakTarget();
     push(ast.doStatement(
         toAnalyzerToken(doKeyword),
         body,
@@ -1387,9 +1406,8 @@
     debugEvent("TypeVariable");
     TypeAnnotation bound = pop();
     SimpleIdentifier name = pop();
-    List<Annotation> metadata = null; // TODO(paulberry)
-    // TODO(paulberry): capture doc comments.  See dartbug.com/28851.
-    Comment comment = null;
+    List<Annotation> metadata = pop();
+    Comment comment = pop();
     push(ast.typeParameter(
         comment, metadata, name, toAnalyzerToken(extendsOrSuper), bound));
   }
@@ -1407,7 +1425,7 @@
     debugEvent("Method");
     FunctionBody body = pop();
     ConstructorName redirectedConstructor = null; // TODO(paulberry)
-    List<ConstructorInitializer> initializers = null; // TODO(paulberry)
+    List<Object> initializerObjects = pop() ?? const [];
     Token separator = null; // TODO(paulberry)
     FormalParameterList parameters = pop();
     TypeParameterList typeParameters = pop(); // TODO(paulberry)
@@ -1417,6 +1435,30 @@
     List<Annotation> metadata = pop();
     Comment comment = pop();
 
+    var initializers = <ConstructorInitializer>[];
+    for (Object initializerObject in initializerObjects) {
+      if (initializerObject is AssignmentExpression) {
+        analyzer.Token thisKeyword;
+        analyzer.Token period;
+        SimpleIdentifier fieldName;
+        Expression left = initializerObject.leftHandSide;
+        if (left is PropertyAccess) {
+          var thisExpression = left.target as ThisExpression;
+          thisKeyword = thisExpression.thisKeyword;
+          period = left.operator;
+          fieldName = left.propertyName;
+        } else {
+          fieldName = left as SimpleIdentifier;
+        }
+        initializers.add(ast.constructorFieldInitializer(
+            thisKeyword,
+            period,
+            fieldName,
+            initializerObject.operator,
+            initializerObject.rightHandSide));
+      }
+    }
+
     void constructor(SimpleIdentifier returnType, analyzer.Token period,
         SimpleIdentifier name) {
       push(ast.constructorDeclaration(
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index f4b3f62..87d342a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1018,8 +1018,8 @@
   }
 
   @override
-  void endForStatement(
-      int updateExpressionCount, Token beginToken, Token endToken) {
+  void endForStatement(Token forKeyword, Token leftSeparator,
+      int updateExpressionCount, Token endToken) {
     debugEvent("ForStatement");
     Statement body = popStatement();
     List<Expression> updates = popListForEffect(updateExpressionCount);
@@ -2218,6 +2218,7 @@
     // TODO(ahe): Do not discard these when enabling generic method syntax.
     pop(); // Bound.
     pop(); // Name.
+    pop(); // Metadata.
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index be5233a..4ed742f 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -201,8 +201,8 @@
 
   void beginForStatement(Token token) {}
 
-  void endForStatement(
-      int updateExpressionCount, Token beginToken, Token endToken) {
+  void endForStatement(Token forKeyword, Token leftSeparator,
+      int updateExpressionCount, Token endToken) {
     logEvent("ForStatement");
   }
 
@@ -537,6 +537,11 @@
 
   void beginMetadata(Token token) {}
 
+  /// Handle the end of a metadata annotation.  Substructures:
+  /// - Identifier
+  /// - Type arguments
+  /// - Constructor name (only if [periodBeforeName] is not `null`)
+  /// - Arguments
   void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
     logEvent("Metadata");
   }
@@ -731,6 +736,7 @@
 
   /// Handle the end of a type formal parameter (e.g. "X extends Y").
   /// Substructures:
+  /// - Metadata
   /// - Name (identifier)
   /// - Type bound
   void endTypeVariable(Token token, Token extendsOrSuper) {
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index e208309..7d7dd55 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -902,6 +902,7 @@
 
   Token parseTypeVariable(Token token) {
     listener.beginTypeVariable(token);
+    token = parseMetadataStar(token);
     token = parseIdentifier(token, IdentifierContext.typeVariableDeclaration);
     Token extendsOrSuper = null;
     if (optional('extends', token) || optional('super', token)) {
@@ -3214,19 +3215,19 @@
   }
 
   Token parseForStatement(Token awaitToken, Token token) {
-    Token forToken = token;
-    listener.beginForStatement(forToken);
+    Token forKeyword = token;
+    listener.beginForStatement(forKeyword);
     token = expect('for', token);
     Token leftParenthesis = token;
     token = expect('(', token);
     token = parseVariablesDeclarationOrExpressionOpt(token);
     if (optional('in', token)) {
-      return parseForInRest(awaitToken, forToken, leftParenthesis, token);
+      return parseForInRest(awaitToken, forKeyword, leftParenthesis, token);
     } else {
       if (awaitToken != null) {
         reportRecoverableError(awaitToken, ErrorKind.InvalidAwaitFor);
       }
-      return parseForRest(forToken, token);
+      return parseForRest(forKeyword, leftParenthesis, token);
     }
   }
 
@@ -3248,7 +3249,8 @@
     return parseExpression(token);
   }
 
-  Token parseForRest(Token forToken, Token token) {
+  Token parseForRest(Token forToken, Token leftParenthesis, Token token) {
+    Token leftSeparator = token;
     token = expectSemicolon(token);
     if (optional(';', token)) {
       token = parseEmptyStatement(token);
@@ -3270,12 +3272,12 @@
     listener.beginForStatementBody(token);
     token = parseStatement(token);
     listener.endForStatementBody(token);
-    listener.endForStatement(expressionCount, forToken, token);
+    listener.endForStatement(forToken, leftSeparator, expressionCount, token);
     return token;
   }
 
   Token parseForInRest(
-      Token awaitToken, Token forToken, Token leftParenthesis, Token token) {
+      Token awaitToken, Token forKeyword, Token leftParenthesis, Token token) {
     assert(optional('in', token));
     Token inKeyword = token;
     token = token.next;
@@ -3287,7 +3289,7 @@
     listener.beginForInBody(token);
     token = parseStatement(token);
     listener.endForInBody(token);
-    listener.endForIn(awaitToken, forToken, leftParenthesis, inKeyword,
+    listener.endForIn(awaitToken, forKeyword, leftParenthesis, inKeyword,
         rightParenthesis, token);
     return token;
   }
diff --git a/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart b/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart
index e5de585..3a44acd 100644
--- a/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart
@@ -14,7 +14,11 @@
     show BeginGroupToken, KeywordToken, StringToken, SymbolToken, Token;
 
 import 'token_constants.dart'
-    show LT_TOKEN, OPEN_CURLY_BRACKET_TOKEN, STRING_INTERPOLATION_TOKEN;
+    show
+        LT_TOKEN,
+        OPEN_CURLY_BRACKET_TOKEN,
+        OPEN_PAREN_TOKEN,
+        STRING_INTERPOLATION_TOKEN;
 
 import 'characters.dart' show $LF, $STX;
 
@@ -132,8 +136,11 @@
     Token token = new BeginGroupToken(info, tokenStart);
     appendToken(token);
 
-    // { (  [ ${ cannot appear inside a type parameters / arguments.
-    if (!identical(info.kind, LT_TOKEN)) discardOpenLt();
+    // { [ ${ cannot appear inside a type parameters / arguments.
+    if (!identical(info.kind, LT_TOKEN) &&
+        !identical(info.kind, OPEN_PAREN_TOKEN)) {
+      discardOpenLt();
+    }
     groupingStack = groupingStack.prepend(token);
   }
 
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index 94adf64..60fa19a 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -495,6 +495,9 @@
       bool allowAbstract = asyncModifier == AsyncMarker.Sync;
       parser.parseFunctionBody(token, isExpression, allowAbstract);
       var body = listener.pop();
+      if (listener.stack.length == 1) {
+        listener.pop(); // constructor initializers
+      }
       listener.checkEmpty(token.charOffset);
       listener.finishFunction(formals, asyncModifier, body);
     } on InputError {
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 3e4b7f1..c90bf03 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -572,6 +572,9 @@
     debugEvent("endTypeVariable");
     TypeBuilder bound = pop();
     String name = pop();
+    // TODO(paulberry): type variable metadata should not be ignored.  See
+    // dartbug.com/28981.
+    /* List<MetadataBuilder> metadata = */ pop();
     push(library.addTypeVariable(name, bound, token.charOffset));
   }
 
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener.dart b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
index b801ca1..875c7a9 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -26,6 +26,7 @@
   Combinators,
   Comments,
   ConditionalUris,
+  ConstructorInitializers,
   ConstructorReferenceContinuationAfterTypeArguments,
   ContinueTarget,
   Expression,
diff --git a/pkg/front_end/test/fasta/kompile.status b/pkg/front_end/test/fasta/kompile.status
index ecdd93c..25693d7 100644
--- a/pkg/front_end/test/fasta/kompile.status
+++ b/pkg/front_end/test/fasta/kompile.status
@@ -51,7 +51,7 @@
 rasta/export: Fail
 rasta/external_factory_redirection: Crash
 rasta/foo: Fail
-rasta/for_loop: Crash
+rasta/for_loop: Fail
 rasta/generic_factory: VerificationError
 rasta/issue_000001: Crash
 rasta/issue_000002: Crash
diff --git a/pkg/js_ast/lib/src/builder.dart b/pkg/js_ast/lib/src/builder.dart
index 5d680f5..ff29447 100644
--- a/pkg/js_ast/lib/src/builder.dart
+++ b/pkg/js_ast/lib/src/builder.dart
@@ -7,7 +7,6 @@
 
 part of js_ast;
 
-
 /**
  * Global template manager.  We should aim to have a fixed number of
  * templates. This implies that we do not use js('xxx') to parse text that is
@@ -18,7 +17,6 @@
  */
 TemplateManager templateManager = new TemplateManager();
 
-
 /**
 
 [js] is a singleton instace of JsBuilder.  JsBuilder is a set of conveniences
@@ -187,7 +185,6 @@
 */
 const JsBuilder js = const JsBuilder();
 
-
 class JsBuilder {
   const JsBuilder();
 
@@ -271,8 +268,8 @@
   Template uncachedExpressionTemplate(String source) {
     MiniJsParser parser = new MiniJsParser(source);
     Expression expression = parser.expression();
-    return new Template(
-        source, expression, isExpression: true, forceCopy: false);
+    return new Template(source, expression,
+        isExpression: true, forceCopy: false);
   }
 
   /**
@@ -281,8 +278,8 @@
   Template uncachedStatementTemplate(String source) {
     MiniJsParser parser = new MiniJsParser(source);
     Statement statement = parser.statement();
-    return new Template(
-        source, statement, isExpression: false, forceCopy: false);
+    return new Template(source, statement,
+        isExpression: false, forceCopy: false);
   }
 
   /**
@@ -300,19 +297,26 @@
 
   /// Creates a literal js string from [value].
   LiteralString _legacyEscapedString(String value) {
-   // Start by escaping the backslashes.
+    // Start by escaping the backslashes.
     String escaped = value.replaceAll('\\', '\\\\');
     // Do not escape unicode characters and ' because they are allowed in the
     // string literal anyway.
     escaped = escaped.replaceAllMapped(new RegExp('\n|"|\b|\t|\v|\r'), (match) {
       switch (match.group(0)) {
-        case "\n" : return r"\n";
-        case "\"" : return r'\"';
-        case "\b" : return r"\b";
-        case "\t" : return r"\t";
-        case "\f" : return r"\f";
-        case "\r" : return r"\r";
-        case "\v" : return r"\v";
+        case "\n":
+          return r"\n";
+        case "\"":
+          return r'\"';
+        case "\b":
+          return r"\b";
+        case "\t":
+          return r"\t";
+        case "\f":
+          return r"\f";
+        case "\r":
+          return r"\r";
+        case "\v":
+          return r"\v";
       }
     });
     LiteralString result = string(escaped);
@@ -324,7 +328,7 @@
 
   /// Creates a literal js string from [value].
   LiteralString escapedString(String value,
-       {bool utf8: false, bool ascii: false}) {
+      {bool utf8: false, bool ascii: false}) {
     if (utf8 == false && ascii == false) return _legacyEscapedString(value);
     if (utf8 && ascii) throw new ArgumentError('Cannot be both UTF8 and ASCII');
 
@@ -340,12 +344,16 @@
         ++singleQuotes;
       } else if (rune == charCodes.$DQ) {
         ++doubleQuotes;
-      } else if (rune == charCodes.$LF || rune == charCodes.$CR ||
-                 rune == charCodes.$LS || rune == charCodes.$PS) {
+      } else if (rune == charCodes.$LF ||
+          rune == charCodes.$CR ||
+          rune == charCodes.$LS ||
+          rune == charCodes.$PS) {
         // Line terminators.
         ++otherEscapes;
-      } else if (rune == charCodes.$BS || rune == charCodes.$TAB ||
-                 rune == charCodes.$VTAB || rune == charCodes.$FF) {
+      } else if (rune == charCodes.$BS ||
+          rune == charCodes.$TAB ||
+          rune == charCodes.$VTAB ||
+          rune == charCodes.$FF) {
         ++otherEscapes;
       } else if (_isUnpairedSurrogate(rune)) {
         ++unpairedSurrogates;
@@ -408,15 +416,24 @@
 
   static String _irregularEscape(int code, bool useSingleQuotes) {
     switch (code) {
-      case charCodes.$SQ: return useSingleQuotes ? r"\'" : r"'";
-      case charCodes.$DQ: return useSingleQuotes ? r'"' : r'\"';
-      case charCodes.$BACKSLASH: return r'\\';
-      case charCodes.$BS: return r'\b';
-      case charCodes.$TAB: return r'\t';
-      case charCodes.$LF: return r'\n';
-      case charCodes.$VTAB: return r'\v';
-      case charCodes.$FF: return r'\f';
-      case charCodes.$CR: return r'\r';
+      case charCodes.$SQ:
+        return useSingleQuotes ? r"\'" : r"'";
+      case charCodes.$DQ:
+        return useSingleQuotes ? r'"' : r'\"';
+      case charCodes.$BACKSLASH:
+        return r'\\';
+      case charCodes.$BS:
+        return r'\b';
+      case charCodes.$TAB:
+        return r'\t';
+      case charCodes.$LF:
+        return r'\n';
+      case charCodes.$VTAB:
+        return r'\v';
+      case charCodes.$FF:
+        return r'\f';
+      case charCodes.$CR:
+        return r'\r';
     }
     return null;
   }
@@ -435,13 +452,13 @@
   LiteralString stringPart(String value) => new LiteralString(value);
 
   StringConcatenation concatenateStrings(Iterable<Literal> parts,
-                                         {addQuotes: false}) {
+      {addQuotes: false}) {
     List<Literal> _parts;
     if (addQuotes) {
       Literal quote = stringPart('"');
       _parts = <Literal>[quote]
-          ..addAll(parts)
-          ..add(quote);
+        ..addAll(parts)
+        ..add(quote);
     } else {
       _parts = new List.from(parts, growable: false);
     }
@@ -472,9 +489,8 @@
 
   Comment comment(String text) => new Comment(text);
 
-  Call propertyCall(Expression receiver,
-                    Expression fieldName,
-                    List<Expression> arguments) {
+  Call propertyCall(
+      Expression receiver, Expression fieldName, List<Expression> arguments) {
     return new Call(new PropertyAccess(receiver, fieldName), arguments);
   }
 
@@ -491,29 +507,31 @@
 LiteralString quoteName(Name name, {allowNull: false}) {
   return js.quoteName(name, allowNull: allowNull);
 }
+
 LiteralString stringPart(String value) => js.stringPart(value);
 Iterable<Literal> joinLiterals(Iterable<Literal> list, Literal separator) {
   return js.joinLiterals(list, separator);
 }
+
 StringConcatenation concatenateStrings(Iterable<Literal> parts,
-                                       {addQuotes: false}) {
+    {addQuotes: false}) {
   return js.concatenateStrings(parts, addQuotes: addQuotes);
 }
 
 LiteralNumber number(num value) => js.number(value);
 ArrayInitializer numArray(Iterable<int> list) => js.numArray(list);
 ArrayInitializer stringArray(Iterable<String> list) => js.stringArray(list);
-Call propertyCall(Expression receiver,
-                  Expression fieldName,
-                  List<Expression> arguments) {
+Call propertyCall(
+    Expression receiver, Expression fieldName, List<Expression> arguments) {
   return js.propertyCall(receiver, fieldName, arguments);
 }
+
 ObjectInitializer objectLiteral(Map<String, Expression> map) {
   return js.objectLiteral(map);
 }
 
 class MiniJsParserError {
-  MiniJsParserError(this.parser, this.message) { }
+  MiniJsParserError(this.parser, this.message) {}
 
   final MiniJsParser parser;
   final String message;
@@ -575,7 +593,7 @@
   String lastToken = null;
   int lastPosition = 0;
   int position = 0;
-  bool skippedNewline = false;  // skipped newline in last getToken?
+  bool skippedNewline = false; // skipped newline in last getToken?
   final String src;
 
   final List<InterpolatedNode> interpolatedValues = <InterpolatedNode>[];
@@ -610,49 +628,70 @@
 
   static String categoryToString(int cat) {
     switch (cat) {
-      case NONE: return "NONE";
-      case ALPHA: return "ALPHA";
-      case NUMERIC: return "NUMERIC";
-      case SYMBOL: return "SYMBOL";
-      case ASSIGNMENT: return "ASSIGNMENT";
-      case DOT: return "DOT";
-      case LPAREN: return "LPAREN";
-      case RPAREN: return "RPAREN";
-      case LBRACE: return "LBRACE";
-      case RBRACE: return "RBRACE";
-      case LSQUARE: return "LSQUARE";
-      case RSQUARE: return "RSQUARE";
-      case STRING: return "STRING";
-      case COMMA: return "COMMA";
-      case QUERY: return "QUERY";
-      case COLON: return "COLON";
-      case SEMICOLON: return "SEMICOLON";
-      case HASH: return "HASH";
-      case WHITESPACE: return "WHITESPACE";
-      case OTHER: return "OTHER";
+      case NONE:
+        return "NONE";
+      case ALPHA:
+        return "ALPHA";
+      case NUMERIC:
+        return "NUMERIC";
+      case SYMBOL:
+        return "SYMBOL";
+      case ASSIGNMENT:
+        return "ASSIGNMENT";
+      case DOT:
+        return "DOT";
+      case LPAREN:
+        return "LPAREN";
+      case RPAREN:
+        return "RPAREN";
+      case LBRACE:
+        return "LBRACE";
+      case RBRACE:
+        return "RBRACE";
+      case LSQUARE:
+        return "LSQUARE";
+      case RSQUARE:
+        return "RSQUARE";
+      case STRING:
+        return "STRING";
+      case COMMA:
+        return "COMMA";
+      case QUERY:
+        return "QUERY";
+      case COLON:
+        return "COLON";
+      case SEMICOLON:
+        return "SEMICOLON";
+      case HASH:
+        return "HASH";
+      case WHITESPACE:
+        return "WHITESPACE";
+      case OTHER:
+        return "OTHER";
     }
     return "Unknown: $cat";
   }
 
   static const CATEGORIES = const <int>[
-      OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,       // 0-7
-      OTHER, WHITESPACE, WHITESPACE, OTHER, OTHER, WHITESPACE,      // 8-13
-      OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,       // 14-21
-      OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,       // 22-29
-      OTHER, OTHER, WHITESPACE,                                     // 30-32
-      SYMBOL, OTHER, HASH, ALPHA, SYMBOL, SYMBOL, OTHER,            // !"#$%&´
-      LPAREN, RPAREN, SYMBOL, SYMBOL, COMMA, SYMBOL, DOT, SYMBOL,   // ()*+,-./
-      NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC,                  // 01234
-      NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC,                  // 56789
-      COLON, SEMICOLON, SYMBOL, SYMBOL, SYMBOL, QUERY, OTHER,       // :;<=>?@
-      ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // ABCDEFGH
-      ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // IJKLMNOP
-      ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // QRSTUVWX
-      ALPHA, ALPHA, LSQUARE, OTHER, RSQUARE, SYMBOL, ALPHA, OTHER,  // YZ[\]^_'
-      ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // abcdefgh
-      ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // ijklmnop
-      ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA,       // qrstuvwx
-      ALPHA, ALPHA, LBRACE, SYMBOL, RBRACE, SYMBOL];                // yz{|}~
+    OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 0-7
+    OTHER, WHITESPACE, WHITESPACE, OTHER, OTHER, WHITESPACE, // 8-13
+    OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 14-21
+    OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // 22-29
+    OTHER, OTHER, WHITESPACE, // 30-32
+    SYMBOL, OTHER, HASH, ALPHA, SYMBOL, SYMBOL, OTHER, // !"#$%&´
+    LPAREN, RPAREN, SYMBOL, SYMBOL, COMMA, SYMBOL, DOT, SYMBOL, // ()*+,-./
+    NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC, // 01234
+    NUMERIC, NUMERIC, NUMERIC, NUMERIC, NUMERIC, // 56789
+    COLON, SEMICOLON, SYMBOL, SYMBOL, SYMBOL, QUERY, OTHER, // :;<=>?@
+    ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // ABCDEFGH
+    ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // IJKLMNOP
+    ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // QRSTUVWX
+    ALPHA, ALPHA, LSQUARE, OTHER, RSQUARE, SYMBOL, ALPHA, OTHER, // YZ[\]^_'
+    ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // abcdefgh
+    ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // ijklmnop
+    ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, // qrstuvwx
+    ALPHA, ALPHA, LBRACE, SYMBOL, RBRACE, SYMBOL
+  ]; // yz{|}~
 
   // This must be a >= the highest precedence number handled by parseBinary.
   static var HIGHEST_PARSE_BINARY_PRECEDENCE = 16;
@@ -660,22 +699,54 @@
 
   // From https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence
   static final BINARY_PRECEDENCE = {
-      '+=': 17, '-=': 17, '*=': 17, '/=': 17, '%=': 17, '^=': 17, '|=': 17,
-      '&=': 17, '<<=': 17, '>>=': 17, '>>>=': 17, '=': 17,
-      '||': 14,
-      '&&': 13,
-      '|': 12,
-      '^': 11,
-      '&': 10,
-      '!=': 9, '==': 9, '!==': 9, '===': 9,
-      '<': 8, '<=': 8, '>=': 8, '>': 8, 'in': 8, 'instanceof': 8,
-      '<<': 7, '>>': 7, '>>>': 7,
-      '+': 6, '-': 6,
-      '*': 5, '/': 5, '%': 5
+    '+=': 17,
+    '-=': 17,
+    '*=': 17,
+    '/=': 17,
+    '%=': 17,
+    '^=': 17,
+    '|=': 17,
+    '&=': 17,
+    '<<=': 17,
+    '>>=': 17,
+    '>>>=': 17,
+    '=': 17,
+    '||': 14,
+    '&&': 13,
+    '|': 12,
+    '^': 11,
+    '&': 10,
+    '!=': 9,
+    '==': 9,
+    '!==': 9,
+    '===': 9,
+    '<': 8,
+    '<=': 8,
+    '>=': 8,
+    '>': 8,
+    'in': 8,
+    'instanceof': 8,
+    '<<': 7,
+    '>>': 7,
+    '>>>': 7,
+    '+': 6,
+    '-': 6,
+    '*': 5,
+    '/': 5,
+    '%': 5
   };
-  static final UNARY_OPERATORS =
-      ['++', '--', '+', '-', '~', '!', 'typeof', 'void', 'delete', 'await']
-        .toSet();
+  static final UNARY_OPERATORS = [
+    '++',
+    '--',
+    '+',
+    '-',
+    '~',
+    '!',
+    'typeof',
+    'void',
+    'delete',
+    'await'
+  ].toSet();
 
   static final OPERATORS_THAT_LOOK_LIKE_IDENTIFIERS =
       ['typeof', 'void', 'delete', 'in', 'instanceof', 'await'].toSet();
@@ -697,8 +768,10 @@
       if (currentCode == charCodes.$BACKSLASH) {
         if (++position >= src.length) error("Unterminated literal");
         int escaped = src.codeUnitAt(position);
-        if (escaped == charCodes.$x || escaped == charCodes.$X ||
-            escaped == charCodes.$u || escaped == charCodes.$U ||
+        if (escaped == charCodes.$x ||
+            escaped == charCodes.$X ||
+            escaped == charCodes.$u ||
+            escaped == charCodes.$U ||
             category(escaped) == NUMERIC) {
           error('Numeric and hex escapes are not allowed in literals');
         }
@@ -714,8 +787,7 @@
       if (position >= src.length) break;
       int code = src.codeUnitAt(position);
       //  Skip '//' and '/*' style comments.
-      if (code == charCodes.$SLASH &&
-          position + 1 < src.length) {
+      if (code == charCodes.$SLASH && position + 1 < src.length) {
         if (src.codeUnitAt(position + 1) == charCodes.$SLASH) {
           int nextPosition = src.indexOf('\n', position);
           if (nextPosition == -1) nextPosition = src.length;
@@ -746,8 +818,8 @@
       lastCategory = STRING;
       lastToken = getDelimited(position);
     } else if (code == charCodes.$0 &&
-               position + 2 < src.length &&
-               src.codeUnitAt(position + 1) == charCodes.$x) {
+        position + 2 < src.length &&
+        src.codeUnitAt(position + 1) == charCodes.$x) {
       // Hex literal.
       for (position += 2; position < src.length; position++) {
         int cat = category(src.codeUnitAt(position));
@@ -777,16 +849,15 @@
         // Special code to disallow !, ~ and / in non-first position in token,
         // so that !! and ~~ parse as two tokens and != parses as one, while =/
         // parses as a an equals token followed by a regexp literal start.
-        newCat =
-            (code == charCodes.$BANG ||
-             code == charCodes.$SLASH ||
-             code == charCodes.$TILDE)
+        newCat = (code == charCodes.$BANG ||
+                code == charCodes.$SLASH ||
+                code == charCodes.$TILDE)
             ? NONE
             : category(code);
       } while (!singleCharCategory(cat) &&
-               (cat == newCat ||
-                (cat == ALPHA && newCat == NUMERIC) ||    // eg. level42.
-                (cat == NUMERIC && newCat == DOT)));      // eg. 3.1415
+          (cat == newCat ||
+              (cat == ALPHA && newCat == NUMERIC) || // eg. level42.
+              (cat == NUMERIC && newCat == DOT))); // eg. 3.1415
       lastCategory = cat;
       lastToken = src.substring(lastPosition, position);
       if (cat == NUMERIC) {
@@ -829,7 +900,7 @@
     // Accept semicolon or automatically inserted semicolon before close brace.
     // Miniparser forbids other kinds of semicolon insertion.
     if (RBRACE == lastCategory) return true;
-    if (NONE == lastCategory) return true;  // end of input
+    if (NONE == lastCategory) return true; // end of input
     if (skippedNewline) {
       error('No automatic semicolon insertion at preceding newline');
     }
@@ -984,7 +1055,8 @@
         propertyName = new LiteralString('"$identifier"');
       } else if (acceptCategory(STRING)) {
         propertyName = new LiteralString(identifier);
-      } else if (acceptCategory(SYMBOL)) {  // e.g. void
+      } else if (acceptCategory(SYMBOL)) {
+        // e.g. void
         propertyName = new LiteralString('"$identifier"');
       } else if (acceptCategory(HASH)) {
         var nameOrPosition = parseHash();
@@ -1034,9 +1106,9 @@
             expectCategory(COMMA);
           }
         }
-        receiver = constructor ?
-               new New(receiver, arguments) :
-               new Call(receiver, arguments);
+        receiver = constructor
+            ? new New(receiver, arguments)
+            : new Call(receiver, arguments);
         constructor = false;
       } else if (!constructor && acceptCategory(LSQUARE)) {
         Expression inBraces = parseExpression();
@@ -1091,7 +1163,8 @@
 
   Expression parseUnaryHigh() {
     String operator = lastToken;
-    if (lastCategory == SYMBOL && UNARY_OPERATORS.contains(operator) &&
+    if (lastCategory == SYMBOL &&
+        UNARY_OPERATORS.contains(operator) &&
         (acceptString("++") || acceptString("--") || acceptString('await'))) {
       if (operator == "await") return new Await(parsePostfix());
       return new Prefix(operator, parsePostfix());
@@ -1101,8 +1174,10 @@
 
   Expression parseUnaryLow() {
     String operator = lastToken;
-    if (lastCategory == SYMBOL && UNARY_OPERATORS.contains(operator) &&
-        operator != "++" && operator != "--") {
+    if (lastCategory == SYMBOL &&
+        UNARY_OPERATORS.contains(operator) &&
+        operator != "++" &&
+        operator != "--") {
       expectCategory(SYMBOL);
       if (operator == "await") return new Await(parsePostfix());
       return new Prefix(operator, parseUnaryLow());
@@ -1114,7 +1189,7 @@
     Expression lhs = parseUnaryLow();
     int minPrecedence;
     String lastSymbol;
-    Expression rhs;  // This is null first time around.
+    Expression rhs; // This is null first time around.
     while (true) {
       String symbol = lastToken;
       if (lastCategory != SYMBOL ||
@@ -1146,7 +1221,6 @@
     return new Conditional(lhs, ifTrue, ifFalse);
   }
 
-
   Expression parseAssignment() {
     Expression lhs = parseConditional();
     String assignmentOperator = lastToken;
@@ -1154,7 +1228,7 @@
       Expression rhs = parseAssignment();
       if (assignmentOperator == "=") {
         return new Assignment(lhs, rhs);
-      } else  {
+      } else {
         // Handle +=, -=, etc.
         String operator =
             assignmentOperator.substring(0, assignmentOperator.length - 1);
@@ -1280,7 +1354,6 @@
       if (lastToken == 'with') {
         error('Not implemented in mini parser');
       }
-
     }
 
     bool checkForInterpolatedStatement = lastCategory == HASH;
@@ -1387,8 +1460,8 @@
         expectCategory(RPAREN);
         Statement body = parseStatement();
         return new ForIn(
-            new VariableDeclarationList([
-                new VariableInitialization(declaration, null)]),
+            new VariableDeclarationList(
+                [new VariableInitialization(declaration, null)]),
             objectExpression,
             body);
       }
@@ -1450,8 +1523,8 @@
     }
     List statements = new List<Statement>();
     while (lastCategory != RBRACE &&
-           lastToken != 'case' &&
-           lastToken != 'default') {
+        lastToken != 'case' &&
+        lastToken != 'default') {
       statements.add(parseStatement());
     }
     return expression == null
@@ -1484,7 +1557,7 @@
     expectCategory(RPAREN);
     expectCategory(LBRACE);
     List<SwitchClause> clauses = new List<SwitchClause>();
-    while(lastCategory != RBRACE) {
+    while (lastCategory != RBRACE) {
       clauses.add(parseSwitchClause());
     }
     expectCategory(RBRACE);
diff --git a/pkg/js_ast/lib/src/characters.dart b/pkg/js_ast/lib/src/characters.dart
index ae6740f..5fd1196 100644
--- a/pkg/js_ast/lib/src/characters.dart
+++ b/pkg/js_ast/lib/src/characters.dart
@@ -6,7 +6,7 @@
 
 const int $EOF = 0;
 const int $STX = 2;
-const int $BS  = 8;
+const int $BS = 8;
 const int $TAB = 9;
 const int $LF = 10;
 const int $VTAB = 11;
diff --git a/pkg/js_ast/lib/src/nodes.dart b/pkg/js_ast/lib/src/nodes.dart
index 94371a0..c43a251 100644
--- a/pkg/js_ast/lib/src/nodes.dart
+++ b/pkg/js_ast/lib/src/nodes.dart
@@ -95,8 +95,7 @@
   T visitJump(Statement node) => visitStatement(node);
 
   T visitBlock(Block node) => visitStatement(node);
-  T visitExpressionStatement(ExpressionStatement node)
-      => visitStatement(node);
+  T visitExpressionStatement(ExpressionStatement node) => visitStatement(node);
   T visitEmptyStatement(EmptyStatement node) => visitStatement(node);
   T visitIf(If node) => visitStatement(node);
   T visitFor(For node) => visitLoop(node);
@@ -109,8 +108,7 @@
   T visitThrow(Throw node) => visitJump(node);
   T visitTry(Try node) => visitStatement(node);
   T visitSwitch(Switch node) => visitStatement(node);
-  T visitFunctionDeclaration(FunctionDeclaration node)
-      => visitStatement(node);
+  T visitFunctionDeclaration(FunctionDeclaration node) => visitStatement(node);
   T visitLabeledStatement(LabeledStatement node) => visitStatement(node);
   T visitLiteralStatement(LiteralStatement node) => visitStatement(node);
 
@@ -122,8 +120,8 @@
   T visitVariableReference(VariableReference node) => visitExpression(node);
 
   T visitLiteralExpression(LiteralExpression node) => visitExpression(node);
-  T visitVariableDeclarationList(VariableDeclarationList node)
-      => visitExpression(node);
+  T visitVariableDeclarationList(VariableDeclarationList node) =>
+      visitExpression(node);
   T visitAssignment(Assignment node) => visitExpression(node);
   T visitVariableInitialization(VariableInitialization node) {
     if (node.value != null) {
@@ -132,6 +130,7 @@
       return visitExpression(node);
     }
   }
+
   T visitConditional(Conditional node) => visitExpression(node);
   T visitNew(New node) => visitExpression(node);
   T visitCall(Call node) => visitExpression(node);
@@ -141,8 +140,8 @@
   T visitAccess(PropertyAccess node) => visitExpression(node);
 
   T visitVariableUse(VariableUse node) => visitVariableReference(node);
-  T visitVariableDeclaration(VariableDeclaration node)
-      => visitVariableReference(node);
+  T visitVariableDeclaration(VariableDeclaration node) =>
+      visitVariableReference(node);
   T visitParameter(Parameter node) => visitVariableDeclaration(node);
   T visitThis(This node) => visitParameter(node);
 
@@ -174,16 +173,16 @@
 
   T visitInterpolatedNode(InterpolatedNode node) => visitNode(node);
 
-  T visitInterpolatedExpression(InterpolatedExpression node)
-      => visitInterpolatedNode(node);
-  T visitInterpolatedLiteral(InterpolatedLiteral node)
-      => visitInterpolatedNode(node);
-  T visitInterpolatedParameter(InterpolatedParameter node)
-      => visitInterpolatedNode(node);
-  T visitInterpolatedSelector(InterpolatedSelector node)
-      => visitInterpolatedNode(node);
-  T visitInterpolatedStatement(InterpolatedStatement node)
-      => visitInterpolatedNode(node);
+  T visitInterpolatedExpression(InterpolatedExpression node) =>
+      visitInterpolatedNode(node);
+  T visitInterpolatedLiteral(InterpolatedLiteral node) =>
+      visitInterpolatedNode(node);
+  T visitInterpolatedParameter(InterpolatedParameter node) =>
+      visitInterpolatedNode(node);
+  T visitInterpolatedSelector(InterpolatedSelector node) =>
+      visitInterpolatedNode(node);
+  T visitInterpolatedStatement(InterpolatedStatement node) =>
+      visitInterpolatedNode(node);
   T visitInterpolatedDeclaration(InterpolatedDeclaration node) {
     return visitInterpolatedNode(node);
   }
@@ -244,6 +243,7 @@
   void visitChildren(NodeVisitor visitor) {
     for (Statement statement in body) statement.accept(visitor);
   }
+
   Program _clone() => new Program(body);
 }
 
@@ -260,6 +260,7 @@
   void visitChildren(NodeVisitor visitor) {
     for (Statement statement in statements) statement.accept(visitor);
   }
+
   Block _clone() => new Block(statements);
 }
 
@@ -270,7 +271,10 @@
   }
 
   accept(NodeVisitor visitor) => visitor.visitExpressionStatement(this);
-  void visitChildren(NodeVisitor visitor) { expression.accept(visitor); }
+  void visitChildren(NodeVisitor visitor) {
+    expression.accept(visitor);
+  }
+
   ExpressionStatement _clone() => new ExpressionStatement(expression);
 }
 
@@ -290,7 +294,7 @@
   If(this.condition, this.then, this.otherwise);
   If.noElse(this.condition, this.then) : this.otherwise = new EmptyStatement();
 
-  bool get hasElse => otherwise is !EmptyStatement;
+  bool get hasElse => otherwise is! EmptyStatement;
 
   accept(NodeVisitor visitor) => visitor.visitIf(this);
 
@@ -377,7 +381,7 @@
 }
 
 class Continue extends Statement {
-  final String targetLabel;  // Can be null.
+  final String targetLabel; // Can be null.
 
   Continue(this.targetLabel);
 
@@ -388,7 +392,7 @@
 }
 
 class Break extends Statement {
-  final String targetLabel;  // Can be null.
+  final String targetLabel; // Can be null.
 
   Break(this.targetLabel);
 
@@ -399,7 +403,7 @@
 }
 
 class Return extends Statement {
-  final Expression value;  // Can be null.
+  final Expression value; // Can be null.
 
   Return([this.value = null]);
 
@@ -428,8 +432,8 @@
 
 class Try extends Statement {
   final Block body;
-  final Catch catchPart;  // Can be null if [finallyPart] is non-null.
-  final Block finallyPart;  // Can be null if [catchPart] is non-null.
+  final Catch catchPart; // Can be null if [finallyPart] is non-null.
+  final Block finallyPart; // Can be null if [catchPart] is non-null.
 
   Try(this.body, this.catchPart, this.finallyPart) {
     assert(catchPart != null || finallyPart != null);
@@ -548,7 +552,7 @@
   LiteralStatement(this.code);
 
   accept(NodeVisitor visitor) => visitor.visitLiteralStatement(this);
-  void visitChildren(NodeVisitor visitor) { }
+  void visitChildren(NodeVisitor visitor) {}
 
   LiteralStatement _clone() => new LiteralStatement(code);
 }
@@ -577,9 +581,7 @@
   Statement toStatement() => new ExpressionStatement(this);
 }
 
-abstract class Declaration implements VariableReference {
-
-}
+abstract class Declaration implements VariableReference {}
 
 /// An implementation of [Name] represents a potentially late bound name in
 /// the generated ast.
@@ -660,11 +662,10 @@
 
 class Assignment extends Expression {
   final Expression leftHandSide;
-  final String op;         // Null, if the assignment is not compound.
-  final Expression value;  // May be null, for [VariableInitialization]s.
+  final String op; // Null, if the assignment is not compound.
+  final Expression value; // May be null, for [VariableInitialization]s.
 
-  Assignment(leftHandSide, value)
-      : this.compound(leftHandSide, null, value);
+  Assignment(leftHandSide, value) : this.compound(leftHandSide, null, value);
   // If `this.op == null` this will be a non-compound assignment.
   Assignment.compound(this.leftHandSide, this.op, this.value);
 
@@ -679,8 +680,7 @@
     if (value != null) value.accept(visitor);
   }
 
-  Assignment _clone() =>
-      new Assignment.compound(leftHandSide, op, value);
+  Assignment _clone() => new Assignment.compound(leftHandSide, op, value);
 }
 
 class VariableInitialization extends Assignment {
@@ -721,7 +721,7 @@
   List<Expression> arguments;
 
   Call(this.target, this.arguments,
-       {JavaScriptNodeSourceInformation sourceInformation}) {
+      {JavaScriptNodeSourceInformation sourceInformation}) {
     this._sourceInformation = sourceInformation;
   }
 
@@ -840,7 +840,6 @@
     argument.accept(visitor);
   }
 
-
   int get precedenceLevel => UNARY;
 }
 
@@ -902,6 +901,7 @@
     name.accept(visitor);
     function.accept(visitor);
   }
+
   NamedFunction _clone() => new NamedFunction(name, function);
 
   int get precedenceLevel => LEFT_HAND_SIDE;
@@ -1074,7 +1074,7 @@
 }
 
 class LiteralNumber extends Literal {
-  final String value;  // Must be a valid JavaScript number literal.
+  final String value; // Must be a valid JavaScript number literal.
 
   LiteralNumber(this.value);
 
@@ -1170,8 +1170,7 @@
 
   accept(NodeVisitor visitor) => visitor.visitInterpolatedExpression(this);
   void visitChildren(NodeVisitor visitor) {}
-  InterpolatedExpression _clone() =>
-      new InterpolatedExpression(nameOrPosition);
+  InterpolatedExpression _clone() => new InterpolatedExpression(nameOrPosition);
 
   int get precedenceLevel => PRIMARY;
 }
@@ -1186,11 +1185,15 @@
   InterpolatedLiteral _clone() => new InterpolatedLiteral(nameOrPosition);
 }
 
-class InterpolatedParameter extends Expression with InterpolatedNode
+class InterpolatedParameter extends Expression
+    with InterpolatedNode
     implements Parameter {
   final nameOrPosition;
 
-  String get name { throw "InterpolatedParameter.name must not be invoked"; }
+  String get name {
+    throw "InterpolatedParameter.name must not be invoked";
+  }
+
   bool get allowRename => false;
 
   InterpolatedParameter(this.nameOrPosition);
@@ -1225,8 +1228,8 @@
 }
 
 class InterpolatedDeclaration extends Expression
-                              with InterpolatedNode
-                              implements Declaration {
+    with InterpolatedNode
+    implements Declaration {
   final nameOrPosition;
 
   InterpolatedDeclaration(this.nameOrPosition);
diff --git a/pkg/js_ast/lib/src/printer.dart b/pkg/js_ast/lib/src/printer.dart
index 564a467..d4b0937 100644
--- a/pkg/js_ast/lib/src/printer.dart
+++ b/pkg/js_ast/lib/src/printer.dart
@@ -4,7 +4,6 @@
 
 part of js_ast;
 
-
 typedef String Renamer(Name);
 
 class JavaScriptPrintingOptions {
@@ -15,19 +14,20 @@
 
   JavaScriptPrintingOptions(
       {this.shouldCompressOutput: false,
-       this.minifyLocalVariables: false,
-       this.preferSemicolonToNewlineInMinifiedOutput: false,
-       this.renamerForNames: identityRenamer});
+      this.minifyLocalVariables: false,
+      this.preferSemicolonToNewlineInMinifiedOutput: false,
+      this.renamerForNames: identityRenamer});
 
   static String identityRenamer(Name name) => name.name;
 }
 
-
 /// An environment in which JavaScript printing is done.  Provides emitting of
 /// text and pre- and post-visit callbacks.
 abstract class JavaScriptPrintingContext {
   /// Signals an error.  This should happen only for serious internal errors.
-  void error(String message) { throw message; }
+  void error(String message) {
+    throw message;
+  }
 
   /// Adds [string] to the output.
   void emit(String string);
@@ -46,10 +46,8 @@
   /// [Fun] nodes and is `null` otherwise.
   ///
   /// [enterNode] is called in post-traversal order.
-  void exitNode(Node node,
-                int startPosition,
-                int endPosition,
-                int closingPosition) {}
+  void exitNode(
+      Node node, int startPosition, int endPosition, int closingPosition) {}
 }
 
 /// A simple implementation of [JavaScriptPrintingContext] suitable for tests.
@@ -63,7 +61,6 @@
   String getText() => buffer.toString();
 }
 
-
 class Printer implements NodeVisitor {
   final JavaScriptPrintingOptions options;
   final JavaScriptPrintingContext context;
@@ -85,22 +82,21 @@
   static final identifierCharacterRegExp = new RegExp(r'^[a-zA-Z_0-9$]');
   static final expressionContinuationRegExp = new RegExp(r'^[-+([]');
 
-  Printer(JavaScriptPrintingOptions options,
-          JavaScriptPrintingContext context)
+  Printer(JavaScriptPrintingOptions options, JavaScriptPrintingContext context)
       : options = options,
         context = context,
         shouldCompressOutput = options.shouldCompressOutput,
         danglingElseVisitor = new DanglingElseVisitor(context),
-        localNamer = determineRenamer(options.shouldCompressOutput,
-                                      options.minifyLocalVariables);
+        localNamer = determineRenamer(
+            options.shouldCompressOutput, options.minifyLocalVariables);
 
-  static LocalNamer determineRenamer(bool shouldCompressOutput,
-                                     bool allowVariableMinification) {
+  static LocalNamer determineRenamer(
+      bool shouldCompressOutput, bool allowVariableMinification) {
     return (shouldCompressOutput && allowVariableMinification)
-        ? new MinifyRenamer() : new IdentityNamer();
+        ? new MinifyRenamer()
+        : new IdentityNamer();
   }
 
-
   // The current indentation string.
   String get indentation {
     // Lazily add new indentation strings as required.
@@ -236,7 +232,7 @@
   }
 
   void visitCommaSeparated(List<Node> nodes, int hasRequiredType,
-                           {bool newInForInit, bool newAtStatementBegin}) {
+      {bool newInForInit, bool newAtStatementBegin}) {
     for (int i = 0; i < nodes.length; i++) {
       if (i != 0) {
         atStatementBegin = false;
@@ -244,8 +240,7 @@
         spaceOut();
       }
       visitNestedExpression(nodes[i], hasRequiredType,
-                            newInForInit: newInForInit,
-                            newAtStatementBegin: newAtStatementBegin);
+          newInForInit: newInForInit, newAtStatementBegin: newAtStatementBegin);
     }
   }
 
@@ -325,7 +320,7 @@
   void visitExpressionStatement(ExpressionStatement node) {
     indent();
     visitNestedExpression(node.expression, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: true);
+        newInForInit: false, newAtStatementBegin: true);
     outSemicolonLn();
   }
 
@@ -353,7 +348,7 @@
     spaceOut();
     out("(");
     visitNestedExpression(node.condition, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
     bool thenWasBlock =
         blockBody(then, needsSeparation: false, needsNewline: !hasElse);
@@ -371,7 +366,7 @@
         endNode(elsePart);
       } else {
         blockBody(unwrapBlockIfSingleStatement(elsePart),
-                  needsSeparation: true, needsNewline: true);
+            needsSeparation: true, needsNewline: true);
       }
     }
   }
@@ -388,23 +383,23 @@
     out("(");
     if (loop.init != null) {
       visitNestedExpression(loop.init, EXPRESSION,
-                            newInForInit: true, newAtStatementBegin: false);
+          newInForInit: true, newAtStatementBegin: false);
     }
     out(";");
     if (loop.condition != null) {
       spaceOut();
       visitNestedExpression(loop.condition, EXPRESSION,
-                            newInForInit: false, newAtStatementBegin: false);
+          newInForInit: false, newAtStatementBegin: false);
     }
     out(";");
     if (loop.update != null) {
       spaceOut();
       visitNestedExpression(loop.update, EXPRESSION,
-                            newInForInit: false, newAtStatementBegin: false);
+          newInForInit: false, newAtStatementBegin: false);
     }
     out(")");
     blockBody(unwrapBlockIfSingleStatement(loop.body),
-              needsSeparation: false, needsNewline: true);
+        needsSeparation: false, needsNewline: true);
   }
 
   @override
@@ -413,14 +408,14 @@
     spaceOut();
     out("(");
     visitNestedExpression(loop.leftHandSide, EXPRESSION,
-                          newInForInit: true, newAtStatementBegin: false);
+        newInForInit: true, newAtStatementBegin: false);
     out(" in");
     pendingSpace = true;
     visitNestedExpression(loop.object, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
     blockBody(unwrapBlockIfSingleStatement(loop.body),
-              needsSeparation: false, needsNewline: true);
+        needsSeparation: false, needsNewline: true);
   }
 
   @override
@@ -429,17 +424,17 @@
     spaceOut();
     out("(");
     visitNestedExpression(loop.condition, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
     blockBody(unwrapBlockIfSingleStatement(loop.body),
-              needsSeparation: false, needsNewline: true);
+        needsSeparation: false, needsNewline: true);
   }
 
   @override
   void visitDo(Do loop) {
     outIndent("do");
     if (blockBody(unwrapBlockIfSingleStatement(loop.body),
-                  needsSeparation: true, needsNewline: false)) {
+        needsSeparation: true, needsNewline: false)) {
       spaceOut();
     } else {
       indent();
@@ -448,7 +443,7 @@
     spaceOut();
     out("(");
     visitNestedExpression(loop.condition, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
     outSemicolonLn();
   }
@@ -481,7 +476,7 @@
       outIndent("return");
       pendingSpace = true;
       visitNestedExpression(node.value, EXPRESSION,
-                            newInForInit: false, newAtStatementBegin: false);
+          newInForInit: false, newAtStatementBegin: false);
     }
     outSemicolonLn();
   }
@@ -495,7 +490,7 @@
     }
     pendingSpace = true;
     visitNestedExpression(node.expression, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     outSemicolonLn();
   }
 
@@ -504,7 +499,7 @@
     outIndent("throw");
     pendingSpace = true;
     visitNestedExpression(node.expression, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     outSemicolonLn();
   }
 
@@ -531,7 +526,7 @@
     spaceOut();
     out("(");
     visitNestedExpression(node.declaration, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
     blockBody(node.body, needsSeparation: false, needsNewline: false);
   }
@@ -542,7 +537,7 @@
     spaceOut();
     out("(");
     visitNestedExpression(node.key, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
     spaceOut();
     outLn("{");
@@ -557,7 +552,7 @@
     outIndent("case");
     pendingSpace = true;
     visitNestedExpression(node.expression, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     outLn(":");
     if (!node.body.statements.isEmpty) {
       indentMore();
@@ -598,13 +593,13 @@
       out(" ");
       // Name must be a [Decl]. Therefore only test for primary expressions.
       visitNestedExpression(name, PRIMARY,
-                            newInForInit: false, newAtStatementBegin: false);
+          newInForInit: false, newAtStatementBegin: false);
     }
     localNamer.enterScope(vars);
     out("(");
     if (fun.params != null) {
       visitCommaSeparated(fun.params, PRIMARY,
-                          newInForInit: false, newAtStatementBegin: false);
+          newInForInit: false, newAtStatementBegin: false);
     }
     out(")");
     switch (fun.asyncModifier) {
@@ -628,7 +623,6 @@
         blockOut(fun.body, shouldIndent: false, needsNewline: false);
     localNamer.leaveScope();
     return closingPosition;
-
   }
 
   @override
@@ -644,18 +638,19 @@
   }
 
   visitNestedExpression(Expression node, int requiredPrecedence,
-                        {bool newInForInit, bool newAtStatementBegin}) {
+      {bool newInForInit, bool newAtStatementBegin}) {
     bool needsParentheses =
         // a - (b + c).
         (requiredPrecedence != EXPRESSION &&
-         node.precedenceLevel < requiredPrecedence) ||
-        // for (a = (x in o); ... ; ... ) { ... }
-        (newInForInit && node is Binary && node.op == "in") ||
-        // (function() { ... })().
-        // ({a: 2, b: 3}.toString()).
-        (newAtStatementBegin && (node is NamedFunction ||
-                                 node is Fun ||
-                                 node is ObjectInitializer));
+                node.precedenceLevel < requiredPrecedence) ||
+            // for (a = (x in o); ... ; ... ) { ... }
+            (newInForInit && node is Binary && node.op == "in") ||
+            // (function() { ... })().
+            // ({a: 2, b: 3}.toString()).
+            (newAtStatementBegin &&
+                (node is NamedFunction ||
+                    node is Fun ||
+                    node is ObjectInitializer));
     if (needsParentheses) {
       inForInit = false;
       atStatementBegin = false;
@@ -673,14 +668,13 @@
   visitVariableDeclarationList(VariableDeclarationList list) {
     out("var ");
     visitCommaSeparated(list.declarations, ASSIGNMENT,
-                        newInForInit: inForInit, newAtStatementBegin: false);
+        newInForInit: inForInit, newAtStatementBegin: false);
   }
 
   @override
   visitAssignment(Assignment assignment) {
     visitNestedExpression(assignment.leftHandSide, CALL,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: atStatementBegin);
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
     if (assignment.value != null) {
       spaceOut();
       String op = assignment.op;
@@ -688,8 +682,7 @@
       out("=");
       spaceOut();
       visitNestedExpression(assignment.value, ASSIGNMENT,
-                            newInForInit: inForInit,
-                            newAtStatementBegin: false);
+          newInForInit: inForInit, newAtStatementBegin: false);
     }
   }
 
@@ -701,40 +694,38 @@
   @override
   visitConditional(Conditional cond) {
     visitNestedExpression(cond.condition, LOGICAL_OR,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: atStatementBegin);
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
     spaceOut();
     out("?");
     spaceOut();
     // The then part is allowed to have an 'in'.
     visitNestedExpression(cond.then, ASSIGNMENT,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     spaceOut();
     out(":");
     spaceOut();
     visitNestedExpression(cond.otherwise, ASSIGNMENT,
-                          newInForInit: inForInit, newAtStatementBegin: false);
+        newInForInit: inForInit, newAtStatementBegin: false);
   }
 
   @override
   visitNew(New node) {
     out("new ");
     visitNestedExpression(node.target, LEFT_HAND_SIDE,
-                          newInForInit: inForInit, newAtStatementBegin: false);
+        newInForInit: inForInit, newAtStatementBegin: false);
     out("(");
     visitCommaSeparated(node.arguments, ASSIGNMENT,
-                        newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
   }
 
   @override
   visitCall(Call call) {
     visitNestedExpression(call.target, CALL,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: atStatementBegin);
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
     out("(");
     visitCommaSeparated(call.arguments, ASSIGNMENT,
-                        newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out(")");
   }
 
@@ -745,7 +736,7 @@
     String op = binary.op;
     int leftPrecedenceRequirement;
     int rightPrecedenceRequirement;
-    bool leftSpace = true;   // left<HERE>op right
+    bool leftSpace = true; // left<HERE>op right
     switch (op) {
       case ',':
         //  x, (y, z) <=> (x, y), z.
@@ -822,8 +813,7 @@
     }
 
     visitNestedExpression(left, leftPrecedenceRequirement,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: atStatementBegin);
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
 
     if (op == "in" || op == "instanceof") {
       // There are cases where the space is not required but without further
@@ -837,8 +827,7 @@
       spaceOut();
     }
     visitNestedExpression(right, rightPrecedenceRequirement,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: false);
+        newInForInit: inForInit, newAtStatementBegin: false);
   }
 
   @override
@@ -867,14 +856,13 @@
         out(op);
     }
     visitNestedExpression(unary.argument, UNARY,
-                          newInForInit: inForInit, newAtStatementBegin: false);
+        newInForInit: inForInit, newAtStatementBegin: false);
   }
 
   @override
   void visitPostfix(Postfix postfix) {
     visitNestedExpression(postfix.argument, CALL,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: atStatementBegin);
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
     out(postfix.op);
   }
 
@@ -909,10 +897,10 @@
       // TODO(floitsch): allow more characters.
       int charCode = field.codeUnitAt(i);
       if (!(charCodes.$a <= charCode && charCode <= charCodes.$z ||
-            charCodes.$A <= charCode && charCode <= charCodes.$Z ||
-            charCode == charCodes.$$ ||
-            charCode == charCodes.$_ ||
-            i != 1 && isDigit(charCode))) {
+          charCodes.$A <= charCode && charCode <= charCodes.$Z ||
+          charCode == charCodes.$$ ||
+          charCode == charCodes.$_ ||
+          i != 1 && isDigit(charCode))) {
         return false;
       }
     }
@@ -927,8 +915,7 @@
   @override
   void visitAccess(PropertyAccess access) {
     visitNestedExpression(access.receiver, CALL,
-                          newInForInit: inForInit,
-                          newAtStatementBegin: atStatementBegin);
+        newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
     Node selector = access.selector;
     if (selector is LiteralString) {
       LiteralString selectorString = selector;
@@ -957,7 +944,7 @@
     }
     out("[");
     visitNestedExpression(selector, EXPRESSION,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
     out("]");
   }
 
@@ -1051,7 +1038,7 @@
       }
       if (i != 0) spaceOut();
       visitNestedExpression(element, ASSIGNMENT,
-                            newInForInit: false, newAtStatementBegin: false);
+          newInForInit: false, newAtStatementBegin: false);
       // We can skip the trailing "," for the last element (since it's not
       // an array hole).
       if (i != elements.length - 1) out(",");
@@ -1070,8 +1057,7 @@
     // property.  Ideally, we would use a proper pretty-printer to make the
     // decision based on layout.
     bool exitOneLinerMode(Expression value) {
-      return
-          value is Fun ||
+      return value is Fun ||
           value is ArrayInitializer && value.elements.any((e) => e is Fun);
     }
 
@@ -1122,7 +1108,7 @@
     out(":");
     spaceOut();
     visitNestedExpression(node.value, ASSIGNMENT,
-                          newInForInit: false, newAtStatementBegin: false);
+        newInForInit: false, newAtStatementBegin: false);
   }
 
   @override
@@ -1205,12 +1191,13 @@
   }
 }
 
-
 class OrderedSet<T> {
   final Set<T> set;
   final List<T> list;
 
-  OrderedSet() : set = new Set<T>(), list = <T>[];
+  OrderedSet()
+      : set = new Set<T>(),
+        list = <T>[];
 
   void add(T x) {
     if (set.add(x)) {
@@ -1235,9 +1222,10 @@
   static final String disableVariableMinificationPattern = "::norenaming::";
   static final String enableVariableMinificationPattern = "::dorenaming::";
 
-  VarCollector() : nested = false,
-                   vars = new OrderedSet<String>(),
-                   params = new OrderedSet<String>();
+  VarCollector()
+      : nested = false,
+        vars = new OrderedSet<String>(),
+        params = new OrderedSet<String>();
 
   void forEachVar(void fn(String v)) => vars.forEach(fn);
   void forEachParam(void fn(String p)) => params.forEach(fn);
@@ -1284,7 +1272,6 @@
   }
 }
 
-
 /**
  * Returns true, if the given node must be wrapped into braces when used
  * as then-statement in an [If] that has an else branch.
@@ -1308,6 +1295,7 @@
     if (!node.hasElse) return true;
     return node.otherwise.accept(this);
   }
+
   bool visitFor(For node) => node.body.accept(this);
   bool visitForIn(ForIn node) => node.body.accept(this);
   bool visitWhile(While node) => node.body.accept(this);
@@ -1323,19 +1311,18 @@
       return node.catchPart.accept(this);
     }
   }
+
   bool visitCatch(Catch node) => node.body.accept(this);
   bool visitSwitch(Switch node) => false;
   bool visitCase(Case node) => false;
   bool visitDefault(Default node) => false;
   bool visitFunctionDeclaration(FunctionDeclaration node) => false;
-  bool visitLabeledStatement(LabeledStatement node)
-      => node.body.accept(this);
+  bool visitLabeledStatement(LabeledStatement node) => node.body.accept(this);
   bool visitLiteralStatement(LiteralStatement node) => true;
 
   bool visitExpression(Expression node) => false;
 }
 
-
 abstract class LocalNamer {
   String getName(String oldName);
   String declareVariable(String oldName);
@@ -1344,7 +1331,6 @@
   void leaveScope();
 }
 
-
 class IdentityNamer implements LocalNamer {
   String getName(String oldName) => oldName;
   String declareVariable(String oldName) => oldName;
@@ -1353,7 +1339,6 @@
   void leaveScope() {}
 }
 
-
 class MinifyRenamer implements LocalNamer {
   final List<Map<String, String>> maps = [];
   final List<int> parameterNumberStack = [];
@@ -1392,9 +1377,9 @@
   static const DIGITS = 10;
 
   static int nthLetter(int n) {
-    return (n < LOWER_CASE_LETTERS) ?
-           charCodes.$a + n :
-           charCodes.$A + n - LOWER_CASE_LETTERS;
+    return (n < LOWER_CASE_LETTERS)
+        ? charCodes.$a + n
+        : charCodes.$A + n - LOWER_CASE_LETTERS;
   }
 
   // Parameters go from a to z and variables go from z to a.  This makes each
diff --git a/pkg/js_ast/lib/src/template.dart b/pkg/js_ast/lib/src/template.dart
index 34ad972..d7946cd 100644
--- a/pkg/js_ast/lib/src/template.dart
+++ b/pkg/js_ast/lib/src/template.dart
@@ -10,7 +10,6 @@
 
   TemplateManager();
 
-
   Template lookupExpressionTemplate(String source) {
     return expressionTemplates[source];
   }
@@ -55,13 +54,15 @@
   bool get isPositional => holeNames == null;
 
   Template(this.source, this.ast,
-           {this.isExpression: true, this.forceCopy: false}) {
+      {this.isExpression: true, this.forceCopy: false}) {
     assert(this.isExpression ? ast is Expression : ast is Statement);
     _compile();
   }
 
   Template.withExpressionResult(this.ast)
-      : source = null, isExpression = true, forceCopy = false {
+      : source = null,
+        isExpression = true,
+        forceCopy = false {
     assert(ast is Expression);
     assert(_checkNoPlaceholders());
     positionalArgumentCount = 0;
@@ -69,7 +70,9 @@
   }
 
   Template.withStatementResult(this.ast)
-      : source = null, isExpression = false, forceCopy = false {
+      : source = null,
+        isExpression = false,
+        forceCopy = false {
     assert(ast is Statement);
     assert(_checkNoPlaceholders());
     positionalArgumentCount = 0;
@@ -89,7 +92,7 @@
     instantiator = generator.compile(ast);
     positionalArgumentCount = generator.analysis.count;
     Set<String> names = generator.analysis.holeNames;
-    holeNames = names.toList(growable:false);
+    holeNames = names.toList(growable: false);
   }
 
   /// Instantiates the template with the given [arguments].
@@ -128,14 +131,12 @@
  */
 typedef Node Instantiator(var arguments);
 
-
 /**
  * InstantiatorGeneratorVisitor compiles a template.  This class compiles a tree
  * containing [InterpolatedNode]s into a function that will create a copy of the
  * tree with the interpolated nodes substituted with provided values.
  */
 class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> {
-
   final bool forceCopy;
 
   InterpolatedNodeAnalysis analysis = new InterpolatedNodeAnalysis();
@@ -222,6 +223,7 @@
           return error('Interpolated value #$nameOrPosition is not '
               'an Expression or List of Expressions: $value');
         }
+
         if (value is Iterable) return value.map(toExpression);
         return toExpression(value);
       };
@@ -247,8 +249,9 @@
         if (item is Parameter) return item;
         if (item is String) return new Parameter(item);
         return error('Interpolated value #$nameOrPosition is not a Parameter or'
-                     ' List of Parameters: $value');
+            ' List of Parameters: $value');
       }
+
       if (value is Iterable) return value.map(toParameter);
       return toParameter(value);
     };
@@ -283,10 +286,12 @@
         var value = arguments[nameOrPosition];
         Statement toStatement(item) {
           if (item is Statement) return item;
-          if (item is Expression) return item.toStatement();;
+          if (item is Expression) return item.toStatement();
+          ;
           return error('Interpolated value #$nameOrPosition is not '
-                       'a Statement or List of Statements: $value');
+              'a Statement or List of Statements: $value');
         }
+
         if (value is Iterable) return value.map(toStatement);
         return toStatement(value);
       };
@@ -306,6 +311,7 @@
           statements.add(node.toStatement());
         }
       }
+
       for (Instantiator instantiator in instantiators) {
         add(instantiator(arguments));
       }
@@ -327,6 +333,7 @@
           statements.add(node.toStatement());
         }
       }
+
       for (Instantiator instantiator in instantiators) {
         add(instantiator(arguments));
       }
@@ -360,11 +367,13 @@
         var value = arguments[nameOrPosition];
         if (value is bool) return value;
         if (value is Expression) return value;
-        if (value is String) return convertStringToVariableUse(value);;
+        if (value is String) return convertStringToVariableUse(value);
+        ;
         error('Interpolated value #$nameOrPosition '
-              'is not an Expression: $value');
+            'is not an Expression: $value');
       };
     }
+
     var makeCondition = compileCondition(node.condition);
     Instantiator makeThen = visit(node.then);
     Instantiator makeOtherwise = visit(node.otherwise);
@@ -377,10 +386,7 @@
           return makeOtherwise(arguments);
         }
       }
-      return new If(
-          condition,
-          makeThen(arguments),
-          makeOtherwise(arguments));
+      return new If(condition, makeThen(arguments), makeOtherwise(arguments));
     };
   }
 
@@ -389,9 +395,7 @@
     Instantiator makeThen = visit(node.then);
     Instantiator makeOtherwise = visit(node.otherwise);
     return (arguments) {
-      return new If(
-          makeCondition(arguments),
-          makeThen(arguments),
+      return new If(makeCondition(arguments), makeThen(arguments),
           makeOtherwise(arguments));
     };
   }
@@ -402,9 +406,8 @@
     Instantiator makeUpdate = visitNullable(node.update);
     Instantiator makeBody = visit(node.body);
     return (arguments) {
-      return new For(
-          makeInit(arguments), makeCondition(arguments), makeUpdate(arguments),
-          makeBody(arguments));
+      return new For(makeInit(arguments), makeCondition(arguments),
+          makeUpdate(arguments), makeBody(arguments));
     };
   }
 
@@ -413,9 +416,7 @@
     Instantiator makeObject = visit(node.object);
     Instantiator makeBody = visit(node.body);
     return (arguments) {
-      return new ForIn(
-          makeLeftHandSide(arguments),
-          makeObject(arguments),
+      return new ForIn(makeLeftHandSide(arguments), makeObject(arguments),
           makeBody(arguments));
     };
   }
@@ -453,7 +454,8 @@
 
   Instantiator visitDartYield(DartYield node) {
     Instantiator makeExpression = visit(node.expression);
-    return (arguments) => new DartYield(makeExpression(arguments), node.hasStar);
+    return (arguments) =>
+        new DartYield(makeExpression(arguments), node.hasStar);
   }
 
   Instantiator visitThrow(Throw node) {
@@ -472,17 +474,19 @@
   Instantiator visitCatch(Catch node) {
     Instantiator makeDeclaration = visit(node.declaration);
     Instantiator makeBody = visit(node.body);
-    return (arguments) => new Catch(
-        makeDeclaration(arguments), makeBody(arguments));
+    return (arguments) =>
+        new Catch(makeDeclaration(arguments), makeBody(arguments));
   }
 
   Instantiator visitSwitch(Switch node) {
     Instantiator makeKey = visit(node.key);
     Iterable<Instantiator> makeCases = node.cases.map(visit);
     return (arguments) {
-      return new Switch(makeKey(arguments),
-          makeCases.map((Instantiator makeCase) => makeCase(arguments))
-                   .toList());
+      return new Switch(
+          makeKey(arguments),
+          makeCases
+              .map((Instantiator makeCase) => makeCase(arguments))
+              .toList());
     };
   }
 
@@ -537,9 +541,7 @@
     Instantiator makeValue = visitNullable(node.value);
     return (arguments) {
       return new Assignment.compound(
-          makeLeftHandSide(arguments),
-          op,
-          makeValue(arguments));
+          makeLeftHandSide(arguments), op, makeValue(arguments));
     };
   }
 
@@ -556,10 +558,8 @@
     Instantiator makeCondition = visit(cond.condition);
     Instantiator makeThen = visit(cond.then);
     Instantiator makeOtherwise = visit(cond.otherwise);
-    return (arguments) => new Conditional(
-        makeCondition(arguments),
-        makeThen(arguments),
-        makeOtherwise(arguments));
+    return (arguments) => new Conditional(makeCondition(arguments),
+        makeThen(arguments), makeOtherwise(arguments));
   }
 
   Instantiator visitNew(New node) =>
@@ -658,8 +658,7 @@
 
   Instantiator visitDeferredNumber(DeferredNumber node) => same(node);
 
-  Instantiator visitDeferredString(DeferredString node) =>
-      (arguments) => node;
+  Instantiator visitDeferredString(DeferredString node) => (arguments) => node;
 
   Instantiator visitLiteralBool(LiteralBool node) =>
       (arguments) => new LiteralBool(node.value);
@@ -674,9 +673,8 @@
       (arguments) => new LiteralNull();
 
   Instantiator visitStringConcatenation(StringConcatenation node) {
-    List<Instantiator> partMakers = node.parts
-        .map(visit)
-        .toList(growable: false);
+    List<Instantiator> partMakers =
+        node.parts.map(visit).toList(growable: false);
     return (arguments) {
       List<Literal> parts = partMakers
           .map((Instantiator instantiator) => instantiator(arguments))
@@ -689,9 +687,8 @@
 
   Instantiator visitArrayInitializer(ArrayInitializer node) {
     // TODO(sra): Implement splicing?
-    List<Instantiator> elementMakers = node.elements
-        .map(visit)
-        .toList(growable: false);
+    List<Instantiator> elementMakers =
+        node.elements.map(visit).toList(growable: false);
     return (arguments) {
       List<Expression> elements = elementMakers
           .map((Instantiator instantiator) => instantiator(arguments))
diff --git a/pkg/js_ast/test/printer_callback_test.dart b/pkg/js_ast/test/printer_callback_test.dart
index 7e14110..d142e83 100644
--- a/pkg/js_ast/test/printer_callback_test.dart
+++ b/pkg/js_ast/test/printer_callback_test.dart
@@ -25,9 +25,7 @@
   /// Map from template names to the inserted values.
   final Map<String, String> environment;
 
-  const TestCase(
-      this.data,
-      [this.environment = const {}]);
+  const TestCase(this.data, [this.environment = const {}]);
 }
 
 const List<TestCase> DATA = const <TestCase>[
@@ -44,12 +42,11 @@
 function(a, b) {
   return null;
 @0}""",
-   TestMode.EXIT: """
+    TestMode.EXIT: """
 function(a@1, b@2) {
   return null@5;
 @4}@3@0"""
   }),
-
   const TestCase(const {
     TestMode.NONE: """
 function() {
@@ -108,7 +105,6 @@
 @26  }@22
 @20}@1@0""",
   }),
-
   const TestCase(const {
     TestMode.NONE: """
 function() {
@@ -125,13 +121,12 @@
   function foo() {
   @3}
 @0}""",
-   TestMode.EXIT: """
+    TestMode.EXIT: """
 function() {
   function foo@4() {
   }@5@3
 @2}@1@0"""
   }),
-
   const TestCase(const {
     TestMode.INPUT: """
 function() {
@@ -153,20 +148,21 @@
   a.b;
   [1,, 2];
 @0}""",
-   TestMode.EXIT: """
+    TestMode.EXIT: """
 function() {
   a@4.b@5@3;
 @2  [1@8,,@9 2@10]@7;
 @6}@1@0""",
   }),
-
   const TestCase(const {
     TestMode.INPUT: "a.#nameTemplate = #nameTemplate",
     TestMode.NONE: "a.nameValue = nameValue",
     TestMode.ENTER: "@0@1@2a.@3nameValue = @3nameValue",
     TestMode.DELIMITER: "a.nameValue = nameValue",
     TestMode.EXIT: "a@2.nameValue@3@1 = nameValue@3@0",
-  }, const {'nameTemplate': 'nameValue'}),
+  }, const {
+    'nameTemplate': 'nameValue'
+  }),
 ];
 
 class FixedName extends Name {
@@ -221,10 +217,8 @@
     }
   }
 
-  void exitNode(Node node,
-                int startPosition,
-                int endPosition,
-                int delimiterPosition) {
+  void exitNode(
+      Node node, int startPosition, int endPosition, int delimiterPosition) {
     int value = id(node);
     if (mode == TestMode.DELIMITER && delimiterPosition != null) {
       tagMap.putIfAbsent(delimiterPosition, () => []).add(tag(value));
diff --git a/pkg/js_ast/test/string_escape_test.dart b/pkg/js_ast/test/string_escape_test.dart
index 3811629..118225b 100644
--- a/pkg/js_ast/test/string_escape_test.dart
+++ b/pkg/js_ast/test/string_escape_test.dart
@@ -23,127 +23,145 @@
   }
 
   test('simple', () {
-      check('', [$DQ, $DQ]);
-      check('a', [$DQ, $a, $DQ]);
-    });
+    check('', [$DQ, $DQ]);
+    check('a', [$DQ, $a, $DQ]);
+  });
 
   test('simple-escapes', () {
-      check([$BS], [$DQ, $BACKSLASH, $b, $DQ]);
-      check([$BS], [$DQ, $BACKSLASH, $b, $DQ], ascii: true);
-      check([$BS], [$DQ, $BACKSLASH, $b, $DQ], utf8: true);
+    check([$BS], [$DQ, $BACKSLASH, $b, $DQ]);
+    check([$BS], [$DQ, $BACKSLASH, $b, $DQ], ascii: true);
+    check([$BS], [$DQ, $BACKSLASH, $b, $DQ], utf8: true);
 
-      check([$LF], [$DQ, $BACKSLASH, $n, $DQ]);
-      check([$LF], [$DQ, $BACKSLASH, $n, $DQ], ascii: true);
-      check([$LF], [$DQ, $BACKSLASH, $n, $DQ], utf8: true);
+    check([$LF], [$DQ, $BACKSLASH, $n, $DQ]);
+    check([$LF], [$DQ, $BACKSLASH, $n, $DQ], ascii: true);
+    check([$LF], [$DQ, $BACKSLASH, $n, $DQ], utf8: true);
 
-      check([$FF], [$DQ, $FF, $DQ]);
-      check([$FF], [$DQ, $BACKSLASH, $f, $DQ], ascii: true);
-      check([$FF], [$DQ, $BACKSLASH, $f, $DQ], utf8: true);
+    check([$FF], [$DQ, $FF, $DQ]);
+    check([$FF], [$DQ, $BACKSLASH, $f, $DQ], ascii: true);
+    check([$FF], [$DQ, $BACKSLASH, $f, $DQ], utf8: true);
 
-      check([$CR], [$DQ, $BACKSLASH, $r, $DQ]);
-      check([$CR], [$DQ, $BACKSLASH, $r, $DQ], ascii: true);
-      check([$CR], [$DQ, $BACKSLASH, $r, $DQ], utf8: true);
+    check([$CR], [$DQ, $BACKSLASH, $r, $DQ]);
+    check([$CR], [$DQ, $BACKSLASH, $r, $DQ], ascii: true);
+    check([$CR], [$DQ, $BACKSLASH, $r, $DQ], utf8: true);
 
-      check([$TAB], [$DQ, $BACKSLASH, $t, $DQ]);
-      check([$TAB], [$DQ, $BACKSLASH, $t, $DQ], ascii: true);
-      check([$TAB], [$DQ, $BACKSLASH, $t, $DQ], utf8: true);
+    check([$TAB], [$DQ, $BACKSLASH, $t, $DQ]);
+    check([$TAB], [$DQ, $BACKSLASH, $t, $DQ], ascii: true);
+    check([$TAB], [$DQ, $BACKSLASH, $t, $DQ], utf8: true);
 
-      check([$VTAB], [$DQ, $BACKSLASH, $v, $DQ]);
-      check([$VTAB], [$DQ, $BACKSLASH, $v, $DQ], ascii: true);
-      check([$VTAB], [$DQ, $BACKSLASH, $v, $DQ], utf8: true);
-    });
+    check([$VTAB], [$DQ, $BACKSLASH, $v, $DQ]);
+    check([$VTAB], [$DQ, $BACKSLASH, $v, $DQ], ascii: true);
+    check([$VTAB], [$DQ, $BACKSLASH, $v, $DQ], utf8: true);
+  });
 
   test('unnamed-control-codes-escapes', () {
-      check([0, 1, 2, 3], [$DQ, 0, 1, 2, 3, $DQ]);
-      check([0, 1, 2, 3], r'''"\x00\x01\x02\x03"''', ascii: true);
-      check([0, 1, 2, 3], [$DQ, 0, 1, 2, 3, $DQ], utf8: true);
-    });
-
+    check([0, 1, 2, 3], [$DQ, 0, 1, 2, 3, $DQ]);
+    check([0, 1, 2, 3], r'''"\x00\x01\x02\x03"''', ascii: true);
+    check([0, 1, 2, 3], [$DQ, 0, 1, 2, 3, $DQ], utf8: true);
+  });
 
   test('line-separator', () {
-      // Legacy escaper is broken.
-      // check([$LS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $8, $DQ]);
-      check([$LS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $8, $DQ], ascii: true);
-      check([$LS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $8, $DQ], utf8: true);
-    });
+    // Legacy escaper is broken.
+    // check([$LS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $8, $DQ]);
+    check([$LS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $8, $DQ], ascii: true);
+    check([$LS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $8, $DQ], utf8: true);
+  });
 
   test('page-separator', () {
-      // Legacy escaper is broken.
-      // check([$PS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $9, $DQ]);
-      check([$PS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $9, $DQ], ascii: true);
-      check([$PS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $9, $DQ], utf8: true);
-    });
+    // Legacy escaper is broken.
+    // check([$PS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $9, $DQ]);
+    check([$PS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $9, $DQ], ascii: true);
+    check([$PS], [$DQ, $BACKSLASH, $u, $2, $0, $2, $9, $DQ], utf8: true);
+  });
 
   test('legacy-escaper-is-broken', () {
-      check([$LS], [$DQ, 0x2028, $DQ]);
-      check([$PS], [$DQ, 0x2029, $DQ]);
-    });
+    check([$LS], [$DQ, 0x2028, $DQ]);
+    check([$PS], [$DQ, 0x2029, $DQ]);
+  });
 
   test('choose-quotes', () {
-      check('\'', [$DQ, $SQ, $DQ]);
-      check('"', [$SQ, $DQ, $SQ], ascii: true);
-      check("'", [$DQ, $SQ, $DQ], ascii: true);
-      // Legacy always double-quotes
-      check([$DQ, $DQ, $SQ],
-            [$DQ, $BACKSLASH, $DQ, $BACKSLASH, $DQ, $SQ, $DQ]);
-      // Using single quotes saves us one backslash:
-      check([$DQ, $DQ, $SQ],
-            [$SQ, $DQ, $DQ, $BACKSLASH, $SQ, $SQ],
-            ascii: true);
-      check([$DQ, $SQ, $SQ],
-            [$DQ, $BACKSLASH, $DQ, $SQ, $SQ, $DQ],
-            ascii: true);
-    });
+    check('\'', [$DQ, $SQ, $DQ]);
+    check('"', [$SQ, $DQ, $SQ], ascii: true);
+    check("'", [$DQ, $SQ, $DQ], ascii: true);
+    // Legacy always double-quotes
+    check([$DQ, $DQ, $SQ], [$DQ, $BACKSLASH, $DQ, $BACKSLASH, $DQ, $SQ, $DQ]);
+    // Using single quotes saves us one backslash:
+    check([$DQ, $DQ, $SQ], [$SQ, $DQ, $DQ, $BACKSLASH, $SQ, $SQ], ascii: true);
+    check([$DQ, $SQ, $SQ], [$DQ, $BACKSLASH, $DQ, $SQ, $SQ, $DQ], ascii: true);
+  });
 
   test('u1234', () {
-      check('\u1234', [$DQ, 0x1234, $DQ]);
-      check('\u1234', [$DQ, $BACKSLASH, $u, $1, $2, $3, $4, $DQ], ascii: true);
-      check('\u1234', [$DQ, 0x1234, $DQ], utf8: true);
-    });
+    check('\u1234', [$DQ, 0x1234, $DQ]);
+    check('\u1234', [$DQ, $BACKSLASH, $u, $1, $2, $3, $4, $DQ], ascii: true);
+    check('\u1234', [$DQ, 0x1234, $DQ], utf8: true);
+  });
 
   test('u12345', () {
-      check([0x12345], [$DQ, 55304, 57157, $DQ]);
-      // TODO: ES6 option:
-      //check([0x12345],
-      //      [$DQ, $BACKSLASH, $u, $LCURLY, $1, $2, $3, $4, $5, $RCURLY, $DQ],
-      //      ascii: true);
-      check([0x12345], r'''"\ud808\udf45"''', ascii: true);
-      check([0x12345],
-            [$DQ, $BACKSLASH, $u, $d, $8, $0, $8,
-                  $BACKSLASH, $u, $d, $f, $4, $5, $DQ],
-            ascii: true);
-      check([0x12345], [$DQ, 55304, 57157, $DQ], utf8: true);
-    });
+    check([0x12345], [$DQ, 55304, 57157, $DQ]);
+    // TODO: ES6 option:
+    //check([0x12345],
+    //      [$DQ, $BACKSLASH, $u, $LCURLY, $1, $2, $3, $4, $5, $RCURLY, $DQ],
+    //      ascii: true);
+    check([0x12345], r'''"\ud808\udf45"''', ascii: true);
+    check([
+      0x12345
+    ], [
+      $DQ,
+      $BACKSLASH,
+      $u,
+      $d,
+      $8,
+      $0,
+      $8,
+      $BACKSLASH,
+      $u,
+      $d,
+      $f,
+      $4,
+      $5,
+      $DQ
+    ], ascii: true);
+    check([0x12345], [$DQ, 55304, 57157, $DQ], utf8: true);
+  });
 
   test('unpaired-surrogate', () {
-      // (0xD834, 0xDD1E) = 0x1D11E
-      // Strings containing unpaired surrogates must be encoded to prevent
-      // problems with the utf8 file-level encoding.
-      check([0xD834], [$DQ, 0xD834, $DQ]);  // Legacy escapedString broken.
-      check([0xD834], [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $DQ], ascii: true);
-      check([0xD834], [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $DQ], utf8: true);
+    // (0xD834, 0xDD1E) = 0x1D11E
+    // Strings containing unpaired surrogates must be encoded to prevent
+    // problems with the utf8 file-level encoding.
+    check([0xD834], [$DQ, 0xD834, $DQ]); // Legacy escapedString broken.
+    check([0xD834], [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $DQ], ascii: true);
+    check([0xD834], [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $DQ], utf8: true);
 
-      check([0xDD1E], [$DQ, 0xDD1E, $DQ]);  // Legacy escapedString broken.
-      check([0xDD1E], [$DQ, $BACKSLASH, $u, $d, $d, $1, $e, $DQ], ascii: true);
-      check([0xDD1E], [$DQ, $BACKSLASH, $u, $d, $d, $1, $e, $DQ], utf8: true);
+    check([0xDD1E], [$DQ, 0xDD1E, $DQ]); // Legacy escapedString broken.
+    check([0xDD1E], [$DQ, $BACKSLASH, $u, $d, $d, $1, $e, $DQ], ascii: true);
+    check([0xDD1E], [$DQ, $BACKSLASH, $u, $d, $d, $1, $e, $DQ], utf8: true);
 
-      check([0xD834, $A],
-            [$DQ, 0xD834, $A, $DQ]);  // Legacy escapedString broken.
-      check([0xD834, $A],
-            [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $A, $DQ],
-            ascii: true);
-      check([0xD834, $A],
-            [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $A, $DQ],
-            utf8: true);
+    check([0xD834, $A], [$DQ, 0xD834, $A, $DQ]); // Legacy escapedString broken.
+    check([0xD834, $A], [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $A, $DQ],
+        ascii: true);
+    check([0xD834, $A], [$DQ, $BACKSLASH, $u, $d, $8, $3, $4, $A, $DQ],
+        utf8: true);
 
-      check([0xD834, 0xDD1E], [$DQ, 0xD834, 0xDD1E, $DQ]);  // Legacy ok.
-      check([0xD834, 0xDD1E],
-            [$DQ,
-              $BACKSLASH, $u, $d, $8, $3, $4,
-              $BACKSLASH, $u, $d, $d, $1, $e,
-              $DQ],
-            ascii: true);
-      check([0xD834, 0xDD1E], r'''"\ud834\udd1e"''', ascii: true);
-      check([0xD834, 0xDD1E], [$DQ, 0xD834, 0xDD1E, $DQ], utf8: true);
-    });
+    check([0xD834, 0xDD1E], [$DQ, 0xD834, 0xDD1E, $DQ]); // Legacy ok.
+    check([
+      0xD834,
+      0xDD1E
+    ], [
+      $DQ,
+      $BACKSLASH,
+      $u,
+      $d,
+      $8,
+      $3,
+      $4,
+      $BACKSLASH,
+      $u,
+      $d,
+      $d,
+      $1,
+      $e,
+      $DQ
+    ], ascii: true);
+    check([0xD834, 0xDD1E], r'''"\ud834\udd1e"''', ascii: true);
+    check([0xD834, 0xDD1E], [$DQ, 0xD834, 0xDD1E, $DQ], utf8: true);
+  });
 }
diff --git a/runtime/bin/address_sanitizer.cc b/runtime/bin/address_sanitizer.cc
index db2c65e..708e169 100644
--- a/runtime/bin/address_sanitizer.cc
+++ b/runtime/bin/address_sanitizer.cc
@@ -4,7 +4,7 @@
 
 #include "platform/globals.h"
 
-#if defined(TARGET_OS_LINUX) || defined(TARGET_OS_MACOSX)
+#if defined(HOST_OS_LINUX) || defined(HOST_OS_MACOSX)
 #if defined(__has_feature)
 #if __has_feature(address_sanitizer)
 
@@ -23,4 +23,4 @@
 
 #endif  // __has_feature(address_sanitizer)
 #endif  // defined(__has_feature)
-#endif  //  defined(TARGET_OS_LINUX) || defined(TARGET_OS_MACOSX)
+#endif  //  defined(HOST_OS_LINUX) || defined(HOST_OS_MACOSX)
diff --git a/runtime/bin/crypto_android.cc b/runtime/bin/crypto_android.cc
index b83a71b..2b6147c 100644
--- a/runtime/bin/crypto_android.cc
+++ b/runtime/bin/crypto_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include <errno.h>  // NOLINT
 #include <fcntl.h>  // NOLINT
@@ -41,4 +41,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/bin/crypto_fuchsia.cc b/runtime/bin/crypto_fuchsia.cc
index dde76ac..4f9ec42 100644
--- a/runtime/bin/crypto_fuchsia.cc
+++ b/runtime/bin/crypto_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "bin/crypto.h"
 
@@ -31,4 +31,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/bin/crypto_linux.cc b/runtime/bin/crypto_linux.cc
index b618101..0a9fcb1 100644
--- a/runtime/bin/crypto_linux.cc
+++ b/runtime/bin/crypto_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include <errno.h>  // NOLINT
 #include <fcntl.h>  // NOLINT
@@ -41,4 +41,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/bin/crypto_macos.cc b/runtime/bin/crypto_macos.cc
index e2447c0..c799d07 100644
--- a/runtime/bin/crypto_macos.cc
+++ b/runtime/bin/crypto_macos.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include <errno.h>  // NOLINT
 #include <fcntl.h>  // NOLINT
@@ -41,4 +41,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/bin/crypto_win.cc b/runtime/bin/crypto_win.cc
index 0208d95..fd68802 100644
--- a/runtime/bin/crypto_win.cc
+++ b/runtime/bin/crypto_win.cc
@@ -7,7 +7,7 @@
 #endif
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "bin/crypto.h"
 
@@ -32,4 +32,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index e03ad8f..e5685df 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -94,11 +94,11 @@
 
 
 static bool IsWindowsHost() {
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
   return true;
-#else   // defined(TARGET_OS_WINDOWS)
+#else   // defined(HOST_OS_WINDOWS)
   return false;
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
 }
 
 
diff --git a/runtime/bin/directory_android.cc b/runtime/bin/directory_android.cc
index b4ad7c0..43ad142 100644
--- a/runtime/bin/directory_android.cc
+++ b/runtime/bin/directory_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "bin/directory.h"
 
@@ -482,4 +482,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/bin/directory_fuchsia.cc b/runtime/bin/directory_fuchsia.cc
index f47f81d4..c213910 100644
--- a/runtime/bin/directory_fuchsia.cc
+++ b/runtime/bin/directory_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "bin/directory.h"
 
@@ -431,4 +431,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/bin/directory_linux.cc b/runtime/bin/directory_linux.cc
index f2a064a..b3acd6f 100644
--- a/runtime/bin/directory_linux.cc
+++ b/runtime/bin/directory_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "bin/directory.h"
 
@@ -486,4 +486,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/bin/directory_macos.cc b/runtime/bin/directory_macos.cc
index ca0d41b..48a7088 100644
--- a/runtime/bin/directory_macos.cc
+++ b/runtime/bin/directory_macos.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "bin/directory.h"
 
@@ -477,4 +477,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/bin/directory_win.cc b/runtime/bin/directory_win.cc
index e9a5be9..df82c11 100644
--- a/runtime/bin/directory_win.cc
+++ b/runtime/bin/directory_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "bin/directory.h"
 #include "bin/file.h"
@@ -510,4 +510,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/bin/eventhandler.h b/runtime/bin/eventhandler.h
index 50852cd..f410ee9 100644
--- a/runtime/bin/eventhandler.h
+++ b/runtime/bin/eventhandler.h
@@ -605,15 +605,15 @@
 }  // namespace dart
 
 // The event handler delegation class is OS specific.
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 #include "bin/eventhandler_android.h"
-#elif defined(TARGET_OS_FUCHSIA)
+#elif defined(HOST_OS_FUCHSIA)
 #include "bin/eventhandler_fuchsia.h"
-#elif defined(TARGET_OS_LINUX)
+#elif defined(HOST_OS_LINUX)
 #include "bin/eventhandler_linux.h"
-#elif defined(TARGET_OS_MACOS)
+#elif defined(HOST_OS_MACOS)
 #include "bin/eventhandler_macos.h"
-#elif defined(TARGET_OS_WINDOWS)
+#elif defined(HOST_OS_WINDOWS)
 #include "bin/eventhandler_win.h"
 #else
 #error Unknown target os.
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index 8ab91cd..053b69d 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "bin/eventhandler.h"
 #include "bin/eventhandler_android.h"
@@ -444,6 +444,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/eventhandler_fuchsia.cc b/runtime/bin/eventhandler_fuchsia.cc
index 6531ce5..438d36eb 100644
--- a/runtime/bin/eventhandler_fuchsia.cc
+++ b/runtime/bin/eventhandler_fuchsia.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "bin/eventhandler.h"
 #include "bin/eventhandler_fuchsia.h"
@@ -506,6 +506,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index 24e7755..cd98058 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "bin/eventhandler.h"
 #include "bin/eventhandler_linux.h"
@@ -441,6 +441,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index 7aa9280..13423fa 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "bin/eventhandler.h"
 #include "bin/eventhandler_macos.h"
@@ -508,6 +508,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index bd4af31..eedcf16 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "bin/eventhandler.h"
 #include "bin/eventhandler_win.h"
@@ -1460,6 +1460,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/extensions_android.cc b/runtime/bin/extensions_android.cc
index 847dfb3..944d57e 100644
--- a/runtime/bin/extensions_android.cc
+++ b/runtime/bin/extensions_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "bin/extensions.h"
 #include <dlfcn.h>  // NOLINT
@@ -48,4 +48,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/bin/extensions_fuchsia.cc b/runtime/bin/extensions_fuchsia.cc
index 5d386f1..a954207 100644
--- a/runtime/bin/extensions_fuchsia.cc
+++ b/runtime/bin/extensions_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "bin/extensions.h"
 #include <dlfcn.h>  // NOLINT
@@ -48,4 +48,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/bin/extensions_linux.cc b/runtime/bin/extensions_linux.cc
index b2c22d3..70eb648 100644
--- a/runtime/bin/extensions_linux.cc
+++ b/runtime/bin/extensions_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "bin/extensions.h"
 #include <dlfcn.h>  // NOLINT
@@ -48,4 +48,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/bin/extensions_macos.cc b/runtime/bin/extensions_macos.cc
index 8588295..3269e4f 100644
--- a/runtime/bin/extensions_macos.cc
+++ b/runtime/bin/extensions_macos.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "bin/extensions.h"
 #include <dlfcn.h>  // NOLINT
@@ -48,4 +48,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/bin/extensions_win.cc b/runtime/bin/extensions_win.cc
index bd742c0..dcc82d0 100644
--- a/runtime/bin/extensions_win.cc
+++ b/runtime/bin/extensions_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "bin/extensions.h"
 #include "bin/utils.h"
@@ -59,4 +59,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/bin/fdutils_android.cc b/runtime/bin/fdutils_android.cc
index ad5b91e..71627b6 100644
--- a/runtime/bin/fdutils_android.cc
+++ b/runtime/bin/fdutils_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "bin/fdutils.h"
 
@@ -147,4 +147,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/bin/fdutils_fuchsia.cc b/runtime/bin/fdutils_fuchsia.cc
index 00c9763..6c3eae9 100644
--- a/runtime/bin/fdutils_fuchsia.cc
+++ b/runtime/bin/fdutils_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "bin/fdutils.h"
 
@@ -147,4 +147,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/bin/fdutils_linux.cc b/runtime/bin/fdutils_linux.cc
index 7f4598b..4bf9897 100644
--- a/runtime/bin/fdutils_linux.cc
+++ b/runtime/bin/fdutils_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "bin/fdutils.h"
 
@@ -147,4 +147,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/bin/fdutils_macos.cc b/runtime/bin/fdutils_macos.cc
index 4a0e3c0..9da95a8 100644
--- a/runtime/bin/fdutils_macos.cc
+++ b/runtime/bin/fdutils_macos.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "bin/fdutils.h"
 
@@ -147,4 +147,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index a8ca445..b226a51 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "bin/file.h"
 
@@ -608,4 +608,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/bin/file_fuchsia.cc b/runtime/bin/file_fuchsia.cc
index 5ed46d5..e0d62b4 100644
--- a/runtime/bin/file_fuchsia.cc
+++ b/runtime/bin/file_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "bin/file.h"
 
@@ -583,4 +583,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index 7b44768..9a13a13 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "bin/file.h"
 
@@ -620,4 +620,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 7309da0..3250960 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "bin/file.h"
 
@@ -582,4 +582,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/bin/file_system_watcher_android.cc b/runtime/bin/file_system_watcher_android.cc
index 0cecfe2..abece4c 100644
--- a/runtime/bin/file_system_watcher_android.cc
+++ b/runtime/bin/file_system_watcher_android.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "bin/file_system_watcher.h"
 
@@ -146,6 +146,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/file_system_watcher_fuchsia.cc b/runtime/bin/file_system_watcher_fuchsia.cc
index abfbaa8..3b4fdf3 100644
--- a/runtime/bin/file_system_watcher_fuchsia.cc
+++ b/runtime/bin/file_system_watcher_fuchsia.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "bin/file_system_watcher.h"
 
@@ -55,6 +55,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/file_system_watcher_linux.cc b/runtime/bin/file_system_watcher_linux.cc
index 91c8184..e74c69f 100644
--- a/runtime/bin/file_system_watcher_linux.cc
+++ b/runtime/bin/file_system_watcher_linux.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "bin/file_system_watcher.h"
 
@@ -147,6 +147,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/file_system_watcher_macos.cc b/runtime/bin/file_system_watcher_macos.cc
index 3636eb3..f9da101 100644
--- a/runtime/bin/file_system_watcher_macos.cc
+++ b/runtime/bin/file_system_watcher_macos.cc
@@ -5,11 +5,11 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "bin/file_system_watcher.h"
 
-#if !TARGET_OS_IOS
+#if !HOST_OS_IOS
 
 #include <errno.h>                      // NOLINT
 #include <fcntl.h>                      // NOLINT
@@ -397,7 +397,7 @@
 }  // namespace bin
 }  // namespace dart
 
-#else  // !TARGET_OS_IOS
+#else  // !HOST_OS_IOS
 
 namespace dart {
 namespace bin {
@@ -439,7 +439,7 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // !TARGET_OS_IOS
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // !HOST_OS_IOS
+#endif  // defined(HOST_OS_MACOS)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/file_system_watcher_win.cc b/runtime/bin/file_system_watcher_win.cc
index 16a49a0..ebbb207 100644
--- a/runtime/bin/file_system_watcher_win.cc
+++ b/runtime/bin/file_system_watcher_win.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "bin/file_system_watcher.h"
 
@@ -135,6 +135,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 9255ca2..883b911 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "bin/file.h"
 
@@ -831,4 +831,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/bin/log_android.cc b/runtime/bin/log_android.cc
index 42a6755..164db7f 100644
--- a/runtime/bin/log_android.cc
+++ b/runtime/bin/log_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "bin/log.h"
 
@@ -37,4 +37,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/bin/log_fuchsia.cc b/runtime/bin/log_fuchsia.cc
index b3f9d1d..f84fc49 100644
--- a/runtime/bin/log_fuchsia.cc
+++ b/runtime/bin/log_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "bin/log.h"
 
@@ -25,4 +25,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/bin/log_linux.cc b/runtime/bin/log_linux.cc
index e9dcf1c..2844a17 100644
--- a/runtime/bin/log_linux.cc
+++ b/runtime/bin/log_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "bin/log.h"
 
@@ -25,4 +25,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/bin/log_macos.cc b/runtime/bin/log_macos.cc
index 913a60d..4044acf 100644
--- a/runtime/bin/log_macos.cc
+++ b/runtime/bin/log_macos.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "bin/log.h"
 
@@ -25,4 +25,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/bin/log_win.cc b/runtime/bin/log_win.cc
index d8dfe96..650e47e 100644
--- a/runtime/bin/log_win.cc
+++ b/runtime/bin/log_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "bin/log.h"
 
@@ -25,4 +25,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 5290205..0d349ee 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -491,7 +491,7 @@
 }
 
 
-#if !defined(TARGET_OS_MACOS)
+#if !defined(HOST_OS_MACOS)
 extern const char* commandline_root_certs_file;
 extern const char* commandline_root_certs_cache;
 
@@ -527,7 +527,7 @@
   commandline_root_certs_cache = arg;
   return true;
 }
-#endif  // !defined(TARGET_OS_MACOS)
+#endif  // !defined(HOST_OS_MACOS)
 
 
 static struct {
@@ -561,10 +561,10 @@
     {"--hot-reload-rollback-test-mode", ProcessHotReloadRollbackTestModeOption},
     {"--short_socket_read", ProcessShortSocketReadOption},
     {"--short_socket_write", ProcessShortSocketWriteOption},
-#if !defined(TARGET_OS_MACOS)
+#if !defined(HOST_OS_MACOS)
     {"--root-certs-file=", ProcessRootCertsFileOption},
     {"--root-certs-cache=", ProcessRootCertsCacheOption},
-#endif  // !defined(TARGET_OS_MACOS)
+#endif  // !defined(HOST_OS_MACOS)
     {NULL, NULL}};
 
 
@@ -1116,7 +1116,7 @@
 "--enable-vm-service[=<port>[/<bind-address>]]\n"
 "  enables the VM service and listens on specified port for connections\n"
 "  (default port number is 8181, default bind address is localhost).\n"
-#if !defined(TARGET_OS_MACOS)
+#if !defined(HOST_OS_MACOS)
 "\n"
 "--root-certs-file=<path>\n"
 "  The path to a file containing the trusted root certificates to use for\n"
@@ -1124,7 +1124,7 @@
 "--root-certs-cache=<path>\n"
 "  The path to a cache directory containing the trusted root certificates to\n"
 "  use for secure socket connections.\n"
-#endif  // !defined(TARGET_OS_MACOS)
+#endif  // !defined(HOST_OS_MACOS)
 "\n"
 "The following options are only used for VM development and may\n"
 "be changed in any future version:\n");
diff --git a/runtime/bin/platform_android.cc b/runtime/bin/platform_android.cc
index 6b051ac..10371c6 100644
--- a/runtime/bin/platform_android.cc
+++ b/runtime/bin/platform_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "bin/platform.h"
 
@@ -97,4 +97,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/bin/platform_fuchsia.cc b/runtime/bin/platform_fuchsia.cc
index 42256f1..ea3115a 100644
--- a/runtime/bin/platform_fuchsia.cc
+++ b/runtime/bin/platform_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "bin/platform.h"
 
@@ -121,4 +121,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/bin/platform_linux.cc b/runtime/bin/platform_linux.cc
index 9a71018..810dec4 100644
--- a/runtime/bin/platform_linux.cc
+++ b/runtime/bin/platform_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "bin/platform.h"
 
@@ -122,4 +122,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/bin/platform_macos.cc b/runtime/bin/platform_macos.cc
index 1f201f1..787069a 100644
--- a/runtime/bin/platform_macos.cc
+++ b/runtime/bin/platform_macos.cc
@@ -3,13 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "bin/platform.h"
 
-#if !TARGET_OS_IOS
+#if !HOST_OS_IOS
 #include <crt_externs.h>  // NOLINT
-#endif                    // !TARGET_OS_IOS
+#endif                    // !HOST_OS_IOS
 #include <mach-o/dyld.h>
 #include <signal.h>      // NOLINT
 #include <string.h>      // NOLINT
@@ -80,7 +80,7 @@
 
 
 const char* Platform::OperatingSystem() {
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
   return "ios";
 #else
   return "macos";
@@ -104,7 +104,7 @@
 
 
 char** Platform::Environment(intptr_t* count) {
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
   // TODO(zra,chinmaygarde): On iOS, environment variables are seldom used. Wire
   // this up if someone needs it. In the meantime, we return an empty array.
   char** result;
@@ -166,4 +166,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/bin/platform_win.cc b/runtime/bin/platform_win.cc
index e34d515..14f1a1f 100644
--- a/runtime/bin/platform_win.cc
+++ b/runtime/bin/platform_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "bin/platform.h"
 
@@ -58,6 +58,19 @@
     // the requested file. See:
     // See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680621(v=vs.85).aspx
     SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
+    // Set up a signal handler that restores the console state on a
+    // CTRL_C_EVENT signal. This will only run when there is no signal hanlder
+    // registered for the CTRL_C_EVENT from Dart code.
+    SetConsoleCtrlHandler(SignalHandler, TRUE);
+  }
+
+  static BOOL WINAPI SignalHandler(DWORD signal) {
+    if (signal == CTRL_C_EVENT) {
+      // We call this without taking the lock because this is a signal
+      // handler, and because the process is about to go down.
+      RestoreConsoleLocked();
+    }
+    return FALSE;
   }
 
   static void SaveAndConfigureConsole() {
@@ -92,20 +105,33 @@
 
   static void RestoreConsole() {
     MutexLocker ml(platform_win_mutex_);
+    RestoreConsoleLocked();
+  }
 
+  static bool ansi_supported() { return ansi_supported_; }
+
+ private:
+  static Mutex* platform_win_mutex_;
+  static int saved_output_cp_;
+  static int saved_input_cp_;
+  static bool ansi_supported_;
+
+  static void RestoreConsoleLocked() {
     // STD_OUTPUT_HANDLE and STD_INPUT_HANDLE may have been closed or
     // redirected. Therefore, we explicitly open the CONOUT$ and CONIN$
     // devices, so that we can be sure that we are really unsetting
     // ENABLE_VIRTUAL_TERMINAL_PROCESSING and ENABLE_VIRTUAL_TERMINAL_INPUT
     // respectively.
-    HANDLE out;
-    {
-      Utf8ToWideScope conin("CONOUT$");
-      out = CreateFileW(conin.wide(), GENERIC_READ | GENERIC_WRITE,
-                        FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
-      if (out != INVALID_HANDLE_VALUE) {
-        SetStdHandle(STD_OUTPUT_HANDLE, out);
-      }
+    const intptr_t kWideBufLen = 64;
+    const char* conout = "CONOUT$";
+    wchar_t widebuf[kWideBufLen];
+    int result =
+        MultiByteToWideChar(CP_UTF8, 0, conout, -1, widebuf, kWideBufLen);
+    ASSERT(result != 0);
+    HANDLE out = CreateFileW(widebuf, GENERIC_READ | GENERIC_WRITE,
+                             FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
+    if (out != INVALID_HANDLE_VALUE) {
+      SetStdHandle(STD_OUTPUT_HANDLE, out);
     }
     DWORD out_mode;
     if ((out != INVALID_HANDLE_VALUE) && GetConsoleMode(out, &out_mode)) {
@@ -113,14 +139,13 @@
       SetConsoleMode(out, request);
     }
 
-    HANDLE in;
-    {
-      Utf8ToWideScope conin("CONIN$");
-      in = CreateFileW(conin.wide(), GENERIC_READ | GENERIC_WRITE,
-                       FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
-      if (in != INVALID_HANDLE_VALUE) {
-        SetStdHandle(STD_INPUT_HANDLE, in);
-      }
+    const char* conin = "CONIN$";
+    result = MultiByteToWideChar(CP_UTF8, 0, conin, -1, widebuf, kWideBufLen);
+    ASSERT(result != 0);
+    HANDLE in = CreateFileW(widebuf, GENERIC_READ | GENERIC_WRITE,
+                            FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
+    if (in != INVALID_HANDLE_VALUE) {
+      SetStdHandle(STD_INPUT_HANDLE, in);
     }
     DWORD in_mode;
     if ((in != INVALID_HANDLE_VALUE) && GetConsoleMode(in, &in_mode)) {
@@ -138,14 +163,6 @@
     }
   }
 
-  static bool ansi_supported() { return ansi_supported_; }
-
- private:
-  static Mutex* platform_win_mutex_;
-  static int saved_output_cp_;
-  static int saved_input_cp_;
-  static bool ansi_supported_;
-
   static void InvalidParameterHandler(const wchar_t* expression,
                                       const wchar_t* function,
                                       const wchar_t* file,
@@ -277,4 +294,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/bin/process.h b/runtime/bin/process.h
index f877b8d..fafff6b 100644
--- a/runtime/bin/process.h
+++ b/runtime/bin/process.h
@@ -12,7 +12,7 @@
 #include "bin/lockers.h"
 #include "bin/thread.h"
 #include "platform/globals.h"
-#if !defined(TARGET_OS_WINDOWS)
+#if !defined(HOST_OS_WINDOWS)
 #include "platform/signal_blocker.h"
 #endif
 #include "platform/utils.h"
@@ -322,8 +322,8 @@
   DISALLOW_COPY_AND_ASSIGN(BufferListBase);
 };
 
-#if defined(TARGET_OS_ANDROID) || defined(TARGET_OS_FUCHSIA) ||                \
-    defined(TARGET_OS_LINUX) || defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_ANDROID) || defined(HOST_OS_FUCHSIA) ||                    \
+    defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS)
 class BufferList : public BufferListBase {
  public:
   BufferList() {}
@@ -340,13 +340,13 @@
       ASSERT(free_size() > 0);
       ASSERT(free_size() <= kBufferSize);
       intptr_t block_size = dart::Utils::Minimum(free_size(), available);
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
       intptr_t bytes = NO_RETRY_EXPECTED(
           read(fd, reinterpret_cast<void*>(FreeSpaceAddress()), block_size));
 #else
       intptr_t bytes = TEMP_FAILURE_RETRY(
           read(fd, reinterpret_cast<void*>(FreeSpaceAddress()), block_size));
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
       if (bytes < 0) {
         return false;
       }
@@ -360,7 +360,7 @@
  private:
   DISALLOW_COPY_AND_ASSIGN(BufferList);
 };
-#endif  // defined(TARGET_OS_ANDROID) ...
+#endif  // defined(HOST_OS_ANDROID) ...
 
 }  // namespace bin
 }  // namespace dart
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index d2dcca1..64ee4dc 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "bin/process.h"
 
@@ -1000,6 +1000,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc
index b1ca5d9..d029c35 100644
--- a/runtime/bin/process_fuchsia.cc
+++ b/runtime/bin/process_fuchsia.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "bin/process.h"
 
@@ -820,6 +820,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index ae686e5..29e6044d 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "bin/process.h"
 
@@ -997,6 +997,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 30035c5..a4420d2 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -5,11 +5,11 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "bin/process.h"
 
-#if !TARGET_OS_IOS
+#if !HOST_OS_IOS
 #include <crt_externs.h>  // NOLINT
 #endif
 #include <errno.h>   // NOLINT
@@ -465,7 +465,7 @@
       ReportChildError();
     }
 
-#if !TARGET_OS_IOS
+#if !HOST_OS_IOS
     if (program_environment_ != NULL) {
       // On MacOS you have to do a bit of magic to get to the
       // environment strings.
@@ -1090,6 +1090,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc
index c0cb06b..7903236 100644
--- a/runtime/bin/process_win.cc
+++ b/runtime/bin/process_win.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "bin/process.h"
 
@@ -1045,6 +1045,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/root_certificates_unsupported.cc b/runtime/bin/root_certificates_unsupported.cc
index 1ba98c8..55917bd 100644
--- a/runtime/bin/root_certificates_unsupported.cc
+++ b/runtime/bin/root_certificates_unsupported.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED) && !defined(DART_IO_SECURE_SOCKET_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS) || defined(TARGET_OS_ANDROID) ||                  \
+#if defined(HOST_OS_MACOS) || defined(HOST_OS_ANDROID) ||                      \
     defined(DART_IO_ROOT_CERTS_DISABLED)
 
 namespace dart {
@@ -17,7 +17,7 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS) || defined(TARGET_OS_ANDROID) || ...
+#endif  // defined(HOST_OS_MACOS) || defined(HOST_OS_ANDROID) || ...
 
 #endif  // !defined(DART_IO_DISABLED) &&
         // !defined(DART_IO_SECURE_SOCKET_DISABLED)
diff --git a/runtime/bin/secure_socket.h b/runtime/bin/secure_socket.h
index 543820b..83bf34d 100644
--- a/runtime/bin/secure_socket.h
+++ b/runtime/bin/secure_socket.h
@@ -10,15 +10,15 @@
 #endif
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID) || defined(TARGET_OS_LINUX) ||                  \
-    defined(TARGET_OS_WINDOWS) || defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_ANDROID) || defined(HOST_OS_LINUX) ||                      \
+    defined(HOST_OS_WINDOWS) || defined(HOST_OS_FUCHSIA)
 #include "bin/secure_socket_boringssl.h"
-#elif defined(TARGET_OS_MACOS)
-#if TARGET_OS_IOS
+#elif defined(HOST_OS_MACOS)
+#if HOST_OS_IOS
 #include "bin/secure_socket_ios.h"
-#else  // TARGET_OS_IOS
+#else  // HOST_OS_IOS
 #include "bin/secure_socket_macos.h"
-#endif  // TARGET_OS_IOS
+#endif  // HOST_OS_IOS
 #else
 #error Unknown target os.
 #endif
diff --git a/runtime/bin/secure_socket_boringssl.cc b/runtime/bin/secure_socket_boringssl.cc
index 81c3d82..f2df95d 100644
--- a/runtime/bin/secure_socket_boringssl.cc
+++ b/runtime/bin/secure_socket_boringssl.cc
@@ -5,8 +5,8 @@
 #if !defined(DART_IO_DISABLED) && !defined(DART_IO_SECURE_SOCKET_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID) || defined(TARGET_OS_LINUX) ||                  \
-    defined(TARGET_OS_WINDOWS) || defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_ANDROID) || defined(HOST_OS_LINUX) ||                      \
+    defined(HOST_OS_WINDOWS) || defined(HOST_OS_FUCHSIA)
 
 #include "bin/secure_socket.h"
 #include "bin/secure_socket_boringssl.h"
@@ -872,7 +872,7 @@
     return;
   }
 
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
   // On Android, we don't compile in the trusted root certificates. Insead,
   // we use the directory of trusted certificates already present on the device.
   // This saves ~240KB from the size of the binary. This has the drawback that
@@ -883,7 +883,7 @@
   const char* android_cacerts = "/system/etc/security/cacerts";
   LoadRootCertCache(context, android_cacerts);
   return;
-#elif defined(TARGET_OS_LINUX)
+#elif defined(HOST_OS_LINUX)
   // On Linux, we use the compiled-in trusted certs as a last resort. First,
   // we try to find the trusted certs in various standard locations. A good
   // discussion of the complexities of this endeavor can be found here:
@@ -900,7 +900,7 @@
     LoadRootCertCache(context, cachedir);
     return;
   }
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
 
   // Fall back on the compiled-in certs if the standard locations don't exist,
   // or we aren't on Linux.
@@ -1799,7 +1799,7 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
 
 #endif  // !defined(DART_IO_DISABLED) &&
         // !defined(DART_IO_SECURE_SOCKET_DISABLED)
diff --git a/runtime/bin/secure_socket_ios.cc b/runtime/bin/secure_socket_ios.cc
index 0f19380..e2d9abc 100644
--- a/runtime/bin/secure_socket_ios.cc
+++ b/runtime/bin/secure_socket_ios.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED) && !defined(DART_IO_SECURE_SOCKET_DISABLED)
 
 #include "platform/globals.h"
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
 
 #include "bin/secure_socket.h"
 #include "bin/secure_socket_ios.h"
@@ -1502,6 +1502,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // TARGET_OS_IOS
+#endif  // HOST_OS_IOS
 
 #endif  // !defined(DART_IO_SECURE_SOCKET_DISABLED)
diff --git a/runtime/bin/secure_socket_macos.cc b/runtime/bin/secure_socket_macos.cc
index 910008c..520f2c9 100644
--- a/runtime/bin/secure_socket_macos.cc
+++ b/runtime/bin/secure_socket_macos.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED) && !defined(DART_IO_SECURE_SOCKET_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS) && !TARGET_OS_IOS
+#if defined(HOST_OS_MACOS) && !HOST_OS_IOS
 
 #include "bin/secure_socket.h"
 #include "bin/secure_socket_macos.h"
@@ -1809,7 +1809,7 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS) && !TARGET_OS_IOS
+#endif  // defined(HOST_OS_MACOS) && !HOST_OS_IOS
 
 #endif  // !defined(DART_IO_DISABLED) &&
         // !defined(DART_IO_SECURE_SOCKET_DISABLED)
diff --git a/runtime/bin/socket.h b/runtime/bin/socket.h
index 1afc05e..ebd4067 100644
--- a/runtime/bin/socket.h
+++ b/runtime/bin/socket.h
@@ -11,15 +11,15 @@
 
 #include "platform/globals.h"
 // Declare the OS-specific types ahead of defining the generic class.
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 #include "bin/socket_android.h"
-#elif defined(TARGET_OS_FUCHSIA)
+#elif defined(HOST_OS_FUCHSIA)
 #include "bin/socket_fuchsia.h"
-#elif defined(TARGET_OS_LINUX)
+#elif defined(HOST_OS_LINUX)
 #include "bin/socket_linux.h"
-#elif defined(TARGET_OS_MACOS)
+#elif defined(HOST_OS_MACOS)
 #include "bin/socket_macos.h"
-#elif defined(TARGET_OS_WINDOWS)
+#elif defined(HOST_OS_WINDOWS)
 #include "bin/socket_win.h"
 #else
 #error Unknown target os.
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 08e49be..f9ed348 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "bin/socket.h"
 #include "bin/socket_android.h"
@@ -580,6 +580,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/socket_fuchsia.cc b/runtime/bin/socket_fuchsia.cc
index b82b723..5ea7f52 100644
--- a/runtime/bin/socket_fuchsia.cc
+++ b/runtime/bin/socket_fuchsia.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "bin/socket.h"
 #include "bin/socket_fuchsia.h"
@@ -534,6 +534,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index af53878..23427a7 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "bin/socket.h"
 #include "bin/socket_linux.h"
@@ -599,6 +599,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index c1f48cc..d4f205e 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "bin/socket.h"
 #include "bin/socket_macos.h"
@@ -628,6 +628,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 55cc107..dbb3d62 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "bin/socket.h"
 #include "bin/socket_win.h"
@@ -668,6 +668,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/stdio_android.cc b/runtime/bin/stdio_android.cc
index fbf1d76..8b264f8 100644
--- a/runtime/bin/stdio_android.cc
+++ b/runtime/bin/stdio_android.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "bin/stdio.h"
 
@@ -97,6 +97,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/stdio_fuchsia.cc b/runtime/bin/stdio_fuchsia.cc
index 8b77fbc..07febe1 100644
--- a/runtime/bin/stdio_fuchsia.cc
+++ b/runtime/bin/stdio_fuchsia.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "bin/stdio.h"
 
@@ -50,6 +50,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/stdio_linux.cc b/runtime/bin/stdio_linux.cc
index dd61fae..8199f20 100644
--- a/runtime/bin/stdio_linux.cc
+++ b/runtime/bin/stdio_linux.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "bin/stdio.h"
 
@@ -97,6 +97,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/stdio_macos.cc b/runtime/bin/stdio_macos.cc
index 9481395..5ed3d7e4e 100644
--- a/runtime/bin/stdio_macos.cc
+++ b/runtime/bin/stdio_macos.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "bin/stdio.h"
 
@@ -97,6 +97,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/stdio_win.cc b/runtime/bin/stdio_win.cc
index 5c79784..8f2a72c 100644
--- a/runtime/bin/stdio_win.cc
+++ b/runtime/bin/stdio_win.cc
@@ -5,7 +5,7 @@
 #if !defined(DART_IO_DISABLED)
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "bin/stdio.h"
 
@@ -96,6 +96,6 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
 
 #endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/test_extension_dllmain_win.cc b/runtime/bin/test_extension_dllmain_win.cc
index 93b66d6..2cee311 100644
--- a/runtime/bin/test_extension_dllmain_win.cc
+++ b/runtime/bin/test_extension_dllmain_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>  // NOLINT
@@ -12,4 +12,4 @@
   return true;
 }
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/bin/thread.h b/runtime/bin/thread.h
index 5bf1f13..6b80444 100644
--- a/runtime/bin/thread.h
+++ b/runtime/bin/thread.h
@@ -16,15 +16,15 @@
 }
 
 // Declare the OS-specific types ahead of defining the generic classes.
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 #include "bin/thread_android.h"
-#elif defined(TARGET_OS_FUCHSIA)
+#elif defined(HOST_OS_FUCHSIA)
 #include "bin/thread_fuchsia.h"
-#elif defined(TARGET_OS_LINUX)
+#elif defined(HOST_OS_LINUX)
 #include "bin/thread_linux.h"
-#elif defined(TARGET_OS_MACOS)
+#elif defined(HOST_OS_MACOS)
 #include "bin/thread_macos.h"
-#elif defined(TARGET_OS_WINDOWS)
+#elif defined(HOST_OS_WINDOWS)
 #include "bin/thread_win.h"
 #else
 #error Unknown target os.
diff --git a/runtime/bin/thread_android.cc b/runtime/bin/thread_android.cc
index e3732fa..d6035ad 100644
--- a/runtime/bin/thread_android.cc
+++ b/runtime/bin/thread_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "bin/thread.h"
 #include "bin/thread_android.h"
@@ -318,4 +318,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/bin/thread_fuchsia.cc b/runtime/bin/thread_fuchsia.cc
index c4fb413..5a9b351 100644
--- a/runtime/bin/thread_fuchsia.cc
+++ b/runtime/bin/thread_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "bin/thread.h"
 #include "bin/thread_fuchsia.h"
@@ -321,4 +321,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/bin/thread_linux.cc b/runtime/bin/thread_linux.cc
index ed44b34..ba34d54 100644
--- a/runtime/bin/thread_linux.cc
+++ b/runtime/bin/thread_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "bin/thread.h"
 #include "bin/thread_linux.h"
@@ -321,4 +321,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/bin/thread_macos.cc b/runtime/bin/thread_macos.cc
index dc76aaa..d8df64a 100644
--- a/runtime/bin/thread_macos.cc
+++ b/runtime/bin/thread_macos.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "bin/thread.h"
 #include "bin/thread_macos.h"
@@ -313,4 +313,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/bin/thread_win.cc b/runtime/bin/thread_win.cc
index 2bb0942..94d144a 100644
--- a/runtime/bin/thread_win.cc
+++ b/runtime/bin/thread_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "bin/thread.h"
 #include "bin/thread_win.h"
@@ -405,4 +405,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/bin/utils_android.cc b/runtime/bin/utils_android.cc
index e40d66a..adb6584 100644
--- a/runtime/bin/utils_android.cc
+++ b/runtime/bin/utils_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include <errno.h>     // NOLINT
 #include <netdb.h>     // NOLINT
@@ -131,4 +131,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/bin/utils_fuchsia.cc b/runtime/bin/utils_fuchsia.cc
index 2425e49..6bb2817 100644
--- a/runtime/bin/utils_fuchsia.cc
+++ b/runtime/bin/utils_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include <errno.h>
 #include <magenta/syscalls.h>
@@ -104,4 +104,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/bin/utils_linux.cc b/runtime/bin/utils_linux.cc
index c59531f..09b852f 100644
--- a/runtime/bin/utils_linux.cc
+++ b/runtime/bin/utils_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include <errno.h>     // NOLINT
 #include <netdb.h>     // NOLINT
@@ -129,4 +129,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/bin/utils_macos.cc b/runtime/bin/utils_macos.cc
index 5753cd0..2f55dbf 100644
--- a/runtime/bin/utils_macos.cc
+++ b/runtime/bin/utils_macos.cc
@@ -3,14 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include <errno.h>           // NOLINT
 #include <mach/clock.h>      // NOLINT
 #include <mach/mach.h>       // NOLINT
 #include <mach/mach_time.h>  // NOLINT
 #include <netdb.h>           // NOLINT
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
 #include <sys/sysctl.h>  // NOLINT
 #endif
 #include <sys/time.h>  // NOLINT
@@ -124,7 +124,7 @@
 }
 
 
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
 static int64_t GetCurrentTimeMicros() {
   // gettimeofday has microsecond resolution.
   struct timeval tv;
@@ -134,11 +134,11 @@
   }
   return (static_cast<int64_t>(tv.tv_sec) * 1000000) + tv.tv_usec;
 }
-#endif  // TARGET_OS_IOS
+#endif  // HOST_OS_IOS
 
 
 int64_t TimerUtils::GetCurrentMonotonicMicros() {
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
   // On iOS mach_absolute_time stops while the device is sleeping. Instead use
   // now - KERN_BOOTTIME to get a time difference that is not impacted by clock
   // changes. KERN_BOOTTIME will be updated by the system whenever the system
@@ -160,7 +160,7 @@
   result *= timebase_info.numer;
   result /= timebase_info.denom;
   return result;
-#endif  // TARGET_OS_IOS
+#endif  // HOST_OS_IOS
 }
 
 
@@ -188,4 +188,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/bin/utils_win.cc b/runtime/bin/utils_win.cc
index 8faa7d0..ef4851a 100644
--- a/runtime/bin/utils_win.cc
+++ b/runtime/bin/utils_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include <errno.h>  // NOLINT
 #include <time.h>   // NOLINT
@@ -260,4 +260,4 @@
 }  // namespace bin
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/bin/vmservice_impl.cc b/runtime/bin/vmservice_impl.cc
index acbcba9..7ff23d0 100644
--- a/runtime/bin/vmservice_impl.cc
+++ b/runtime/bin/vmservice_impl.cc
@@ -238,7 +238,7 @@
                          Dart_NewBoolean(dev_mode_server));
 
 // Are we running on Windows?
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
   Dart_Handle is_windows = Dart_True();
 #else
   Dart_Handle is_windows = Dart_False();
@@ -248,7 +248,7 @@
   SHUTDOWN_ON_ERROR(result);
 
 // Are we running on Fuchsia?
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
   Dart_Handle is_fuchsia = Dart_True();
 #else
   Dart_Handle is_fuchsia = Dart_False();
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index 2cd1921..683445c 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -198,7 +198,7 @@
 }
 
 
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 // MAC OSX math library produces old style cast warning.
 #pragma GCC diagnostic ignored "-Wold-style-cast"
 #endif
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index a7e8ddc..4a68c86 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -874,8 +874,7 @@
 
   Type& instantiated_type =
       Type::Handle(Type::New(clz, type_args_obj, TokenPosition::kNoSource));
-  instantiated_type ^= ClassFinalizer::FinalizeType(
-      clz, instantiated_type, ClassFinalizer::kCanonicalize);
+  instantiated_type ^= ClassFinalizer::FinalizeType(clz, instantiated_type);
   if (instantiated_type.IsMalbounded()) {
     const LanguageError& type_error =
         LanguageError::Handle(instantiated_type.error());
diff --git a/runtime/lib/uri.cc b/runtime/lib/uri.cc
index 66ab6ed..2f5dba1 100644
--- a/runtime/lib/uri.cc
+++ b/runtime/lib/uri.cc
@@ -9,7 +9,7 @@
 namespace dart {
 
 DEFINE_NATIVE_ENTRY(Uri_isWindowsPlatform, 0) {
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
   return Bool::True().raw();
 #else
   return Bool::False().raw();
diff --git a/runtime/platform/floating_point_win.cc b/runtime/platform/floating_point_win.cc
index 8863ec5..7fffe7a 100644
--- a/runtime/platform/floating_point_win.cc
+++ b/runtime/platform/floating_point_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "platform/floating_point_win.h"
 
@@ -46,4 +46,4 @@
   }
 }
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 6372df0e2..c504430 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -87,36 +87,36 @@
 #if defined(__ANDROID__)
 
 // Check for Android first, to determine its difference from Linux.
-#define TARGET_OS_ANDROID 1
+#define HOST_OS_ANDROID 1
 
 #elif defined(__linux__) || defined(__FreeBSD__)
 
 // Generic Linux.
-#define TARGET_OS_LINUX 1
+#define HOST_OS_LINUX 1
 
 #elif defined(__APPLE__)
 
 // Define the flavor of Mac OS we are running on.
 #include <TargetConditionals.h>
-// TODO(iposva): Rename TARGET_OS_MACOS to TARGET_OS_MAC to inherit
+// TODO(iposva): Rename HOST_OS_MACOS to HOST_OS_MAC to inherit
 // the value defined in TargetConditionals.h
-#define TARGET_OS_MACOS 1
+#define HOST_OS_MACOS 1
 #if TARGET_OS_IPHONE
 // Test for this #define by saying '#if TARGET_OS_IOS' rather than the usual
 // '#if defined(TARGET_OS_IOS)'. TARGET_OS_IOS is defined to be 0 in
 // XCode >= 7.0. See Issue #24453.
-#define TARGET_OS_IOS 1
+#define HOST_OS_IOS 1
 #endif
 
 #elif defined(_WIN32)
 
 // Windows, both 32- and 64-bit, regardless of the check for _WIN32.
-#define TARGET_OS_WINDOWS 1
+#define HOST_OS_WINDOWS 1
 
 #elif defined(__Fuchsia__)
-#define TARGET_OS_FUCHSIA
+#define HOST_OS_FUCHSIA
 
-#elif !defined(TARGET_OS_FUCHSIA)
+#elif !defined(HOST_OS_FUCHSIA)
 #error Automatic target os detection failed.
 #endif
 
@@ -388,7 +388,7 @@
 #if defined(TARGET_ABI_IOS) && defined(TARGET_ABI_EABI)
 #error Both TARGET_ABI_IOS and TARGET_ABI_EABI defined.
 #elif !defined(TARGET_ABI_IOS) && !defined(TARGET_ABI_EABI)
-#if defined(TARGET_OS_MAC)
+#if defined(HOST_OS_MAC)
 #define TARGET_ABI_IOS 1
 #else
 #define TARGET_ABI_EABI 1
@@ -672,21 +672,21 @@
 
 // On Windows the reentrent version of strtok is called
 // strtok_s. Unify on the posix name strtok_r.
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 #define snprintf _snprintf
 #define strtok_r strtok_s
 #endif
 
-#if !defined(TARGET_OS_WINDOWS)
+#if !defined(HOST_OS_WINDOWS)
 #if defined(TEMP_FAILURE_RETRY)
 // TEMP_FAILURE_RETRY is defined in unistd.h on some platforms. We should
 // not use that version, but instead the one in signal_blocker.h, to ensure
 // we disable signal interrupts.
 #undef TEMP_FAILURE_RETRY
 #endif  // defined(TEMP_FAILURE_RETRY)
-#endif  // !defined(TARGET_OS_WINDOWS)
+#endif  // !defined(HOST_OS_WINDOWS)
 
-#if defined(TARGET_OS_LINUX) || defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS)
 // Tell the compiler to do printf format string checking if the
 // compiler supports it; see the 'format' attribute in
 // <http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Function-Attributes.html>.
diff --git a/runtime/platform/math.h b/runtime/platform/math.h
index 1edf3e3..1926625 100644
--- a/runtime/platform/math.h
+++ b/runtime/platform/math.h
@@ -8,7 +8,7 @@
 // We must take these math functions from the C++ header file as long as we
 // are using the STL. Otherwise the Android build will break due to confusion
 // between C++ and C headers when math.h is also included.
-#if !defined(TARGET_OS_FUCHSIA)
+#if !defined(HOST_OS_FUCHSIA)
 #include <cmath>
 
 #define isinf(val) std::isinf(val)
diff --git a/runtime/platform/signal_blocker.h b/runtime/platform/signal_blocker.h
index 2afe49f..a7566b8 100644
--- a/runtime/platform/signal_blocker.h
+++ b/runtime/platform/signal_blocker.h
@@ -8,7 +8,7 @@
 #include "platform/globals.h"
 #include "platform/assert.h"
 
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 #error Do not include this file on Windows.
 #endif
 
diff --git a/runtime/platform/utils.h b/runtime/platform/utils.h
index 911cf50..d9d70c1 100644
--- a/runtime/platform/utils.h
+++ b/runtime/platform/utils.h
@@ -208,15 +208,15 @@
 
 }  // namespace dart
 
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 #include "platform/utils_android.h"
-#elif defined(TARGET_OS_FUCHSIA)
+#elif defined(HOST_OS_FUCHSIA)
 #include "platform/utils_fuchsia.h"
-#elif defined(TARGET_OS_LINUX)
+#elif defined(HOST_OS_LINUX)
 #include "platform/utils_linux.h"
-#elif defined(TARGET_OS_MACOS)
+#elif defined(HOST_OS_MACOS)
 #include "platform/utils_macos.h"
-#elif defined(TARGET_OS_WINDOWS)
+#elif defined(HOST_OS_WINDOWS)
 #include "platform/utils_win.h"
 #else
 #error Unknown target os.
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index d0e9d3c..cabee7f 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -15,7 +15,7 @@
 
 // An extra check since we are assuming the existence of /proc/cpuinfo below.
 #if !defined(USING_SIMULATOR) && !defined(__linux__) && !defined(ANDROID) &&   \
-    !TARGET_OS_IOS
+    !HOST_OS_IOS
 #error ARM cross-compile only supported on Linux
 #endif
 
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index 8816dd0..5a9a812 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -3413,7 +3413,7 @@
 
 ASSEMBLER_TEST_GENERATE(DoubleAbs, assembler) {
   EnterTestFrame(assembler);
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
   // First argument is code object, second argument is thread. MSVC passes
   // third argument in XMM2.
   __ DoubleAbs(XMM2);
diff --git a/runtime/vm/atomic.h b/runtime/vm/atomic.h
index c66c2cf..5a110a8 100644
--- a/runtime/vm/atomic.h
+++ b/runtime/vm/atomic.h
@@ -73,15 +73,15 @@
 #include "vm/atomic_simulator.h"
 #endif
 
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 #include "vm/atomic_android.h"
-#elif defined(TARGET_OS_FUCHSIA)
+#elif defined(HOST_OS_FUCHSIA)
 #include "vm/atomic_fuchsia.h"
-#elif defined(TARGET_OS_LINUX)
+#elif defined(HOST_OS_LINUX)
 #include "vm/atomic_linux.h"
-#elif defined(TARGET_OS_MACOS)
+#elif defined(HOST_OS_MACOS)
 #include "vm/atomic_macos.h"
-#elif defined(TARGET_OS_WINDOWS)
+#elif defined(HOST_OS_WINDOWS)
 #include "vm/atomic_win.h"
 #else
 #error Unknown target os.
diff --git a/runtime/vm/atomic_android.h b/runtime/vm/atomic_android.h
index f0731ab..a2f40f1 100644
--- a/runtime/vm/atomic_android.h
+++ b/runtime/vm/atomic_android.h
@@ -9,7 +9,7 @@
 #error Do not include atomic_android.h directly. Use atomic.h instead.
 #endif
 
-#if !defined(TARGET_OS_ANDROID)
+#if !defined(HOST_OS_ANDROID)
 #error This file should only be included on Android builds.
 #endif
 
diff --git a/runtime/vm/atomic_fuchsia.h b/runtime/vm/atomic_fuchsia.h
index e85899f..2092e9f 100644
--- a/runtime/vm/atomic_fuchsia.h
+++ b/runtime/vm/atomic_fuchsia.h
@@ -9,7 +9,7 @@
 #error Do not include atomic_fuchsia.h directly. Use atomic.h instead.
 #endif
 
-#if !defined(TARGET_OS_FUCHSIA)
+#if !defined(HOST_OS_FUCHSIA)
 #error This file should only be included on Fuchsia builds.
 #endif
 
diff --git a/runtime/vm/atomic_linux.h b/runtime/vm/atomic_linux.h
index c4ee910..b4cdffb 100644
--- a/runtime/vm/atomic_linux.h
+++ b/runtime/vm/atomic_linux.h
@@ -9,7 +9,7 @@
 #error Do not include atomic_linux.h directly. Use atomic.h instead.
 #endif
 
-#if !defined(TARGET_OS_LINUX)
+#if !defined(HOST_OS_LINUX)
 #error This file should only be included on Linux builds.
 #endif
 
diff --git a/runtime/vm/atomic_macos.h b/runtime/vm/atomic_macos.h
index e1c701f..6913a3f 100644
--- a/runtime/vm/atomic_macos.h
+++ b/runtime/vm/atomic_macos.h
@@ -9,7 +9,7 @@
 #error Do not include atomic_macos.h directly. Use atomic.h instead.
 #endif
 
-#if !defined(TARGET_OS_MACOS)
+#if !defined(HOST_OS_MACOS)
 #error This file should only be included on Mac OS X builds.
 #endif
 
diff --git a/runtime/vm/atomic_win.h b/runtime/vm/atomic_win.h
index 398ed43..2750f41 100644
--- a/runtime/vm/atomic_win.h
+++ b/runtime/vm/atomic_win.h
@@ -9,7 +9,7 @@
 #error Do not include atomic_win.h directly. Use atomic.h instead.
 #endif
 
-#if !defined(TARGET_OS_WINDOWS)
+#if !defined(HOST_OS_WINDOWS)
 #error This file should only be included on Windows builds.
 #endif
 
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index e094d0f..4baec47 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -364,7 +364,7 @@
     THR_Print("Resolving redirecting factory: %s\n",
               String::Handle(factory.name()).ToCString());
   }
-  type ^= FinalizeType(cls, type, kCanonicalize);
+  type ^= FinalizeType(cls, type);
   factory.SetRedirectionType(type);
   if (type.IsMalformedOrMalbounded()) {
     ASSERT(factory.RedirectionTarget() == Function::null());
@@ -460,7 +460,7 @@
       target_type ^= target_type.InstantiateFrom(type_args, &bound_error, NULL,
                                                  NULL, Heap::kOld);
       if (bound_error.IsNull()) {
-        target_type ^= FinalizeType(cls, target_type, kCanonicalize);
+        target_type ^= FinalizeType(cls, target_type);
       } else {
         ASSERT(target_type.IsInstantiated() && type_args.IsInstantiated());
         const Script& script = Script::Handle(target_class.script());
@@ -642,6 +642,7 @@
 void ClassFinalizer::CheckRecursiveType(const Class& cls,
                                         const AbstractType& type,
                                         PendingTypes* pending_types) {
+  ASSERT(pending_types != NULL);
   Zone* zone = Thread::Current()->zone();
   if (FLAG_trace_type_finalization) {
     THR_Print("Checking recursive type '%s': %s\n",
@@ -742,10 +743,12 @@
   }
 
   // Mark the type as being finalized in order to detect self reference and
-  // postpone bound checking until after all types in the graph of
+  // postpone bound checking (if required) until after all types in the graph of
   // mutually recursive types are finalized.
   type.SetIsBeingFinalized();
-  pending_types->Add(type);
+  if (pending_types != NULL) {
+    pending_types->Add(type);
+  }
 
   // The full type argument vector consists of the type arguments of the
   // super types of type_class, which are initialized from the parsed
@@ -1010,7 +1013,7 @@
     declared_bound = type_param.bound();
     if (!declared_bound.IsObjectType() && !declared_bound.IsDynamicType()) {
       if (!declared_bound.IsFinalized() && !declared_bound.IsBeingFinalized()) {
-        declared_bound = FinalizeType(cls, declared_bound, kCanonicalize);
+        declared_bound = FinalizeType(cls, declared_bound);
         type_param.set_bound(declared_bound);
       }
       ASSERT(declared_bound.IsFinalized() || declared_bound.IsBeingFinalized());
@@ -1046,7 +1049,7 @@
           AbstractType& bound =
               AbstractType::Handle(TypeParameter::Cast(type_arg).bound());
           if (!bound.IsFinalized() && !bound.IsBeingFinalized()) {
-            bound = FinalizeType(type_arg_cls, bound, kCanonicalize);
+            bound = FinalizeType(type_arg_cls, bound);
             TypeParameter::Cast(type_arg).set_bound(bound);
           }
         }
@@ -1198,8 +1201,9 @@
   ASSERT(type.IsType());
 
   // This type is the root type of the type graph if no pending types queue is
-  // allocated yet.
-  const bool is_root_type = (pending_types == NULL);
+  // allocated yet, and if canonicalization is required.
+  const bool is_root_type =
+      (pending_types == NULL) && (finalization >= kCanonicalize);
   if (is_root_type) {
     pending_types = new PendingTypes(zone, 4);
   }
@@ -1290,7 +1294,8 @@
 
 
 void ClassFinalizer::FinalizeSignature(const Class& cls,
-                                       const Function& function) {
+                                       const Function& function,
+                                       FinalizationKind finalization) {
   AbstractType& type = AbstractType::Handle();
   AbstractType& finalized_type = AbstractType::Handle();
   // Finalize upper bounds of function type parameters.
@@ -1302,7 +1307,7 @@
     for (intptr_t i = 0; i < num_type_params; i++) {
       type_param ^= type_params.TypeAt(i);
       type = type_param.bound();
-      finalized_type = FinalizeType(cls, type, kCanonicalize);
+      finalized_type = FinalizeType(cls, type, finalization);
       if (finalized_type.raw() != type.raw()) {
         type_param.set_bound(finalized_type);
       }
@@ -1310,7 +1315,7 @@
   }
   // Finalize result type.
   type = function.result_type();
-  finalized_type = FinalizeType(cls, type, kCanonicalize);
+  finalized_type = FinalizeType(cls, type, finalization);
   // The result type may be malformed or malbounded.
   if (finalized_type.raw() != type.raw()) {
     function.set_result_type(finalized_type);
@@ -1319,7 +1324,7 @@
   const intptr_t num_parameters = function.NumParameters();
   for (intptr_t i = 0; i < num_parameters; i++) {
     type = function.ParameterTypeAt(i);
-    finalized_type = FinalizeType(cls, type, kCanonicalize);
+    finalized_type = FinalizeType(cls, type, finalization);
     // The parameter type may be malformed or malbounded.
     if (type.raw() != finalized_type.raw()) {
       function.SetParameterTypeAt(i, finalized_type);
@@ -1451,7 +1456,7 @@
   for (intptr_t i = 0; i < num_fields; i++) {
     field ^= array.At(i);
     type = field.type();
-    type = FinalizeType(cls, type, kCanonicalize);
+    type = FinalizeType(cls, type);
     field.SetFieldType(type);
     name = field.name();
     if (field.is_static()) {
@@ -1642,7 +1647,7 @@
         // yet loaded, do not attempt to resolve.
         Type& type = Type::Handle(zone, function.RedirectionType());
         if (IsLoaded(type)) {
-          type ^= FinalizeType(cls, type, kCanonicalize);
+          type ^= FinalizeType(cls, type);
           function.SetRedirectionType(type);
         }
       }
@@ -1832,8 +1837,7 @@
           if (!param_bound.IsInstantiated()) {
             // Make sure the bound is finalized before instantiating it.
             if (!param_bound.IsFinalized() && !param_bound.IsBeingFinalized()) {
-              param_bound =
-                  FinalizeType(mixin_app_class, param_bound, kCanonicalize);
+              param_bound = FinalizeType(mixin_app_class, param_bound);
               param.set_bound(param_bound);  // In case part of recursive type.
             }
             param_bound = param_bound.InstantiateFrom(
@@ -2387,7 +2391,7 @@
   // unfinalized bounds. It is more efficient to finalize them early.
   // Finalize bounds even if running in production mode, so that a snapshot
   // contains them.
-  FinalizeUpperBounds(cls, kCanonicalizeWellFormed);
+  FinalizeUpperBounds(cls);
   // Finalize super type.
   AbstractType& super_type = AbstractType::Handle(cls.super_type());
   if (!super_type.IsNull()) {
@@ -2398,13 +2402,13 @@
     // later executed in checked mode. Note that the finalized type argument
     // vector of any type of the base class will contain a BoundedType for the
     // out of bound type argument.
-    super_type = FinalizeType(cls, super_type, kCanonicalizeWellFormed);
+    super_type = FinalizeType(cls, super_type);
     cls.set_super_type(super_type);
   }
   // Finalize mixin type.
   Type& mixin_type = Type::Handle(cls.mixin());
   if (!mixin_type.IsNull()) {
-    mixin_type ^= FinalizeType(cls, mixin_type, kCanonicalizeWellFormed);
+    mixin_type ^= FinalizeType(cls, mixin_type);
     cls.set_mixin(mixin_type);
   }
   if (cls.IsTypedefClass()) {
@@ -2427,7 +2431,7 @@
     ASSERT(signature.SignatureType() == type.raw());
 
     // Resolve and finalize the signature type of this typedef.
-    type ^= FinalizeType(cls, type, kCanonicalizeWellFormed);
+    type ^= FinalizeType(cls, type);
 
     // If a different canonical signature type is returned, update the signature
     // function of the typedef.
@@ -2448,7 +2452,7 @@
   AbstractType& seen_interf = AbstractType::Handle();
   for (intptr_t i = 0; i < interface_types.Length(); i++) {
     interface_type ^= interface_types.At(i);
-    interface_type = FinalizeType(cls, interface_type, kCanonicalizeWellFormed);
+    interface_type = FinalizeType(cls, interface_type);
     interface_types.SetAt(i, interface_type);
 
     // Check whether the interface is duplicated. We need to wait with
diff --git a/runtime/vm/class_finalizer.h b/runtime/vm/class_finalizer.h
index 86c8d87..d8150c6 100644
--- a/runtime/vm/class_finalizer.h
+++ b/runtime/vm/class_finalizer.h
@@ -22,21 +22,22 @@
     kIgnore,                 // Type is ignored and replaced by dynamic.
     kDoNotResolve,           // Type resolution is postponed.
     kResolveTypeParameters,  // Resolve type parameters only.
-    kFinalize,               // Type resolution and finalization are required.
-    kCanonicalize,           // Same as kFinalize, but with canonicalization.
-    kCanonicalizeWellFormed  // Error-free resolution, finalization, and
-                             // canonicalization are required.
+    kFinalize,               // Resolve and finalize type and type arguments.
+    kCanonicalize            // Finalize, check bounds, and canonicalize.
   };
 
   // Finalize given type while parsing class cls.
-  // Also canonicalize type if applicable.
-  static RawAbstractType* FinalizeType(const Class& cls,
-                                       const AbstractType& type,
-                                       FinalizationKind finalization,
-                                       PendingTypes* pending_types = NULL);
+  // Also canonicalize and bound check type if applicable.
+  static RawAbstractType* FinalizeType(
+      const Class& cls,
+      const AbstractType& type,
+      FinalizationKind finalization = kCanonicalize,
+      PendingTypes* pending_types = NULL);
 
   // Finalize the types in the functions's signature while parsing class cls.
-  static void FinalizeSignature(const Class& cls, const Function& function);
+  static void FinalizeSignature(const Class& cls,
+                                const Function& function,
+                                FinalizationKind finalization = kCanonicalize);
 
   // Allocate, finalize, and return a new malformed type as if it was declared
   // in class cls at the given token position.
@@ -158,8 +159,9 @@
                                       const TypeArguments& arguments,
                                       Error* bound_error);
   static void ResolveUpperBounds(const Class& cls);
-  static void FinalizeUpperBounds(const Class& cls,
-                                  FinalizationKind finalization);
+  static void FinalizeUpperBounds(
+      const Class& cls,
+      FinalizationKind finalization = kCanonicalize);
   static void ResolveSignature(const Class& cls, const Function& function);
   static void ResolveAndFinalizeMemberTypes(const Class& cls);
   static void PrintClassInformation(const Class& cls);
diff --git a/runtime/vm/cpu_arm.cc b/runtime/vm/cpu_arm.cc
index e5a1dd9..f4d72d8 100644
--- a/runtime/vm/cpu_arm.cc
+++ b/runtime/vm/cpu_arm.cc
@@ -90,12 +90,12 @@
 #endif
 
 void CPU::FlushICache(uword start, uword size) {
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
   // Precompilation never patches code so there should be no I cache flushes.
   UNREACHABLE();
 #endif
 
-#if !defined(USING_SIMULATOR) && !TARGET_OS_IOS
+#if !defined(USING_SIMULATOR) && !HOST_OS_IOS
   // Nothing to do. Flushing no instructions.
   if (size == 0) {
     return;
@@ -140,7 +140,7 @@
 
 
 #if !defined(USING_SIMULATOR)
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
 void HostCPUFeatures::InitOnce() {
   // TODO(24743): Actually check the CPU features and fail if we're missing
   // something assumed in a precompiled snapshot.
@@ -158,7 +158,7 @@
   initialized_ = true;
 #endif
 }
-#else  // TARGET_OS_IOS
+#else  // HOST_OS_IOS
 void HostCPUFeatures::InitOnce() {
   bool is_arm64 = false;
   CpuInfo::InitOnce();
@@ -238,7 +238,7 @@
   initialized_ = true;
 #endif
 }
-#endif  // TARGET_OS_IOS
+#endif  // HOST_OS_IOS
 
 void HostCPUFeatures::Cleanup() {
   DEBUG_ASSERT(initialized_);
diff --git a/runtime/vm/cpu_arm64.cc b/runtime/vm/cpu_arm64.cc
index a5e3049..10a0404 100644
--- a/runtime/vm/cpu_arm64.cc
+++ b/runtime/vm/cpu_arm64.cc
@@ -19,12 +19,12 @@
 namespace dart {
 
 void CPU::FlushICache(uword start, uword size) {
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
   // Precompilation never patches code so there should be no I cache flushes.
   UNREACHABLE();
 #endif
 
-#if !defined(USING_SIMULATOR) && !TARGET_OS_IOS
+#if !defined(USING_SIMULATOR) && !HOST_OS_IOS
   // Nothing to do. Flushing no instructions.
   if (size == 0) {
     return;
@@ -32,8 +32,8 @@
 
 // ARM recommends using the gcc intrinsic __clear_cache on Linux and Android.
 // blogs.arm.com/software-enablement/141-caches-and-self-modifying-code/
-#if defined(TARGET_OS_ANDROID) || defined(TARGET_OS_FUCHSIA) ||                \
-    defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_ANDROID) || defined(HOST_OS_FUCHSIA) ||                    \
+    defined(HOST_OS_LINUX)
   extern void __clear_cache(char*, char*);
   char* beg = reinterpret_cast<char*>(start);
   char* end = reinterpret_cast<char*>(start + size);
diff --git a/runtime/vm/cpuid.cc b/runtime/vm/cpuid.cc
index 576687e..4800c5b 100644
--- a/runtime/vm/cpuid.cc
+++ b/runtime/vm/cpuid.cc
@@ -3,12 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if !defined(TARGET_OS_MACOS)
+#if !defined(HOST_OS_MACOS)
 #include "vm/cpuid.h"
 
 #if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64)
 // GetCpuId() on Windows, __get_cpuid() on Linux
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 #include <intrin.h>  // NOLINT
 #else
 #include <cpuid.h>  // NOLINT
@@ -25,7 +25,7 @@
 #if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64)
 
 void CpuId::GetCpuId(int32_t level, uint32_t info[4]) {
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
   // The documentation for __cpuid is at:
   // http://msdn.microsoft.com/en-us/library/hskdteyh(v=vs.90).aspx
   __cpuid(reinterpret_cast<int*>(info), level);
@@ -114,4 +114,4 @@
 #endif  // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
 }  // namespace dart
 
-#endif  // !defined(TARGET_OS_MACOS)
+#endif  // !defined(HOST_OS_MACOS)
diff --git a/runtime/vm/cpuid.h b/runtime/vm/cpuid.h
index 63b317b..180394e 100644
--- a/runtime/vm/cpuid.h
+++ b/runtime/vm/cpuid.h
@@ -6,7 +6,7 @@
 #define RUNTIME_VM_CPUID_H_
 
 #include "vm/globals.h"
-#if !defined(TARGET_OS_MACOS)
+#if !defined(HOST_OS_MACOS)
 #include "vm/allocation.h"
 #include "vm/cpuinfo.h"
 
@@ -44,5 +44,5 @@
 
 }  // namespace dart
 
-#endif  // !defined(TARGET_OS_MACOS)
+#endif  // !defined(HOST_OS_MACOS)
 #endif  // RUNTIME_VM_CPUID_H_
diff --git a/runtime/vm/cpuinfo_android.cc b/runtime/vm/cpuinfo_android.cc
index 077de16..23bca81 100644
--- a/runtime/vm/cpuinfo_android.cc
+++ b/runtime/vm/cpuinfo_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "vm/cpuinfo.h"
 #include "vm/proccpuinfo.h"
@@ -68,4 +68,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/vm/cpuinfo_fuchsia.cc b/runtime/vm/cpuinfo_fuchsia.cc
index a46f842..9ddb06e 100644
--- a/runtime/vm/cpuinfo_fuchsia.cc
+++ b/runtime/vm/cpuinfo_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "vm/cpuinfo.h"
 
@@ -70,4 +70,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/vm/cpuinfo_linux.cc b/runtime/vm/cpuinfo_linux.cc
index 6f47be0..232b409 100644
--- a/runtime/vm/cpuinfo_linux.cc
+++ b/runtime/vm/cpuinfo_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "vm/cpuinfo.h"
 #include "vm/cpuid.h"
@@ -106,4 +106,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/vm/cpuinfo_macos.cc b/runtime/vm/cpuinfo_macos.cc
index f878a5b..6139f56 100644
--- a/runtime/vm/cpuinfo_macos.cc
+++ b/runtime/vm/cpuinfo_macos.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "vm/cpuinfo.h"
 
@@ -80,4 +80,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/vm/cpuinfo_win.cc b/runtime/vm/cpuinfo_win.cc
index 6f18a35..7d0820a 100644
--- a/runtime/vm/cpuinfo_win.cc
+++ b/runtime/vm/cpuinfo_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "vm/cpuinfo.h"
 #include "vm/cpuid.h"
@@ -60,4 +60,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 4cad96c..78363de 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -5532,8 +5532,7 @@
   // Construct the type object, canonicalize it and return.
   Type& instantiated_type =
       Type::Handle(Type::New(cls, type_args_obj, TokenPosition::kNoSource));
-  instantiated_type ^= ClassFinalizer::FinalizeType(
-      cls, instantiated_type, ClassFinalizer::kCanonicalize);
+  instantiated_type ^= ClassFinalizer::FinalizeType(cls, instantiated_type);
   return Api::NewHandle(T, instantiated_type.raw());
 }
 
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index be174f0..5bcf490 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -12,7 +12,7 @@
 #define USING_DBC false
 #endif
 
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 #define USING_FUCHSIA true
 #else
 #define USING_FUCHSIA false
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 3350d78..1874bf7 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -4165,8 +4165,7 @@
       Z,
       Type::New(function_class, TypeArguments::Handle(Z, TypeArguments::null()),
                 token_pos, Heap::kOld));
-  type ^= ClassFinalizer::FinalizeType(function_class, type,
-                                       ClassFinalizer::kCanonicalize);
+  type ^= ClassFinalizer::FinalizeType(function_class, type);
   Value* receiver_value = Bind(new (Z) ConstantInstr(type));
   arguments->Add(PushArgument(receiver_value));
   // String memberName.
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h
index 04240d9..7f72f41 100644
--- a/runtime/vm/globals.h
+++ b/runtime/vm/globals.h
@@ -80,7 +80,7 @@
 
 // When using GCC we can use GCC attributes to ensure that certain
 // contants are 8 or 16 byte aligned.
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 #define ALIGN8 __declspec(align(8))
 #define ALIGN16 __declspec(align(16))
 #else
@@ -98,7 +98,7 @@
 
 
 // Macros to get the contents of the fp register.
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 // clang-format off
 #if defined(HOST_ARCH_IA32)
@@ -114,7 +114,7 @@
 #error Unknown host architecture.
 #endif
 
-#else  // !defined(TARGET_OS_WINDOWS))
+#else  // !defined(HOST_OS_WINDOWS))
 
 // Assume GCC-like inline syntax is valid.
 #if defined(HOST_ARCH_IA32)
@@ -122,7 +122,7 @@
 #elif defined(HOST_ARCH_X64)
 #define COPY_FP_REGISTER(fp) asm volatile("movq %%rbp, %0" : "=r"(fp));
 #elif defined(HOST_ARCH_ARM)
-#if defined(TARGET_OS_MAC)
+#if defined(HOST_OS_MAC)
 #define COPY_FP_REGISTER(fp) asm volatile("mov %0, r7" : "=r"(fp));
 #else
 #define COPY_FP_REGISTER(fp) asm volatile("mov %0, r11" : "=r"(fp));
@@ -135,7 +135,7 @@
 #error Unknown host architecture.
 #endif
 
-#endif  // !defined(TARGET_OS_WINDOWS))
+#endif  // !defined(HOST_OS_WINDOWS))
 
 }  // namespace dart
 
diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
index 7c3ea87..41eb3d6 100644
--- a/runtime/vm/kernel_to_il.cc
+++ b/runtime/vm/kernel_to_il.cc
@@ -1285,8 +1285,7 @@
   type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()),
                    klass.token_pos());
   if (klass.is_type_finalized()) {
-    type ^= ClassFinalizer::FinalizeType(
-        klass, type, ClassFinalizer::kCanonicalizeWellFormed);
+    type ^= ClassFinalizer::FinalizeType(klass, type);
     // Note that the receiver type may now be a malbounded type.
     klass.SetCanonicalType(type);
   }
@@ -4371,8 +4370,8 @@
       Type::ZoneHandle(Z, signature_function.SignatureType());
 
   if (finalize_) {
-    signature_type ^= ClassFinalizer::FinalizeType(
-        *active_class_->klass, signature_type, ClassFinalizer::kCanonicalize);
+    signature_type ^=
+        ClassFinalizer::FinalizeType(*active_class_->klass, signature_type);
     // Do not refer to signature_function anymore, since it may have been
     // replaced during canonicalization.
     signature_function = Function::null();
@@ -4473,8 +4472,7 @@
   result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource);
   if (finalize_) {
     ASSERT(active_class_->klass != NULL);
-    result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_,
-                                           ClassFinalizer::kCanonicalize);
+    result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_);
   }
 }
 
@@ -4532,8 +4530,7 @@
   Type& type = Type::Handle(
       Z, Type::New(receiver_class, type_arguments, TokenPosition::kNoSource));
   if (finalize_) {
-    type ^= ClassFinalizer::FinalizeType(
-        *active_class_->klass, type, ClassFinalizer::kCanonicalizeWellFormed);
+    type ^= ClassFinalizer::FinalizeType(*active_class_->klass, type);
   }
 
   const TypeArguments& instantiated_type_arguments =
@@ -4554,8 +4551,7 @@
   type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()),
                    klass.token_pos());
   if (klass.is_type_finalized()) {
-    type ^= ClassFinalizer::FinalizeType(
-        klass, type, ClassFinalizer::kCanonicalizeWellFormed);
+    type ^= ClassFinalizer::FinalizeType(klass, type);
     klass.SetCanonicalType(type);
   }
   return type;
@@ -4924,8 +4920,7 @@
 
     AbstractType& type = AbstractType::Handle(
         Z, Type::New(klass, type_arguments, TokenPosition::kNoSource));
-    type = ClassFinalizer::FinalizeType(klass, type,
-                                        ClassFinalizer::kCanonicalize);
+    type = ClassFinalizer::FinalizeType(klass, type);
 
     if (type.IsMalbounded()) {
       // Evaluate expressions for correctness.
@@ -6300,8 +6295,8 @@
                                             true);  // is_closure
       // Finalize function type.
       Type& signature_type = Type::Handle(Z, function.SignatureType());
-      signature_type ^= ClassFinalizer::FinalizeType(
-          *active_class_.klass, signature_type, ClassFinalizer::kCanonicalize);
+      signature_type ^=
+          ClassFinalizer::FinalizeType(*active_class_.klass, signature_type);
       function.SetSignatureType(signature_type);
 
       I->AddClosureFunction(function);
diff --git a/runtime/vm/malloc_hooks.cc b/runtime/vm/malloc_hooks.cc
index d838457..e3cbdd1 100644
--- a/runtime/vm/malloc_hooks.cc
+++ b/runtime/vm/malloc_hooks.cc
@@ -5,7 +5,7 @@
 #include "platform/globals.h"
 
 #if defined(DART_USE_TCMALLOC) && !defined(PRODUCT) &&                         \
-    !defined(TARGET_ARCH_DBC) && !defined(TARGET_OS_FUCHSIA)
+    !defined(TARGET_ARCH_DBC) && !defined(HOST_OS_FUCHSIA)
 
 #include "vm/malloc_hooks.h"
 
@@ -444,4 +444,4 @@
 }  // namespace dart
 
 #endif  // defined(DART_USE_TCMALLOC) && !defined(PRODUCT) &&
-        // !defined(TARGET_ARCH_DBC) && !defined(TARGET_OS_FUCHSIA)
+        // !defined(TARGET_ARCH_DBC) && !defined(HOST_OS_FUCHSIA)
diff --git a/runtime/vm/malloc_hooks_test.cc b/runtime/vm/malloc_hooks_test.cc
index 26a5647..834a340 100644
--- a/runtime/vm/malloc_hooks_test.cc
+++ b/runtime/vm/malloc_hooks_test.cc
@@ -5,7 +5,7 @@
 #include "platform/globals.h"
 
 #if defined(DART_USE_TCMALLOC) && !defined(PRODUCT) &&                         \
-    !defined(TARGET_ARCH_DBC) && !defined(TARGET_OS_FUCHSIA)
+    !defined(TARGET_ARCH_DBC) && !defined(HOST_OS_FUCHSIA)
 
 #include "platform/assert.h"
 #include "vm/globals.h"
diff --git a/runtime/vm/malloc_hooks_unsupported.cc b/runtime/vm/malloc_hooks_unsupported.cc
index 1f8b75a..eccd953 100644
--- a/runtime/vm/malloc_hooks_unsupported.cc
+++ b/runtime/vm/malloc_hooks_unsupported.cc
@@ -5,7 +5,7 @@
 #include "platform/globals.h"
 
 #if !defined(DART_USE_TCMALLOC) || defined(PRODUCT) ||                         \
-    defined(TARGET_ARCH_DBC) || defined(TARGET_OS_FUCHSIA)
+    defined(TARGET_ARCH_DBC) || defined(HOST_OS_FUCHSIA)
 
 #include "vm/malloc_hooks.h"
 
@@ -63,4 +63,4 @@
 }  // namespace dart
 
 #endif  // !defined(DART_USE_TCMALLOC) || defined(PRODUCT) ||
-        // defined(TARGET_ARCH_DBC) || defined(TARGET_OS_FUCHSIA)
+        // defined(TARGET_ARCH_DBC) || defined(HOST_OS_FUCHSIA)
diff --git a/runtime/vm/native_arguments.h b/runtime/vm/native_arguments.h
index b54499c..c63e2c6 100644
--- a/runtime/vm/native_arguments.h
+++ b/runtime/vm/native_arguments.h
@@ -33,7 +33,7 @@
     uword current_sp = Simulator::Current()->get_register(SPREG);              \
     ASSERT(Utils::IsAligned(current_sp, OS::ActivationFrameAlignment()));      \
   }
-#elif defined(TARGET_OS_WINDOWS)
+#elif defined(HOST_OS_WINDOWS)
 // The compiler may dynamically align the stack on Windows, so do not check.
 #define CHECK_STACK_ALIGNMENT                                                  \
   {}
diff --git a/runtime/vm/native_symbol_android.cc b/runtime/vm/native_symbol_android.cc
index 8cb3b67..b178019 100644
--- a/runtime/vm/native_symbol_android.cc
+++ b/runtime/vm/native_symbol_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "vm/native_symbol.h"
 
@@ -40,4 +40,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/vm/native_symbol_fuchsia.cc b/runtime/vm/native_symbol_fuchsia.cc
index 528d4e5..3123c0e 100644
--- a/runtime/vm/native_symbol_fuchsia.cc
+++ b/runtime/vm/native_symbol_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "platform/memory_sanitizer.h"
 #include "vm/native_symbol.h"
@@ -48,4 +48,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/vm/native_symbol_linux.cc b/runtime/vm/native_symbol_linux.cc
index 9556ddb..d5df815 100644
--- a/runtime/vm/native_symbol_linux.cc
+++ b/runtime/vm/native_symbol_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "platform/memory_sanitizer.h"
 #include "vm/native_symbol.h"
@@ -49,4 +49,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/vm/native_symbol_macos.cc b/runtime/vm/native_symbol_macos.cc
index 6ca35cd..1411f3f 100644
--- a/runtime/vm/native_symbol_macos.cc
+++ b/runtime/vm/native_symbol_macos.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "vm/native_symbol.h"
 
@@ -46,4 +46,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/vm/native_symbol_win.cc b/runtime/vm/native_symbol_win.cc
index 09e5116..cc5dabd 100644
--- a/runtime/vm/native_symbol_win.cc
+++ b/runtime/vm/native_symbol_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "vm/lockers.h"
 #include "vm/native_symbol.h"
@@ -84,4 +84,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 6e3b4e9..0214fd9 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -1996,8 +1996,7 @@
 RawAbstractType* Class::RareType() const {
   const Type& type = Type::Handle(Type::New(
       *this, Object::null_type_arguments(), TokenPosition::kNoSource));
-  return ClassFinalizer::FinalizeType(*this, type,
-                                      ClassFinalizer::kCanonicalize);
+  return ClassFinalizer::FinalizeType(*this, type);
 }
 
 
@@ -2005,8 +2004,7 @@
   const TypeArguments& args = TypeArguments::Handle(type_parameters());
   const Type& type =
       Type::Handle(Type::New(*this, args, TokenPosition::kNoSource));
-  return ClassFinalizer::FinalizeType(*this, type,
-                                      ClassFinalizer::kCanonicalize);
+  return ClassFinalizer::FinalizeType(*this, type);
 }
 
 
@@ -3834,17 +3832,9 @@
     }
     if (other.IsDartFunctionClass()) {
       // Check if type S has a call() method.
-      Function& function = Function::Handle(
-          zone, thsi.LookupDynamicFunctionAllowAbstract(Symbols::Call()));
-      if (function.IsNull()) {
-        // Walk up the super_class chain.
-        Class& cls = Class::Handle(zone, thsi.SuperClass());
-        while (!cls.IsNull() && function.IsNull()) {
-          function = cls.LookupDynamicFunctionAllowAbstract(Symbols::Call());
-          cls = cls.SuperClass();
-        }
-      }
-      if (!function.IsNull()) {
+      const Function& call_function =
+          Function::Handle(zone, thsi.LookupCallFunctionForTypeTest());
+      if (!call_function.IsNull()) {
         return true;
       }
     }
@@ -3866,8 +3856,7 @@
           // runtime if this type test returns false at compile time.
           continue;
         }
-        ClassFinalizer::FinalizeType(thsi, interface,
-                                     ClassFinalizer::kCanonicalize);
+        ClassFinalizer::FinalizeType(thsi, interface);
         interfaces.SetAt(i, interface);
       }
       if (interface.IsMalbounded()) {
@@ -4002,6 +3991,32 @@
 }
 
 
+RawFunction* Class::LookupCallFunctionForTypeTest() const {
+  // If this class is not compiled yet, it is too early to lookup a call
+  // function. This case should only occur during bounds checking at compile
+  // time. Return null as if the call method did not exist, so the type test
+  // may return false, but without a bound error, and the bound check will get
+  // postponed to runtime.
+  if (!is_finalized()) {
+    return Function::null();
+  }
+  Zone* zone = Thread::Current()->zone();
+  Class& cls = Class::Handle(zone, raw());
+  Function& call_function = Function::Handle(zone);
+  do {
+    ASSERT(cls.is_finalized());
+    call_function = cls.LookupDynamicFunctionAllowAbstract(Symbols::Call());
+    cls = cls.SuperClass();
+  } while (call_function.IsNull() && !cls.IsNull());
+  if (!call_function.IsNull()) {
+    // Make sure the signature is finalized before using it in a type test.
+    ClassFinalizer::FinalizeSignature(
+        cls, call_function, ClassFinalizer::kFinalize);  // No bounds checking.
+  }
+  return call_function.raw();
+}
+
+
 // Returns true if 'prefix' and 'accessor_name' match 'name'.
 static bool MatchesAccessorName(const String& name,
                                 const char* prefix,
@@ -6797,8 +6812,7 @@
 
   const Type& signature_type = Type::Handle(closure_function.SignatureType());
   if (!signature_type.IsFinalized()) {
-    ClassFinalizer::FinalizeType(Class::Handle(Owner()), signature_type,
-                                 ClassFinalizer::kCanonicalize);
+    ClassFinalizer::FinalizeType(Class::Handle(Owner()), signature_type);
   }
   set_implicit_closure_function(closure_function);
   ASSERT(closure_function.IsImplicitClosureFunction());
@@ -15762,24 +15776,17 @@
   const bool other_is_dart_function = instantiated_other.IsDartFunctionType();
   if (other_is_dart_function || instantiated_other.IsFunctionType()) {
     // Check if this instance understands a call() method of a compatible type.
-    Function& call = Function::Handle(
-        zone, cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()));
-    if (call.IsNull()) {
-      // Walk up the super_class chain.
-      Class& super_cls = Class::Handle(zone, cls.SuperClass());
-      while (!super_cls.IsNull() && call.IsNull()) {
-        call = super_cls.LookupDynamicFunctionAllowAbstract(Symbols::Call());
-        super_cls = super_cls.SuperClass();
-      }
-    }
-    if (!call.IsNull()) {
+    const Function& call_function =
+        Function::Handle(zone, cls.LookupCallFunctionForTypeTest());
+    if (!call_function.IsNull()) {
       if (other_is_dart_function) {
         return true;
       }
       const Function& other_signature =
           Function::Handle(zone, Type::Cast(instantiated_other).signature());
-      if (call.IsSubtypeOf(type_arguments, other_signature,
-                           other_type_arguments, bound_error, Heap::kOld)) {
+      if (call_function.IsSubtypeOf(type_arguments, other_signature,
+                                    other_type_arguments, bound_error,
+                                    Heap::kOld)) {
         return true;
       }
     }
@@ -16581,19 +16588,11 @@
           TypeArguments::Handle(zone, other.arguments()), bound_error, space);
     }
     // Check if type S has a call() method of function type T.
-    Function& function = Function::Handle(
-        zone, type_cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()));
-    if (function.IsNull()) {
-      // Walk up the super_class chain.
-      Class& cls = Class::Handle(zone, type_cls.SuperClass());
-      while (!cls.IsNull() && function.IsNull()) {
-        function = cls.LookupDynamicFunctionAllowAbstract(Symbols::Call());
-        cls = cls.SuperClass();
-      }
-    }
-    if (!function.IsNull()) {
+    const Function& call_function =
+        Function::Handle(zone, type_cls.LookupCallFunctionForTypeTest());
+    if (!call_function.IsNull()) {
       if (other_is_dart_function_type ||
-          function.TypeTest(
+          call_function.TypeTest(
               test_kind, TypeArguments::Handle(zone, arguments()),
               Function::Handle(zone, Type::Cast(other).signature()),
               TypeArguments::Handle(zone, other.arguments()), bound_error,
@@ -16884,7 +16883,8 @@
     const Class& cls = Class::Handle(type_class());
     len = cls.NumTypeParameters();  // Check the type parameters only.
   }
-  return (len == 0) || args.IsSubvectorInstantiated(num_type_args - len, len);
+  return (len == 0) ||
+         args.IsSubvectorInstantiated(num_type_args - len, len, trail);
 }
 
 
@@ -17864,6 +17864,15 @@
     // Report the bound error only if both the bounded type and the upper bound
     // are instantiated. Otherwise, we cannot tell yet it is a bound error.
     if (bounded_type.IsInstantiated() && upper_bound.IsInstantiated()) {
+      // There is another special case where we do not want to report a bound
+      // error yet: if the upper bound is a function type, but the bounded type
+      // is not and its class is not compiled yet, i.e. we cannot look for
+      // a call method yet.
+      if (!bounded_type.IsFunctionType() && upper_bound.IsFunctionType() &&
+          bounded_type.HasResolvedTypeClass() &&
+          !Class::Handle(bounded_type.type_class()).is_finalized()) {
+        return false;  // Not a subtype yet, but no bound error yet.
+      }
       const String& bounded_type_name =
           String::Handle(bounded_type.UserVisibleName());
       const String& upper_bound_name =
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index b587568..9e1d503 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1162,6 +1162,7 @@
   RawFunction* LookupFunctionAllowPrivate(const String& name) const;
   RawFunction* LookupGetterFunction(const String& name) const;
   RawFunction* LookupSetterFunction(const String& name) const;
+  RawFunction* LookupCallFunctionForTypeTest() const;
   RawField* LookupInstanceField(const String& name) const;
   RawField* LookupStaticField(const String& name) const;
   RawField* LookupField(const String& name) const;
@@ -6216,7 +6217,7 @@
     // uninstantiated upper bound. Therefore, we do not need to check if the
     // bound is instantiated. Moreover, doing so could lead into cycles, as in
     // class C<T extends C<C>> { }.
-    return AbstractType::Handle(type()).IsInstantiated();
+    return AbstractType::Handle(type()).IsInstantiated(trail);
   }
   virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
   virtual bool IsRecursive() const;
diff --git a/runtime/vm/os_android.cc b/runtime/vm/os_android.cc
index f3673ee..4f3b784 100644
--- a/runtime/vm/os_android.cc
+++ b/runtime/vm/os_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "vm/os.h"
 
@@ -450,4 +450,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index 1a96aaa3..209c825 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "vm/os.h"
 
@@ -317,4 +317,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index e73996b..6db9488 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "vm/os.h"
 
@@ -428,4 +428,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/vm/os_macos.cc b/runtime/vm/os_macos.cc
index efeb76c..a4db521 100644
--- a/runtime/vm/os_macos.cc
+++ b/runtime/vm/os_macos.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "vm/os.h"
 
@@ -15,7 +15,7 @@
 #include <sys/time.h>        // NOLINT
 #include <sys/resource.h>    // NOLINT
 #include <unistd.h>          // NOLINT
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
 #include <sys/sysctl.h>  // NOLINT
 #include <syslog.h>      // NOLINT
 #endif
@@ -27,7 +27,7 @@
 namespace dart {
 
 const char* OS::Name() {
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
   return "ios";
 #else
   return "macos";
@@ -90,13 +90,13 @@
 }
 
 
-#if !TARGET_OS_IOS
+#if !HOST_OS_IOS
 static mach_timebase_info_data_t timebase_info;
 #endif
 
 
 int64_t OS::GetCurrentMonotonicTicks() {
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
   // On iOS mach_absolute_time stops while the device is sleeping. Instead use
   // now - KERN_BOOTTIME to get a time difference that is not impacted by clock
   // changes. KERN_BOOTTIME will be updated by the system whenever the system
@@ -121,27 +121,27 @@
   result *= timebase_info.numer;
   result /= timebase_info.denom;
   return result;
-#endif  // TARGET_OS_IOS
+#endif  // HOST_OS_IOS
 }
 
 
 int64_t OS::GetCurrentMonotonicFrequency() {
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
   return kMicrosecondsPerSecond;
 #else
   return kNanosecondsPerSecond;
-#endif  // TARGET_OS_IOS
+#endif  // HOST_OS_IOS
 }
 
 
 int64_t OS::GetCurrentMonotonicMicros() {
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
   ASSERT(GetCurrentMonotonicFrequency() == kMicrosecondsPerSecond);
   return GetCurrentMonotonicTicks();
 #else
   ASSERT(GetCurrentMonotonicFrequency() == kNanosecondsPerSecond);
   return GetCurrentMonotonicTicks() / kNanosecondsPerMicrosecond;
-#endif  // TARGET_OS_IOS
+#endif  // HOST_OS_IOS
 }
 
 
@@ -167,7 +167,7 @@
 
 
 intptr_t OS::ActivationFrameAlignment() {
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
 #if TARGET_ARCH_ARM
   // Even if we generate code that maintains a stronger alignment, we cannot
   // assert the stronger stack alignment because C++ code will not maintain it.
@@ -183,11 +183,11 @@
 #else
 #error Unimplemented
 #endif
-#else   // TARGET_OS_IOS
+#else   // HOST_OS_IOS
   // OS X activation frames must be 16 byte-aligned; see "Mac OS X ABI
   // Function Call Guide".
   return 16;
-#endif  // TARGET_OS_IOS
+#endif  // HOST_OS_IOS
 }
 
 
@@ -314,7 +314,7 @@
 
 
 void OS::Print(const char* format, ...) {
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
   va_list args;
   va_start(args, format);
   vsyslog(LOG_INFO, format, args);
@@ -407,7 +407,7 @@
 
 
 void OS::PrintErr(const char* format, ...) {
-#if TARGET_OS_IOS
+#if HOST_OS_IOS
   va_list args;
   va_start(args, format);
   vsyslog(LOG_ERR, format, args);
@@ -445,4 +445,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/vm/os_thread.h b/runtime/vm/os_thread.h
index 3130b25..567a892 100644
--- a/runtime/vm/os_thread.h
+++ b/runtime/vm/os_thread.h
@@ -10,15 +10,15 @@
 #include "vm/globals.h"
 
 // Declare the OS-specific types ahead of defining the generic classes.
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 #include "vm/os_thread_android.h"
-#elif defined(TARGET_OS_FUCHSIA)
+#elif defined(HOST_OS_FUCHSIA)
 #include "vm/os_thread_fuchsia.h"
-#elif defined(TARGET_OS_LINUX)
+#elif defined(HOST_OS_LINUX)
 #include "vm/os_thread_linux.h"
-#elif defined(TARGET_OS_MACOS)
+#elif defined(HOST_OS_MACOS)
 #include "vm/os_thread_macos.h"
-#elif defined(TARGET_OS_WINDOWS)
+#elif defined(HOST_OS_WINDOWS)
 #include "vm/os_thread_win.h"
 #else
 #error Unknown target os.
diff --git a/runtime/vm/os_thread_android.cc b/runtime/vm/os_thread_android.cc
index 3ad2a89..36f910b 100644
--- a/runtime/vm/os_thread_android.cc
+++ b/runtime/vm/os_thread_android.cc
@@ -5,7 +5,7 @@
 #include "platform/globals.h"  // NOLINT
 
 
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "vm/os_thread.h"
 
@@ -472,4 +472,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/vm/os_thread_fuchsia.cc b/runtime/vm/os_thread_fuchsia.cc
index 0426532..20db34d 100644
--- a/runtime/vm/os_thread_fuchsia.cc
+++ b/runtime/vm/os_thread_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"  // NOLINT
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "vm/os_thread.h"
 #include "vm/os_thread_fuchsia.h"
@@ -430,4 +430,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/vm/os_thread_linux.cc b/runtime/vm/os_thread_linux.cc
index 11ce109..60e3322 100644
--- a/runtime/vm/os_thread_linux.cc
+++ b/runtime/vm/os_thread_linux.cc
@@ -4,7 +4,7 @@
 
 #include "platform/globals.h"  // NOLINT
 
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "vm/os_thread.h"
 
@@ -476,4 +476,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/vm/os_thread_macos.cc b/runtime/vm/os_thread_macos.cc
index bc33dc1d..67b1851 100644
--- a/runtime/vm/os_thread_macos.cc
+++ b/runtime/vm/os_thread_macos.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"  // NOLINT
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "vm/os_thread.h"
 
@@ -436,4 +436,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/vm/os_thread_win.cc b/runtime/vm/os_thread_win.cc
index 7d80d4d..1c15835 100644
--- a/runtime/vm/os_thread_win.cc
+++ b/runtime/vm/os_thread_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"  // NOLINT
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "vm/growable_array.h"
 #include "vm/lockers.h"
@@ -700,4 +700,4 @@
 #endif  // _WIN64
 }  // extern "C"
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/vm/os_win.cc b/runtime/vm/os_win.cc
index 0c5bb0e..ae36735 100644
--- a/runtime/vm/os_win.cc
+++ b/runtime/vm/os_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "vm/os.h"
 
@@ -456,4 +456,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 210e9a6..a1b5c73 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -12503,11 +12503,9 @@
   // use the class scope of the class from which the function originates.
   if (current_class().IsMixinApplication()) {
     return ClassFinalizer::FinalizeType(
-        Class::Handle(Z, parsed_function()->function().origin()), type,
-        ClassFinalizer::kCanonicalize);
+        Class::Handle(Z, parsed_function()->function().origin()), type);
   }
-  return ClassFinalizer::FinalizeType(current_class(), type,
-                                      ClassFinalizer::kCanonicalize);
+  return ClassFinalizer::FinalizeType(current_class(), type);
 }
 
 
@@ -12556,8 +12554,7 @@
   type = Type::New(cls, TypeArguments::Handle(Z, cls.type_parameters()),
                    cls.token_pos(), Heap::kOld);
   if (cls.is_type_finalized()) {
-    type ^= ClassFinalizer::FinalizeType(
-        cls, type, ClassFinalizer::kCanonicalizeWellFormed);
+    type ^= ClassFinalizer::FinalizeType(cls, type);
     // Note that the receiver type may now be a malbounded type.
     cls.SetCanonicalType(type);
   }
@@ -13955,7 +13952,7 @@
       (la3 == Token::kLT) || (la3 == Token::kPERIOD) || (la3 == Token::kHASH);
   LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(Z);
   AbstractType& type =
-      AbstractType::Handle(Z, ParseType(ClassFinalizer::kCanonicalizeWellFormed,
+      AbstractType::Handle(Z, ParseType(ClassFinalizer::kCanonicalize,
                                         true,  // allow deferred type
                                         consume_unresolved_prefix, &prefix));
   // A constructor tear-off closure can only have been created for a
@@ -14018,7 +14015,7 @@
 
   LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(Z);
   AbstractType& type = AbstractType::ZoneHandle(
-      Z, ParseType(ClassFinalizer::kCanonicalizeWellFormed, allow_deferred_type,
+      Z, ParseType(ClassFinalizer::kCanonicalize, allow_deferred_type,
                    consume_unresolved_prefix, &prefix));
 
   if (FLAG_load_deferred_eagerly && !prefix.IsNull() &&
diff --git a/runtime/vm/proccpuinfo.cc b/runtime/vm/proccpuinfo.cc
index dd8416f..5bb402d 100644
--- a/runtime/vm/proccpuinfo.cc
+++ b/runtime/vm/proccpuinfo.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_LINUX) || defined(HOST_OS_ANDROID)
 
 #include "vm/proccpuinfo.h"
 
@@ -153,4 +153,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_LINUX) || defined(HOST_OS_ANDROID)
diff --git a/runtime/vm/proccpuinfo.h b/runtime/vm/proccpuinfo.h
index e81d7ee..ee57e2c 100644
--- a/runtime/vm/proccpuinfo.h
+++ b/runtime/vm/proccpuinfo.h
@@ -6,7 +6,7 @@
 #define RUNTIME_VM_PROCCPUINFO_H_
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_LINUX) || defined(HOST_OS_ANDROID)
 
 #include "vm/allocation.h"
 
@@ -29,6 +29,6 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_LINUX) || defined(HOST_OS_ANDROID)
 
 #endif  // RUNTIME_VM_PROCCPUINFO_H_
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 7110d08..ca72be7 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -31,7 +31,7 @@
 
 DEFINE_FLAG(bool, trace_profiled_isolates, false, "Trace profiled isolates.");
 
-#if defined(TARGET_OS_ANDROID) || defined(TARGET_ARCH_ARM64) ||                \
+#if defined(HOST_OS_ANDROID) || defined(TARGET_ARCH_ARM64) ||                  \
     defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
 DEFINE_FLAG(int,
             profile_period,
@@ -734,7 +734,7 @@
 }
 
 
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 // On Windows this code is synchronously executed from the thread interrupter
 // thread. This means we can safely have a static fault_address.
 static uword fault_address = 0;
@@ -763,7 +763,7 @@
                           uword sp,
                           ProfilerCounters* counters) {
   ASSERT(counters != NULL);
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
   // Use structured exception handling to trap guard page access on Windows.
   __try {
 #endif
@@ -791,7 +791,7 @@
       sample->SetAt(0, pc);
     }
 
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
     // Use structured exception handling to trap guard page access.
   } __except (GuardPageExceptionFilter(GetExceptionInformation())) {  // NOLINT
     // Sample collection triggered a guard page fault:
@@ -961,7 +961,7 @@
 
 
 void Profiler::DumpStackTrace(void* context) {
-#if defined(TARGET_OS_LINUX) || defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS)
   ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context);
   mcontext_t mcontext = ucontext->uc_mcontext;
   uword pc = SignalHandler::GetProgramCounter(mcontext);
diff --git a/runtime/vm/signal_handler.h b/runtime/vm/signal_handler.h
index 734db06..ff02a97 100644
--- a/runtime/vm/signal_handler.h
+++ b/runtime/vm/signal_handler.h
@@ -8,10 +8,10 @@
 #include "vm/allocation.h"
 #include "vm/globals.h"
 
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 #include <signal.h>    // NOLINT
 #include <ucontext.h>  // NOLINT
-#elif defined(TARGET_OS_ANDROID)
+#elif defined(HOST_OS_ANDROID)
 #include <signal.h>  // NOLINT
 #if !defined(__BIONIC_HAVE_UCONTEXT_T)
 #include <asm/sigcontext.h>  // NOLINT
@@ -25,15 +25,15 @@
   uint32_t uc_sigmask;
 } ucontext_t;
 #endif                       // !defined(__BIONIC_HAVE_UCONTEXT_T)
-#elif defined(TARGET_OS_MACOS)
+#elif defined(HOST_OS_MACOS)
 #include <signal.h>        // NOLINT
 #include <sys/ucontext.h>  // NOLINT
-#elif defined(TARGET_OS_WINDOWS)
+#elif defined(HOST_OS_WINDOWS)
 // Stub out for windows.
 struct siginfo_t;
 struct mcontext_t;
 struct sigset_t {};
-#elif defined(TARGET_OS_FUCHSIA)
+#elif defined(HOST_OS_FUCHSIA)
 #include <signal.h>    // NOLINT
 #include <ucontext.h>  // NOLINT
 #endif
@@ -43,7 +43,7 @@
 // work around incorrect Thumb -> ARM transitions. See SignalHandlerTrampoline
 // below for more details.
 #if defined(HOST_ARCH_ARM) &&                                                  \
-    (defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)) &&                \
+    (defined(HOST_OS_LINUX) || defined(HOST_OS_ANDROID)) &&                    \
     !defined(__thumb__)
 #define USE_SIGNAL_HANDLER_TRAMPOLINE
 #endif
diff --git a/runtime/vm/signal_handler_android.cc b/runtime/vm/signal_handler_android.cc
index 8812c63..6482242 100644
--- a/runtime/vm/signal_handler_android.cc
+++ b/runtime/vm/signal_handler_android.cc
@@ -6,7 +6,7 @@
 #include "vm/instructions.h"
 #include "vm/simulator.h"
 #include "vm/signal_handler.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 namespace dart {
 
@@ -117,4 +117,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/vm/signal_handler_fuchsia.cc b/runtime/vm/signal_handler_fuchsia.cc
index 1b704eb..e64dc4f 100644
--- a/runtime/vm/signal_handler_fuchsia.cc
+++ b/runtime/vm/signal_handler_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "vm/signal_handler.h"
 
@@ -52,4 +52,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/vm/signal_handler_linux.cc b/runtime/vm/signal_handler_linux.cc
index b867c00..bbd5522 100644
--- a/runtime/vm/signal_handler_linux.cc
+++ b/runtime/vm/signal_handler_linux.cc
@@ -6,7 +6,7 @@
 #include "vm/instructions.h"
 #include "vm/simulator.h"
 #include "vm/signal_handler.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 namespace dart {
 
@@ -125,4 +125,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/vm/signal_handler_macos.cc b/runtime/vm/signal_handler_macos.cc
index 36643c2..addabb9 100644
--- a/runtime/vm/signal_handler_macos.cc
+++ b/runtime/vm/signal_handler_macos.cc
@@ -6,7 +6,7 @@
 #include "vm/instructions.h"
 #include "vm/simulator.h"
 #include "vm/signal_handler.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 namespace dart {
 
@@ -120,4 +120,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/vm/signal_handler_win.cc b/runtime/vm/signal_handler_win.cc
index bb6b92d..633c49e 100644
--- a/runtime/vm/signal_handler_win.cc
+++ b/runtime/vm/signal_handler_win.cc
@@ -4,7 +4,7 @@
 
 #include "vm/globals.h"
 #include "vm/signal_handler.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 namespace dart {
 
@@ -50,4 +50,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 3c0c99b..7df213e 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -2657,7 +2657,7 @@
     // Format(instr, "smulh 'rd, 'rn, 'rm");
     const int64_t rn_val = get_register(rn, R31IsZR);
     const int64_t rm_val = get_register(rm, R31IsZR);
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
     // Visual Studio does not support __int128.
     int64_t alu_out;
     Multiply128(rn_val, rm_val, &alu_out);
@@ -2665,14 +2665,14 @@
     const __int128 res =
         static_cast<__int128>(rn_val) * static_cast<__int128>(rm_val);
     const int64_t alu_out = static_cast<int64_t>(res >> 64);
-#endif  // TARGET_OS_WINDOWS
+#endif  // HOST_OS_WINDOWS
     set_register(instr, rd, alu_out, R31IsZR);
   } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(21, 3) == 6) &&
              (instr->Bit(15) == 0)) {
     // Format(instr, "umulh 'rd, 'rn, 'rm");
     const uint64_t rn_val = get_register(rn, R31IsZR);
     const uint64_t rm_val = get_register(rm, R31IsZR);
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
     // Visual Studio does not support __int128.
     uint64_t alu_out;
     UnsignedMultiply128(rn_val, rm_val, &alu_out);
@@ -2680,7 +2680,7 @@
     const unsigned __int128 res = static_cast<unsigned __int128>(rn_val) *
                                   static_cast<unsigned __int128>(rm_val);
     const uint64_t alu_out = static_cast<uint64_t>(res >> 64);
-#endif  // TARGET_OS_WINDOWS
+#endif  // HOST_OS_WINDOWS
     set_register(instr, rd, alu_out, R31IsZR);
   } else if ((instr->Bits(29, 3) == 4) && (instr->Bits(21, 3) == 5) &&
              (instr->Bit(15) == 0)) {
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 5eddb35..738461e 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -872,9 +872,9 @@
   }
 
 
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
   assembly_stream_.Print(".section .rodata\n");
-#elif defined(TARGET_OS_MACOS)
+#elif defined(HOST_OS_MACOS)
   assembly_stream_.Print(".const\n");
 #else
   // Unsupported platform.
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 6806d99..a1fd87e 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -22,7 +22,7 @@
 
 bool StackFrame::IsStubFrame() const {
   ASSERT(!(IsEntryFrame() || IsExitFrame()));
-#if !defined(TARGET_OS_WINDOWS)
+#if !defined(HOST_OS_WINDOWS)
   // On Windows, the profiler calls this from a separate thread where
   // Thread::Current() is NULL, so we cannot create a NoSafepointScope.
   NoSafepointScope no_safepoint;
@@ -223,7 +223,7 @@
 // We add a no gc scope to ensure that the code below does not trigger
 // a GC as we are handling raw object references here. It is possible
 // that the code is called while a GC is in progress, that is ok.
-#if !defined(TARGET_OS_WINDOWS)
+#if !defined(HOST_OS_WINDOWS)
   // On Windows, the profiler calls this from a separate thread where
   // Thread::Current() is NULL, so we cannot create a NoSafepointScope.
   NoSafepointScope no_safepoint;
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index fe245a6..6aef77b 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -807,7 +807,7 @@
 };
 
 
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 // Clears the state of the current thread and frees the allocation.
 void WindowsThreadCleanUp();
 #endif
diff --git a/runtime/vm/thread_interrupter_android.cc b/runtime/vm/thread_interrupter_android.cc
index af066c3..e4c3817 100644
--- a/runtime/vm/thread_interrupter_android.cc
+++ b/runtime/vm/thread_interrupter_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include <sys/syscall.h>  // NOLINT
 #include <errno.h>        // NOLINT
@@ -76,4 +76,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/vm/thread_interrupter_fuchsia.cc b/runtime/vm/thread_interrupter_fuchsia.cc
index 23fb826..9f2507b 100644
--- a/runtime/vm/thread_interrupter_fuchsia.cc
+++ b/runtime/vm/thread_interrupter_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "vm/thread_interrupter.h"
 
@@ -31,4 +31,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/vm/thread_interrupter_linux.cc b/runtime/vm/thread_interrupter_linux.cc
index 6c4fdb2..399861b 100644
--- a/runtime/vm/thread_interrupter_linux.cc
+++ b/runtime/vm/thread_interrupter_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include <errno.h>  // NOLINT
 
@@ -72,4 +72,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/vm/thread_interrupter_macos.cc b/runtime/vm/thread_interrupter_macos.cc
index e37580d..746c1a2 100644
--- a/runtime/vm/thread_interrupter_macos.cc
+++ b/runtime/vm/thread_interrupter_macos.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include <errno.h>  // NOLINT
 #include <assert.h>      // NOLINT
@@ -95,4 +95,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/vm/thread_interrupter_win.cc b/runtime/vm/thread_interrupter_win.cc
index 964a405..4342f2b 100644
--- a/runtime/vm/thread_interrupter_win.cc
+++ b/runtime/vm/thread_interrupter_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "platform/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "vm/flags.h"
 #include "vm/os.h"
@@ -124,4 +124,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc
index 4c23d78..716ac8b 100644
--- a/runtime/vm/timeline.cc
+++ b/runtime/vm/timeline.cc
@@ -1375,7 +1375,7 @@
 
 TimelineEventSystraceRecorder::TimelineEventSystraceRecorder(intptr_t capacity)
     : TimelineEventFixedBufferRecorder(capacity), systrace_fd_(-1) {
-#if defined(TARGET_OS_ANDROID) || defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_ANDROID) || defined(HOST_OS_LINUX)
   const char* kSystracePath = "/sys/kernel/debug/tracing/trace_marker";
   systrace_fd_ = open(kSystracePath, O_WRONLY);
   if ((systrace_fd_ < 0) && FLAG_trace_timeline) {
@@ -1391,7 +1391,7 @@
 
 
 TimelineEventSystraceRecorder::~TimelineEventSystraceRecorder() {
-#if defined(TARGET_OS_ANDROID) || defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_ANDROID) || defined(HOST_OS_LINUX)
   if (systrace_fd_ >= 0) {
     close(systrace_fd_);
   }
@@ -1416,7 +1416,7 @@
   if (event == NULL) {
     return;
   }
-#if defined(TARGET_OS_ANDROID) || defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_ANDROID) || defined(HOST_OS_LINUX)
   if (systrace_fd_ >= 0) {
     // Serialize to the systrace format.
     const intptr_t kBufferLength = 1024;
diff --git a/runtime/vm/virtual_memory_android.cc b/runtime/vm/virtual_memory_android.cc
index 6a151b2..f9a6c9c 100644
--- a/runtime/vm/virtual_memory_android.cc
+++ b/runtime/vm/virtual_memory_android.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_ANDROID)
+#if defined(HOST_OS_ANDROID)
 
 #include "vm/virtual_memory.h"
 
@@ -111,4 +111,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_ANDROID)
+#endif  // defined(HOST_OS_ANDROID)
diff --git a/runtime/vm/virtual_memory_fuchsia.cc b/runtime/vm/virtual_memory_fuchsia.cc
index ca48ec2..bc708ec 100644
--- a/runtime/vm/virtual_memory_fuchsia.cc
+++ b/runtime/vm/virtual_memory_fuchsia.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_FUCHSIA)
+#if defined(HOST_OS_FUCHSIA)
 
 #include "vm/virtual_memory.h"
 
@@ -280,4 +280,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_FUCHSIA)
+#endif  // defined(HOST_OS_FUCHSIA)
diff --git a/runtime/vm/virtual_memory_linux.cc b/runtime/vm/virtual_memory_linux.cc
index cc57139..1efee89 100644
--- a/runtime/vm/virtual_memory_linux.cc
+++ b/runtime/vm/virtual_memory_linux.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_LINUX)
+#if defined(HOST_OS_LINUX)
 
 #include "vm/virtual_memory.h"
 
@@ -111,4 +111,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_LINUX)
+#endif  // defined(HOST_OS_LINUX)
diff --git a/runtime/vm/virtual_memory_macos.cc b/runtime/vm/virtual_memory_macos.cc
index bf77b66..967e8e4 100644
--- a/runtime/vm/virtual_memory_macos.cc
+++ b/runtime/vm/virtual_memory_macos.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_MACOS)
+#if defined(HOST_OS_MACOS)
 
 #include "vm/virtual_memory.h"
 
@@ -111,4 +111,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_MACOS)
+#endif  // defined(HOST_OS_MACOS)
diff --git a/runtime/vm/virtual_memory_win.cc b/runtime/vm/virtual_memory_win.cc
index 0f4b179..c02f93a 100644
--- a/runtime/vm/virtual_memory_win.cc
+++ b/runtime/vm/virtual_memory_win.cc
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/globals.h"
-#if defined(TARGET_OS_WINDOWS)
+#if defined(HOST_OS_WINDOWS)
 
 #include "vm/virtual_memory.h"
 
@@ -98,4 +98,4 @@
 
 }  // namespace dart
 
-#endif  // defined(TARGET_OS_WINDOWS)
+#endif  // defined(HOST_OS_WINDOWS)
diff --git a/sdk/lib/_internal/js_runtime/lib/js_string.dart b/sdk/lib/_internal/js_runtime/lib/js_string.dart
index 9319b14..86e2937 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_string.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_string.dart
@@ -13,9 +13,14 @@
 class JSString extends Interceptor implements String, JSIndexable {
   const JSString();
 
+  @NoInline()
   int codeUnitAt(int index) {
     if (index is !int) throw diagnoseIndexError(this, index);
     if (index < 0) throw diagnoseIndexError(this, index);
+    return _codeUnitAt(index);
+  }
+
+  int _codeUnitAt(int index) {
     if (index >= length) throw diagnoseIndexError(this, index);
     return JS('JSUInt31', r'#.charCodeAt(#)', this, index);
   }
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 81b2244..74ca448 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -141,7 +141,6 @@
 Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t01: RuntimeError # co19 issue 87
 Language/Expressions/Shift/syntax_t01/14: MissingRuntimeError # Please triage this failure
 Language/Functions/External_Functions/not_connected_to_a_body_t01: CompileTimeError, OK # Issue 5021
-Language/Generics/syntax_t17: fail # Issue 21203
 Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t01: CompileTimeError # Please triage this failure
 Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t02: CompileTimeError # Please triage this failure
 Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t01/01: CompileTimeError # Please triage this failure
@@ -151,7 +150,7 @@
 Language/Metadata/before_import_t01: RuntimeError # Please triage this failure
 Language/Metadata/before_library_t01: RuntimeError # Please triage this failure
 Language/Metadata/before_param_t09: RuntimeError # Please triage this failure
-Language/Metadata/before_type_param_t01: CompileTimeError # Please triage this failure
+Language/Metadata/before_type_param_t01: RuntimeError # Please triage this failure
 Language/Metadata/before_typedef_t01: RuntimeError # Please triage this failure
 Language/Metadata/before_variable_t01: RuntimeError # Please triage this failure
 Language/Mixins/Mixin_Application/static_warning_t01: CompileTimeError # Please triage this failure
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 9726c7b8..a5620a6 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -335,7 +335,6 @@
 Language/Functions/syntax_t39: MissingCompileTimeError
 Language/Functions/syntax_t40: MissingCompileTimeError
 Language/Generics/malformed_t01: RuntimeError
-Language/Generics/syntax_t17: CompileTimeError
 Language/Interfaces/Superinterfaces/definition_t03: MissingCompileTimeError
 Language/Interfaces/Superinterfaces/definition_t04: MissingCompileTimeError
 Language/Interfaces/Superinterfaces/superinterface_of_itself_t01: MissingCompileTimeError
@@ -598,7 +597,7 @@
 Language/Metadata/before_function_t05: RuntimeError
 Language/Metadata/before_function_t06: RuntimeError
 Language/Metadata/before_function_t07: RuntimeError
-Language/Metadata/before_type_param_t01: CompileTimeError
+Language/Metadata/before_type_param_t01: RuntimeError
 Language/Metadata/compilation_t01: MissingCompileTimeError
 Language/Metadata/compilation_t02: MissingCompileTimeError
 Language/Metadata/compilation_t03: MissingCompileTimeError
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 925d1d1..e549f19 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -9,6 +9,7 @@
 
 regress_26668_test: Fail # Issue 26678
 regress_27617_test/1: MissingCompileTimeError
+regress_29025_test: StaticWarning # Issue 29081
 
 # Runtime negative test. No static errors or warnings.
 closure_call_wrong_argument_count_negative_test: skip
diff --git a/tests/language/regress_29025_test.dart b/tests/language/regress_29025_test.dart
new file mode 100644
index 0000000..a9903a2
--- /dev/null
+++ b/tests/language/regress_29025_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for 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 T F<T>(T t);
+
+class B<T extends F<T>> {}
+class C<T extends F<C<T>>> {}
+
+class D extends B<D> {
+  D foo(D x) => x;
+  D call(D x) => x;
+  D bar(D x) => x;
+}
+
+class E extends C<E> {
+  C<E> foo(C<E> x) => x;
+  C<E> call(C<E> x) => x;
+  C<E> bar(C<E> x) => x;
+}
+
+main() {
+ F<D> fd = new D();
+ var d = fd(fd);
+ print(d);
+ F<E> fe = new E();
+ var e = fe(fe);
+ print(e);
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index d990dc5..47c1946 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -14,6 +14,7 @@
 math/low_test: RuntimeError
 math/random_big_test: RuntimeError  # Using bigint seeds for random.
 
+mirrors/invocation_fuzz_test: RuntimeError # Issue 29086
 mirrors/abstract_class_test: RuntimeError # Issue 12826
 mirrors/class_declarations_test/none: RuntimeError # Issue 13440
 mirrors/class_mirror_location_test: RuntimeError # Issue 6490
@@ -65,7 +66,7 @@
 mirrors/load_library_test: RuntimeError # Issue 6335
 mirrors/local_function_is_static_test: RuntimeError # Issue 6335
 mirrors/lru_test: Skip # dart2js_native/lru_test is used instead
-mirrors/metadata_scope_test/none: CompileTimeError # Issue 10905
+mirrors/metadata_scope_test/none: RuntimeError # Issue 10905
 mirrors/method_mirror_name_test: RuntimeError # Issue 6335
 mirrors/method_mirror_properties_test: RuntimeError # Issue 11861
 mirrors/method_mirror_source_test : RuntimeError # Issue 6490
@@ -76,7 +77,7 @@
 mirrors/mirrors_nsm_mismatch_test: RuntimeError # Issue 19353
 mirrors/mixin_test: RuntimeError # Issue 12464
 mirrors/mixin_application_test: RuntimeError # Issue 12464
-mirrors/other_declarations_location_test: CompileTimeError # Issue 10905
+mirrors/other_declarations_location_test: RuntimeError # Issue 10905
 mirrors/parameter_test/none: RuntimeError # Issue 6490
 mirrors/parameter_of_mixin_app_constructor_test: RuntimeError # Issue 6490
 mirrors/private_class_field_test: CompileTimeError
@@ -97,7 +98,7 @@
 mirrors/typedef_test: RuntimeError # Issue 6490
 mirrors/typedef_metadata_test: RuntimeError # Issue 12785
 mirrors/typedef_reflected_type_test/01: RuntimeError # Issue 12607
-mirrors/typevariable_mirror_metadata_test: CompileTimeError # Issue 10905
+mirrors/typevariable_mirror_metadata_test: RuntimeError # Issue 10905
 mirrors/type_variable_is_static_test: RuntimeError # Issue 6335
 mirrors/type_variable_owner_test/01: RuntimeError # Issue 12785
 mirrors/variable_is_const_test/none: RuntimeError # Issue 14671
diff --git a/tests/lib/mirrors/invocation_fuzz_test.dart b/tests/lib/mirrors/invocation_fuzz_test.dart
index 1043145..7cc6393 100644
--- a/tests/lib/mirrors/invocation_fuzz_test.dart
+++ b/tests/lib/mirrors/invocation_fuzz_test.dart
@@ -96,12 +96,26 @@
   queue.add(task);
 }
 
+checkField(VariableMirror v, ObjectMirror target, [origin]) {
+  if (isBlacklisted(v.qualifiedName)) return;
+
+  var task = new Task();
+  task.name = '${MirrorSystem.getName(v.qualifiedName)} from $origin';
+
+  task.action = () => target.getField(v.simpleName);
+
+  queue.add(task);
+}
+
 checkInstance(instanceMirror, origin) {
   ClassMirror klass = instanceMirror.type;
   while (klass != null) {
     instanceMirror.type.declarations.values
         .where((d) => d is MethodMirror && !d.isStatic)
         .forEach((m) => checkMethod(m, instanceMirror, origin));
+    instanceMirror.type.declarations.values
+        .where((d) => d is VariableMirror)
+        .forEach((v) => checkField(v, instanceMirror, origin));
     klass = klass.superclass;
   }
 }
@@ -177,7 +191,7 @@
 
   var valueObjects =
     [true, false, null, [], {}, dynamic,
-     0, 0xEFFFFFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 3.14159,
+     0, 0xEFFFFFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 3.14159, () {},
      "foo", 'blåbærgrød', 'Îñţérñåţîöñåļîžåţîờñ', "\u{1D11E}", #symbol];
   valueObjects.forEach((v) => checkInstance(reflect(v), 'value object'));
 
diff --git a/tools/VERSION b/tools/VERSION
index c6ceb84..7487bd8 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 23
 PATCH 0
-PRERELEASE 7
+PRERELEASE 8
 PRERELEASE_PATCH 0
